commit db368c4836c772b1fc38fe1a8326b56d06b22311 Author: 苏承祥 <1142819049@qq.com> Date: Mon Oct 19 18:16:57 2020 +0800 init diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100755 index 00000000..45d2c950 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,60 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "scxwhite", + "name": "苏承祥", + "avatar_url": "https://avatars2.githubusercontent.com/u/23207189?v=4", + "profile": "https://blog.csdn.net/su20145104009/", + "contributions": [ + "design" + ] + }, + { + "login": "jiangeyu", + "name": "凌霄", + "avatar_url": "https://avatars2.githubusercontent.com/u/34758993?v=4", + "profile": "https://blog.csdn.net/Pengjx2014", + "contributions": [ + "design" + ] + }, + { + "login": "jet2007", + "name": "jet2007", + "avatar_url": "https://avatars3.githubusercontent.com/u/3906077?v=4", + "profile": "https://github.com/jet2007", + "contributions": [ + "design" + ] + }, + { + "login": "akong0115", + "name": "akong0115", + "avatar_url": "https://avatars3.githubusercontent.com/u/26199270?v=4", + "profile": "https://github.com/akong0115", + "contributions": [ + "design" + ] + }, + { + "login": "Deegue", + "name": "Yizhong Zhang", + "avatar_url": "https://avatars3.githubusercontent.com/u/25916266?v=4", + "profile": "https://github.com/Deegue", + "contributions": [ + "design" + ] + } + + ], + "contributorsPerLine": 7, + "projectName": "hera", + "projectOwner": "scxwhite", + "repoType": "github", + "repoHost": "https://github.com" +} diff --git a/.gitattributes b/.gitattributes new file mode 100755 index 00000000..7c51ecd9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.js linguist-language=Java +*.css linguist-language=Java +*.html linguist-language=Java \ No newline at end of file diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100755 index 00000000..91106d3f --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,17 @@ +name: Java CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Maven + run: mvn -B package --file pom.xml diff --git a/.gitignore b/.gitignore new file mode 100755 index 00000000..052dd475 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +#maven ignore +target/ +*.tar.gz +*.jar +*.war +*.ear + +#idea ignore +.idea/ +*.iml +*.ipr +*.iws + + + +#eclipse ignore +.settings/ +.project +.classpath + +#temp ignore +*.log +*.cache +*.diff +*.patch +*.tmp + +#system ignore +.DS_Store +Thumbs.db +.idea + +# other edit +*.vscode diff --git a/.travis.yml b/.travis.yml new file mode 100755 index 00000000..79c93b9c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: java +jdk: + - openjdk8 +install: mvn install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true +#script: mvn test +script: mvn clean package -Pdev diff --git a/LICENSE b/LICENSE new file mode 100755 index 00000000..23cb7903 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md new file mode 100755 index 00000000..d3a47bbd --- /dev/null +++ b/README.md @@ -0,0 +1,282 @@ +github地址:https://github.com/scxwhite/hera + +# 数据平台打造的任务调度系统(HERA) + +[![Build Status](https://travis-ci.org/scxwhite/hera.svg?branch=open-source)](https://travis-ci.org/scxwhite/hera) +[![](https://www.jitpack.io/v/scxwhite/hera.svg)](https://www.jitpack.io/#scxwhite/hera) + +目前接入hera的公司([点我接入](https://github.com/scxwhite/hera/issues/24)): +- 杭州二维火科技有限公司 +- 杭州涂鸦科技有限公司 +- 北京高因科技(居理新房)有限公司 +- 盈亚科技有限公司 +- 北京智融时代信息技术有限公司 +- 卓尔智联集团(02098·HK) +- 北京果敢时代科技有限公司(大V店) +- 中通天鸿-中国领先的云计算呼叫中心平台及人工智能科技公司 +- 杭州-呆萝卜 +- 微神马科技(大连)有限公司 +- 上海骅天技术服务有限公司 +- 浙江格家网络技术有限公司 +- 紫梧桐(北京)资产管理有限公司 (蛋壳公寓) +- 海拍客 +- 摩比神奇(北京)信息技术有限公司 +- 蛋壳公寓 +- 杭州富聊科技有限公司 +- 持续更新中。。欢迎大家自荐 + +# 交流群 + +个人微信(已满99人,需要我拉你进去) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20190102190821351.png) +# 赞助 +![开源不易,感谢支持](https://img-blog.csdnimg.cn/20191114120009558.png) + +开源不易,感谢支持 + +# 介绍文章 +[操作文档](https://github.com/scxwhite/hera/blob/hera-master/hera-admin/src/main/resources/static/help/help.md) + +[赫拉(hera)分布式任务调度系统之操作文档](https://scx-white.blog.csdn.net/article/details/102571798) + +[赫拉(hera)分布式任务调度系统之架构,基本功能(一)](https://blog.csdn.net/su20145104009/article/details/85124746) + +[赫拉(hera)分布式任务调度系统之项目启动(二)](https://blog.csdn.net/su20145104009/article/details/85161711) + +[赫拉(hera)分布式任务调度系统之开发中心(三)](https://blog.csdn.net/su20145104009/article/details/85336364) + +[赫拉(hera)分布式任务调度系统之版本(四)](https://blog.csdn.net/su20145104009/article/details/85778303) + +[赫拉(hera)分布式任务调度系统之Q&A(五)](https://blog.csdn.net/su20145104009/article/details/86076137) +## 前言 +在大数据平台,随着业务发展,每天承载着成千上万的ETL任务调度,这些任务集中在hive,shell脚本调度。怎么样让大量的ETL任务准确的完成调度而不出现问题,甚至在任务调度执行中出现错误的情况下,任务能够完成自我恢复甚至执行错误告警与完整的日志查询。`hera`任务调度系统就是在这种背景下衍生的一款分布式调度系统。随着hera集群动态扩展,可以承载成千上万的任务调度。它是一款原生的分布式任务调度,可以快速的添加部署`wokrer`节点,动态扩展集群规模。支持`shell,hive,spark`脚本调度,可以动态的扩展支持`python`等服务器端脚本调度。 + +>hera分布式任务调度系统是根据前阿里开源调度系统(`zeus`)进行的二次开发,其中zeus大概在2014年开源,开源后却并未进行维护。我公司(二维火)2015年引进了zeus任务调度系统,一直使用至今年11月份,在我们部门乃至整个公司发挥着不可替代的作用。在我使用zeus的这一年多,不得不承认它的强大,只要集群规模于配置适度,他可以承担数万乃至十万甚至更高的数量级的任务调度。但是由于zeus代码是未维护的,前端更是使用GWT技术,难于在`zeus`上面进行维护。我与另外一个小伙伴(花名:凌霄,现在阿里淘宝部门)于今年三月份开始重写`zeus`,改名赫拉(hera) + +```***项目地址:git@github.com:scxwhite/hera.git ***``` +## 架构 +`hera`系统只是负责调度以及辅助的系统,具体的计算还是要落在`hadoop、hive、yarn、spark`等集群中去。所以此时又一个硬性要求,如果要执行`hadoop,hive,spark`等任务,我们的`hera`系统的`worker`一定要部署在这些集群某些机器之上。如果仅仅是`shell`,那么也至少需要`linux`系统。对于`windows`系统,可以把自己作为`master`进行调试。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191213100911982.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +`hera`系统本身严格的遵从主从架构模式,由主节点充当着任务调度触发与任务分发器,从节点作为具体的任务执行器.架构图如下: + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191213100937780.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +`hera` 在 `2.4` 版本以上也支持了`emr` 集群,即允许任务执行在阿里云、亚马逊的 `emr` 机器之上,架构图如下: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191114114902720.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +## 功能 +![具体功能](https://img-blog.csdnimg.cn/20200922110012179.png) + + - 支持任务的定时调度、依赖调度、手动调度、手动恢复、超级恢复、重跑历史 + - 支持丰富的任务类型:`shell,hive,python,spark-sql,java` + - 可视化的任务`DAG`图展示,任务的执行严格按照任务的依赖关系执行 + - 某个任务的上、下游执行状况查看,通过任务依赖图可以清楚的判断当前任务为何还未执行,删除该任务会影响那些任务。 + - 支持上传文件到`hdfs`,支持使用`hdfs`文件资源 + - 支持日志的实时滚动 + - 支持任务失败自动恢复 + - 实现集群HA,机器宕机环境实现机器断线重连与心跳恢复与`hera`集群`HA`,节点单点故障环境下任务自动恢复,`master`断开,`worker`抢占`master` + - 支持对`master/work` 负载,内存,进程,`cpu`信息的可视化查看 + - 支持正在等待执行的任务,每个`worker`上正在执行的任务信息的可视化查看 + - 支持实时运行的任务,失败任务,成功任务,任务耗时`top10`的可视化查看 + - 支持历史执行任务信息的折线图查看 具体到某天的总运行次数,总失败次数,总成功次数,总任务数,总失败任务数,总成功任务数 + - 支持关注自己的任务,自动调度执行失败时会向负责人发送邮件 + - 对外提供`API`,开放系统任务调度触发接口,便于对接其它需要使用hera的系统 + - 组下任务总览、组下任务失败、组下任务正在运行 + - 支持`map-reduce`任务和`yarn`任务的实时取消。 + - 支持任务超时提醒 + - 支持用户与组的概念 + - 支持任务操作历史记录查看与恢复 + - 支持任务告警定位到个人 + - 告警类型支持邮箱以及自定义的钉钉、企业微信、短信、电话等 + - 支持任务各种条件的模糊搜索 + - 支持阿里云emr的自动创建、销毁 + - 支持亚马逊emr的自动创建、销毁、弹性伸缩 + - (还有更多,等待大家探索) +# 安装部署与启动 + + +## 创建表 +当使用`git`把`hera`克隆到本地之后,首先在`hera/hera-admin/resources`目录下找到`hera.sql`文件,在自己的数据库中新建这些必要的表,并插入初始化的数据(如果你目前使用的是低版本的hera,那么你可以到 [update](https://github.com/scxwhite/hera/tree/hera-master/update/sql) 目录查看是否有你的 `hera` 版本升级的 `ddl` ,如果有请根据你的版本依次执行 `ddl` 语句) + +此时可以在`hera/hera-admin/resources`目录下找到`application.yml`文件。在文件里修改数据源`hera`的数据源(修改`druid.datasource`下的配置)即可进行下面的操作。 + +```yml +## 省略部分 +druid: + datasource: + username: root #数据库用户名 + password: moye #数据库密码 + driver-class-name: com.mysql.jdbc.Driver #数据库驱动 + url: jdbc:mysql://localhost:3306/hera?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowMultiQueries=true +## 省略部分 + +``` + +## 打包部署 +### 2.4.1及以上版本部署方案 + **[注:2.4.1及以上版本已经集成启动和关闭的sh]** + +![在这里插入图片描述](https://img-blog.csdnimg.cn/2019111411090872.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +如果你的 `hera` 使用的是 `2.4.1` 版本以上的,使用maven执行 mvn clean package -Dmaven.test.skip=true -Pdev + 打包后在根目录会出现如图所示的压缩包 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191114111031525.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +你可以通过 `ssh` 把该包上传到服务器,解压该tar.gz包。然后修改 `config` 目录下的`application.yml` 配置文件,在 `bin` 目录里执行 `start.sh` 脚本即可成功启动`hera`。 + +### 2.4.1以下版本部署方案 + +``` +mvn clean package -Dmaven.test.skip=true -Pdev +``` +打包后可以进入`hera-admin/target`目录下查看打包后的`hera-dev.jar` 。此时可以简单使用`java -server -Xms4G -Xmx4G -Xmn2G -jar hera.jar `启动项目,此时即可在浏览器中输入 + +``` +localhost:8080/hera/login/admin +``` +即进入登录界面,账号为`hera` 密码为`biadmin`,点击登录即进入系统。 + +>注:目前hera有用户账户和组账户之分,默认跳转的登录地址为用户账户,需要用户注册(用户需要归属于一个组账户),然后hera组账户在用户管理里页面审核通过后即可登录用户账户。 + +顺便附上我的启动脚本 + +```shell +#!/bin/sh + +JAVA_OPTS="-server -Xms4G -Xmx4G -Xmn2G -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=5 -XX:+CMSParallelInitialMarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/opt/logs/spring-boot/gc.log -XX:MetaspaceSize=128m -XX:+UseCMSCompactAtFullCollection -XX:MaxMetaspaceSize=128m -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/logs/spring-boot/dump" + +log_dir="/opt/logs/spring-boot" +log_file="/opt/logs/spring-boot/all.log" +jar_file="/opt/app/spring-boot/hera.jar" + + +#日志文件夹不存在,则创建 +if [ ! -d "${log_dir}" ]; then + echo "创建日志目录:${log_dir}" + mkdir -p "${log_dir}" + echo "创建日志目录完成:${log_dir}" +fi + + +#父目录下jar文件存在 +if [ -f "${jar_file}" ]; then + #启动jar包 错误输出的error 标准输出的log + nohup java $JAVA_OPTS -jar ${jar_file} 1>"${log_file}" 2>"${log_dir}"/error.log & + echo "启动完成" + exit 0 +else + echo -e "\033[31m${jar_file}文件不存在!\033[0m" + exit 1 +fi +``` +关闭的脚本 + +```bash +#!/bin/bash +pid=`ps aux| grep java | grep hera | awk '{print $2}'` + +[ ! $pid ] && echo "找不到hera的进程,请确认hera已经启动" && exit 0 + +res=`kill -9 $pid` + +echo 关闭hera成功,pid:$pid + + +``` + + +## 测试 +默认登陆地址为:http://localhost:8080/hera 下面需要做的是在`worker`管理这里添加执行任务的机器`IP`,然后选择一个机器组(组的概念:对于不同的`worker`而言环境可能不同,可能有的用来执行`spark`任务,有的用来执行`hadoop`任务,有的只是开发等等。当创建任务的时候根据任务类型选择一个组,要执行任务的时候会发送到相应的组的机器上执行任务)。 +对于执行`work`的机器`ip`调试时可以是`master`,生产环境建议不要让`master`执行任务。如果要执行`map-reduce`或者`spark`任务,要保证你的`work`具有这些集群的客户端。 +那么我们就在`work`管理页面增加要执行的`work`地址以及机器组。 + + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20181225102855978.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1MjAxNDUxMDQwMDk=,size_16,color_FFFFFF,t_70) + +此时有30分钟的缓冲时间,`master` 才会检测到该 `work` 加入。为了测试,此时我们可以通过重启 `master` 来立刻使该 work` 加入执行组(后面会增加一键刷新 `work` 信息)。 + + 此时要注意,我们的 work 也一定也要安装 hera 应用并启动。 + +重启后我们可以进入调度中心 ,在搜索栏里搜索 `1` ,然后按回车 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20181225103951766.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1MjAxNDUxMDQwMDk=,size_16,color_FFFFFF,t_70) + +会发现一个 `echoTest` 任务 ,此时我们还不能执行任务,因为我们的所有任务的执行者登录用户。比如此刻我使用 `hera` 登录的,那么此时一定要保证你的 `work` 机器上有 `hera` 这个用户。 +否则执行任务会出现 `sudo: unknown user: hera` 异常。 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20181225104307920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1MjAxNDUxMDQwMDk=,size_16,color_FFFFFF,t_70) + +此时可以向我们填写的 `work` 机器上增加 `hera` 用户。 + + useradd hera + +如果是 `mac` 系统 那么可以使用以下命令创建 `hera` 用户 + + sudo dscl . -create /Users/hera + sudo dscl . -create /Users/hera UserShell /bin/bash + sudo dscl . -create /Users/hera RealName "hera分布式任务调度" + sudo dscl . -create /Users/hera UniqueID "1024" + sudo dscl . -create /Users/hera PrimaryGroupID 80 + sudo dscl . -create /Users/hera NFSHomeDirectory /Users/hera + +>此时点击手动执行->选择版本->执行。此时该任务会运行,点击右上角的查看日志,可以看到任务的执行记录。 + +此时如果任务执行失败,`error` 日志内容为 + +``` +sudo: no tty present and no askpass program specified +``` + +那么此时要使你启动` hera` 项目的用户具有 `sudo -u hera` 的权限(无须输入`root`密码,即可执行 `sudo -u hera echo 1` ,具体可以在 `sudo visudo` 中配置)。 +比如我启动 `hera` 应用的用户是 `wyr` +那么首先在终端执行 `sudo visudo`命令,此时会进入文本编辑 +然后在后面追加一行 + + wyr ALL=(ALL) NOPASSWD:ALL +如下图: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20181228103306280.png) +这样就会在切换用户的时候无须输入密码。当然如果你使用的是`root`用户启动,即可跳过这段。 + +由于在 `hera` 中还用到了 `dos2unix` ,需要在执行任务的`work`上安装 `dos2unix` 工具。 + +``` +yum install dos2unix +``` + +如果一切配置完成,那么即可看到输出任务执行成功的日志。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20181228103625553.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1MjAxNDUxMDQwMDk=,size_16,color_FFFFFF,t_70) +至此 已经完成了 任务的手动执行。 + + +## TIPS +当然在部署的时候可能会出现各种状况。 +比如:`work` 无法连接到 `master`,连接时抛出 + +``` +java.net.NoRouteToHostException: 没有到主机的路由 +``` +这个时候请注意,我们的master使用的端口是:`9887`。需要在每台 `hera` 机器上的防火墙开启此端口(最好关闭防火墙 `sudo service iptables stop` )。 + +还有一种情况: `work` 可以连接上 `master` ,但是在`master`日志中发现 `work` 总是一段时间后断开。原因是:`hera` 各个机器的时间不一致,修改一下 + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + +
苏承祥
苏承祥

🎨
凌霄
凌霄

🎨
akong0115
akong0115

🎨
Yizhong Zhang
Yizhong Zhang

🎨
jet2007
jet2007

🎨
+ + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/bin/restart.sh b/bin/restart.sh new file mode 100755 index 00000000..b909406b --- /dev/null +++ b/bin/restart.sh @@ -0,0 +1,16 @@ +#!/bin/bash +workDir=$(cd "$(dirname $0)";pwd) +if [[ ! -f "$workDir/stop.sh" ]];then + echo "找不到关闭hera的脚本stop.sh,请确保${workDir}目录下有stop.sh脚本" + exit 1 +fi +if [[ ! -f "$workDir/start.sh" ]];then + echo "找不到启动hera的脚本start.sh,请确保${workDir}目录下有start.sh脚本" + exit 1 +fi + +sh $workDir/stop.sh + +sh $workDir/start.sh + +echo "---------重启hera成功----------" diff --git a/bin/start.sh b/bin/start.sh new file mode 100755 index 00000000..10c5dfdd --- /dev/null +++ b/bin/start.sh @@ -0,0 +1,28 @@ +#!/bin/bash +workDir=$(cd "$(dirname $0)";cd ..;pwd) +JAVA_OPTS="-server -Xms4G -Xmx4G -Xmn2G -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=5 -XX:+CMSParallelInitialMarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/opt/logs/spring-boot/gc.log -XX:MetaspaceSize=128m -XX:+UseCMSCompactAtFullCollection -XX:MaxMetaspaceSize=128m -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${workDir}/dump" +log_dir="${workDir}/logs" +log_file="${log_dir}/all.log" + + +#日志文件夹不存在,则创建 +if [[ ! -d "${log_dir}" ]]; then + echo "创建日志目录:${log_dir}" + mkdir -p "${log_dir}" + echo "创建日志目录完成:${log_dir}" +fi + +jar_file=`find ${workDir} -maxdepth 1 -name "hera-*.jar"` + +echo ${jar_file} + +#父目录下jar文件存在 +if [[ -f "${jar_file}" ]]; then + #启动jar包 错误输出的error 标准输出的log + nohup java ${JAVA_OPTS} -jar ${jar_file} 1>"${log_file}" 2>"${log_dir}"/error.log & + echo "启动完成,日志路径:${log_dir}" + exit 0 +else + echo -e "\033[31m启动失败!!!无法在${workDir}目录找不到hera启动jar文件!\033[0m" + exit 1 +fi diff --git a/bin/stop.sh b/bin/stop.sh new file mode 100755 index 00000000..b6c09c72 --- /dev/null +++ b/bin/stop.sh @@ -0,0 +1,8 @@ +#!/bin/bash +pid=`ps aux | grep java | grep hera | awk '{print $2}'` + +[ ! $pid ] && echo "找不到hera的进程,请确认hera已经启动" && exit 0 + +res=`kill -9 $pid` + +echo 关闭hera成功,pid:$pid diff --git a/docs/branch/hera-2.4.2/readme.md b/docs/branch/hera-2.4.2/readme.md new file mode 100755 index 00000000..99f00968 --- /dev/null +++ b/docs/branch/hera-2.4.2/readme.md @@ -0,0 +1,8 @@ + +本分支新增功能: +- feature-job-biz-ver:引入批次号+业务标签,弱化版本号概念(调度周期,基准日期间隔,业务标签) +- feature-job-display:任务详情模块布局及功能调整 +- feature-job-copy:调度中心页面-复制任务 +- feature-job-log与feature-job-log-info:1、在worder机器生成明细所有日志文件;2、web端日志信息使用新页面展示 +- feature-dag-display:依赖关系图展示任务名称 +- feture-web-session-expire:web会话有效期可配置 diff --git a/docs/feature/feature-dag-display/readme.md b/docs/feature/feature-dag-display/readme.md new file mode 100755 index 00000000..89cffb5a --- /dev/null +++ b/docs/feature/feature-dag-display/readme.md @@ -0,0 +1 @@ +主要改进点:依赖图(任务管理与调度中心模块下)的节点显示节点名称 \ No newline at end of file diff --git a/docs/feature/feature-job-biz-ver/job-base-edit.jpg b/docs/feature/feature-job-biz-ver/job-base-edit.jpg new file mode 100755 index 00000000..cc573653 Binary files /dev/null and b/docs/feature/feature-job-biz-ver/job-base-edit.jpg differ diff --git a/docs/feature/feature-job-biz-ver/job-base-info.jpg b/docs/feature/feature-job-biz-ver/job-base-info.jpg new file mode 100755 index 00000000..f2e78e3c Binary files /dev/null and b/docs/feature/feature-job-biz-ver/job-base-info.jpg differ diff --git a/docs/feature/feature-job-biz-ver/job-inst-01.jpg b/docs/feature/feature-job-biz-ver/job-inst-01.jpg new file mode 100755 index 00000000..7883af58 Binary files /dev/null and b/docs/feature/feature-job-biz-ver/job-inst-01.jpg differ diff --git a/docs/feature/feature-job-biz-ver/job-inst-02.jpg b/docs/feature/feature-job-biz-ver/job-inst-02.jpg new file mode 100755 index 00000000..ce0d8152 Binary files /dev/null and b/docs/feature/feature-job-biz-ver/job-inst-02.jpg differ diff --git a/docs/feature/feature-job-biz-ver/readme.md b/docs/feature/feature-job-biz-ver/readme.md new file mode 100755 index 00000000..110de36f --- /dev/null +++ b/docs/feature/feature-job-biz-ver/readme.md @@ -0,0 +1,103 @@ +[TOC] + +## 说明 +引入批次号+业务标签,弱化版本号概念 + +​ 作业:调度周期,基准日期间隔,业务标签; + +​ 作业实例:批次号; + +​ 如jobA定义的调度周期=day,入参基准日期间隔=-1时,则版本号(id)=20191203010203xxxx的批次号=2019-01-02 + +​ 附:对于业务来说,版本号太技术了,不容易理解。 + + + + +## 功能 + +一、调度中心-作业-页面(查看与编辑) + + 1. 标签:作业的业务标签,多个标签逗号分隔 + 2. 调度周期:year,month,day,hour,minute,second,other(other当前等价于second) + 3. 参数基准时间间隔: 数字值,如-1 + 4. 如jobA定义的调度周期=day,入参基准日期间隔=-1时,则版本号(id)=20191203010203xxxx的批次号=2019-01-02 + +![作业查看页面](job-base-info.jpg) + + + +![作业编辑页面](job-base-edit.jpg) + + + + + +二、任务详细-作业页面 + +1. 突出的标签的显示 +2. 单个作业实例中,突出显示批次号,隐藏了版本号,ID信息 + +![](job-inst-01.jpg) + + + +![](job-inst-02.jpg) + + + + +### hera meta 改动 + +一、表hera_job,增加3个字段----不改变原hera的调用逻辑;只是会结合版本号,得到作业实例的批次号信息。 + +``` +cron_period varchar(50) DEFAULT 'other' COMMENT '调度周期(year,month,day,hour,minute,second,other)', +cron_interval int DEFAULT 0 COMMENT '调度间隔,业务定义的日期与调度日期的间隔', +biz_label varchar(500) not null DEFAULT '' COMMENT '业务标签,逗号分隔' +``` + +二、表hera_action,增加1个字段批次号 +如jobA定义的cron_period=day,cron_interval=-1时,则版本号(id)=20191203010203xxxx的批次号=20190102 + +``` +batch_id varchar(50) DEFAULT NULL COMMENT '批次号', +``` + +三、hera_action_history表 + +``` + batch_id varchar(50) DEFAULT NULL COMMENT '批次号', + biz_label varchar(500) DEFAULT NULL COMMENT '标签', +``` + + + +### hera脚本改动 + +HeraJob的实体与实体vo + +jobAction的实体与实体vo + +jobActionHistroy增加setBizLabel,setBatchId + +``` +1.com.dfire.controller.ScheduleCenterController +public JsonResponse execute方法 的actionHistory set两个setBizLabel,setBatchId + +2.com.dfire.core.event.handler.JobHandler +startNewJob方法--build()前的两个setBizLabel,setBatchId + +3. com.dfire.core.netty.master.Master +private void startNewJob方法--build()前的两个setBizLabel,setBatchId + +4.com.dfire.core.netty.master.MasterRunJob +private void runScheduleJobContext方法--build()前的两个setBizLabel,setBatchId + +``` + +JobHistoryVo + +jobDetail.js + +等 \ No newline at end of file diff --git a/docs/feature/feature-job-copy/readme.md b/docs/feature/feature-job-copy/readme.md new file mode 100755 index 00000000..518a09c9 --- /dev/null +++ b/docs/feature/feature-job-copy/readme.md @@ -0,0 +1,2 @@ +- ҳ- + - =ͬĿ¼£_copy , ״̬=ʧЧ \ No newline at end of file diff --git a/docs/feature/feature-job-display/job-group-list.jpg b/docs/feature/feature-job-display/job-group-list.jpg new file mode 100755 index 00000000..2b34e2da Binary files /dev/null and b/docs/feature/feature-job-display/job-group-list.jpg differ diff --git a/docs/feature/feature-job-display/job-job-list.jpg b/docs/feature/feature-job-display/job-job-list.jpg new file mode 100755 index 00000000..e5491269 Binary files /dev/null and b/docs/feature/feature-job-display/job-job-list.jpg differ diff --git a/docs/feature/feature-job-display/job-main-list.jpg b/docs/feature/feature-job-display/job-main-list.jpg new file mode 100755 index 00000000..b8354b92 Binary files /dev/null and b/docs/feature/feature-job-display/job-main-list.jpg differ diff --git a/docs/feature/feature-job-display/job-operate.jpg b/docs/feature/feature-job-display/job-operate.jpg new file mode 100755 index 00000000..637fc4c2 Binary files /dev/null and b/docs/feature/feature-job-display/job-operate.jpg differ diff --git a/docs/feature/feature-job-display/readme.md b/docs/feature/feature-job-display/readme.md new file mode 100755 index 00000000..dbe0a993 --- /dev/null +++ b/docs/feature/feature-job-display/readme.md @@ -0,0 +1,48 @@ +[TOC] + + + +## 任务详情模块 + +### 任务详情-主页面 + +- 任务组与任务的展开子页面内容不一样 +- 筛选条件,增加开始日期与结束日期 + +![](job-main-list.jpg) + + + +### 任务详情-组子页面 + +- 组下的任务执行历史情况(点击主页面的任务组,按开始时间升序) + +![](job-group-list.jpg) + +### 任务详情-任务子页面 + +- 同一个任务执行历史情况(点击主页面的任务,按开始时间降序) + +![](job-job-list.jpg) + +### 子页面的功能说明 + +#### 时间轴 + +- 当前任务的执行的时间区间 + +#### 操作 + +说明:对于当前任务的手动可操作的一系列动作。 + +- 重做:包含【重做当前】和【重做后续】,相当于之前版本的【手动执行】与【手动恢复】 +- 取消:取消正在执行的任务 +- 强制:直接将任务的状态值,强制设置为【失败】、【成功】、【等待】 + +备注:3个选项的可见性,较为简单,未细分,可进一步优化(如若当前状=成功,则强制成功为不可见,目前就未实现) + +![](job-operate.jpg) + + + + diff --git a/docs/feature/feature-job-log-info/readme.md b/docs/feature/feature-job-log-info/readme.md new file mode 100755 index 00000000..e33bd9e3 --- /dev/null +++ b/docs/feature/feature-job-log-info/readme.md @@ -0,0 +1,6 @@ +### 日志页面功能 + +#### 任务实例的日志信息 + +- 配置项:application.xml中增加配置项webLogHeadCount,webLogTailCount,分别可查看日志头尾多少条信息;默认值为10000(5000+5000) +- 全新的日志页面:任务详情页--操作--日志,使用新标签页打开日志信息( 原来为第1列,在当前页面中展开并查看明细日志) \ No newline at end of file diff --git a/docs/feature/feature-job-log/readme.md b/docs/feature/feature-job-log/readme.md new file mode 100755 index 00000000..86bc8728 --- /dev/null +++ b/docs/feature/feature-job-log/readme.md @@ -0,0 +1,80 @@ +[TOC] + + + +## 日志详情功能 + +### 日志详情 + +- 之前网页端只保留1000行左右的日志,若超过,就不展示; + +- 本Feature增加功能:在worker机器的脚本运行目录上--生成日志文件 + + - 日志文件清单 + + ```shell + #示例 + /opt/logs/spring-boot/2019-12-29/manual-4564 + + -rwxrwxrwx 1 hera hera 105 Dec 29 15:25 1577604332970.sh + -rw-r--r-- 1 hera hera 8917 Dec 29 15:25 3912efed-c508-498a-9610-ee545a0c9c87.log + -rwxrwxrwx 1 hera hera 517 Dec 29 15:25 tmp.sh + + ``` + + - tmp.sh + + ```shell + curDir=$(cd `dirname $0`; pwd) + scriptName=`basename $0` + cd ${curDir} + log_file=78e32f90-16ca-481d-b55f-a6c82f0e63a7.log + echo "调度作业的日志文件:[${curDir}/${log_file}]" + runtime=`date '+%Y-%m-%d %H:%M:%S'` + echo "作业执行开始,时间[$runtime]" + + bash /opt/logs/spring-boot/2019-12-30/manual-4657/1577673901459.sh 2>&1|tee -a ${log_file} + if [ ${PIPESTATUS[0]} != 0 ] + then + runtime=`date '+%Y-%m-%d %H:%M:%S'` + echo "作业执行失败,时间[$runtime]" + exit -1 + else + runtime=`date '+%Y-%m-%d %H:%M:%S'` + #'此处可设置web或FTP服务,如上传日志文件,以达到网页端可查看完成日志功能' + echo "作业执行成功,时间[$runtime]" + fi + ``` + + - 网页端的日志示例 + + ```shell + HERA# 本地执行任务 + 2019-12-30 10:45:11 开始运行 + HERA# ==================开始输出脚本内容================== + + sleep 234 + HERA# ==================结束输出脚本内容================== + HERA# 开始执行前置处理单元DownLoadJob + HERA# 前置处理单元DownLoadJob处理完毕 + HERA# 开始执行核心job + HERA# dos2unix file:/opt/logs/spring-boot/2019-12-30/manual-4658/1577673912031.sh + CONSOLE# dos2unix: converting file /opt/logs/spring-boot/2019-12-30/manual-4658/1577673912031.sh to Unix format ... + CONSOLE# 调度作业的日志文件:[/opt/logs/spring-boot/2019-12-30/manual-4658/343ac3e9-7243-407e-bfd3-aa0c666f9fa6.log] + CONSOLE# 作业执行开始,时间[2019-12-30 10:45:12] + HERA# 核心job处理完毕 + HERA# exitCode = 0 + ``` + + + + +### 下一步计划 + + - 在网页端提供一个“下载”完整日志 + + + + + + diff --git a/docs/feature/feture-web-session-expire/readme.md b/docs/feature/feture-web-session-expire/readme.md new file mode 100755 index 00000000..18587810 --- /dev/null +++ b/docs/feature/feture-web-session-expire/readme.md @@ -0,0 +1,2 @@ +- feture-web-session-expire + - 网页sesseion会话的有效期可配置,详见application.xml的webSessionExpire \ No newline at end of file diff --git a/docs/help.md b/docs/help.md new file mode 100755 index 00000000..bce26a32 --- /dev/null +++ b/docs/help.md @@ -0,0 +1,385 @@ + +# 前言 +>最近发现我总是站在我的角度来使用hera,每个功能都很清楚,但是对于使用者,他们是不清楚的,所以提供一篇hera操作文档。有问题可以在下面回复 + +[开源地址,请点个start,谢谢](https://github.com/scxwhite/hera) +# 操作文档 + +## 登录和注册 +在 `hera`上登录和注册其实分为两个部分,即用户和用户组(如果使用的是`hera2.4`版本以下的没这个功能) +### 用户 +用户的登录url地址为 `/login`,页面效果如图 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015191930463.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +请注意看提示,用户名为你注册的邮箱的前缀。 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015192026639.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +- 邮箱:任务失败(手动恢复或者自动调度触发并且达到任务重试次数)后发送邮件 +- 手机号:任务失败(手动恢复或者自动调度触发并且达到任务重试次数)后打电话 +- 工号:任务失败(手动恢复或者自动调度触发并且达到任务重试次数)后发送钉钉/企业微信消息 +- 部门: 这里的部门,即是用户组,每一个用户一定属于一个用户组。用户注册后可以联系管理员修改组 +***Tip:这里的工号在数据库中只设置了长度为5的字符,如果需要更长,请联系管理员修改*** +### 用户组 +用户组对应的 `url` 为 /`login/admin`,页面效果如下 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015192824629.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +用户组也可以登录,使用你注册的用户名和密码登录即可。 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015192847295.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +- 账号: 注意,这里的用户组账号对应到 `linux` 机器上的用户。在每个任务执行的时候都会切换到该用户组来执行任务,来实现 `linux` 多租户的功能 +- 邮箱:所属于该用户组的用户所创建的任务失败(手动恢复或者自动调度触发并且达到任务重试次数)后发送邮件 +- 手机:暂时无用 +- 账号描述:部门描述等额外信息 + +### 总结 +用户组和用户的含义在公司里解释: +>用户组对应我们公司的各个部门,每个部门的 `leader` 持有该账户。 +用户对应部门下的员工,每个员工持有该账户 + +用户组和用户的含义在 `hera` 里的解释: +>用户组表示一大堆任务的所有者,`hera` 里面任务的权限粒度只到用户组级别,也就是说,所属于同一个用户组的用户可以访问彼此的任务。 + + + +## 首页 +目前首页放的是一系列的任务信息,简单介绍以下 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015194314337.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +![在这里插入图片描述](https://img-blog.csdnimg.cn/2019101519442779.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +- 今日总任务数: 从今天凌晨到此刻,在 `hera` 上执行的总的任务数 +- 失败任务数:从今天凌晨到此刻,在 `hear` 上执行的失败的任务数 +- 实时任务状态:此刻,在 `hera` 集群实时运行的任务数量及状态统计 +- 任务执行状态:最近7填任务的数量的折线图 +- 任务时长`TOP10`:昨日和今日任务的执行时长对比柱状图(排序方式为:今天任务的执行时长耗时) + +总结 +>通过今日总任务数清楚集群执行了多少任务 +>通过失败任务数来查看任务的失败,以便处理失败任务。 +>通过实时任务状态来判断集群是否有任务在执行。 +>通过任务的执行状态来大致查看任务最近几天的执行状态 +>通过任务的时长 `TOP10` 来优化那些耗时长的任务 + + + +## 机器组监控 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015195912940.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191030164012243.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +主要是查看机器的相关信息,没什么好说的 + +## 系统管理 +系统管理页面只有赫拉的**超级管理员**才能查看,主要包含用户、用户组的审核及编辑,机器组的新建与删除、机器组中机器的创建与删除,下面一一介绍 +### 用户管理 +#### 用户组 +用户组即是在 `/login/admin` 地址中注册的用户,注册后会展示在这里等待管理员审核 +![在这里插入图片描述](https://img-blog.csdnimg.cn/201910152000319.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +用户组的操作有审核通过、审核拒绝以及在编辑中修改用户组的邮箱和手机号信息。 +#### 用户 +用户组即是在 `/login` 地址中注册的用户,注册后会展示在这里等待管理员审核 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015200112107.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +用户操作主要是对用户组所属的用户进行审核通过、审核拒绝以及对用户的工号、邮箱、电话、所属用户组的修改 + +#### 总结 +该页面主要是 `hera` 超级管理员的操作,默认为 `hera` 组的所有成员,用来审核用户以及修改用户信息 + +### 监控管理 +监控管理页面的效果图如下 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191017192355322.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +监控管理页面的功能主要是: + +- 添加任务监控人 +- 移除任务监控人 + +>解释一下什么是监控人,每一个任务都有一个或多个监控人(关注人),一旦该任务执行失败(手动恢复/自动调度)就会通过短信、电话、邮件(如果发现无告警,联系管理员自行扩展 `AlarmCenter.class`的电话和微信告警)的方式通知该任务的所有监控人 + +### 机器组管理&worker管理 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191017193106889.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +该页面是为 `hera` 的所有 `work` 进行分组,假设 `hera` 有4台 `work` 分别为`A,B,C,D`。其中 `A、B` 两台机器执行spark任务,`C、D` 两台机器执行默认任务。我们就可以在机器组页面创建两个机器组分别为默认组和 `spark` 组。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024192314877.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + + +然后在 `worker `管理页面分别添加 `A、B` 机器的 `ip` 到 `spark` 组,`C、D` 两台机器到默认组。 +然后就可以在添加任务的时候选择所需要执行的机器组了。 + + + + +注意: +1.机器组管理在`emr`集群上目前是不支持分组的,也就是说你的分组无效。因为 `emr` 是 `ssh` 到远程集群,并不是在本地执行。 +2.在 `worker` 页面添加机器 `ip` 后不是实时生效的,需要等待半个小时或者手动重启 `master `。 + + + + + +## 任务管理 +任务管理主要是对调度中心任务的一些信息检索及查看,主要包含:任务详情、任务依赖、任务搜索、日志记录等 +### 任务详情 +界面展示如图 +![在这里插入图片描述](https://img-blog.csdnimg.cn/2019102419512526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +该界面展示所有任务的执行的状态,包括执行次数,执行时长,执行人,执行机器等信息。可以通过右上角的状态进行勾选想要查看的状态 +- 状态 选项有全部、成功、失败、运行中、等待等任务的几种状态 +- 日期 默认选择今天,可供使用者自己勾选 + +同时,每一条记录都是支持点击查看运行记录详情,点击后的展开图如下 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024194800115.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +该详情其实与调度中心的运行日志界面基本一致,主要是展示运行的运行记录,运行结果,运行时长等基本信息 +### 任务依赖 +任务依赖,顾名思义就是任务的上下游关系,该界面主要是为了查看某个任务的上下游任务状态。 +任务状态由不同的颜色来表示 +>绿色:执行成功 +黄色:正在运行 +红色:失败或未执行 +灰色:关闭 + +具体操作是:先填入任务 `ID`,之后点击上游任务链或者下游任务链按钮,此时展示全部会变为不可点击状态,等待展示全部变为点击状态时,点击一下,任务的依赖关系图就会绘制完成 + +#### 上游任务 +上游任务一般用来排查当前任务为什么没执行?任务在上游执行到哪里了?上游哪个任务失败了需要我手动恢复?等等 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191030171030964.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +#### 下游任务 +下游任务一般看当前任务的执行进度,以及哪些任务依赖当前任务。 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191030170506873.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +tips: +- 任务依赖图也可以在调度中心直接点击,无需填写任务 `ID` 号 +- 依赖图展示完毕后可以把鼠标放在某个任务上面,此时右侧的任务状态信息就会变化 +- 任务依赖图中的任务支持点击查看 +- `0` 号任务没有实际意义,仅仅为了标识依赖图的开始节点。即:如果你点击的是上有任务链,那么 `0` 号任务在最下方,如果你点击的是下游任务链,那么 `0` 号任务在最上方 + + +### 任务搜索 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024195520190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +该界面主要根据脚本内容、任务名称、描述内容、变量内容、任务类型、任务是否开启等任务条件来模糊搜索该平台的所有任务,很简单,就不再介绍。 + +### 日志记录 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024195718621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +该界面主要展示任务的所有操作记录,点击记录右侧的查看可以看到操作的详细内容 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024195920373.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +主要是为了方便对比或者找回曾经修改的脚本 + +>有一点需要注意,超级管理员可以看所有用户组中用户的操作记录。如果是普通用户只能看该组内的用户操作记录 + +## 开发中心 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024200116228.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +开发中心,顾名思义,是我们日常开发任务的地方。 + +在任务栏最外层有两个文件夹,分别为个人文档和共享文档,区别如下: + +- 个人文档: 属于同一个组的用户共同使用个人文档内创建的任务 +- 共享文档: 任意组的人都能查看在共享文档内创建的任务 + +### 新建任务/新建文件夹 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/2019102420103166.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +在任务栏处可以通过把鼠标放在某个文件夹上然后右键来调出任务操作。主要包含增加文件夹、新建 `Hive` 任务、新建 `Shell` 任务、新建 `Spark` 任务、重命名、删除等操作。 + +### 执行任务 +大家可能发现脚本区的上方有几个按钮,其中执行和执行选中的代码,就是用来执行脚本内容的。 +当在文件夹中新建任务后,就可以写脚本执行任务了。通过鼠标点击左侧的任务可以进行编辑任务,比如我点击左侧的 `echo.sh` 任务然后代码内容写为 `echo "hello world"` ,再然后点击工具栏的执行按钮,此时脚本下方会实时输出任务的执行结果 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024202030984.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +如果脚本内容分很多段,我只想执行某一部分怎么办? +此时可以通过鼠标选中你要执行的代码,然后点击上方的执行选中的代码按钮即可 + + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024202239582.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +### 日志查看 +在开发中心,日志查看有两种方式 +1.第一种就是上面那种,通过任务执行,直接在下方查看 +2.点击最下方的历史日志 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024202414844.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024202506563.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +然后就能看详细的历史日志了 + +### 上传资源 +点击脚本上方工具栏的上传资源按钮会弹出上传文件的弹框,通过选择自己要上传的文件,点击上传按钮即可完成上传 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024202724571.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +注意 +>1.上传的文件目前仅支持`'py','jar','sql','hive','sh','js','txt','png','jpg','gif'` 等扩展名,如果需要其它文件,请联系管理员修改 +>2.上传成功后会返回一个路径,请copy下你上传后的文件地址,以便后面使用。目前还未有界面来维护上传的资源,在计划开发中 + +### 同步任务 +该功能开发中,后续会自动关联调度中心,关联调度中心某个任务的配置 + +### 保存脚本 +脚本会自动保存,如果不放心的话,就点一下吧 + +## 调度中心 + +调度中心,可谓是赫拉的核心操作的地方。在这里主要用来开发任务,控制任务的开启/关闭状态,设置任务的定时时间,任务的依赖,手动执行、手动恢复任务、查看运行日志,配置告警,查看组下任务状态等等。下面一一来介绍。 + + +### 总览 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191030172436777.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +调度中心主要分三部分,红框标注的为任务树,绿框标注的为任务的基本信息,蓝框标注的为任务的操作按钮(任务的操作按钮和任务组的操作按钮不一致,此处截取的是任务的操作按钮) + +### 任务树 +大家可以通过上面截图中的红框内容发现,最上方有两个按钮,分别为:我的调度任务和全部调度任务。 +- 我的调度任务:我所属的用户组所创建的所有任务 +- 全部调度任务:所有用户组用户所创建的所有任务 + +任务树中的图标主要有三种: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191030173550856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +1.大目录 +>大目录下只能创建大目录或者小目录 + +2.小目录 +>小目录下面只能创建文件(任务) + +3.文件 +>文件的内容就是任务的脚本 + + +提示:上图中可以看到点击98号任务后右侧显示编辑和删除的按钮,这两个按钮均为临时重命名和删除,刷新后还会存在。需要知道的是,调度中心所有的操作按钮都在最右侧,即总览所附图中蓝色框标注的部分 + + +### 任务基本信息 + +当你在任务树中点击某个任务后,任务的基本信息就会改变 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191030174046849.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +包含的内容比较多,我会把主要部分信息介绍一下 + +- 任务`id` :系统自动生成,任务的唯一标识 +- 名称:新建任务时用户填写,最好见名知意,尽可能短 +- 任务类型:编辑任务时可选`shell、hive、spark`三种类型 +- 自动调度: 自动调度是否开启,可以通过右侧的开启/关闭按钮来操作 +- 任务优先级:编辑任务时可选`low,medium,high`,当队列中任务很多时会根据该优先级进行分发任务执行 +- 描述:必填项,任务信息的描述 +- 调度类型:编辑任务时可选定时调度、依赖调度,定时调度时需要填写`cron` 表达式,依赖调度时需要选择所依赖的任务 `ID` +- 定时表达式:调度类型为定时调度时所填写的 `cron` 表达式 +- 依赖任务:调度类型为依赖调度时所选择的依赖任务 `ID` 的列表 +- 重试次数:任务自动调度/手动恢复失败时重试的次数 +- 重试间隔:任务自动调度/手动恢复失败后需要等待多久进行重试 +- 预计时长:整数,`0`表示无限大。当任务执行超出预计时长时会进行告警 +- 报警类型:任务任务自动调度/手动恢复失败,并且重试次数已经用完进行邮件、企业微信、电话告警,告警级别依次升高。当选择电话告警时,三种告警都会触发 +- 所有人:任务创建者所属的用户组 +- 关注人员:任务失败后告警的人员,默认是任务的创建者。其它用户也可以在这里点击关注或者管理员在监控管理界面添加 +- 管理员:该任务还允许哪些用户组的用户操作,可以通过操作按钮的配置管理员进行添加 +- 重复执行:是否运行同一时间允许两个或两个以上实例执行。比如:每个小时触发的任务,任务的执行时间超出了一个小时,如果设置为否,则下个小时的任务不会执行,直到漏跑检测到才会执行 +- 机器组:该任务需要在哪个机器组执行。机器组的创建请参考上面的机器组管理 +- 区域:任务需要在哪个区域执行。默认是 `all` ,如果你们的 `hera` 数据库做了多区同步,那么可以选择需要执行的区域,在不是所选择的区域执行该任务时会直接设置为成功。如果需要支持,可以联系我加入赫拉开源群 + + +### 任务配置项以及脚本内容 +上面简单表述了一下任务的基本信息,下面需要说明任务的配置信息、脚本等 +![在这里插入图片描述](https://img-blog.csdnimg.cn/2019103119563747.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +从上往下依次是:任务配置项、脚本内容、继承的配置项 + +> - 任务的配置项:是专属于该任务的配置,以 `key=value` 对的形式存在,换行分割。 +>- 脚本内容:供开发者编写的脚本内容,脚本内容要根据任务的类型来写,如果是 `spark` 任务就写 `spark-sql`,如果是 `hive` 任务就写 `hive-sql`,如果是 `shell` 任务就写 `shell` 脚本 +> - 继承的配置项:在 `hera` 中允许配置项的继承,凡是任务都能够使用其所有父级的目录,所以 `hera` 可以把一些公共的配置配置到目录上。如果任务的配置项和继承配置项有重复 `key` 的,那么以`最近原则`为准,取任务的配置而忽略继承的配置。 + +--- +有一点需要说明的是,`hera` 本身支持区域代码前缀的变量,那么该变量就会在指定区域使用 +我们公司共有五个区域 +- AY:中国 +- EU:欧洲 +- US:美国 +- IND:印度 +- UE:美东 +我的配置项里有两个配置: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031201249164.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +然后我选择的执行区域为美国和欧洲,配置项里只有欧洲和美国开头的`name` 变量,然后我在不同区域执行该任务时: +- 中国区域 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031201649194.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +由于执行区域只有欧洲(`EU`)和美国(`US`),所以在中国(`AY`)执行直接设置为成功,然后通知下游任务执行 + +- 欧洲区域 +![在这里插入图片描述](https://img-blog.csdnimg.cn/201910312018432.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +由于我们设置的配置项的 `EU.name=欧洲` 所以欧洲区域读取的变量内容为欧洲 + +- 美国区域 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031202053759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +美国区域读取的就是 `US.name=美国` 的变量内容 + +--- +脚本内容 +脚本内容其实不想说的,不过又担心大家不懂,还是举几个例子 + +- shell任务 +其实 `shell` 任务可以执行任务任务,只要是使用 `shell` 脚本可以操作的,这里都可以操作,就举个 `shell` 实现 `spark-submit` 的任务 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031203056883.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +- hive任务 +`hive` 任务就是使用 `hive sql` 写的脚本,也举个例子 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031203430689.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) + +- spark任务 +`spark` 任务就是使用 `spark sql` 写的任务。`spark` 任务和 `hive` 任务差不多,不过对于 `spark` 任务通常我们会配置 `--executor-memory --num-executors` 等参数。`hera` 默认已经配置了这些参数,当你觉得资源不够时,可以通过在配置项增加 `hera.spark.conf` 变量覆盖默认参数 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031203904878.png) + +### 操作按钮 +操作按钮包含了调度中心的所有点击操作,任务操作按钮和组操作按钮有些许不同,下面一一介绍 +#### 组操作按钮 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031210133265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +基本信息模块与任务模块差不多,不再介绍 + +- 任务总览 +任务总览可以查看该组下的所有任务执行状态信息 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031210342473.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +通过该功能我们可以知道那些任务执行了,那些任务没执行的原因是上游哪个任务失败了,右侧按钮可以进行再次过滤 +- 正在运行 +与任务总览类似,只不过只看正在运行的任务 +- 失败记录 +与任务总览类似,只不过只看失败的任务 +- 添加组 +该功能在鼠标放在大目录上时显示,能够在该组下面创建新的组 + +- 编辑 +编辑该组配置信息和基本信息 + +- 添加任务 +该功能在放在小目录上时显示,能够在该组下面创建新的任务 + +- 删除 +字面意思 +- 配置管理员 +当其它用户组需要在该组下添加任务时,需要有该组的权限。通过配置管理员的方式可以实现 +#### 任务操作按钮 +- 运行日志 +顾名思义,运行日志查看任务的执行日志信息,当点击该任务后会弹出一个模态框 +![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031204357319.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +该模态框包含了该任务所有的历史执行记录,主要包含开始时间、结束时间、执行的机器ip、执行人、执行时长等信息。左侧的`+`号按钮可以展开查看详细的执行日志。 + +- 操作记录 +操作记录主要记录了该任务的历史所有操作记录 +![在这里插入图片描述](https://img-blog.csdnimg.cn/2019103120483137.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +主要包含操作类型、操作人、操作时间等信息,左侧的 `+` 号同样支持展开 +查看详细操作 +比如,我展开更新脚本内容 +![在这里插入图片描述](https://img-blog.csdnimg.cn/2019103120485064.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9zY3gtd2hpdGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70) +左侧为历史的脚本内容,右侧为最新的脚本内容。如果想查找历史脚本可以从这里恢复 + + + +- 版本生成 +在赫拉中任务的执行需要版本一说,所以每个任务如果要执行都需要版本。赫拉本身会在每个小时的整点附近自动生成版本,如果某人想立刻生成版本,需要点击一下版本生成按钮(目前2.4及以下版本不支持依赖任务版本生成,仅支持定时任务,如果需要的话,可以先把任务设置为定时任务,生成版本后再切换回去)。 +- 依赖图 +依赖图与上面介绍的一样,不再叙述 +- 编辑 +默认情况下 **基本信息** 、 **脚本配置项** 与**脚本**是只读的状态,只有点击编辑后才能够进行编辑这些信息 +- 手动执行 +执行一次该任务,执行成功不会通知下游依赖任务。手动执行的时候需要选择一个版本,如果没有版本就要等待版本生成或者手动生成 +- 手动恢复 +执行一次该任务,执行成功通知下游依赖任务。其它与手动执行一致 +- 开启/关闭 +任务是否开启自动调度,默认是关闭状态。开启状态的任务失败会进行告警。 + +- 失效 +可以理解为关闭。 +- 删除 +字面含义 +- 配置管理员 +该功能一般在该任务需要交接给其它部门的人时使用,凡是在配置管理员内的用户组的用户都能操作该任务 +- 关注该任务 +当前登录用户关注该任务的失败告警通知 + + + diff --git a/docs/index.html b/docs/index.html new file mode 100755 index 00000000..cf1a60ee --- /dev/null +++ b/docs/index.html @@ -0,0 +1,26 @@ + + + + + 帮助文档 + + + + + + +
+ + + + diff --git a/hera-admin/pom.xml b/hera-admin/pom.xml new file mode 100755 index 00000000..833b5020 --- /dev/null +++ b/hera-admin/pom.xml @@ -0,0 +1,212 @@ + + + 4.0.0 + + + com.dfire.hera + hera + 2.4.2 + + + hera-admin + ${hera.admin.version} + jar + hera-admin + hera任务调度系统 + + + UTF-8 + UTF-8 + 1.8 + + com.dfire.AdminBootstrap + hera-${env} + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-test + + + + mysql + mysql-connector-java + + + + com.alibaba + fastjson + + + org.yaml + snakeyaml + + + + com.github.pagehelper + pagehelper + 5.1.2 + + + + + org.projectlombok + lombok + + + + junit + junit + + + + log4j + log4j + + + + org.slf4j + log4j-over-slf4j + + + + commons-fileupload + commons-fileupload + + + + + + com.dfire.hera + hera-core + + + + org.aspectj + aspectjrt + 1.9.1 + + + org.aspectj + aspectjweaver + 1.8.8 + + + org.jetbrains + annotations + 17.0.0 + compile + + + + + + + ${final-name} + + + src/main/resources + true + + + **/adminlte/plugins/font-awesome-4.5.0/fonts/** + **/adminlte/bootstrap/fonts/** + **/plugins/layui/font/** + + + + + src/main/resources + false + + + **/adminlte/plugins/font-awesome-4.5.0/fonts/** + **/adminlte/bootstrap/fonts/** + **/plugins/layui/font/** + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.4.2 + + true + + + + org.apache.maven.plugins + maven-jar-plugin + 2.6 + + + + ${main-class} + true + lib/ + + + ./ + + + + config/*.yml + config/*.xml + config/*.yaml + config/*.properties + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.6 + + src/main/assembly/assembly.xml + ${final-name} + false + ../ + posix + + + + make-assembly + package + + single + + + + + + + + + diff --git a/hera-admin/src/main/assembly/assembly.xml b/hera-admin/src/main/assembly/assembly.xml new file mode 100755 index 00000000..7f4484a6 --- /dev/null +++ b/hera-admin/src/main/assembly/assembly.xml @@ -0,0 +1,73 @@ + + + assembly + + tar.gz + + ${assembly.include.base.directory} + + + + ${basedir}/../bin + + *.sh + + 700 + /bin + + + ${basedir}/../plugins + + *.rpm + *.txt + + 700 + /plugins + + + + ${basedir}/${project.build.directory} + + ${project.build.finalName}.${project.packaging} + + / + + + + + ${basedir}/${project.build.directory}/classes/config + + *.yaml + *.yml + *.xml + *.properties + + 600 + /config + + + + + + runtime + + ${groupId}:${artifactId} + + /lib + + + diff --git a/hera-admin/src/main/java/com/dfire/AdminBootstrap.java b/hera-admin/src/main/java/com/dfire/AdminBootstrap.java new file mode 100755 index 00000000..00bb02ac --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/AdminBootstrap.java @@ -0,0 +1,24 @@ +package com.dfire; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + + +/** + * @author: 凌霄 + * @time: Created in 11:59 2018/1/1 + * 启动入口 + */ +@MapperScan(basePackages = "com.dfire.*.mapper") +@SpringBootApplication(scanBasePackages = "com.dfire") +@ServletComponentScan(value = "com.dfire.config") +@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true) +public class AdminBootstrap { + + public static void main(String[] args) { + SpringApplication.run(AdminBootstrap.class, args); + } +} diff --git a/hera-admin/src/main/java/com/dfire/config/AdminCheck.java b/hera-admin/src/main/java/com/dfire/config/AdminCheck.java new file mode 100755 index 00000000..e3596c54 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/AdminCheck.java @@ -0,0 +1,12 @@ +package com.dfire.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface AdminCheck { +} diff --git a/hera-admin/src/main/java/com/dfire/config/DruidConfig.java b/hera-admin/src/main/java/com/dfire/config/DruidConfig.java new file mode 100755 index 00000000..4125ab80 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/DruidConfig.java @@ -0,0 +1,50 @@ +package com.dfire.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +/** + * + * @author xiaosuda + * @date 2018/7/26 + */ +@Configuration +public class DruidConfig { + + + @Bean + @Primary + @ConfigurationProperties("druid.datasource") + public DataSource druidDateSource() { + return new DruidDataSource(); + } + + + @Bean + @Primary + public ServletRegistrationBean druidStatViewServlet() { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*"); + servletRegistrationBean.addInitParameter("loginUsername","hera"); + servletRegistrationBean.addInitParameter("loginPassword","admin"); + servletRegistrationBean.addInitParameter("resetEnable","false"); + return servletRegistrationBean; + } + + + @Bean + @Primary + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); + filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } +} diff --git a/hera-admin/src/main/java/com/dfire/config/HeraAspect.java b/hera-admin/src/main/java/com/dfire/config/HeraAspect.java new file mode 100755 index 00000000..2187e467 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/HeraAspect.java @@ -0,0 +1,217 @@ +package com.dfire.config; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraGroup; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraPermission; +import com.dfire.common.entity.vo.HeraGroupVo; +import com.dfire.common.entity.vo.HeraJobVo; +import com.dfire.common.enums.RunAuthType; +import com.dfire.common.exception.NoPermissionException; +import com.dfire.common.service.HeraGroupService; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.service.HeraPermissionService; +import com.dfire.common.util.StringUtil; +import com.dfire.core.util.JwtUtils; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Arrays; + +/** + * @author xiaosuda + * @date 2018/8/1 + */ +@Aspect +@Component +public class HeraAspect { + + + @Autowired + @Qualifier("heraJobMemoryService") + private HeraJobService heraJobService; + + @Autowired + private HeraPermissionService heraPermissionService; + + @Autowired + private HeraGroupService heraGroupService; + + @Pointcut("execution(* com.dfire.controller..*(..)) || @annotation(RunAuth)") + private void auth() { + + } + + @Around("auth()") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + Method method = getMethod(joinPoint); + if (method != null) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + if (method.isAnnotationPresent(AdminCheck.class)) { + checkAdmin(request); + } + if (method.isAnnotationPresent(RunAuth.class)) { + checkRunAuth(method, request, joinPoint); + } + } + Long start = System.currentTimeMillis(); + Object res; + res = joinPoint.proceed(); + Long end = System.currentTimeMillis(); + if (start - end >= 10 * 1000L) { + HeraLog.warn("方法名:{},参数:{},耗时:{}ms", joinPoint.getSignature().getName(), Arrays.asList(joinPoint.getArgs()), end - start); + } + return res; + } + + /** + * 解析方法上的@RunAuth注解参数 + * + * @param method 包含RunAuth注解的方法 + * @param request request + * @param joinPoint 切面 + * @throws NoPermissionException 无权限 + * @throws IllegalArgumentException 参数错误 + */ + private void checkRunAuth(Method method, HttpServletRequest request, ProceedingJoinPoint joinPoint) throws NoPermissionException, IllegalArgumentException { + if (!method.isAnnotationPresent(RunAuth.class)) { + throw new IllegalArgumentException("方法" + method.getName() + "不含@RunAuth注解"); + } + RunAuth runAuth = method.getAnnotation(RunAuth.class); + Integer runId = null; + RunAuthType runAuthType; + if (runAuth.typeIndex() != -1) { + runAuthType = (RunAuthType) getRunId(joinPoint, runAuth.typeIndex()); + } else { + runAuthType = runAuth.authType(); + } + // -1表示参数是个vo,并且在首位0 + if (runAuth.idIndex() == -1) { + Object param = getRunId(joinPoint, 0); + if (runAuthType == RunAuthType.JOB) { + if (param instanceof HeraJobVo) { + runId = ((HeraJobVo) param).getId(); + } else if (param instanceof HeraJob) { + runId = ((HeraJob) param).getId(); + } + } else { + if (param instanceof HeraGroup) { + runId = ((HeraGroup) param).getId(); + } else if (param instanceof HeraGroupVo) { + runId = ((HeraGroupVo) param).getId(); + } + } + } else { + Object param = getRunId(joinPoint, runAuth.idIndex()); + + if (param == null) { + throw new IllegalArgumentException("参数格式错误"); + } + if (runAuthType == RunAuthType.GROUP && param instanceof String) { + runId = StringUtil.getGroupId((String) param); + } else { + if (param instanceof Integer) { + runId = (Integer) param; + } else { + runId = Integer.parseInt(String.valueOf(param)); + } + } + } + if (runId == null) { + throw new IllegalArgumentException("参数格式错误"); + } + checkPermission(getOwner(request), runId, runAuthType); + } + + private void checkPermission(String owner, Integer id, RunAuthType runAuthType) throws NoPermissionException { + String errorMsg = "抱歉,您没有权限进行此操作"; + if (owner == null || id == null) { + if (owner == null) { + ErrorLog.warn("owner为null,无权限执行"); + } else { + ErrorLog.warn("id为null,无权限执行"); + } + throw new NoPermissionException(errorMsg); + } + if (isAdmin(owner)) { + return; + } + if (runAuthType == null) { + throw new IllegalArgumentException("RunAuthType 参数有误"); + } + if (RunAuthType.JOB == runAuthType) { + HeraJob job = heraJobService.findMemById(id); + if (job != null && !job.getOwner().equals(owner)) { + HeraPermission permission = heraPermissionService.findByCond(id, owner, runAuthType.getName()); + if (permission == null) { + ErrorLog.warn(owner + "无权限操作任务:" + id); + throw new NoPermissionException(errorMsg); + } + } + } else if (RunAuthType.GROUP == runAuthType) { + HeraGroup group = heraGroupService.findById(id); + if (group != null && !owner.equals(group.getOwner())) { + if (heraPermissionService.findByCond(id, owner, runAuthType.getName()) == null) { + ErrorLog.warn(owner + "无权限操作组:" + id); + throw new NoPermissionException(errorMsg); + } + } + } + } + + private Object getRunId(ProceedingJoinPoint joinPoint, int argIndex) { + if (joinPoint.getArgs() == null || joinPoint.getArgs().length < argIndex) { + throw new IllegalArgumentException(joinPoint.getSignature().toShortString() + ":@RunAuth参数下标越界"); + } + return joinPoint.getArgs()[argIndex]; + } + + + /** + * 检测用户是否为超级用户 + * + * @param request request + */ + private void checkAdmin(HttpServletRequest request) throws NoPermissionException { + if (!isAdmin(getOwner(request))) { + throw new NoPermissionException("操作无权限,请使用超级用户执行该操作"); + } + } + + private boolean isAdmin(String owner) { + return owner.equals(HeraGlobalEnv.getAdmin()); + } + + + private String getOwner(HttpServletRequest request) { + return JwtUtils.getObjectFromToken(Constants.TOKEN_NAME, request, Constants.SESSION_USERNAME); + } + + /** + * 根据切面获得当前执行的方法 + * + * @param jp 切面 + * @return 方法 + */ + private Method getMethod(JoinPoint jp) { + Method proxyMethod = ((MethodSignature) jp.getSignature()).getMethod(); + try { + return jp.getTarget().getClass().getMethod(proxyMethod.getName(), proxyMethod.getParameterTypes()); + } catch (NoSuchMethodException | SecurityException ignored) { + } + return null; + } +} diff --git a/hera-admin/src/main/java/com/dfire/config/HeraExceptionHandler.java b/hera-admin/src/main/java/com/dfire/config/HeraExceptionHandler.java new file mode 100755 index 00000000..43995ec8 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/HeraExceptionHandler.java @@ -0,0 +1,95 @@ +package com.dfire.config; + +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.model.TableResponse; +import com.dfire.common.exception.NoPermissionException; +import com.dfire.logs.ErrorLog; +import org.springframework.beans.factory.BeanFactoryUtils; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerExecutionChain; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.NoHandlerFoundException; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import org.springframework.web.servlet.support.RequestContextUtils; +import org.springframework.web.servlet.view.json.MappingJackson2JsonView; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Map; + +/** + * desc: + * + * @author scx + * @create 2019/06/18 + */ +@ControllerAdvice +public class HeraExceptionHandler { + + @ExceptionHandler(Exception.class) + public Object handlerException(HttpServletRequest request, Exception ex) { + ErrorLog.error("请求" + request.getRequestURI() + "异常:", ex); + return getReturn(getReturnType(request), HttpStatus.INTERNAL_SERVER_ERROR, "请求异常,请联系管理员", "当您看到这个页面,表示该应用出错,请联系管理员进行解决"); + } + + + @ExceptionHandler(MissingServletRequestParameterException.class) + public Object handlerMissParameterException(HttpServletRequest request) { + return getReturn(getReturnType(request), HttpStatus.BAD_GATEWAY, "参数不完整,请核查", "当你看到这个页面,说明你请求的参数不正确,请核查"); + } + + @ExceptionHandler(NoPermissionException.class) + public ModelAndView handlerNoPermissionException(HttpServletRequest request) { + return getReturn(getReturnType(request), HttpStatus.FORBIDDEN, "操作无权限", "当你看到这个页面,说明你访问了你无权限访问的页面或者请求,请向管理员申请相关权限"); + } + + + @ExceptionHandler(NoHandlerFoundException.class) + public ModelAndView handlerNotFoundException(HttpServletRequest request) { + ErrorLog.error("请求" + request.getRequestURI() + "404异常"); + return getReturn(NoHandlerFoundException.class, HttpStatus.NOT_FOUND, "page not found", "当您看到这个页面,表示您的访问出错,这个错误是您打开的页面不存在,请确认您输入的地址是正确的,如果是在本站点击后出现这个页面,请联系管理员进行处理感谢您的支持!"); + } + + private ModelAndView getReturn(Class returnType, HttpStatus internalServerError, String errorMsg, String content) { + if (returnType == JsonResponse.class) { + ModelAndView json = new ModelAndView(new MappingJackson2JsonView()); + json.addAllObjects(new JsonResponse(false, errorMsg).toMap()); + return json; + } else if (returnType == TableResponse.class) { + ModelAndView json = new ModelAndView(new MappingJackson2JsonView()); + json.addAllObjects(new TableResponse(-1, errorMsg).toMap()); + return json; + } else { //String 、ModelAndView都返回错误页面 + ModelAndView modelAndView = new ModelAndView("/error.index"); + modelAndView.addObject("msg", errorMsg); + modelAndView.addObject("code", internalServerError.value()); + modelAndView.addObject("content", content); + return modelAndView; + } + } + + private Class getReturnType(HttpServletRequest request) { + WebApplicationContext context = RequestContextUtils.findWebApplicationContext(request); + Map mappingMap = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false); + HandlerExecutionChain chain; + for (HandlerMapping handlerMapping : mappingMap.values()) { + try { + if (handlerMapping instanceof RequestMappingHandlerMapping && (chain = handlerMapping.getHandler(request)) != null) { + Method method = ((HandlerMethod) chain.getHandler()).getMethod(); + return method.getReturnType(); + } + } catch (Exception e) { + ErrorLog.error("获取返回类型失败", e); + } + } + return null; + } + + +} diff --git a/hera-admin/src/main/java/com/dfire/config/HeraRunListener.java b/hera-admin/src/main/java/com/dfire/config/HeraRunListener.java new file mode 100755 index 00000000..92cb65b3 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/HeraRunListener.java @@ -0,0 +1,106 @@ +package com.dfire.config; + +import com.dfire.common.util.ActionUtil; +import com.dfire.logs.MonitorLog; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.SpringApplicationRunListener; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; + +import java.util.Date; + +/** + * desc: + * hera启动监听 + * + * @author scx + * @create 2019/03/25 + */ +public class HeraRunListener implements SpringApplicationRunListener { + + + private Date startTime; + private SpringApplication application; + private String[] args; + + + public HeraRunListener(SpringApplication application, String[] args) { + this.application = application; + this.args = args; + } + + @Override + public void starting() { + startTime = new Date(); + MonitorLog.info("spring starting: " + ActionUtil.getDefaultFormatterDate(startTime)); + } + + @Override + public void environmentPrepared(ConfigurableEnvironment environment) { + MonitorLog.info("spring environmentPrepared"); + + + } + + @Override + public void contextPrepared(ConfigurableApplicationContext context) { + MonitorLog.info("spring contextPrepared"); + + } + + @Override + public void contextLoaded(ConfigurableApplicationContext context) { + MonitorLog.info("spring contextLoaded"); + + } + + @Override + public void finished(ConfigurableApplicationContext context, Throwable exception) { + Date endTime = new Date(); + int serverPort = Integer.parseInt(context.getEnvironment().getProperty("server.port")); + MonitorLog.info("Tomcat started on port(s):" + serverPort); + MonitorLog.info("固定集群ip为:" + HeraGlobalEnv.getEmrFixedHost()); + MonitorLog.info("==========启动完成了: " + ActionUtil.getDefaultFormatterDate(endTime) + "; 共花费: " + DateBetween(startTime, endTime)); + } + + + private String DateBetween(Date start, Date end) { + if (start.compareTo(end) > 0) { + Date tmp; + tmp = start; + start = end; + end = tmp; + } + + long cost = (end.getTime() - start.getTime()) / 1000; + + long hours, minute, seconds; + + hours = cost / 60 / 60; + + cost = cost % (60 * 60); + + minute = cost / 60; + cost = cost % 60; + seconds = cost; + StringBuilder res = new StringBuilder(); + if (hours > 9) { + res.append(hours); + } else { + res.append("0").append(hours); + } + res.append(":"); + if (minute > 9) { + res.append(minute); + } else { + res.append("0").append(minute); + } + res.append(":"); + if (seconds > 9) { + res.append(seconds); + } else { + res.append("0").append(seconds); + } + return res.toString(); + } +} diff --git a/hera-admin/src/main/java/com/dfire/config/RunAuth.java b/hera-admin/src/main/java/com/dfire/config/RunAuth.java new file mode 100755 index 00000000..4f7ccdcb --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/RunAuth.java @@ -0,0 +1,38 @@ +package com.dfire.config; + +import com.dfire.common.enums.RunAuthType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * @author scx + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RunAuth { + + /** + * 需要赋权的类型 + * + * @return RunAuthType + */ + RunAuthType authType() default RunAuthType.JOB; + + /** + * id 的下标 -1表示第一个参数是vo + * + * @return int + */ + int idIndex() default 0; + + /** + * 赋权类型的下标,会覆盖authType + * + * @return + */ + int typeIndex() default -1; +} diff --git a/hera-admin/src/main/java/com/dfire/config/SwaggerBootstrapUiDemoApplication.java b/hera-admin/src/main/java/com/dfire/config/SwaggerBootstrapUiDemoApplication.java new file mode 100755 index 00000000..84e986bf --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/SwaggerBootstrapUiDemoApplication.java @@ -0,0 +1,24 @@ +package com.dfire.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import springfox.documentation.spring.web.SpringfoxWebMvcConfiguration; + +/** + * desc: + * + * @author scx + * @create 2020/09/17 + */ +//@ConditionalOnClass(SpringfoxWebMvcConfiguration.class) +@Configuration +public class SwaggerBootstrapUiDemoApplication extends WebMvcConfigurerAdapter { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } +} diff --git a/hera-admin/src/main/java/com/dfire/config/SwaggerConfiguration.java b/hera-admin/src/main/java/com/dfire/config/SwaggerConfiguration.java new file mode 100755 index 00000000..58b9ed97 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/SwaggerConfiguration.java @@ -0,0 +1,42 @@ +package com.dfire.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * desc: + * + * @author scx + * @create 2020/09/17 + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfiguration { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.dfire.controller")) + .paths(PathSelectors.any()) + .build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("swagger-bootstrap-ui RESTful APIs") + .description("swagger-bootstrap-ui") + .termsOfServiceUrl("http://localhost:8121/") + .contact("developer@mail.com") + .version("1.0") + .build(); + } +} diff --git a/hera-admin/src/main/java/com/dfire/config/UnCheckLogin.java b/hera-admin/src/main/java/com/dfire/config/UnCheckLogin.java new file mode 100755 index 00000000..b2fe1663 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/UnCheckLogin.java @@ -0,0 +1,15 @@ +package com.dfire.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by xiaosuda on 2018/7/24. + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface UnCheckLogin { + +} diff --git a/hera-admin/src/main/java/com/dfire/config/WebSecurityConfig.java b/hera-admin/src/main/java/com/dfire/config/WebSecurityConfig.java new file mode 100755 index 00000000..56cf12f7 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/config/WebSecurityConfig.java @@ -0,0 +1,71 @@ +package com.dfire.config; + +import com.dfire.common.constants.Constants; +import com.dfire.controller.BaseHeraController; +import com.dfire.core.util.JwtUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.config.annotation.InterceptorRegistration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author: 凌霄 + * @time: Created in 上午11:09 2018/5/22 + * @desc + */ +@Configuration +public class WebSecurityConfig extends WebMvcConfigurerAdapter { + + @Bean + public SecurityInterceptor getSecurityInterceptor() { + return new SecurityInterceptor(); + } + + @Override + public void addInterceptors(InterceptorRegistry interceptorRegistry) { + InterceptorRegistration addRegistry = interceptorRegistry.addInterceptor(getSecurityInterceptor()); + addRegistry.excludePathPatterns("/error").excludePathPatterns("/login/**"); + } + + private class SecurityInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (!(handler instanceof HandlerMethod)) { + return true; + } + HandlerMethod method = (HandlerMethod) handler; + UnCheckLogin methodAnnotation = method.getMethodAnnotation(UnCheckLogin.class); + if (methodAnnotation != null) { + return true; + } + UnCheckLogin declaredAnnotation = method.getBeanType().getDeclaredAnnotation(UnCheckLogin.class); + if (declaredAnnotation != null) { + return true; + } + String heraToken = JwtUtils.getValFromCookies(Constants.TOKEN_NAME, request); + if (StringUtils.isNotBlank(heraToken) && JwtUtils.verifyToken(heraToken)) { + return true; + } + request.getRequestDispatcher("/login").forward(request, response); + return false; + } + + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + BaseHeraController.remove(); + super.postHandle(request, response, handler, modelAndView); + } + } + + +} diff --git a/hera-admin/src/main/java/com/dfire/controller/BaseHeraController.java b/hera-admin/src/main/java/com/dfire/controller/BaseHeraController.java new file mode 100755 index 00000000..3a5f6c6a --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/BaseHeraController.java @@ -0,0 +1,170 @@ +package com.dfire.controller; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraRecord; +import com.dfire.common.enums.LogTypeEnum; +import com.dfire.common.enums.RecordTypeEnum; +import com.dfire.common.enums.RunAuthType; +import com.dfire.common.service.HeraRecordService; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.util.JwtUtils; +import com.dfire.logs.ErrorLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.ModelAttribute; + +import javax.servlet.http.HttpServletRequest; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author xiaosuda + * @date 2018/7/19 + */ +public abstract class BaseHeraController { + + + private static ThreadPoolExecutor poolExecutor; + private static ThreadLocal requestThread = new ThreadLocal<>(); + @Autowired + protected HeraRecordService recordService; + @Autowired + ScheduleCenterController scheduleCenterController; + + { + poolExecutor = new ThreadPoolExecutor( + 1, Runtime.getRuntime().availableProcessors() * 4, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("updateJobThread"), new ThreadPoolExecutor.AbortPolicy()); + poolExecutor.allowCoreThreadTimeOut(true); + } + + public static void remove() { + requestThread.remove(); + } + + public static void set(HttpServletRequest request) { + if(requestThread.get() == null) { + requestThread.set(request); + } + } + + protected String getIp() { + String unKnow = "unknown"; + HttpServletRequest request = requestThread.get(); + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || unKnow.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || unKnow.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || unKnow.equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || unKnow.equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || unKnow.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } + + @ModelAttribute + protected void setRequest(HttpServletRequest request) { + requestThread.set(request); + } + + protected String getOwner() { + return JwtUtils.getObjectFromToken(Constants.TOKEN_NAME, requestThread.get(), Constants.SESSION_USERNAME); + } + + protected String getSsoName() { + return JwtUtils.getObjectFromToken(Constants.TOKEN_NAME, requestThread.get(), Constants.SESSION_SSO_NAME); + } + + protected String getOwnerId() { + return JwtUtils.getObjectFromToken(Constants.TOKEN_NAME, requestThread.get(), Constants.SESSION_USER_ID); + } + + protected String getSsoId() { + return JwtUtils.getObjectFromToken(Constants.TOKEN_NAME, requestThread.get(), Constants.SESSION_SSO_ID); + } + + protected void addRecord(LogTypeEnum jobType, Integer jobId, String content, RecordTypeEnum typeEnum, String owner, String ownerId) { + recordService.add(HeraRecord.builder() + .logId(jobId) + .logType(jobType.getName()) + .content(content) + .sso(owner) + .gid(Integer.parseInt(ownerId)) + .type(typeEnum.getId()) + .build()); + } + + + protected void addJobRecord(Integer jobId, String content, RecordTypeEnum typeEnum, String owner, String ownerId) { + recordService.add(HeraRecord.builder() + .logId(jobId) + .logType(LogTypeEnum.JOB.getName()) + .content(content) + .sso(owner) + .gid(Integer.parseInt(ownerId)) + .type(typeEnum.getId()) + .build()); + } + + + protected void addGroupRecord(Integer jobId, String content, RecordTypeEnum typeEnum, String owner, String ownerId) { + recordService.add(HeraRecord.builder() + .logId(jobId) + .logType(LogTypeEnum.GROUP.getName()) + .content(content) + .sso(owner) + .gid(Integer.parseInt(ownerId)) + + .type(typeEnum.getId()) + .build()); + } + + protected void addDebugRecord(Integer jobId, String content, RecordTypeEnum typeEnum, String ownerName, String ownerId) { + recordService.add(HeraRecord.builder() + .logId(jobId) + .logType(LogTypeEnum.DEBUG.getName()) + .content(content) + .sso(ownerName) + .gid(Integer.parseInt(ownerId)) + .type(typeEnum.getId()) + .build()); + } + + protected void addUserRecord(Integer userId, String content, RecordTypeEnum typeEnum, String ssoName, String ownerId) { + recordService.add(HeraRecord.builder() + .logId(userId) + .logType(LogTypeEnum.USER.getName()) + .content(content) + .sso(ssoName) + .gid(Integer.parseInt(ownerId)) + .type(typeEnum.getId()) + .build()); + } + + protected void checkPermission(Integer jobId, RunAuthType type) { + scheduleCenterController.doAspectAuth(jobId, type); + } + + + protected void doAsync(Runnable runnable) { + poolExecutor.execute(() -> { + try { + runnable.run(); + } catch (Exception e) { + ErrorLog.error("异步执行异常", e); + } + }); + } + + protected boolean isAdmin() { + return HeraGlobalEnv.getAdmin().equals(getOwner()); + } +} diff --git a/hera-admin/src/main/java/com/dfire/controller/DevelopCenterController.java b/hera-admin/src/main/java/com/dfire/controller/DevelopCenterController.java new file mode 100755 index 00000000..47f731e0 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/DevelopCenterController.java @@ -0,0 +1,274 @@ +package com.dfire.controller; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraDebugHistory; +import com.dfire.common.entity.HeraFile; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.enums.RecordTypeEnum; +import com.dfire.common.service.HeraDebugHistoryService; +import com.dfire.common.service.HeraFileService; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.worker.WorkClient; +import com.dfire.logs.MonitorLog; +import com.dfire.protocol.JobExecuteKind; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; + +/** + * @author: 凌霄 + * @time: Created in 16:34 2018/1/13 + * @desc 开发中心 + */ +@Controller +@RequestMapping("/developCenter") +@Api("开发中心接口") +public class DevelopCenterController extends BaseHeraController { + + @Autowired + @Qualifier("heraFileMemoryService") + private HeraFileService heraFileService; + @Autowired + private HeraDebugHistoryService debugHistoryService; + @Autowired + private WorkClient workClient; + + + @RequestMapping(method = RequestMethod.GET) + @ApiOperation("页面跳转") + public String dev() { + return "developCenter/developCenter.index"; + } + + @RequestMapping(value = "/init", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("获取开发中心个人文档和所有文档") + public JsonResponse initFileTree() { + return new JsonResponse(true, heraFileService.buildFileTree(getOwner())); + } + + @RequestMapping(value = "/addFile", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("添加新的脚本") + public JsonResponse addFileAndFolder(@ApiParam(value = "file对象", required = true) HeraFile heraFile) { + Integer parent = heraFile.getParent(); + HeraFile parentFile = heraFileService.findById(parent); + if (Constants.FILE_ALL_NAME.equals(parentFile.getOwner())) { + heraFile.setOwner(Constants.FILE_ALL_NAME); + } else { + heraFile.setOwner(getOwner()); + } + Integer id = heraFileService.insert(heraFile); + + addDebugRecord(id, heraFile.getName(), RecordTypeEnum.Add, getSsoName(), getOwnerId()); + return new JsonResponse(true, id); + } + + @RequestMapping(value = "/find", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("查询脚本内容") + public JsonResponse getHeraFile(@ApiParam(value = "file对象", required = true) HeraFile heraFile) { + return new JsonResponse(true, heraFileService.findById(heraFile.getId())); + } + + @RequestMapping(value = "/delete", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("删除脚本") + public JsonResponse delete(@ApiParam(value = "file对象", required = true) HeraFile heraFile) { + HeraFile file = heraFileService.findById(heraFile.getId()); + if (Constants.FILE_SELF.equals(file.getName())) { + return new JsonResponse(false, "无法删除个人文档"); + } else if (Constants.FILE_ALL.equals(file.getName())) { + return new JsonResponse(false, "无法删除共享文档"); + } + boolean res = heraFileService.delete(heraFile.getId()) > 0; + addDebugRecord(heraFile.getId(), heraFile.getName(), RecordTypeEnum.DELETE, getSsoName(), getOwnerId()); + return new JsonResponse(res, res ? "删除成功" : "删除失败"); + } + + @RequestMapping(value = "/rename", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("脚本重命名") + public JsonResponse rename(@ApiParam(value = "file对象", required = true) HeraFile heraFile) { + return new JsonResponse(true, heraFileService.updateFileName(heraFile) > 0 ? "更新成功" : "更新失败"); + } + + + /** + * 手动执行脚本 + * + * @param heraFile + * @return + */ + @RequestMapping(value = "/debug", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("执行整个脚本") + public JsonResponse debug(@RequestBody @ApiParam(value = "file对象", required = true) HeraFile heraFile) throws ExecutionException, InterruptedException, TimeoutException { + String owner = getOwner(); + HeraFile file = heraFileService.findById(heraFile.getId()); + if (file == null) { + return new JsonResponse(false, "脚本已被删除"); + } + String name = file.getName(); + file.setContent(heraFile.getContent()); + heraFileService.updateContent(heraFile); + HeraDebugHistory history = HeraDebugHistory.builder() + .fileId(file.getId()) + .script(heraFile.getContent()) + .startTime(new Date()) + .owner(Constants.FILE_ALL_NAME.equals(file.getOwner()) ? owner : file.getOwner()) + .hostGroupId(file.getHostGroupId() == 0 ? HeraGlobalEnv.defaultWorkerGroup : file.getHostGroupId()) + .build(); + return executeJob(name, history, getSsoName()); + } + + /** + * 手动执行选中的代码 + * + * @param heraFile + * @return + */ + @RequestMapping(value = "/debugSelectCode", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("执行选中脚本") + public JsonResponse debugSelectCode(@RequestBody @ApiParam(value = "file对象", required = true) HeraFile heraFile) throws ExecutionException, InterruptedException, TimeoutException { + String owner = getOwner(); + HeraFile file = heraFileService.findById(heraFile.getId()); + file.setContent(heraFile.getContent()); + String name = file.getName(); + HeraDebugHistory history = HeraDebugHistory.builder() + .jobId(file.getJobId()) + .fileId(file.getId()) + .script(heraFile.getContent()) + .startTime(new Date()) + .owner(owner) + .hostGroupId(file.getHostGroupId() == 0 ? HeraGlobalEnv.defaultWorkerGroup : file.getHostGroupId()) + .build(); + return executeJob(name, history, getSsoName()); + } + + private JsonResponse executeJob(String name, HeraDebugHistory history, String ssoName) throws ExecutionException, InterruptedException, TimeoutException { + int suffixIndex = name.lastIndexOf(Constants.POINT); + if (suffixIndex == -1) { + return new JsonResponse(false, "无后缀名,请设置支持的后缀名[.sh .hive .spark]"); + } + String suffix = name.substring(suffixIndex); + String runType; + if ((Constants.HIVE_SUFFIX).equalsIgnoreCase(suffix)) { + runType = Constants.HIVE_FILE; + } else if ((Constants.SHELL_SUFFIX).equalsIgnoreCase(suffix)) { + runType = Constants.SHELL_FILE; + } else if ((Constants.SPARK_SUFFIX).equalsIgnoreCase(suffix)) { + runType = Constants.SPARK_FILE; + } else { + return new JsonResponse(false, "暂未支持的后缀名[" + suffix + "],请设置支持的后缀名[.sh .hive .spark]"); + } + history.setRunType(runType); + Long newId = debugHistoryService.insert(history); + String ownerId = getOwnerId(); + doAsync(() -> addDebugRecord(history.getFileId(), String.valueOf(history.getId()), RecordTypeEnum.Execute, ssoName, ownerId)); + workClient.executeJobFromWeb(JobExecuteKind.ExecuteKind.DebugKind, newId); + Map res = new HashMap<>(2); + res.put("fileId", history.getFileId()); + res.put("debugId", newId); + return new JsonResponse(true, "执行成功", res); + } + + /** + * 获取脚本执行历史 + * + * @param fileId + * @return + */ + @RequestMapping(value = "findDebugHistory", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("查看执行历史记录") + public JsonResponse findDebugHistory(@ApiParam(value = "fileid", required = true) Integer fileId) { + return new JsonResponse(true, debugHistoryService.findByFileId(fileId)); + } + + /** + * 取消执行脚本 + * + * @param id + * @return + */ + @RequestMapping(value = "/cancelJob", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("取消任务") + public JsonResponse cancelJob(@ApiParam(value = "fileid", required = true) Long id) throws ExecutionException, InterruptedException, TimeoutException { + return new JsonResponse(true, workClient.cancelJobFromWeb(JobExecuteKind.ExecuteKind.DebugKind, id)); + } + + + @RequestMapping(value = "/getLog", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("获取日志") + public JsonResponse getJobLog(@ApiParam(value = "fileid", required = true) Integer id) { + return new JsonResponse(true, debugHistoryService.findLogById(id)); + } + + + @RequestMapping(value = "/check", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("权限检测") + public JsonResponse check(@ApiParam(value = "fileid", required = true) Integer id) { + if (checkPermission(id)) { + return new JsonResponse(true, "查询成功", true); + } else { + return new JsonResponse(true, "无权限", false); + } + } + + @RequestMapping(value = "/moveNode", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("节点移动") + public JsonResponse moveNode(@ApiParam(value = "fileid", required = true) Integer id + , @ApiParam(value = "file移动前父目录id", required = true) Integer parent + , @ApiParam(value = "file移动后父目录id", required = true) Integer lastParent) { + if (!checkPermission(id)) { + return new JsonResponse(false, "无权限,移动失败"); + } + boolean res = heraFileService.updateParentById(id, parent); + if (res) { + addDebugRecord(id, lastParent + "=>" + parent, RecordTypeEnum.MOVE, getSsoName(), getOwnerId()); + MonitorLog.info("开发中心任务{}【移动】:{} ----> {}", id, lastParent, parent); + return new JsonResponse(true, "移动成功"); + } else { + return new JsonResponse(false, "移动失败,请联系管理员"); + } + } + + private boolean checkPermission(Integer id) { + if (isAdmin()) { + return true; + } + HeraFile heraFile = heraFileService.findById(id); + return heraFile != null && heraFile.getOwner().equals(getOwner()); + } + + @RequestMapping(value = "saveScript", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("保存脚本") + public JsonResponse saveScript(@RequestBody @ApiParam(value = "file对象", required = true) HeraFile heraFile) { + boolean result = heraFileService.updateContent(heraFile) > 0; + return new JsonResponse(result, result ? "保存成功" : "保存失败"); + } + + + + +} diff --git a/hera-admin/src/main/java/com/dfire/controller/EchoController.java b/hera-admin/src/main/java/com/dfire/controller/EchoController.java new file mode 100755 index 00000000..e69de29b diff --git a/hera-admin/src/main/java/com/dfire/controller/HealthController.java b/hera-admin/src/main/java/com/dfire/controller/HealthController.java new file mode 100755 index 00000000..e69de29b diff --git a/hera-admin/src/main/java/com/dfire/controller/HelpController.java b/hera-admin/src/main/java/com/dfire/controller/HelpController.java new file mode 100755 index 00000000..abd0c686 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/HelpController.java @@ -0,0 +1,25 @@ +package com.dfire.controller; + +import com.dfire.config.UnCheckLogin; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * desc: + * + * @author scx + * @create 2019/11/05 + */ + +@Controller +@RequestMapping("/help") + +public class HelpController { + + @RequestMapping + @UnCheckLogin + public String index() { + return "help"; + } + +} diff --git a/hera-admin/src/main/java/com/dfire/controller/HeraAdviceController.java b/hera-admin/src/main/java/com/dfire/controller/HeraAdviceController.java new file mode 100755 index 00000000..0089aa1f --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/HeraAdviceController.java @@ -0,0 +1,48 @@ +package com.dfire.controller; + +import com.dfire.common.entity.HeraAdvice; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.service.HeraAdviceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @author xiaosuda + * @date 2018/12/5 + */ +@Api("建议/留言接口") +@Controller +@RequestMapping("/adviceController") +public class HeraAdviceController extends BaseHeraController { + + + @Autowired + private HeraAdviceService heraAdviceService; + + + @RequestMapping(method = RequestMethod.GET) + public ModelAndView toPage() { + ModelAndView mv = new ModelAndView("/bugReport"); + mv.addObject("allMsg", heraAdviceService.getAll()); + return mv; + } + + + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("添加留言接口") + public JsonResponse addAdvice(@ApiParam(value = "建议对象", required = true) HeraAdvice heraAdvice) { + if (heraAdvice.getMsg().contains("<") || heraAdvice.getMsg().contains(">")) { + return new JsonResponse(false, "不允许输入特殊符号"); + } + boolean res = heraAdviceService.addAdvice(heraAdvice); + return new JsonResponse(res, res ? "添加成功" : "添加失败"); + } +} diff --git a/hera-admin/src/main/java/com/dfire/controller/HeraRerunController.java b/hera-admin/src/main/java/com/dfire/controller/HeraRerunController.java new file mode 100755 index 00000000..ca5658e2 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/HeraRerunController.java @@ -0,0 +1,203 @@ +package com.dfire.controller; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraRerun; +import com.dfire.common.entity.form.HeraRerunForm; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.model.TableResponse; +import com.dfire.common.entity.vo.HeraRerunVo; +import com.dfire.common.service.HeraJobHistoryService; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.service.HeraRerunService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.Pair; +import com.dfire.config.RunAuth; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * desc: + * + * @author scx + * @create 2019/11/25 + */ +@RequestMapping("/rerun/") +@Controller +@Api("重跑任务接口") +public class HeraRerunController extends BaseHeraController { + + + @Autowired + private HeraRerunService heraRerunService; + + @Autowired + @Qualifier("heraJobMemoryService") + private HeraJobService heraJobService; + + @Autowired + private HeraJobHistoryService heraJobHistoryService; + + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("任务重跑列表") + public TableResponse list(@ApiParam(value = "分页参数", required = true) TablePageForm pageForm, + @ApiParam(value = "状态:-1所有,0开启,1结束", required = true) Integer status) { + Pair> res = heraRerunService.findByPage(pageForm, status); + return new TableResponse(res.fst(), 0, res.snd()); + } + + @RequestMapping(value = "/failed", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("重跑失败列表查询") + public TableResponse failedList(@ApiParam(value = "分页参数", required = true) TablePageForm pageForm, @ApiParam(value = "重跑id", required = true) Integer rerunId) { + HeraRerunVo heraRerun = heraRerunService.findVoById(rerunId); + Pair> res = heraJobHistoryService.findRerunFailed(heraRerun.getJobId() + , String.valueOf(rerunId) + , ActionUtil.getActionByDateStr(heraRerun.getStartTime()) - 1, pageForm); + return new TableResponse(res.fst(), 0, res.snd()); + } + + @RequestMapping(value = "/failed", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("重跑所有失败记录") + public JsonResponse rerunFailed(@ApiParam(value = "重跑id", required = true) Integer rerunId) { + HeraRerunVo lastRerun = heraRerunService.findVoById(rerunId); + String rerunFailedCount = lastRerun.getExtra().getOrDefault(Constants.ACTION_FAILED_NUM, "0"); + if ("0".equals(rerunFailedCount)) { + return new JsonResponse(false, "无失败记录,无需重跑"); + } + Integer realFailedCount = heraJobHistoryService.findRerunFailedCount(lastRerun.getJobId(), String.valueOf(lastRerun.getId()), ActionUtil.getActionByDateStr(lastRerun.getStartTime()) - 1); + + if (realFailedCount != Integer.parseInt(rerunFailedCount)) { + return new JsonResponse(false, "执行记录可能被删除,无法重跑失败"); + } + + HeraRerunVo newRerun = new HeraRerunVo(); + newRerun.setStartTime(lastRerun.getStartTime()); + newRerun.setEndTime(lastRerun.getEndTime()); + newRerun.setGmtCreate(ActionUtil.getTodayString()); + newRerun.setName("重跑失败-" + lastRerun.getName()); + newRerun.setJobId(lastRerun.getJobId()); + newRerun.setSsoName(lastRerun.getSsoName()); + Map extra = new HashMap<>(2); + extra.put(Constants.RERUN_THREAD, lastRerun.getExtra().getOrDefault(Constants.RERUN_THREAD, "1")); + extra.put(Constants.RERUN_FAILED, Boolean.TRUE.toString()); + extra.put(Constants.ACTION_DONE, Boolean.TRUE.toString()); + extra.put(Constants.ACTION_PROCESS_NUM, "0"); + extra.put(Constants.ACTION_ALL_NUM, rerunFailedCount); + extra.put(Constants.LAST_RERUN_ID, String.valueOf(lastRerun.getId())); + newRerun.setExtra(extra); + heraRerunService.add(newRerun); + return new JsonResponse(true, "添加重跑任务成功"); + } + + + @RequestMapping(value = "/status", method = RequestMethod.PUT) + @ResponseBody + @ApiOperation("重跑状态更改") + public JsonResponse update(@ApiParam(value = "重跑id", required = true) Integer id, + @ApiParam(value = "状态:0开启,1结束", required = true) Integer isEnd) { + + if (isEnd == 0) { + HeraRerunVo heraRerun = heraRerunService.findVoById(id); + + if (Integer.parseInt(heraRerun.getExtra().getOrDefault(Constants.ACTION_ALL_NUM, String.valueOf(Integer.MAX_VALUE))) <= Integer.parseInt(heraRerun.getExtra().getOrDefault(Constants.ACTION_PROCESS_NUM, "0"))) { + return new JsonResponse(false, "重跑任务已经结束,无法开启"); + } + + Integer cntByJob = heraRerunService.findCntByJob(heraRerun.getJobId(), 0); + + if (cntByJob > 0) { + return new JsonResponse(false, "存在正在执行的重跑任务,任务ID[" + heraRerun.getJobId() + "],请先关闭之前的重跑任务"); + } + + if (!isAdmin() && !heraRerun.getSsoName().trim().equals(getSsoName())) { + return new JsonResponse(false, "无权限关闭该重跑任务,请联系[" + heraRerun.getSsoName() + "]关闭"); + } + + } + + boolean res = heraRerunService.updateById(HeraRerun.builder() + .id(id) + .isEnd(isEnd) + .build()); + return new JsonResponse(res, res ? (isEnd == 0 ? "开启成功" : "关闭成功") : (isEnd == 0 ? "开启失败" : "关闭失败")); + } + + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + @RunAuth + @Transactional(rollbackFor = Exception.class) + @ApiOperation("重跑任务添加") + public JsonResponse add(@ApiParam(value = "任务id", required = false) Integer jobId + , @ApiParam(value = "重跑json对象,see:HeraRerunForm", required = true) String rerunJson) { + + JSONObject rerunObj = JSONObject.parseObject(rerunJson); + + HeraRerunForm rerunForm = new HeraRerunForm(); + + rerunForm.setName(rerunObj.getString("name")); + + rerunForm.setJobId(rerunObj.getInteger("jobId")); + + rerunForm.setThreads(rerunObj.getString("threads")); + + if (StringUtils.isBlank(rerunForm.getName()) || rerunForm.getName().length() < 4) { + return new JsonResponse(false, "重跑名称不可少,且最短4个字"); + } + + if (rerunForm.getJobId() == null || heraJobService.findMemById(rerunForm.getJobId()) == null) { + return new JsonResponse(false, "任务ID不存在"); + } + Map timeMap = new HashMap<>(rerunObj.size()); + + + for (Map.Entry entry : rerunObj.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (key.startsWith(Constants.RERUN_START_TIME) || key.startsWith(Constants.RERUN_END_TIME)) { + if (value == null || StringUtils.isBlank(entry.getValue().toString())) { + return new JsonResponse(false, "重跑时间不允许为空"); + } + timeMap.put(key, String.valueOf(value)); + } + + } + int dateSize = timeMap.size() / 2; + + for (int i = 0; i < dateSize; i++) { + String startTime = timeMap.get(Constants.RERUN_START_TIME + i); + String endTime = timeMap.get(Constants.RERUN_END_TIME + i); + heraRerunService.add(HeraRerunVo.builder() + .jobId(rerunForm.getJobId()) + .name(rerunForm.getName()) + .startTime(startTime) + .endTime(endTime) + .gmtCreate(ActionUtil.getTodayString()) + .ssoName(getSsoName()) + .extra(Collections.singletonMap(Constants.RERUN_THREAD, rerunForm.getThreads())) + .build()); + + } + + return new JsonResponse(true, "添加成功"); + } + + +} diff --git a/hera-admin/src/main/java/com/dfire/controller/HostGroupController.java b/hera-admin/src/main/java/com/dfire/controller/HostGroupController.java new file mode 100755 index 00000000..1a06fbb2 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/HostGroupController.java @@ -0,0 +1,78 @@ +package com.dfire.controller; + +import com.dfire.common.entity.HeraHostGroup; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.model.TableResponse; +import com.dfire.common.service.HeraHostGroupService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/4/20 + */ +@Controller +@RequestMapping("/hostGroup/") +@Api("机器组相关接口") +public class HostGroupController { + + private final HeraHostGroupService heraHostGroupService; + + + + public HostGroupController(HeraHostGroupService heraHostGroupService) { + this.heraHostGroupService = heraHostGroupService; + } + + + + + + + @RequestMapping(value = "list", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("获取所有机器组列表") + public TableResponse getAll() { + + List groupList = heraHostGroupService.getAll(); + + if (groupList == null) { + return new TableResponse(-1, "查询失败"); + } + return new TableResponse(groupList.size(), 0, groupList); + + } + + + @RequestMapping(value = "add", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("添加机器组") + public JsonResponse add(@ApiParam(value = "机器组", required = true) HeraHostGroup heraHostGroup) { + boolean res = heraHostGroupService.insert(heraHostGroup) > 0; + return new JsonResponse(res, res ? "新增成功" : "新增失败"); + } + + @RequestMapping(value = "update", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("更新机器组") + public JsonResponse update(@ApiParam(value = "机器组", required = true) HeraHostGroup heraHostGroup) { + boolean update = heraHostGroupService.update(heraHostGroup) > 0; + return new JsonResponse(update, update ? "更新成功" : "更新失败"); + } + + @RequestMapping(value = "del", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("删除机器组") + public JsonResponse del(@ApiParam(value = "机器组id", required = true) Integer id) { + int res = heraHostGroupService.delete(id); + return new JsonResponse(res > 0, res > 0 ? "删除成功" : "删除失败"); + } +} diff --git a/hera-admin/src/main/java/com/dfire/controller/JobManageController.java b/hera-admin/src/main/java/com/dfire/controller/JobManageController.java new file mode 100755 index 00000000..31e40e61 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/JobManageController.java @@ -0,0 +1,169 @@ +package com.dfire.controller; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.util.StringUtil; +import com.dfire.form.JobSearchForm; +import com.dfire.monitor.service.JobManageService; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * desc: + * + * @author scx + * @create 2019/07/10 + */ +@Controller +@RequestMapping("job/") +public class JobManageController extends BaseHeraController { + + + @Autowired + private JobManageService jobManageService; + + @Autowired + @Qualifier("heraJobMemoryService") + private HeraJobService heraJobService; + + /** + * 今日任务详情 + * + * @param status 任务状态 + * @return 历史结果 + */ + @RequestMapping(value = "history", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("任务执行详情") + public JsonResponse findJobHistoryByStatus(@RequestParam("status") @ApiParam(value = "任务状态", required = true) String status + , @RequestParam("begindt") @ApiParam(value = "开始日期", required = true) String begindt + , @RequestParam("enddt") @ApiParam(value = "结束日志", required = true) String enddt) { + return jobManageService.findJobHistoryByStatus(status, begindt, enddt); + } + + @RequestMapping(value = "search", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("任务搜索") + public JsonResponse jobSearch(@ApiParam(value = "任务搜索对象", required = true) JobSearchForm searchForm) { + List jobList = heraJobService.getAll(); + + //全部小写处理 + searchForm.setName(getLowerCase(searchForm.getName())); + searchForm.setScript(getLowerCase(searchForm.getScript())); + searchForm.setDescription(getLowerCase(searchForm.getDescription())); + searchForm.setConfig(getLowerCase(searchForm.getConfig())); + searchForm.setRunType(getLowerCase(searchForm.getRunType())); + + return new JsonResponse(true, jobList.parallelStream() + .filter(job -> Optional.ofNullable(searchForm.getAuto()) + .map(auto -> job.getAuto().equals(auto)).orElse(true) + && Optional.ofNullable(searchForm.getRunType()) + .map(runTypeEnum -> runTypeEnum.equals(job.getRunType())).orElse(true) + && Optional.ofNullable(searchForm.getName()) + .map(name -> job.getName().toLowerCase().contains(name)) + .orElse(true) + && Optional.ofNullable(searchForm.getDescription()) + .map(desc -> StringUtils.isNotBlank(job.getDescription()) + && job.getDescription().toLowerCase().contains(searchForm.getDescription())) + .orElse(true) + && Optional.ofNullable(searchForm.getConfig()) + .map(confName -> StringUtils.isNotBlank(job.getConfigs()) && + job.getConfigs().toLowerCase().contains(confName)) + .orElse(true) + && Optional.ofNullable(searchForm.getScript()) + .map(script -> StringUtils.isNotBlank(job.getScript()) + && job.getScript().toLowerCase().contains(script)).orElse(true)) + .map(job -> { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", job.getId()); + jsonObject.put("name", markAsRed(job.getName(), searchForm.getName())); + Map configMap = StringUtil.convertStringToMap(markAsRed(job.getConfigs(), searchForm.getConfig())); + jsonObject.put("config", mapToString(configMap)); + jsonObject.put("configLine", configMap.size()); + if (StringUtils.isBlank(job.getScript())) { + jsonObject.put("script", ""); + } else { + Pair pair = replaceLine(markAsRed(job.getScript(), searchForm.getScript())); + jsonObject.put("script", pair.getLeft()); + jsonObject.put("scriptLine", pair.getRight()); + } + jsonObject.put("runType", job.getRunType()); + jsonObject.put("description", markAsRed(job.getDescription(), searchForm.getDescription())); + return jsonObject; + }) + .collect(Collectors.toList())); + } + + + private String mapToString(Map map) { + StringBuilder builder = new StringBuilder(); + map.forEach((key, value) -> { + if (value.toLowerCase().contains("password")) { + value = "******"; + } + builder.append(key).append("=").append(value).append("
"); + }); + return builder.toString(); + } + + private Pair replaceLine(String script) { + Matcher pattern = Pattern.compile("\n+").matcher(script); + StringBuilder builder = new StringBuilder(); + int start = 0, end = script.length(), line = 1; + while (pattern.find()) { + builder.append(script, start, pattern.start()); + builder.append("
"); + start = pattern.end(); + line++; + } + builder.append(script, start, end); + return new MutablePair<>(builder.toString(), line); + } + + + private String markAsRed(String source, String word) { + if (StringUtils.isBlank(word)) { + return source; + } + Matcher matcher = Pattern.compile(word, Pattern.CASE_INSENSITIVE).matcher(source); + StringBuilder builder = new StringBuilder(); + int start = 0, end = source.length(); + while (matcher.find()) { + builder.append(source, start, matcher.start()); + builder.append("").append(matcher.group()).append(""); + start = matcher.end(); + } + + builder.append(source, start, end); + return builder.toString(); + } + + + private String getLowerCase(String val) { + if (StringUtils.isBlank(val)) { + return null; + } + return val.toLowerCase(); + } + + +} diff --git a/hera-admin/src/main/java/com/dfire/controller/LoginController.java b/hera-admin/src/main/java/com/dfire/controller/LoginController.java new file mode 100755 index 00000000..10607ec4 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/LoginController.java @@ -0,0 +1,187 @@ +package com.dfire.controller; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.HeraUser; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.enums.RecordTypeEnum; +import com.dfire.common.service.HeraSsoService; +import com.dfire.common.service.HeraUserService; +import com.dfire.common.util.StringUtil; +import com.dfire.config.UnCheckLogin; +import com.dfire.core.util.JwtUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import springfox.documentation.annotations.ApiIgnore; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + + +/** + * @author: 凌霄 + * @time: Created in 16:34 2018/1/1 + * @desc 登陆控制器 + */ + +@Api("登陆控制器") +@Controller +public class LoginController extends BaseHeraController { + + @Autowired + private HeraUserService heraUserService; + + @Autowired + private HeraSsoService heraSsoService; + + + @RequestMapping(value = "/",method = RequestMethod.GET) + public String toLogin() { + return "redirect:/login"; + } + + @RequestMapping(value = "/login",method = RequestMethod.GET) + public String login() { + return "/login"; + } + + @RequestMapping(value = "/login/admin",method = RequestMethod.GET) + public String admin() { + return "/admin"; + } + + @RequestMapping(value = "/home",method = RequestMethod.GET) + public String index() { + return "home"; + } + + @UnCheckLogin + @ResponseBody + @RequestMapping(value = "admin/login", method = RequestMethod.POST) + @ResponseStatus(HttpStatus.OK) + @ApiOperation("用户组登陆接口") + public JsonResponse adminLogin(@ApiParam(value = "sso对象",required = true)String userName + , @ApiParam(value = "密码,32为md5",required = true)String password + , @ApiIgnore HttpServletResponse response) { + HeraUser user = heraUserService.findByName(userName.split("@")[0]); + if (user == null) { + return new JsonResponse(false, "用户不存在"); + } + String pwd = user.getPassword(); + if (!StringUtils.isEmpty(password)) { + password = StringUtil.EncoderByMd5(password); + if (pwd.equals(password)) { + if (user.getIsEffective() == 0) { + return new JsonResponse(false, "审核未通过,请联系管理员"); + } + Cookie cookie = new Cookie(Constants.TOKEN_NAME, JwtUtils.createToken(userName, String.valueOf(user.getId()), Constants.DEFAULT_ID, userName)); + cookie.setMaxAge(Constants.LOGIN_TIME_OUT); + cookie.setPath("/"); + response.addCookie(cookie); + addUserRecord(user.getId(), "组账户", RecordTypeEnum.LOGIN, userName, String.valueOf(user.getId())); + return new JsonResponse(true, "登录成功"); + } else { + return new JsonResponse(false, "密码错误,请重新输入"); + } + } + return new JsonResponse(false, "请输入密码"); + } + + @ResponseBody + @UnCheckLogin + @ResponseStatus(HttpStatus.CREATED) + @RequestMapping(value = "admin/register", method = RequestMethod.POST) + @ApiOperation("用户组注册接口") + public JsonResponse adminRegister(@ApiParam(value = "用户组对象",required = true)HeraUser user) { + HeraUser check = heraUserService.findByName(user.getName()); + if (check != null) { + return new JsonResponse(false, "用户名已存在,请更换用户名"); + } + int res = heraUserService.insert(user); + return new JsonResponse(res > 0, res > 0 ? "注册成功,等待管理员审核" : "注册失败,请联系管理员"); + } + + @ResponseBody + @UnCheckLogin + @ResponseStatus(HttpStatus.OK) + @RequestMapping(value = "sso/login", method = RequestMethod.POST) + @ApiOperation("用户登陆接口") + public JsonResponse ssoLogin(@ApiParam(value = "sso对象",required = true) String userName + ,@ApiParam(value = "密码,32为md5",required = true) String password + ,@ApiIgnore HttpServletResponse response) { + HeraSso heraSso = heraSsoService.findSsoByName(userName); + if (heraSso == null) { + return new JsonResponse(false, "用户不存在"); + } + String pwd = heraSso.getPassword(); + if (!StringUtils.isEmpty(password)) { + password = StringUtil.EncoderByMd5(password); + if (pwd.equals(password)) { + if (heraSso.getIsValid() == 0) { + return new JsonResponse(false, "审核未通过,请联系管理员"); + } + + String owner = Optional.of(heraUserService.findById(heraSso.getGid())).orElse(HeraUser.builder().name("read_only").build()).getName(); + Cookie cookie = new Cookie(Constants.TOKEN_NAME, JwtUtils.createToken(owner + , String.valueOf(heraSso.getGid()) + , String.valueOf(heraSso.getId()) + , userName)); + cookie.setMaxAge(Constants.LOGIN_TIME_OUT); + cookie.setPath("/"); + response.addCookie(cookie); + addUserRecord(heraSso.getId(), "sso账户", RecordTypeEnum.LOGIN, userName, String.valueOf(heraSso.getGid())); + return new JsonResponse(true, "登录成功"); + } else { + return new JsonResponse(false, "密码错误,请重新输入"); + } + } + return new JsonResponse(false, "请输入密码"); + } + + @ResponseBody + @UnCheckLogin + @ResponseStatus(HttpStatus.CREATED) + @RequestMapping(value = "sso/register", method = RequestMethod.POST) + @ApiOperation("用户注册接口") + public JsonResponse ssoRegister(@ApiParam(value = "sso对象",required = true) HeraSso heraSso) { + heraSso.setName(heraSso.getEmail().substring(0, heraSso.getEmail().indexOf("@"))); + boolean exist = heraSsoService.checkByName(heraSso.getName()); + if (exist) { + return new JsonResponse(false, "用户名已存在,请更换用户名"); + } + boolean res = heraSsoService.addSso(heraSso); + return new JsonResponse(res, res ? "注册成功,等待管理员审核" : "注册失败,请联系管理员"); + } + + @ResponseBody + @UnCheckLogin + @ResponseStatus(HttpStatus.OK) + @RequestMapping(value = "sso/groups", method = RequestMethod.GET) + @ApiOperation("查询用户组列表") + public JsonResponse ssoGroups() { + List users = heraUserService.getAll(); + if (users == null || users.size() == 0) { + return new JsonResponse(false, "找不到部门,请联系管理员"); + } + List groups = users.stream().filter(user -> user.getIsEffective() == 1).map(x -> { + JSONObject group = new JSONObject(); + group.put("id", x.getId()); + group.put("name", x.getName()); + return group; + }).collect(Collectors.toList()); + return new JsonResponse(true, "查询成功", groups); + } +} diff --git a/hera-admin/src/main/java/com/dfire/controller/RecordController.java b/hera-admin/src/main/java/com/dfire/controller/RecordController.java new file mode 100755 index 00000000..8261f3f2 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/RecordController.java @@ -0,0 +1,162 @@ +package com.dfire.controller; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraRecord; +import com.dfire.common.entity.HeraUser; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.model.TableResponse; +import com.dfire.common.entity.vo.HeraRecordVo; +import com.dfire.common.entity.vo.PageHelper; +import com.dfire.common.enums.LogTypeEnum; +import com.dfire.common.enums.RecordTypeEnum; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.service.HeraUserService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.Pair; +import com.dfire.config.HeraGlobalEnv; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * desc: + * + * @author scx + * @create 2019/07/17 + */ +@Controller +@Api(value = "历史记录查看接口") +@RequestMapping("/record") +public class RecordController extends BaseHeraController { + + + @Autowired + private HeraUserService heraUserService; + + @Autowired + private HeraJobService heraJobService; + + @RequestMapping + public String record() { + return "/jobManage/record.index"; + } + + + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("所有历史查看") + public TableResponse listRecord(@ApiParam(value = "分页", required = true) TablePageForm pageForm) { + String ownerName; + boolean isAdmin = HeraGlobalEnv.getAdmin().equals(ownerName = getOwner()); + + Pair> pair; + Map cacheOwner = new HashMap<>(); + if (isAdmin) { + pair = recordService.selectByPage(pageForm); + } else { + pair = recordService.selectByPage(pageForm, Integer.parseInt(getOwnerId())); + } + List voList = pair.snd().stream().map(record -> { + HeraRecordVo recordVo = new HeraRecordVo(); + BeanUtils.copyProperties(record, recordVo); + recordVo.setCreateTime(ActionUtil.getDefaultFormatterDate(new Date(record.getGmtCreate()))); + recordVo.setType(RecordTypeEnum.parseById(record.getType()).getType()); + if (isAdmin) { + if (!cacheOwner.containsKey(record.getGid())) { + cacheOwner.put(record.getGid(), Optional.of(heraUserService.findById(record.getGid())).map(HeraUser::getName).orElse("none")); + } + recordVo.setGName(cacheOwner.get(record.getGid())); + } else { + recordVo.setGName(ownerName); + } + return recordVo; + }).collect(Collectors.toList()); + return new TableResponse(pair.fst(), 0, voList); + } + + + @RequestMapping(value = "/find", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("根据类型查询历史记录") + @SuppressWarnings("unchecked") + public JsonResponse getRecord(@ApiParam(value = "分页", required = true) PageHelper pageHelper + ) { + Map cacheOwner = new HashMap<>(2); + Map res = recordService.findPageByLogId(pageHelper); + String rows = "rows"; + List vos = ((List) res.get(rows)).stream().map(record -> { + HeraRecordVo recordVo = new HeraRecordVo(); + BeanUtils.copyProperties(record, recordVo); + recordVo.setType(RecordTypeEnum.parseById(record.getType()).getType()); + recordVo.setCreateTime(ActionUtil.getDefaultFormatterDate(new Date(record.getGmtCreate()))); + if (!cacheOwner.containsKey(record.getGid())) { + cacheOwner.put(record.getGid(), Optional.ofNullable(heraUserService.findById(record.getGid())).map(HeraUser::getName).orElse("无")); + } + recordVo.setGName(cacheOwner.get(record.getGid())); + return recordVo; + }).collect(Collectors.toList()); + res.put(rows, vos); + return new JsonResponse(true, res); + + } + + + @RequestMapping("/now") + @ResponseBody + @ApiOperation("查询记录的最新状态") + public JsonResponse findNow(@ApiParam(value = "记录id", required = true) Integer logId + , @ApiParam(value = "记录类型:job,group,debug,upload,user", required = true) String logType + , @ApiParam(value = "操作类型:RecordTypeEnum", required = true) String type) { + LogTypeEnum typeEnum = LogTypeEnum.parseByName(logType); + JSONObject resData = new JSONObject(); + String content = ""; + String runType = "Shell"; + switch (typeEnum) { + case JOB: + HeraJob heraJob = heraJobService.findById(logId); + runType = heraJob.getRunType(); + switch (RecordTypeEnum.parseByName(type)) { + case SCRIPT: + case DELETE: + content = heraJob.getScript(); + break; + case RUN_TYPE: + content = heraJob.getRunType(); + break; + case CRON: + content = heraJob.getCronExpression(); + break; + case CONFIG: + content = heraJob.getConfigs(); + break; + case AREA: + content = heraJob.getAreaId(); + break; + case SWITCH: + content = String.valueOf(heraJob.getAuto()); + break; + default: + break; + } + break; + default: + break; + } + resData.put("content", content); + resData.put("runType", runType); + + return new JsonResponse(true, resData); + } + +} diff --git a/hera-admin/src/main/java/com/dfire/controller/ScheduleCenterController.java b/hera-admin/src/main/java/com/dfire/controller/ScheduleCenterController.java new file mode 100755 index 00000000..2b722426 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/ScheduleCenterController.java @@ -0,0 +1,510 @@ +package com.dfire.controller; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.*; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.model.TableResponse; +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.entity.vo.HeraGroupVo; +import com.dfire.common.entity.vo.HeraJobVo; +import com.dfire.common.entity.vo.PageHelperTimeRange; +import com.dfire.common.enums.*; +import com.dfire.common.exception.NoPermissionException; +import com.dfire.common.service.*; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.util.PasswordUtils; +import com.dfire.common.util.StringUtil; +import com.dfire.common.vo.GroupTaskVo; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.config.RunAuth; +import com.dfire.config.UnCheckLogin; +import com.dfire.core.netty.worker.WorkClient; +import com.dfire.logs.MonitorLog; +import com.dfire.protocol.JobExecuteKind; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 16:50 2018/1/13 + * @desc 调度中心视图管理器 + */ +@Controller +@Api(value = "调度中心") +@RequestMapping("/scheduleCenter") +public class ScheduleCenterController extends BaseHeraController { + + private final HeraJobService heraJobService; + private final HeraJobActionService heraJobActionService; + private final HeraGroupService heraGroupService; + private final HeraJobHistoryService heraJobHistoryService; + private final HeraJobMonitorService heraJobMonitorService; + private final HeraUserService heraUserService; + private final HeraPermissionService heraPermissionService; + private final WorkClient workClient; + private final HeraHostGroupService heraHostGroupService; + private final HeraAreaService heraAreaService; + private final HeraSsoService heraSsoService; + + public ScheduleCenterController(HeraJobMonitorService heraJobMonitorService, @Qualifier("heraJobMemoryService") HeraJobService heraJobService, HeraJobActionService heraJobActionService, @Qualifier("heraGroupMemoryService") HeraGroupService heraGroupService, HeraJobHistoryService heraJobHistoryService, HeraUserService heraUserService, HeraPermissionService heraPermissionService, WorkClient workClient, HeraHostGroupService heraHostGroupService, HeraAreaService heraAreaService, HeraSsoService heraSsoService) { + this.heraJobMonitorService = heraJobMonitorService; + this.heraJobService = heraJobService; + this.heraJobActionService = heraJobActionService; + this.heraGroupService = heraGroupService; + this.heraJobHistoryService = heraJobHistoryService; + this.heraUserService = heraUserService; + this.heraPermissionService = heraPermissionService; + this.workClient = workClient; + this.heraHostGroupService = heraHostGroupService; + this.heraAreaService = heraAreaService; + this.heraSsoService = heraSsoService; + } + + + @RequestMapping(method = RequestMethod.GET) + @ApiOperation(value = "调度中心页面跳转") + public String login() { + return "scheduleCenter/scheduleCenter.index"; + } + + @RequestMapping(value = "/init", method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "获取任务树,包含我的任务和全部任务两个集合") + public JsonResponse initJobTree() { + return new JsonResponse(true, Optional.of(heraJobService.buildJobTree(getOwner(), Integer.parseInt(getSsoId()))).get()); + } + + @RequestMapping(value = "/getJobMessage", method = RequestMethod.GET) + @ResponseBody + @ApiOperation(value = "获取任务信息") + public JsonResponse getJobMessage(@ApiParam(value = "任务ID", required = true) Integer jobId) { + HeraJob job = heraJobService.findById(jobId); + HeraJobVo heraJobVo = BeanConvertUtils.convert(job); + heraJobVo.setInheritConfig(getInheritConfig(job.getGroupId())); + HeraJobMonitor monitor = heraJobMonitorService.findByJobId(jobId); + StringBuilder focusUsers = new StringBuilder("[ "); + Optional.ofNullable(monitor).ifPresent(m -> { + if (StringUtils.isNotBlank(m.getUserIds())) { + String ssoId = getSsoId(); + Arrays.stream(monitor.getUserIds().split(Constants.COMMA)).filter(StringUtils::isNotBlank).distinct().forEach(id -> { + if (ssoId.equals(id)) { + heraJobVo.setFocus(true); + focusUsers.append(Constants.BLANK_SPACE).append(getSsoName()); + } else { + Optional.ofNullable(heraSsoService.findSsoById(Integer.parseInt(id))) + .ifPresent(sso -> focusUsers.append(Constants.BLANK_SPACE).append(sso.getName())); + } + }); + } + }); + focusUsers.append(" ]"); + Optional.ofNullable(heraHostGroupService.findById(job.getHostGroupId())) + .ifPresent(group -> heraJobVo.setHostGroupName(group.getName())); + heraJobVo.setUIdS(getuIds(jobId, RunAuthType.JOB)); + heraJobVo.setFocusUser(focusUsers.toString()); + heraJobVo.setAlarmLevel(AlarmLevel.getName(job.getOffset())); + heraJobVo.setCycle(CycleEnum.parse(job.getCycle()).getDesc()); + configDecry(heraJobVo.getConfigs()); + configDecry(heraJobVo.getInheritConfig()); + //如果无权限,进行变量加密 + if (heraJobVo.getConfigs().keySet().stream().anyMatch(key -> key.toLowerCase().contains(Constants.PASSWORD_WORD)) + || heraJobVo.getInheritConfig().keySet().stream().anyMatch(key -> key.toLowerCase().contains(Constants.PASSWORD_WORD))) { + try { + checkPermission(jobId, RunAuthType.JOB); + } catch (NoPermissionException e) { + encryption(heraJobVo.getConfigs()); + encryption(heraJobVo.getInheritConfig()); + } + } + return new JsonResponse(true, heraJobVo); + } + + + @RunAuth(typeIndex = 1) + @GetMapping("/checkPermission") + @ResponseBody + @ApiOperation(value = "权限检测接口") + public JsonResponse doAspectAuth(@ApiParam(value = "任务ID", required = true) Integer jobId + , @ApiParam(value = "检测类型", required = true) RunAuthType type) { + return new JsonResponse(true, true); + } + + + private void configDecry(Map config) { + Optional.ofNullable(config) + .ifPresent(cxf -> cxf.entrySet() + .stream() + .filter(pair -> pair.getKey().toLowerCase().contains(Constants.SECRET_PREFIX)) + .forEach(entry -> entry.setValue(PasswordUtils.aesDecrypt(entry.getValue())))); + } + + + private void encryption(Map config) { + Optional.ofNullable(config) + .ifPresent(cxf -> cxf.entrySet() + .stream() + .filter(pair -> pair.getKey().toLowerCase().contains(Constants.PASSWORD_WORD)) + .forEach(entry -> entry.setValue("******"))); + } + + /** + * 组下搜索任务 + * + * @param groupId groupId + * @param status all:全部; + * @param pageForm layui table分页参数 + * @return 结果 + */ + @RequestMapping(value = "/getGroupTask", method = RequestMethod.GET) + @ResponseBody + @ApiOperation(value = "某组下搜索任务") + public TableResponse getGroupTask(@ApiParam(value = "组Id", required = true) String groupId, + @ApiParam(value = "任务状态") String status, + @ApiParam(value = "日期", required = true) String dt, + @ApiParam(value = "分页参数", required = true) TablePageForm pageForm) { + + List group = heraGroupService.findDownStreamGroup(StringUtil.getGroupId(groupId)); + + Set groupSet = group.stream().map(HeraGroup::getId).collect(Collectors.toSet()); + List jobList = heraJobService.getAll(); + Set jobIdSet = jobList.stream().filter(job -> groupSet.contains(job.getGroupId())).map(HeraJob::getId).collect(Collectors.toSet()); + SimpleDateFormat format = new SimpleDateFormat("yyMMdd"); + Calendar calendar = Calendar.getInstance(); + String startDate; + Date start; + if (StringUtils.isBlank(dt)) { + start = new Date(); + } else { + try { + start = format.parse(dt); + } catch (ParseException e) { + start = new Date(); + } + } + + calendar.setTime(start); + startDate = ActionUtil.getFormatterDate("yyyyMMdd", calendar.getTime()); + calendar.add(Calendar.DAY_OF_YEAR, +1); + String endDate = ActionUtil.getFormatterDate("yyyyMMdd", calendar.getTime()); + List taskVos = heraJobActionService.findByJobIds(new ArrayList<>(jobIdSet), startDate, endDate, pageForm, status); + return new TableResponse(pageForm.getCount(), 0, taskVos); + } + + @RequestMapping(value = "/getGroupMessage", method = RequestMethod.GET) + @ResponseBody + @ApiOperation(value = "获取组信息") + public JsonResponse getGroupMessage(@ApiParam(value = "组ID", required = true) String groupId) { + Integer id = StringUtil.getGroupId(groupId); + HeraGroup group = heraGroupService.findById(id); + HeraGroupVo groupVo = BeanConvertUtils.convert(group); + groupVo.setInheritConfig(getInheritConfig(groupVo.getParent())); + groupVo.setUIdS(getuIds(id, RunAuthType.GROUP)); + configDecry(groupVo.getConfigs()); + configDecry(groupVo.getInheritConfig()); + if (groupVo.getConfigs().keySet().stream().anyMatch(key -> key.toLowerCase().contains(Constants.PASSWORD_WORD)) + || groupVo.getInheritConfig().keySet().stream().anyMatch(key -> key.toLowerCase().contains(Constants.PASSWORD_WORD))) { + try { + checkPermission(id, RunAuthType.GROUP); + } catch (NoPermissionException e) { + encryption(groupVo.getConfigs()); + encryption(groupVo.getInheritConfig()); + } + } + return new JsonResponse(true, groupVo); + } + + + @RequestMapping(value = "/getJobOperator", method = RequestMethod.GET) + @ResponseBody + @RunAuth(typeIndex = 1) + @ApiOperation("获取任务管理员,admin表示目前有权限操作的用户") + public JsonResponse getJobOperator(@ApiParam(value = "任务/组ID", required = true) String jobId, + @ApiParam(value = "任务类型", required = true) RunAuthType type) { + Integer groupId = StringUtil.getGroupId(jobId); + List permissions = heraPermissionService.findByTargetId(groupId, type.getName(), 1); + List all = heraUserService.findAllName(); + if (all == null || permissions == null) { + return new JsonResponse(false, "发生错误,请联系管理员"); + } + Map res = new HashMap<>(2); + res.put("allUser", all); + res.put("admin", permissions); + return new JsonResponse(true, "查询成功", res); + } + + @RequestMapping(value = "/getJobVersion", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("获取任务的所有版本") + public JsonResponse getJobVersion(@ApiParam(value = "任务ID", required = true) Long jobId) { + return new JsonResponse(true, heraJobActionService.getActionVersionByJobId(jobId) + .stream() + .map(id -> HeraActionVo.builder().id(id).build()) + .collect(Collectors.toList())); + } + + + @RequestMapping(value = "/addJob", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("新增任务") + @RunAuth(authType = RunAuthType.GROUP, idIndex = 1) + public JsonResponse addJob(@ApiParam(value = "任务信息", required = true) HeraJob heraJob, + @ApiParam(value = "所在组目录", required = true) String parentId) { + heraJob.setGroupId(StringUtil.getGroupId(parentId)); + heraJob.setHostGroupId(HeraGlobalEnv.defaultWorkerGroup); + heraJob.setOwner(getOwner()); + heraJob.setScheduleType(JobScheduleTypeEnum.Independent.getType()); + int insert = heraJobService.insert(heraJob); + if (insert > 0) { + addJobRecord(heraJob); + return new JsonResponse(true, String.valueOf(heraJob.getId())); + } else { + return new JsonResponse(false, "新增失败"); + } + } + + @PostMapping(value = "/copyJob") + @ResponseBody + @RunAuth(authType = RunAuthType.JOB) + @ApiOperation("复制任务接口") + public JsonResponse copyJob( + @ApiParam(value = "复制的任务ID", required = true) int jobId) { + HeraJob copyJob = heraJobService.findById(jobId); + copyJob.setName(copyJob.getName() + "_copy"); + copyJob.setOwner(getOwner()); + copyJob.setScheduleType(JobScheduleTypeEnum.Independent.getType()); + copyJob.setId(0); + copyJob.setIsValid(0); + int insert = heraJobService.insert(copyJob); + if (insert > 0) { + addJobRecord(copyJob); + return new JsonResponse(true, String.valueOf(copyJob.getId())); + } else { + return new JsonResponse(false, "新增失败"); + } + } + + + private void addJobRecord(HeraJob heraJob) { + String ssoName = getSsoName(); + String ownerId = getOwnerId(); + MonitorLog.info("{}[{}]【添加】任务{}成功", heraJob.getOwner(), ssoName, heraJob.getId()); + updateMonitor(heraJob.getId()); + doAsync(() -> addJobRecord(heraJob.getId(), heraJob.getName(), RecordTypeEnum.Add, ssoName, ownerId)); + } + + @RequestMapping(value = "/addMonitor", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("任务添加监控") + public JsonResponse updateMonitor(@ApiParam(value = "任务ID", required = true) Integer id) { + String ssoId = getSsoId(); + if (Constants.DEFAULT_ID.equals(ssoId)) { + return new JsonResponse(false, "组账户不支持监控任务"); + } + boolean res = heraJobMonitorService.addMonitor(ssoId, id); + if (res) { + MonitorLog.info("{}【关注】任务{}成功", getSsoName(), id); + return new JsonResponse(true, "关注成功"); + } else { + return new JsonResponse(false, "系统异常,请联系管理员"); + } + } + + @RequestMapping(value = "/delMonitor", method = RequestMethod.POST) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @ApiOperation("删除任务关注人") + public JsonResponse deleteMonitor(@ApiParam(value = "任务ID", required = true) Integer id) { + String ssoId = getSsoId(); + HeraJobMonitor monitor = heraJobMonitorService.findByJobId(id); + if (monitor != null) { + if (monitor.getUserIds().split(Constants.COMMA).length == 1) { + return new JsonResponse(false, "至少有一个监控人"); + } + } + boolean res = heraJobMonitorService.removeMonitor(ssoId, id); + if (res) { + MonitorLog.info("{}【取关】任务{}成功", getSsoName(), id); + return new JsonResponse(true, "取关成功"); + } else { + return new JsonResponse(false, "系统异常,请联系管理员"); + } + } + + @RequestMapping(value = "/addGroup", method = RequestMethod.POST) + @ResponseBody + @RunAuth(authType = RunAuthType.GROUP, idIndex = 1) + @ApiOperation("添加组") + public JsonResponse addJob(@ApiParam(value = "组信息", required = true) HeraGroup heraGroup, + @ApiParam(value = "所在组id", required = true) String parentId) { + heraGroup.setParent(StringUtil.getGroupId(parentId)); + heraGroup.setOwner(getOwner()); + heraGroup.setExisted(1); + int insert = heraGroupService.insert(heraGroup); + if (insert > 0) { + MonitorLog.info("{}【添加】组{}成功", getSsoName(), heraGroup.getId()); + return new JsonResponse(true, Constants.GROUP_PREFIX + heraGroup.getId()); + } else { + return new JsonResponse(false, String.valueOf(-1)); + + } + } + + + @RequestMapping(value = "/generateVersion", method = RequestMethod.POST) + @ResponseBody + @RunAuth + @ApiOperation("全量版本生成/单个版本生成") + public JsonResponse generateVersion(@ApiParam("任务ID") Long jobId) throws ExecutionException, InterruptedException, TimeoutException { + return new JsonResponse(true, workClient.generateActionFromWeb(JobExecuteKind.ExecuteKind.ManualKind, jobId)); + } + + + /** + * 获取任务历史版本 + * + * @param pageHelper + * @return + */ + @RequestMapping(value = "/getJobHistory", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("任务历史记录") + public JsonResponse getJobHistory(@ApiParam(value = "分页", required = true) PageHelperTimeRange pageHelper) { + return new JsonResponse(true, heraJobHistoryService.findLogByPage(pageHelper)); + } + + @RequestMapping(value = "/getHostGroupIds", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("获取机器组Id") + public JsonResponse getHostGroupIds() { + return new JsonResponse(true, heraHostGroupService.getAll()); + } + + @RequestMapping(value = "getLog", method = RequestMethod.GET) + @ResponseBody + @RunAuth() + @ApiOperation("获取任务日志接口") + public JsonResponse getJobLog(@ApiParam(value = "任务ID", required = true) Integer id) { + return new JsonResponse(true, heraJobHistoryService.findLogById(id)); + } + + + @RequestMapping(value = "/status/{jobId}", method = RequestMethod.GET) + @ResponseBody + @UnCheckLogin + @ApiOperation("开放接口,查询任务状态") + public JsonResponse getStatus(@PathVariable("jobId") @ApiParam(value = "任务ID", required = true) Integer jobId + , @RequestParam("time") @ApiParam(value = "时间戳,只查询该时间戳之后的记录", required = true) long time) { + HeraJobHistory history = heraJobHistoryService.findNewest(jobId); + if (history == null) { + return new JsonResponse(false, "无执行记录"); + } + //此时可能正在创建动态集群 或者发送netty消息的路上 + if (history.getStartTime() == null && history.getGmtCreate().getTime() >= time) { + return new JsonResponse(true, StatusEnum.RUNNING.toString()); + } + + if (history.getStartTime() != null && history.getStartTime().getTime() < time) { + return new JsonResponse(false, "无执行记录"); + } + return new JsonResponse(true, Optional.ofNullable(history.getStatus()).orElse(StatusEnum.RUNNING.toString())); + } + + + private Map getInheritConfig(Integer groupId) { + HeraGroup group = heraGroupService.findConfigById(groupId); + Map configMap = new TreeMap<>(); + while (group != null && groupId != null && groupId != 0) { + Map map = StringUtil.convertStringToMap(group.getConfigs()); + // 多重继承相同变量,以第一个的为准 + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + if (!configMap.containsKey(key)) { + configMap.put(key, entry.getValue()); + } + } + groupId = group.getParent(); + group = heraGroupService.findConfigById(groupId); + } + return configMap; + } + + + private String getuIds(Integer id, RunAuthType type) { + List permissions = heraPermissionService.findByTargetId(id, type.getName(), 1); + StringBuilder uids = new StringBuilder("[ "); + if (permissions != null && permissions.size() > 0) { + permissions.forEach(x -> uids.append(x.getUid()).append(" ")); + } + uids.append("]"); + + return uids.toString(); + } + + + @RequestMapping(value = "/getJobImpactOrProgress", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("查询任务依赖关系接口") + public JsonResponse getJobImpactOrProgress(@ApiParam(value = "任务ID", required = true) Integer jobId + , @ApiParam(value = "0:上游/1:下游", required = true) Integer type) { + Map graph = heraJobService.findCurrentJobGraph(jobId, type); + if (graph == null) { + return new JsonResponse(false, "当前任务不存在"); + } + return new JsonResponse(true, "成功", graph); + } + + @RequestMapping(value = "/getAllArea", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("获取所有区域") + public JsonResponse getAllArea() { + return new JsonResponse(true, "成功", Optional.of(heraAreaService.findAll()).get()); + } + + + /** + * @param jobHisId + * @param status + * @return + */ + @RequestMapping(value = "/forceJobHisStatus", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("强制设置任务状态") + public JsonResponse forceJobHisStatus(@ApiParam(value = "执行记录id", required = true) Long jobHisId + , @ApiParam(value = "设置的状态", required = true) String status) { + + String info = ""; + if (status.equals(StatusEnum.WAIT.toString())) { + info = "手动强制等待状态"; + } else if (status.equals(StatusEnum.FAILED.toString())) { + info = "手动强制失败状态"; + } else if (status.equals(StatusEnum.SUCCESS.toString())) { + info = "手动强制成功状态"; + } else if (status.equals(StatusEnum.RUNNING.toString())) { + info = "手动强制运行中状态"; + } + + String illustrate = heraJobHistoryService.findById(jobHisId).getIllustrate(); + if (StringUtils.isNotBlank(illustrate)) { + illustrate += ";" + info; + } else { + illustrate = info; + } + heraJobHistoryService.updateStatusAndIllustrate(jobHisId, status, illustrate, new Date()); + return new JsonResponse(true, "修改状态成功"); + } +} diff --git a/hera-admin/src/main/java/com/dfire/controller/ScheduleOperatorController.java b/hera-admin/src/main/java/com/dfire/controller/ScheduleOperatorController.java new file mode 100755 index 00000000..662327d6 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/ScheduleOperatorController.java @@ -0,0 +1,664 @@ +package com.dfire.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.*; +import com.dfire.common.entity.model.HeraJobBean; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.vo.HeraGroupVo; +import com.dfire.common.entity.vo.HeraJobVo; +import com.dfire.common.enums.RecordTypeEnum; +import com.dfire.common.enums.RunAuthType; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.common.exception.NoPermissionException; +import com.dfire.common.service.*; +import com.dfire.common.util.*; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.config.RunAuth; +import com.dfire.config.UnCheckLogin; +import com.dfire.core.netty.worker.WorkClient; +import com.dfire.core.util.JobUtils; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.MonitorLog; +import com.dfire.protocol.JobExecuteKind; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.lang3.StringUtils; +import org.quartz.CronExpression; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.WebAsyncTask; +import springfox.documentation.annotations.ApiIgnore; + +import java.text.ParseException; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +/** + * desc: + * + * @author scx + * @create 2020/06/19 + */ +@Controller +@Api("调度中心操作") +@RequestMapping("/scheduleCenter") +public class ScheduleOperatorController extends BaseHeraController { + + + private final HeraJobService heraJobService; + private final HeraJobActionService heraJobActionService; + private final HeraGroupService heraGroupService; + private final HeraJobHistoryService heraJobHistoryService; + private final HeraUserService heraUserService; + private final HeraPermissionService heraPermissionService; + private final WorkClient workClient; + private final HeraHostGroupService heraHostGroupService; + private final HeraSsoService heraSsoService; + + private final Set cancelSet = new HashSet<>(); + private final HeraJobMonitorService jobMonitorService; + + public ScheduleOperatorController(HeraJobMonitorService jobMonitorService, HeraJobActionService heraJobActionService, @Qualifier("heraJobMemoryService") HeraJobService heraJobService, @Qualifier("heraGroupMemoryService") HeraGroupService heraGroupService, HeraJobHistoryService heraJobHistoryService, HeraUserService heraUserService, HeraPermissionService heraPermissionService, WorkClient workClient, HeraHostGroupService heraHostGroupService, HeraSsoService heraSsoService) { + this.heraJobActionService = heraJobActionService; + this.heraJobService = heraJobService; + this.heraGroupService = heraGroupService; + this.heraJobHistoryService = heraJobHistoryService; + this.heraUserService = heraUserService; + this.heraPermissionService = heraPermissionService; + this.workClient = workClient; + this.heraHostGroupService = heraHostGroupService; + this.heraSsoService = heraSsoService; + this.jobMonitorService = jobMonitorService; + } + + @PostMapping("/moveNodes") + @ResponseBody + @ApiOperation("任务批量移动接口") + public JsonResponse moveNodes(@ApiParam(value = "任务id集合,用,分割",required = true)String ids + ,@ApiParam(value = "之前的所在组目录",required = true) String oldParent + ,@ApiParam(value = "新的所在组目录",required = true) String newParent) { + if (ids != null) { + for (String id : ids.split(Constants.COMMA)) { + moveNode(id, newParent, oldParent); + } + } + return new JsonResponse(true, "成功"); + } + + @RequestMapping(value = "/moveNode", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("任务单个移动接口") + public JsonResponse moveNode(@ApiParam(value = "任务id", required = true) String id + , @ApiParam(value = "新的所在组目录", required = true) String parent + , @ApiParam(value = "之前的所在组目录", required = true) String lastParent) throws NoPermissionException { + Integer newParent = StringUtil.getGroupId(parent); + Integer newId; + String ssoName = getSsoName(); + String ownerId = getOwnerId(); + if (id.startsWith(Constants.GROUP_PREFIX)) { + newId = StringUtil.getGroupId(id); + checkPermission(newId, RunAuthType.GROUP); + boolean result = heraGroupService.changeParent(newId, newParent); + doAsync(() -> addGroupRecord(newId, lastParent + "=>" + newParent, RecordTypeEnum.MOVE, ssoName, ownerId)); + MonitorLog.info("组{}:发生移动 {} ---> {}", newId, lastParent, newParent); + return new JsonResponse(result, result ? "处理成功" : "移动失败"); + } else { + newId = Integer.parseInt(id); + checkPermission(newId, RunAuthType.JOB); + boolean result = heraJobService.changeParent(newId, newParent); + doAsync(() -> addJobRecord(newId, lastParent + "=>" + newParent, RecordTypeEnum.MOVE, ssoName, ownerId)); + MonitorLog.info("任务{}:发生移动{} ---> {}", newId, lastParent, newParent); + return new JsonResponse(result, result ? "处理成功" : "移动失败"); + } + } + + @RequestMapping(value = "/updatePermission", method = RequestMethod.POST) + @ResponseBody + @Transactional(rollbackFor = Exception.class) + @RunAuth(typeIndex = 1) + @ApiOperation("权限更新接口") + public JsonResponse updatePermission(@RequestParam("id") @ApiParam(value = "任务id", required = true) String id, + @RequestParam("type") @ApiParam(value = "类型:job,group", required = true) RunAuthType type, + @RequestParam("uIdS") @ApiParam(value = "ssoid集合", required = true) String names) { + + Integer newId = StringUtil.getGroupId(id); + JSONArray parseId = JSONArray.parseArray(names); + Set uIdS; + if (parseId == null) { + uIdS = new HashSet<>(0); + } else { + uIdS = parseId.stream().map(uid -> (String) uid).collect(Collectors.toSet()); + } + String typeStr = type.getName(); + Optional.ofNullable(heraPermissionService.findByTargetId(newId, typeStr, 1)).ifPresent(perms -> perms.forEach(perm -> { + if (!uIdS.contains(perm.getUid())) { + heraPermissionService.updateByUid(newId, typeStr, 0, perm.getUid()); + } else { + uIdS.remove(perm.getUid()); + } + })); + //经过第一轮的筛选后,如果还剩下,继续处理 + if (uIdS.size() > 0) { + List perms = heraPermissionService.findByTargetId(newId, typeStr, 0); + //把以前设置为无效的、这次加入管理的重新设置为有效 + if (perms != null) { + perms.stream().filter(perm -> uIdS.contains(perm.getUid())).forEach(perm -> { + uIdS.remove(perm.getUid()); + heraPermissionService.updateByUid(newId, typeStr, 1, perm.getUid()); + }); + } + if (uIdS.size() > 0) { + //余下的都是需要新增的 + Long targetId = Long.parseLong(String.valueOf(newId)); + uIdS.forEach(uid -> heraPermissionService.insert(HeraPermission + .builder() + .type(typeStr) + .targetId(targetId) + .uid(uid) + .build()) + ); + } + } + return new JsonResponse(true, "修改成功"); + } + + @RequestMapping(value = "/check", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("权限检测接口") + public JsonResponse check(@ApiParam(value = "任务id", required = true) String id) { + if (id == null) { + return new JsonResponse(true, "查询成功", false); + } + boolean auth = true; + if (id.startsWith(Constants.GROUP_PREFIX)) { + try { + checkPermission(StringUtil.getGroupId(id), RunAuthType.GROUP); + } catch (NoPermissionException e) { + auth = false; + } + return new JsonResponse(true, "查询成功", auth); + } else { + try { + checkPermission(Integer.parseInt(id), RunAuthType.JOB); + } catch (NoPermissionException e) { + auth = false; + } + return new JsonResponse(true, "查询成功", auth); + } + } + + /** + * 一键开启/关闭/失效 某job 的上游/下游的所有任务 + * + * @param jobId jobId + * @param type 0:上游 1:下游 + * @param auto 0:关闭 1:开启 2:失效 + * @return + */ + @RequestMapping(value = "/switchAll", method = RequestMethod.GET) + @ResponseBody + @ApiIgnore + public JsonResponse getJobImpact(Integer jobId, Integer type, Integer auto) throws NoPermissionException, HeraException { + List jobList = heraJobService.findJobImpact(jobId, type); + if (jobList == null) { + return new JsonResponse(false, "当前任务不存在"); + } + int size = jobList.size(); + JsonResponse response; + if ((type == 0 && auto == 1) || (type == 1 && auto != 1)) { + for (int i = size - 1; i >= 0; i--) { + response = updateSwitch(jobList.get(i), auto); + if (!response.isSuccess()) { + return response; + } + } + } else if ((type == 1 && auto == 1) || (type == 0 && auto != 1)) { + for (int i = 0; i < size; i++) { + response = updateSwitch(jobList.get(i), auto); + if (!response.isSuccess()) { + return response; + } + } + } else { + return new JsonResponse(false, "未知的type:" + type); + } + + return new JsonResponse(true, "全部处理成功", jobList); + } + + /** + * 取消正在执行的任务 + * + * @param jobId + * @param historyId + * @return + */ + @RequestMapping(value = "/cancelJob", method = RequestMethod.GET) + @ResponseBody + @RunAuth(idIndex = 1) + @ApiOperation("取消任务") + public WebAsyncTask cancelJob(@ApiParam(value = "执行记录id", required = true) Long historyId, @ApiParam(value = "任务id", required = true) String jobId) { + MonitorLog.info("{}取消任务{}", getOwner(), jobId); + if (cancelSet.contains(historyId)) { + return new WebAsyncTask<>(() -> new JsonResponse(true, "任务正在取消中,请稍后")); + } + String ssoName = getSsoName(); + String ownerId = getOwnerId(); + WebAsyncTask response = new WebAsyncTask<>(() -> { + String res = null; + try { + cancelSet.add(historyId); + addJobRecord(Integer.parseInt(jobId), "", RecordTypeEnum.CANCEL, ssoName, ownerId); + try { + res = workClient.cancelJobFromWeb(JobExecuteKind.ExecuteKind.ScheduleKind, historyId); + } catch (ExecutionException | InterruptedException e) { + ErrorLog.error("取消任务异常", e); + } + return new JsonResponse(true, res); + } finally { + cancelSet.remove(historyId); + MonitorLog.info("取消任务{}结果为:{}", jobId, res); + } + }); + response.onTimeout(() -> new JsonResponse(false, "任务正在取消,请稍后")); + return response; + } + + @RequestMapping(value = "/updateSwitch", method = RequestMethod.POST) + @ResponseBody + @RunAuth + @ApiOperation("开启/关闭任务") + public JsonResponse updateSwitch(@ApiParam(value = "任务id", required = true) Integer id, @ApiParam(value = "切换状态,0:关闭,1开启", required = true) Integer status) throws HeraException { + HeraJob heraJob = heraJobService.findById(id); + if (status.equals(heraJob.getAuto())) { + return new JsonResponse(true, "操作成功"); + } + //TODO 上下游任务检测时需要优化 任务链路复杂时 导致关闭/开启耗时较久 + //关闭动作 上游关闭时需要判断下游是否有开启任务,如果有,则不允许关闭 + if (status != 1) { + String errorMsg; + if ((errorMsg = getJobFromAuto(heraJobService.findDownStreamJob(id), 1)) != null) { + return new JsonResponse(false, id + "下游存在开启状态任务:" + errorMsg); + } + } else { //开启动作 如果有上游任务,上游任务不能为关闭状态 + String errorMsg; + if ((errorMsg = getJobFromAuto(heraJobService.findUpStreamJob(id), 0)) != null) { + return new JsonResponse(false, id + "上游存在关闭状态任务:" + errorMsg); + } + } + boolean result = heraJobService.changeSwitch(id, status); + + if (result) { + MonitorLog.info("{}【切换】任务{}状态{}成功", getSsoName(), status == 1 ? Constants.OPEN_STATUS : status == 0 ? "关闭" : "失效"); + } + + String ssoName = getSsoName(); + String ownerId = getOwnerId(); + doAsync(() -> addJobRecord(id, String.valueOf(status), RecordTypeEnum.SWITCH, ssoName, ownerId)); + if (status == 1) { + updateJobToMaster(result, id); + return new JsonResponse(result, result ? "开启成功" : "开启失败"); + } else if (status == 0) { + return new JsonResponse(result, result ? "关闭成功" : "关闭失败"); + } else { + return new JsonResponse(result, result ? "成功设置为失效状态" : "设置状态失败"); + } + } + + private void updateJobToMaster(boolean result, Integer id) { + if (result) { + doAsync(() -> { + try { + workClient.updateJobFromWeb(String.valueOf(id)); + } catch (ExecutionException | InterruptedException | TimeoutException e) { + ErrorLog.error("更新异常", e); + } + }); + } + } + + @RequestMapping(value = "/execute", method = RequestMethod.GET) + @ResponseBody + @UnCheckLogin + @ApiOperation("http外部调用,执行任务") + public JsonResponse publicExecute(@RequestParam @ApiParam(value = "map参数类型,替换任务的配置信息", required = true) Map params) throws ExecutionException, InterruptedException, NoPermissionException, HeraException, TimeoutException { + String secret = params.get("secret"); + String decrypt = PasswordUtils.aesDecrypt(secret); + if (decrypt == null) { + return new JsonResponse(false, "解密失败,请询问管理员"); + } + String[] split = decrypt.split(";"); + if (split.length != 2) { + return new JsonResponse(false, "解密失败,请询问管理员"); + } + HeraAction action = heraJobActionService.findLatestByJobId(Long.parseLong((split[0]))); + if (action == null) { + return new JsonResponse(false, "找不到版本"); + } + addJobRecord(Integer.parseInt(split[0]), "远程执行任务", RecordTypeEnum.REMOTE, getIp() + ":" + split[1], String.valueOf(heraUserService.findByName(split[1]).getId())); + MonitorLog.info("远程调用:{}", JSONObject.toJSONString(params)); + HeraJob heraJob = heraJobService.findById(Integer.parseInt(split[0])); + Map configs = StringUtil.convertStringToMap(heraJob.getConfigs()); + configs.putAll(params); + heraJob.setConfigs(StringUtil.convertMapToString(configs)); + heraJobService.update(heraJob); + return execute(action.getId(), 2, split[1]); + } + + + /** + * 手动执行任务 + * + * @param actionId + * @return + */ + @RequestMapping(value = "/manual", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("手动执行接口") + public JsonResponse execute(@JsonSerialize(using = ToStringSerializer.class) @ApiParam(value = "版本id", required = true) Long actionId + , @ApiParam(value = "触发类型,2手动执行,3手动恢复,6超级恢复", required = true) Integer triggerType, + @RequestParam(required = false) @ApiParam(value = "任务执行组", required = false) String execUser) throws InterruptedException, ExecutionException, HeraException, TimeoutException { + if (actionId == null) { + return new JsonResponse(false, "请先生成版本再执行"); + } + if (execUser == null) { + checkPermission(ActionUtil.getJobId(actionId), RunAuthType.JOB); + } + TriggerTypeEnum triggerTypeEnum = TriggerTypeEnum.parser(triggerType); + if (triggerTypeEnum == null) { + return new JsonResponse(false, " 无法识别的触发类型,请联系管理员"); + } + + HeraAction heraAction = heraJobActionService.findById(actionId); + HeraJob heraJob = heraJobService.findById(heraAction.getJobId()); + if (execUser == null) { + execUser = super.getSsoName(); + } + if (execUser == null) { + return new JsonResponse(false, "任务执行人为空"); + } + + String configs = heraJob.getConfigs(); + HeraJobHistory actionHistory = HeraJobHistory.builder().build(); + actionHistory.setJobId(heraAction.getJobId()); + actionHistory.setActionId(heraAction.getId()); + actionHistory.setTriggerType(triggerTypeEnum.getId()); + actionHistory.setOperator(heraJob.getOwner()); + actionHistory.setIllustrate(execUser); + actionHistory.setStatus(StatusEnum.RUNNING.toString()); + actionHistory.setStatisticEndTime(heraAction.getStatisticEndTime()); + actionHistory.setHostGroupId(heraAction.getHostGroupId()); + heraJobHistoryService.insert(actionHistory); + heraAction.setScript(heraJob.getScript()); + heraAction.setHistoryId(actionHistory.getId()); + heraAction.setConfigs(configs); + heraAction.setAuto(heraJob.getAuto()); + heraAction.setHostGroupId(heraJob.getHostGroupId()); + heraJobActionService.update(heraAction); + workClient.executeJobFromWeb(JobExecuteKind.ExecuteKind.ManualKind, actionHistory.getId()); + + String ownerId = getOwnerId(); + if (ownerId == null) { + ownerId = "0"; + } + addJobRecord(heraJob.getId(), String.valueOf(actionId), RecordTypeEnum.Execute, execUser, ownerId); + return new JsonResponse(true, String.valueOf(actionId)); + } + + @RequestMapping(value = "/updateJobMessage", method = RequestMethod.POST) + @ResponseBody + @RunAuth(idIndex = -1) + @ApiOperation("更新任务信息") + public JsonResponse updateJobMessage(@ApiParam(value = "任务vo对象", required = true) HeraJobVo heraJobVo) { + if (StringUtils.isBlank(heraJobVo.getDescription())) { + return new JsonResponse(false, "描述不能为空"); + } + try { + new CronExpression(heraJobVo.getCronExpression()); + } catch (ParseException e) { + return new JsonResponse(false, "定时表达式不准确,请核实后再保存"); + } + + HeraHostGroup hostGroup = heraHostGroupService.findById(heraJobVo.getHostGroupId()); + if (hostGroup == null) { + return new JsonResponse(false, "机器组不存在,请选择一个机器组"); + } + + if (StringUtils.isBlank(heraJobVo.getAreaId())) { + return new JsonResponse(false, "至少选择一个任务所在区域"); + } + + //如果是依赖任务 + if (heraJobVo.getScheduleType() == 1) { + String dependencies = heraJobVo.getDependencies(); + if (StringUtils.isNotBlank(dependencies)) { + String[] jobs = dependencies.split(Constants.COMMA); + HeraJob heraJob; + boolean jobAuto = true; + StringBuilder sb = null; + for (String job : jobs) { + heraJob = heraJobService.findById(Integer.parseInt(job)); + if (heraJob == null) { + return new JsonResponse(false, "任务:" + job + "为空"); + } + if (heraJob.getAuto() != 1) { + if (jobAuto) { + jobAuto = false; + sb = new StringBuilder(); + sb.append(job); + } else { + sb.append(",").append(job); + } + } + } + if (!jobAuto) { + return new JsonResponse(false, "不允许依赖关闭状态的任务:" + sb.toString()); + } + } else { + return new JsonResponse(false, "请勾选你要依赖的任务"); + } + } else if (heraJobVo.getScheduleType() == 0) { + heraJobVo.setDependencies(""); + } else { + return new JsonResponse(false, "无法识别的调度类型"); + } + HeraJob memJob = heraJobService.findById(heraJobVo.getId()); + Map configMap = StringUtil.configsToMap(heraJobVo.getSelfConfigs()); + configEncry(configMap); + heraJobVo.setSelfConfigs(StringUtil.mapToConfigs(configMap)); + HeraJob newJob = BeanConvertUtils.convertToHeraJob(heraJobVo); + int maxTimeOut = HeraGlobalEnv.getTaskTimeout() * 60; + if (newJob.getMustEndMinute() > maxTimeOut) { + return new JsonResponse(false, "超出最大超时限制,最大为:" + maxTimeOut); + } else if (newJob.getMustEndMinute() == 0) { + newJob.setMustEndMinute(60); + } + if (StringUtils.isNotBlank(newJob.getDependencies())) { + if (!newJob.getDependencies().equals(memJob.getDependencies())) { + List relation = heraJobService.getAllJobDependencies(); + + DagLoopUtil dagLoopUtil = new DagLoopUtil(heraJobService.selectMaxId()); + + for (HeraJob job : relation) { + String dependencies; + if (job.getId() == newJob.getId()) { + dependencies = newJob.getDependencies(); + } else { + dependencies = job.getDependencies(); + } + if (StringUtils.isNotBlank(dependencies)) { + String[] split = dependencies.split(","); + for (String s : split) { + HeraJob memById = heraJobService.findMemById(Integer.parseInt(s)); + if (memById == null) { + return new JsonResponse(false, "依赖任务:" + s + "不存在"); + } + dagLoopUtil.addEdge(job.getId(), Integer.parseInt(s)); + } + } + } + + if (dagLoopUtil.isLoop()) { + return new JsonResponse(false, "出现环形依赖,请检测依赖关系:" + dagLoopUtil.getLoop()); + } + } + } + + + newJob.setAuto(memJob.getAuto()); + + String ssoName = getSsoName(); + String ownerId = getOwnerId(); + Integer update = heraJobService.update(newJob); + if (update == null || update == 0) { + return new JsonResponse(false, "更新失败"); + } + doAsync(() -> { + //脚本更新 + if (!newJob.getScript().equals(memJob.getScript())) { + addJobRecord(newJob.getId(), memJob.getScript(), RecordTypeEnum.SCRIPT, ssoName, ownerId); + } + //依赖任务更新 + if (newJob.getDependencies() != null && !newJob.getDependencies().equals(memJob.getDependencies())) { + addJobRecord(newJob.getId(), memJob.getDependencies(), RecordTypeEnum.DEPEND, ssoName, ownerId); + } + //定时表达式更新 + if (newJob.getCronExpression() != null && !newJob.getCronExpression().equals(memJob.getCronExpression())) { + addJobRecord(newJob.getId(), memJob.getCronExpression(), RecordTypeEnum.CRON, ssoName, ownerId); + } + //执行区域更新 + if (newJob.getAreaId() != null && !newJob.getAreaId().equals(memJob.getAreaId())) { + addJobRecord(newJob.getId(), memJob.getAreaId(), RecordTypeEnum.AREA, ssoName, ownerId); + } + //脚本配置项变化 + if (newJob.getConfigs() != null && !newJob.getConfigs().equals(memJob.getConfigs())) { + addJobRecord(newJob.getId(), memJob.getConfigs(), RecordTypeEnum.CONFIG, ssoName, ownerId); + } + if (newJob.getRunType() != null && !newJob.getRunType().equals(memJob.getRunType())) { + addJobRecord(newJob.getId(), memJob.getRunType(), RecordTypeEnum.RUN_TYPE, ssoName, ownerId); + } + }); + + return new JsonResponse(true, "更新成功"); + } + + + + + @GetMapping(value = "previewJob") + @ResponseBody + @ApiOperation("预览任务接口") + public JsonResponse previewJobScript(@ApiParam(value = "任务版本id", required = true) Long actionId) throws HeraException { + return new JsonResponse("", true, getRenderScript(actionId)); + } + + private String getRenderScript(Long actionId) throws HeraException { + return this.getRenderScript(actionId, null); + } + + private String getRenderScript(Long actionId, String script) throws HeraException { + Integer jobId = ActionUtil.getJobId(String.valueOf(actionId)); + HeraJobBean jobBean = heraGroupService.getUpstreamJobBean(jobId); + if (script == null) { + script = jobBean.getHeraJob().getScript(); + } + + RenderHierarchyProperties renderHierarchyProperties = new RenderHierarchyProperties(jobBean.getHierarchyProperties()); + script = JobUtils.previewScript(renderHierarchyProperties.getAllProperties(), script); + script = RenderHierarchyProperties.render(script, String.valueOf(actionId).substring(0, 12)); + return script; + } + + @RequestMapping(value = "/updateGroupMessage", method = RequestMethod.POST) + @ResponseBody + @ApiOperation("更新组信息") + @RunAuth(authType = RunAuthType.GROUP, idIndex = 1) + public JsonResponse updateGroupMessage(@ApiParam(value = "组信息对象", required = true) HeraGroupVo groupVo, @ApiParam(value = "组id", required = true) String groupId) { + groupVo.setId(StringUtil.getGroupId(groupId)); + + Map configMap = StringUtil.configsToMap(groupVo.getSelfConfigs()); + configEncry(configMap); + + groupVo.setSelfConfigs(StringUtil.mapToConfigs(configMap)); + HeraGroup heraGroup = BeanConvertUtils.convert(groupVo); + + String ownerId = getOwnerId(); + String ssoName = getSsoName(); + doAsync(() -> { + HeraGroup lastGroup = heraGroupService.findById(heraGroup.getId()); + if (lastGroup.getConfigs() != null && !lastGroup.getConfigs().equals(heraGroup.getConfigs())) { + addGroupRecord(heraGroup.getId(), lastGroup.getConfigs(), RecordTypeEnum.CONFIG, ssoName, ownerId); + } + }); + + boolean res = heraGroupService.update(heraGroup) > 0; + return new JsonResponse(res, res ? "更新成功" : "系统异常,请联系管理员"); + } + + private void configEncry(Map config) { + Optional.ofNullable(config) + .ifPresent(cxf -> cxf.entrySet() + .stream() + .filter(pair -> pair.getKey().toLowerCase().contains(Constants.SECRET_PREFIX)) + .forEach(entry -> entry.setValue(PasswordUtils.aesEncryption(entry.getValue())))); + } + + private String getJobFromAuto(List streamJob, Integer auto) { + boolean has = false; + StringBuilder filterJob = null; + for (HeraJob job : streamJob) { + if (job.getAuto().equals(auto)) { + if (!has) { + has = true; + filterJob = new StringBuilder(); + filterJob.append(job.getId()); + } else { + filterJob.append(",").append(job.getId()); + } + } + } + if (has) { + return filterJob.toString(); + } + return null; + } + + @RequestMapping(value = "/deleteJob", method = RequestMethod.POST) + @ResponseBody + @RunAuth(typeIndex = 1) + @ApiOperation("删除任务接口") + public JsonResponse deleteJob(@ApiParam(value = "任务id", required = true) String id, + @ApiParam(value = "类型:job、group", required = true) RunAuthType type) throws NoPermissionException { + Integer xId = StringUtil.getGroupId(id); + boolean res; + String check = heraJobService.checkDependencies(xId, type); + if (StringUtils.isNotBlank(check)) { + return new JsonResponse(false, check); + } + String ssoName = getSsoName(); + String ownerId = getOwnerId(); + if (type == RunAuthType.GROUP) { + res = heraGroupService.delete(xId) > 0; + MonitorLog.info("{}【删除】组{}成功", ssoName, xId); + doAsync(() -> addGroupRecord(xId, null, RecordTypeEnum.DELETE, ssoName, ownerId)); + return new JsonResponse(res, res ? "删除成功" : "系统异常,请联系管理员"); + } + res = heraJobService.delete(xId) > 0; + MonitorLog.info("{}【删除】任务{}成功", getOwner(), xId); + updateJobToMaster(res, xId); + doAsync(() -> addJobRecord(xId, null, RecordTypeEnum.DELETE, ssoName, ownerId)); + return new JsonResponse(res, res ? "删除成功" : "系统异常,请联系管理员"); + } + +} diff --git a/hera-admin/src/main/java/com/dfire/controller/SystemManageController.java b/hera-admin/src/main/java/com/dfire/controller/SystemManageController.java new file mode 100755 index 00000000..2456de9a --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/SystemManageController.java @@ -0,0 +1,324 @@ +package com.dfire.controller; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraHostRelation; +import com.dfire.common.entity.HeraJobMonitor; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.model.TableResponse; +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.entity.vo.HeraJobMonitorVo; +import com.dfire.common.entity.vo.HeraSsoVo; +import com.dfire.common.exception.NoPermissionException; +import com.dfire.common.service.HeraHostRelationService; +import com.dfire.common.service.HeraJobActionService; +import com.dfire.common.service.HeraJobMonitorService; +import com.dfire.common.service.HeraSsoService; +import com.dfire.config.AdminCheck; +import com.dfire.core.netty.worker.WorkClient; +import com.dfire.monitor.service.JobManageService; +import com.dfire.protocol.JobExecuteKind; +import com.google.protobuf.InvalidProtocolBufferException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; + +/** + * @author: 凌霄 + * @time: Created in 16:52 2018/1/13 + * @desc 系统管理 + */ +@Controller +@Api("系统操作接口") +public class SystemManageController extends BaseHeraController { + + @Autowired + private JobManageService jobManageService; + + @Autowired + private HeraJobActionService heraJobActionService; + + @Autowired + private HeraHostRelationService heraHostRelationService; + + @Autowired + private WorkClient workClient; + + @Autowired + private HeraJobMonitorService heraJobMonitorService; + + @Autowired + private HeraSsoService heraSsoService; + + + @GetMapping("/userManage") + @AdminCheck + public String userManage() throws NoPermissionException { + return "systemManage/userManage.index"; + } + + @GetMapping("/basicManage") + @AdminCheck + public String basicManage() throws NoPermissionException { + return "systemManage/basicManage.index"; + } + + @RequestMapping("/workManage") + @GetMapping + public String workManage() throws NoPermissionException { + return "systemManage/workManage.index"; + } + + + @GetMapping("/hostGroupManage") + @AdminCheck + public String hostGroupManage() throws NoPermissionException { + return "systemManage/hostGroupManage.index"; + } + + @GetMapping("/jobMonitor") + @AdminCheck + public String jobMonitor() throws NoPermissionException { + return "systemManage/jobMonitor.index"; + } + + + @GetMapping("/jobDetail") + public String jobManage() { + return "jobManage/jobDetail.index"; + } + + + @GetMapping("/rerun") + public String jobRerun() { + return "jobManage/rerun.index"; + } + + @GetMapping("/jobSearch") + public String jobSearch() { + return "jobManage/jobSearch.index"; + } + + + @GetMapping("/jobDag") + public String jobDag() { + return "jobManage/jobDag.index"; + } + + @GetMapping("/machineInfo") + public String machineInfo() { + return "machineInfo"; + } + + @RequestMapping(value = "/workManage/list", method = RequestMethod.GET) + @ResponseBody + @AdminCheck + @ApiOperation("机器组关系列表查询") + public TableResponse workManageList() { + List hostRelations = heraHostRelationService.getAll(); + if (hostRelations == null) { + return new TableResponse(-1, "查询失败"); + } + return new TableResponse(hostRelations.size(), 0, hostRelations); + } + + @RequestMapping(value = "/workManage/add", method = RequestMethod.POST) + @ResponseBody + @AdminCheck + @ApiOperation("机器组关系添加") + public JsonResponse workManageAdd(@ApiParam(value = "机器组管理对象",required = true) HeraHostRelation heraHostRelation) { + int insert = heraHostRelationService.insert(heraHostRelation); + if (insert > 0) { + return new JsonResponse(true, "插入成功"); + } + return new JsonResponse(false, "插入失败"); + + } + + @RequestMapping(value = "/workManage/del", method = RequestMethod.POST) + @ResponseBody + @AdminCheck + @ApiOperation("机器组关系删除") + public JsonResponse workManageDel(@ApiParam(value = "机器组关系id",required = true)Integer id) { + int delete = heraHostRelationService.delete(id); + if (delete > 0) { + return new JsonResponse(true, "删除成功"); + } + return new JsonResponse(false, "删除失败"); + } + + @RequestMapping(value = "/workManage/update", method = RequestMethod.POST) + @ResponseBody + @AdminCheck + @ApiOperation("机器组关系更新") + public JsonResponse workManageUpdate(@ApiParam(value = "机器组管理对象",required = true)HeraHostRelation heraHostRelation) { + int update = heraHostRelationService.update(heraHostRelation); + if (update > 0) { + return new JsonResponse(true, "更新成功"); + } + return new JsonResponse(false, "更新失败"); + + } + + + @GetMapping(value = "/jobMonitor/list") + @ResponseBody + @ApiOperation("任务监控列表查询") + public TableResponse jobMonitorList() { + List monitors = heraJobMonitorService.findAllVo(); + if (monitors == null || monitors.size() == 0) { + return new TableResponse(-1, "无监控任务"); + } + Map cacheSso = new HashMap<>(); + monitors.forEach(monitor -> { + if (!StringUtils.isBlank(monitor.getUserIds())) { + List ssoVos = new ArrayList<>(); + Arrays.stream(monitor.getUserIds().split(Constants.COMMA)).filter(StringUtils::isNotBlank).distinct().forEach(id -> { + HeraSsoVo ssoVo = cacheSso.get(id); + if (ssoVo == null) { + ssoVo = heraSsoService.findSsoVoById(Integer.parseInt(id)); + cacheSso.put(id, ssoVo); + } + ssoVos.add(ssoVo); + }); + monitor.setMonitors(ssoVos); + } else { + monitor.setMonitors(new ArrayList<>(0)); + } + Optional.ofNullable(monitor.getUserIds()).ifPresent(userIds -> { + if (userIds.endsWith(Constants.COMMA)) { + monitor.setUserIds(userIds.substring(0, userIds.length() - 1)); + } + }); + }); + cacheSso.clear(); + return new TableResponse(monitors.size(), 0, monitors); + } + + @PostMapping(value = "/jobMonitor/add") + @ResponseBody + @AdminCheck + @ApiOperation("任务监控人添加接口") + public JsonResponse jobMonitorAdd(@ApiParam(value = "任务id",required = true)Integer jobId, + @ApiParam(value = "监控人hera_sso的id集合,多个,分割",required = true)String monitors) { + HeraJobMonitor monitor = heraJobMonitorService.findByJobId(jobId); + if (monitor != null) { + return new JsonResponse(false, "该监控任务已经存在,请直接编辑该任务"); + } + boolean res = heraJobMonitorService.addMonitor(monitors, jobId); + return new JsonResponse(res, res ? "添加监控成功" : "添加监控失败"); + } + + @PostMapping(value = "/jobMonitor/update") + @ResponseBody + @AdminCheck + @ApiOperation("任务监控人更新接口") + public JsonResponse jobMonitorUpdate(@ApiParam(value = "任务id",required = true)Integer jobId, + @ApiParam(value = "监控人hera_sso的id集合,多个,分割",required = true)String monitors) { + boolean res = heraJobMonitorService.updateMonitor(monitors, jobId); + return new JsonResponse(res, res ? "添加监控成功" : "添加监控失败"); + } + + /** + * 首页任务运行top10 + * + * @return + */ + @RequestMapping(value = "/homePage/findJobRunTimeTop10", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("首页任务运行top10") + public JsonResponse findJobRunTimeTop10() { + return jobManageService.findJobRunTimeTop10(); + } + + + /** + * 今日所有任务状态,初始化首页饼图 + * + * @return + */ + @RequestMapping(value = "/homePage/findAllJobStatus", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("今日所有任务状态,初始化首页饼图") + public JsonResponse findAllJobStatus() { + return jobManageService.findAllJobStatus(); + } + + + /** + * 今日所有任务状态明细,线形图初始化 + * + * @return + */ + @RequestMapping(value = "/homePage/findAllJobStatusDetail", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("今日任务详情明细,初始化曲线图") + public JsonResponse findAllJobStatusDetail() { + return jobManageService.findAllJobStatusDetail(); + } + + + @RequestMapping(value = "/homePage/getJobQueueInfo", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("获取任务在work/master上的等待/执行队列及监控信息") + public JsonResponse getJobQueueInfo() throws InterruptedException, ExecutionException, InvalidProtocolBufferException, TimeoutException { + return new JsonResponse(true, workClient.getJobQueueInfoFromWeb()); + + } + + + @RequestMapping(value = "/homePage/getNotRunJob", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("查询未执行的任务") + public JsonResponse getNotRunJob() { + List scheduleJob = heraJobActionService.getNotRunScheduleJob(); + return new JsonResponse(true, "查询成功", scheduleJob); + } + + @RequestMapping(value = "/homePage/getFailJob", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("查询最后一次调度失败的任务") + public JsonResponse getScheduleFailJob() { + List failedJob = heraJobActionService.getFailedJob(); + return new JsonResponse(true, "查询成功", failedJob); + } + + @RequestMapping(value = "/homePage/getAllWorkInfo", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("查询所有的机器监控信息") + public JsonResponse getAllWorkInfo() throws InterruptedException, ExecutionException, InvalidProtocolBufferException, TimeoutException { + return new JsonResponse(true, workClient.getAllWorkInfo()); + } + + + @RequestMapping(value = "/isAdmin", method = RequestMethod.GET) + @ResponseBody + @ApiOperation("是否为admin用户查询") + public JsonResponse checkAdmin() { + return new JsonResponse(true, isAdmin()); + } + + + @RequestMapping(value = "/admin/generateAllVersion", method = RequestMethod.PUT) + @ResponseBody + @AdminCheck + @ApiOperation("全量版本生成接口") + public JsonResponse generateAllVersion() throws ExecutionException, InterruptedException, TimeoutException { + return new JsonResponse(true, workClient.generateActionFromWeb(JobExecuteKind.ExecuteKind.ManualKind, Constants.ALL_JOB_ID)); + } + + @RequestMapping(value = "admin/updateWork", method = RequestMethod.PUT) + @ResponseBody + @AdminCheck + @ApiOperation("更新work信息触发接口") + public JsonResponse updateWork() throws ExecutionException, InterruptedException, TimeoutException { + return new JsonResponse(true, workClient.updateWorkFromWeb()); + } +} diff --git a/hera-admin/src/main/java/com/dfire/controller/UploadResourceController.java b/hera-admin/src/main/java/com/dfire/controller/UploadResourceController.java new file mode 100755 index 00000000..574165b3 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/UploadResourceController.java @@ -0,0 +1,94 @@ +package com.dfire.controller; + +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.enums.LogTypeEnum; +import com.dfire.common.enums.RecordTypeEnum; +import com.dfire.common.util.HierarchyProperties; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.job.JobContext; +import com.dfire.core.job.ProcessJob; +import com.dfire.core.job.UploadEmrFileJob; +import com.dfire.core.job.UploadLocalFileJob; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import springfox.documentation.annotations.ApiIgnore; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 下午1:22 2018/7/21 + * @desc + */ +@Controller +@RequestMapping("/uploadResource") +@Api("资源上传接口") +public class UploadResourceController extends BaseHeraController { + + + @RequestMapping(value = "/upload", method = RequestMethod.POST) + @ResponseBody + @Transactional(rollbackFor = Exception.class) + @ApiOperation("上传接口") + public JsonResponse uploadResource(@ApiIgnore MultipartHttpServletRequest request) { + Map fileMap = request.getFileMap(); + String fileName = null; + String newFilePath; + File file; + JsonResponse response = new JsonResponse(); + response.setSuccess(true); + StringBuilder resMsg = new StringBuilder(); + try { + for (String key : fileMap.keySet()) { + MultipartFile multipartFile = fileMap.get(key); + fileName = multipartFile.getOriginalFilename(); + int lastPoint = fileName.lastIndexOf("."); + fileName = fileName.substring(0, lastPoint) + "_" + System.nanoTime() + fileName.substring(lastPoint); + newFilePath = HeraGlobalEnv.getWorkDir() + File.separator + fileName; + file = new File(newFilePath); + multipartFile.transferTo(file); + JobContext jobContext = JobContext.builder().build(); + jobContext.setProperties(new HierarchyProperties(new HashMap<>(16))); + jobContext.setWorkDir(HeraGlobalEnv.getWorkDir()); + ProcessJob uploadJob; + int exitCode; + //如果是emr集群 先 scp 到emr固定机器上 + if (HeraGlobalEnv.isEmrJob()) { + //默认都是hadoop用户 + uploadJob = new UploadEmrFileJob(jobContext, file.getAbsolutePath(), fileName, HeraGlobalEnv.emrFixedHost); + exitCode = uploadJob.run(); + } else { + uploadJob = new UploadLocalFileJob(jobContext, file.getAbsolutePath(), HeraGlobalEnv.getHdfsUploadPath()); + exitCode = uploadJob.run(); + } + HeraLog.info("controller upload file command {}", uploadJob.getCommandList().toString()); + if (exitCode == 0) { + addRecord(LogTypeEnum.UPLOAD, 1, fileName, RecordTypeEnum.UPLOAD, getSsoName(), getOwnerId()); + resMsg.append(fileName).append("[上传成功]: ").append(HeraGlobalEnv.getHdfsUploadPath()).append(fileName).append("
"); + } else { + response.setSuccess(false); + addRecord(LogTypeEnum.UPLOAD, 1, fileName + "上传失败", RecordTypeEnum.UPLOAD, getSsoName(), getOwnerId()); + resMsg.append(fileName).append("[上传失败]: ").append(HeraGlobalEnv.getHdfsUploadPath()).append(fileName).append("
"); + } + //删除临时文件 + file.delete(); + } + } catch (Exception e) { + ErrorLog.error("上传文件异常:" + fileName, e); + return new JsonResponse(false, "上传文件异常,请联系管理员"); + } + response.setMessage(resMsg.toString()); + return response; + } +} diff --git a/hera-admin/src/main/java/com/dfire/controller/UserManageController.java b/hera-admin/src/main/java/com/dfire/controller/UserManageController.java new file mode 100755 index 00000000..cd175982 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/controller/UserManageController.java @@ -0,0 +1,282 @@ +package com.dfire.controller; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.entity.HeraFile; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.HeraUser; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.model.TableResponse; +import com.dfire.common.entity.vo.HeraSsoVo; +import com.dfire.common.entity.vo.HeraUserVo; +import com.dfire.common.service.HeraFileService; +import com.dfire.common.service.HeraSsoService; +import com.dfire.common.service.HeraUserService; +import com.dfire.common.util.ActionUtil; +import com.dfire.config.AdminCheck; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 下午4:10 2018/6/14 + * @desc + */ +@Api(value = "用户管理") +@Controller +@RequestMapping("/userManage/") +public class UserManageController { + + @Autowired + private HeraUserService heraUserService; + + @Autowired + private HeraSsoService heraSsoService; + + @Autowired + @Qualifier("heraFileMemoryService") + private HeraFileService heraFileService; + + @RequestMapping(value = "/initUser", method = RequestMethod.GET) + @ResponseBody + @ApiOperation(value = "获取用户组列表") + public TableResponse initUser() { + List users = heraUserService.getAll(); + List res; + if (users != null) { + res = new ArrayList<>(users.size()); + for (HeraUser user : users) { + HeraUserVo userVo = new HeraUserVo(); + BeanUtils.copyProperties(user, userVo); + userVo.setCreateTime(ActionUtil.getDefaultFormatterDate(user.getGmtCreate())); + userVo.setOpTime(ActionUtil.getDefaultFormatterDate(user.getGmtModified())); + res.add(userVo); + } + } else { + res = new ArrayList<>(0); + } + res.sort((o1, o2) -> -(o1.getCreateTime().compareTo(o2.getCreateTime()))); + return new TableResponse(res.size(), 0, res); + } + + @RequestMapping(value = "/sso/update", method = RequestMethod.POST) + @ResponseBody + @AdminCheck + @ApiOperation(value = "更新用户") + public JsonResponse ssoUpdate(@ApiParam(value = "用户信息", required = true) HeraSso sso) { + boolean success = heraSsoService.updateHeraSsoById(sso); + return new JsonResponse(success, success ? "更新成功" : "更新失败"); + } + + @RequestMapping(value = "/user/update", method = RequestMethod.POST) + @ResponseBody + @AdminCheck + @ApiOperation(value = "更新用户组") + public JsonResponse userUpdate(@ApiParam(value = "用户组信息", required = true) HeraUser user) { + boolean success = heraUserService.update(user); + return new JsonResponse(success, success ? "更新成功" : "更新失败"); + } + + @RequestMapping(value = "/groups", method = RequestMethod.GET) + @ResponseBody + @AdminCheck + @ApiOperation(value = "获取所有用户组") + public JsonResponse ssoGroups() { + List users = heraUserService.getGroups(); + return new JsonResponse(true, users.stream() + .map(user -> { + JSONObject userVo = new JSONObject(); + userVo.put("id", user.getId()); + userVo.put("name", user.getName()); + return userVo; + }).collect(Collectors.toList())); + } + + @RequestMapping(value = "/initSso", method = RequestMethod.GET) + @ResponseBody + @ApiOperation(value = "获取所有用户列表") + public TableResponse initSso() { + List ssoList = heraSsoService.getAll(); + if (ssoList == null || ssoList.size() == 0) { + return new TableResponse(-1, "数据为空"); + } + Map userMap = Optional.ofNullable(heraUserService.getAll()) + .orElse(new ArrayList<>(0)) + .stream() + .filter(user -> user.getIsEffective() == 1) + .collect(Collectors.toMap(HeraUser::getId, HeraUser::getName)); + List ssoVoList = ssoList.stream().map(sso -> { + HeraSsoVo ssoVo = new HeraSsoVo(); + BeanUtils.copyProperties(sso, ssoVo); + ssoVo.setGName(userMap.getOrDefault(sso.getGid(), "佚名")); + return ssoVo; + }).collect(Collectors.toList()); + return new TableResponse(ssoVoList.size(), 0, ssoVoList); + } + + + /** + * operateType: 1,执行删除操作,2,执行审核通过操作,3,执行审核拒绝操作 + * + * @return + */ + + @RequestMapping(value = "/operateUser", method = RequestMethod.POST) + @ResponseBody + @AdminCheck + @ApiOperation(value = "用户操作接口") + public JsonResponse operateUser(@ApiParam(value = "用户组信息", required = true) Integer id + , @ApiParam(value = "操作类型,1:删除,2:同意,3:拒绝", required = true) String operateType + , @ApiParam(value = "用户类型,1:用户,0:用户组", required = true) Integer userType) { + JsonResponse response = new JsonResponse(false, "更新失败"); + switch (UserType.parse(userType)) { + case SSO: + switch (OperateTypeEnum.parse(operateType)) { + case Refuse: + if (heraSsoService.setValid(id, 0)) { + response.setSuccess(true); + response.setMessage("审核拒绝"); + } else { + response.setSuccess(false); + response.setMessage("拒绝失败"); + } + break; + case Delete: + if (heraSsoService.deleteSsoById(id)) { + response.setSuccess(true); + response.setMessage("删除成功"); + } else { + response.setSuccess(false); + response.setMessage("删除失败"); + } + break; + case Approve: + if (heraSsoService.setValid(id, 1)) { + response.setSuccess(true); + response.setMessage("审核通过"); + } else { + response.setSuccess(false); + response.setMessage("审核通过失败"); + } + break; + default: + response.setMessage("未知的操作类型"); + response.setSuccess(false); + break; + } + break; + case ADMIN: + int result; + switch (OperateTypeEnum.parse(operateType)) { + case Refuse: + result = heraUserService.updateEffective(id, "0"); + if (result > 0) { + response.setMessage("审核拒绝"); + response.setSuccess(true); + } + break; + case Delete: + result = heraUserService.delete(id); + if (result > 0) { + response.setMessage("删除成功"); + response.setSuccess(true); + } + break; + case Approve: + result = heraUserService.updateEffective(id, "1"); + if (result > 0) { + HeraUser user = heraUserService.findById(id); + if (user != null) { + HeraFile file = heraFileService.findDocByOwner(user.getName()); + if (file == null) { + Integer integer = heraFileService.insert(HeraFile.builder().name("个人文档").owner(user.getName()).type(1).build()); + if (integer <= 0) { + return new JsonResponse(false, "新增文档失败,请联系管理员"); + } + } + } + response.setMessage("审核通过"); + response.setSuccess(true); + } + break; + default: + response.setMessage("未知的操作类型"); + response.setSuccess(false); + break; + } + break; + default: + response.setSuccess(false); + response.setMessage("未知的用户类型"); + break; + } + return response; + + } + + private enum OperateTypeEnum { + /** + * 删除操作 + */ + Delete("1"), + /** + * 同意操作 + */ + Approve("2"), + /** + * 拒绝操作 + */ + Refuse("3"); + private String operateType; + + OperateTypeEnum(String type) { + this.operateType = type; + } + + public static OperateTypeEnum parse(String operateType) { + Optional typeEnum = Arrays.stream(OperateTypeEnum.values()) + .filter(operate -> operate.toString().equals(operateType)) + .findAny(); + return typeEnum.orElse(OperateTypeEnum.Refuse); + } + + @Override + public String toString() { + return operateType; + } + } + + private enum UserType { + /** + * sso相关操作 + */ + SSO(1), + /** + * 管理员相关 + */ + ADMIN(0); + private Integer userType; + + + UserType(Integer type) { + this.userType = type; + } + + public static UserType parse(Integer userType) { + Optional typeEnum = Arrays.stream(UserType.values()) + .filter(operate -> operate.userType.equals(userType)) + .findAny(); + return typeEnum.orElse(null); + } + } +} diff --git a/hera-admin/src/main/java/com/dfire/form/JobSearchForm.java b/hera-admin/src/main/java/com/dfire/form/JobSearchForm.java new file mode 100755 index 00000000..918b9704 --- /dev/null +++ b/hera-admin/src/main/java/com/dfire/form/JobSearchForm.java @@ -0,0 +1,31 @@ +package com.dfire.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * desc: + * + * @author scx + * @create 2019/07/10 + */ +@Data +@ApiModel("任务模糊搜索表单") +public class JobSearchForm { + + @ApiModelProperty("脚本内容") + private String script; + @ApiModelProperty("任务名称") + private String name; + @ApiModelProperty("任务描述") + private String description; + @ApiModelProperty("任务配置") + private String config; + @ApiModelProperty("开启状态") + private Integer auto; + @ApiModelProperty("执行类型") + private String runType; + + +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/META-INF/spring.factories b/hera-admin/src/main/resources/META-INF/spring.factories new file mode 100755 index 00000000..4f015fea --- /dev/null +++ b/hera-admin/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.SpringApplicationRunListener=com.dfire.config.HeraRunListener diff --git a/hera-admin/src/main/resources/banner.txt b/hera-admin/src/main/resources/banner.txt new file mode 100755 index 00000000..72752b50 --- /dev/null +++ b/hera-admin/src/main/resources/banner.txt @@ -0,0 +1,11 @@ +${AnsiColor.BRIGHT_CYAN} + _ + | |__ ___ _ __ __ _ + | '_ \ / _ \ '__/ _` | + | | | | __/ | | (_| | + |_| |_|\___|_| \__,_| create by: 凌霄 小苏打 生煎 火锅 + +${AnsiColor.BRIGHT_YELLOW} +::: Spring-Boot ${spring-boot.version} ::: Hera (version:${hera.version}) + +${AnsiColor.DEFAULT} diff --git a/hera-admin/src/main/resources/config/application.yml b/hera-admin/src/main/resources/config/application.yml new file mode 100755 index 00000000..5d42210d --- /dev/null +++ b/hera-admin/src/main/resources/config/application.yml @@ -0,0 +1,346 @@ +spring: + profiles: + active: @env@ + http: + multipart: + max-file-size: 100Mb #允许上传文件的最大大小 + max-request-size: 100Mb #允许上传文件的最大大小 + encoding: + charset: utf-8 + freemarker: + allow-request-override: true + cache: false + check-template-location: true + charset: utf-8 + content-type: text/html + expose-request-attributes: false + expose-session-attributes: false + expose-spring-macro-helpers: false + suffix: .ftl + template-loader-path: classpath:/templates/ + request-context-attribute: request + mvc: + throw-exception-if-no-handler-found: true + static-path-pattern: /static/** + +druid: + datasource: + username: root #数据库用户名 + password: moye #数据库密码 + driver-class-name: com.mysql.jdbc.Driver #数据库驱动 + url: jdbc:mysql://localhost:3306/hera2.4.2?characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowMultiQueries=true&useSSL=false + initial-size: 5 #初始化连接池数量 + min-idle: 1 #最小生存连接数 + max-active: 16 #最大连接池数量 + max-wait: 5000 #获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 + time-between-connect-error-millis: 60000 # Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接,单位是毫秒 + min-evictable-idle-time-millis: 300000 # 连接保持空闲而不被驱逐的最长时间,单位是毫秒 + test-while-idle: true #申请连接的时候,如果检测到连接空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 + test-on-borrow: true #申请连接时执行validationQuery检测连接是否有效 + test-on-return: false # 归还连接时执行validationQuery检测连接是否有效 + connection-init-sqls: 'set names utf8mb4' + validation-query: select 1 #用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 + validation-query-timeout: 1 #单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法 + log-abandoned: true + stat-mergeSql: true + filters: stat,wall,log4j + connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + + +server: + port: 8080 + context-path: /hera + +clean: + path: ${server.context-path} +#hera全局配置 +hera: + defaultWorkerGroup: 1 #默认worker的host组id + preemptionMasterGroup: 1 #抢占master的host组id + excludeFile: jar;war + maxMemRate: 0.70 #已使用内存占总内存的最大比例,默认0.75 + maxCpuLoadPerCore: 1.0 #cpu load per core等于最近1分钟系统的平均cpu负载÷cpu核心数量,默认1.0 + scanRate: 1000 #队列扫描频率(毫秒) + systemMemUsed: 4000 # 系统占用内存 + requestTimeout: 10000 # 异步请求超时时间 + channelTimeout: 1000 # netty请求超时时间 + perTaskUseMem: 500 # 每个任务使用内存500M + warmUpCheck: 0 # 热身检测 默认10秒,0 表示关闭。在任务连续两次发送到同一台work时 会进行预热检测。#由于任务执行需要经历 发送指令-接受指令-初始化环境-提交任务-开始执行 等阶段, 如果任务分发频率较高时,容易宕机 + jobCacheDay: 2 # <<该配置很重要>> ,表示action最远可以重跑任务的日期,默认2天。 + loadBalance: roundrobin # 负载均衡策略,默认轮训 可选值有roundrobin(轮训)random(随机) + heartBeat: 2 # 心跳传递时间频率 + workDir: /opt/logs/spring-boot # 工作路径 执行的任务文件/上传的文件都在这里 + hdfsUploadPath: /hera/hdfs-upload-dir/ #此处必须是hdfs路径,所有的上传附件都会存放在下面路径上.注意:必须保证启动hera项目的用户是此文件夹的所有者,否则会导致上传错误 + schedule-group: online + maxParallelNum: 2000 #master 允许的最大并行任务 当大于此数值 将会放在阻塞队列中 + connectPort: 9887 #netty通信的端口 + admin: hera # admin用户 + taskTimeout: 12 #单个任务执行的最大时间 单位:小时 + env: ${spring.profiles.active} + alarmEnv: daily,dev,pre,publish # 设置允许哪些环境开启告警,多个用,分开,默认全部环境 + sudoUser: false #是否要使用sudo -u 切换账号(即启动多租户功能) + version: 2.4.2 + kerberos: + keytabpath: #kerberos认证keytab文件,如果hadoop 集群无需kerberos授权,则不填 + principal: #kerberos认证principal,如果hadoop 集群无需kerberos授权,则不填 + job: + shell: + bin: bash + hive: + bin: hive + spark-sql: + bin: spark-sql + script-echo: true + emrJob: false #是否为emr集群 false 表示为本地hadoop集群,true:amazon 亚马逊emr集群任务 true:aliYun 阿里云集群任务 + emr_fixed_host: #emr固定集群地址 + area: all + keyPath: /home/docker/conf/bigdata.pem #emr登录集群到私钥的绝对路径 + monitorUsers: 00001 #(微信工号,只适用于企业微信告警 )多个用|分割 + monitorEmails: monitor@qq.com #群发监控者的邮箱(任务任务失败都会通知到该列表) 多个用;分割 + webSessionExpire: 4320 # web session失效时间,单位为分钟;3天*24*60=4320 + webLogHeadCount: 5000 # web端的任务详情日志展示头部行数 + webLogTailCount: 5000 # web端的任务详情日志展示尾部行数 + emr_groups: #根据hera组来创建集群,达到不同组任务执行集群隔离的效果。值为hera的组比如配置 hera.emr_groups: hera 则此时动态集群会创建两个,一个是hera集群:只供hera组的任务使用,一个是other集群:非hera组的任务执行 + aws_emr_type: SPOT #emr 动态集群的类型,可选:SPOT,ON_DEMAND 默认使用竞价,最大按需 + rerun: + maxParallelNum: 20 #任务重跑允许调度的最大上限。如果当前调度的任务超出此上限,将阻塞重跑任务调度,避免重跑影响了正常的调度 + timeRange: 0-23 #重跑允许调度的时间范围 + +aliYun: + accessKey: xx #阿里云创建集群的ak + accessSecret: xx #阿里云创建集群的as + +india: + accessKey: xx #印度amazon创建集群的ak + accessSecret: xx #印度amazon创建集群的as +logging: + config: classpath:config/logback-spring.xml + path: /opt/logs/spring-boot # 日志路径 + level: + root: INFO + org.springframework: ERROR + com.dfire.common.mapper: ERROR + + +# 发送配置邮件的发送者 +mail: + host: smtp.mxhichina.com + protocol: smtp + port: 465 + user: xxx + password: xxx + + + + +mybatis: + configuration: + mapUnderscoreToCamelCase: true +#spark 配置 +spark: + address: jdbc:hive2://localhost:10000 #ThriftServer地址 + driver: org.apache.hive.jdbc.HiveDriver #jdbc driver + username: xxx #ThriftServer用户名 + password: 123456 #ThriftServer密码 + master: --master yarn + driver-memory: --driver-memory 1g + driver-cores: --driver-cores 1 + executor-memory: --executor-memory 2g + executor-cores: --executor-cores 1 + + +--- +# 中国 +spring: + profiles: dev +hera: + admin: hera + emrJob: false + area: CN +--- +## 中国开发环境 +spring: + profiles: dev_cn +druid: + datasource: + url: jdbc:mysql://localhost:3306/hera?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowMultiQueries=true + username: root + password: root +hera: + area: CN + emrJob: true:aliYun + +server: + port: 8121 + context-path: / +--- +## 中国日常环境 +spring: + profiles: daily_cn +druid: + datasource: + url: xx + username: xx + password: xx +hera: + + area: CN + emrJob: true:aliYun + maxParallelNum: 2 +server: + port: 8121 + context-path: / + + +--- +## 中国预发环境 +spring: + profiles: pre_cn +druid: + datasource: + url: xx + username: xx + password: xx +hera: + + area: CN + emrJob: true:aliYun + emr_fixed_host: xx.xx.xx.xx + hdfsUploadPath: oss://xxx/pre/hera/ +server: + port: 8121 + context-path: / + + +--- +## 中国线上环境 +spring: + profiles: prod_cn +druid: + datasource: + url: xx + username: xx + password: xx +hera: + area: CN + emrJob: true:aliYun + emr_fixed_host: xx.xx.xx.xx + hdfsUploadPath: oss://xxx/hera/ +server: + port: 8121 + context-path: / + +--- +############################################################################################################################## +############################################################################################################################## +############################################################################################################################## +############################################################################################################################## +# 以下所有环境 如果想根据 maven -P参数指定,请增加文件/Users/scx/work/git/person/hera/pom.xml 中profiles配置 # +# # +# 以下所有环境 如果想根据 maven -P参数指定,请增加文件/Users/scx/work/git/person/hera/pom.xml 中profiles配置 # +# # +# 以下所有环境 如果想根据 maven -P参数指定,请增加文件/Users/scx/work/git/person/hera/pom.xml 中profiles配置 # +# # +# 以下所有环境 如果想根据 maven -P参数指定,请增加文件/Users/scx/work/git/person/hera/pom.xml 中profiles配置 # +# # +# 以下所有环境 如果想根据 maven -P参数指定,请增加文件/Users/scx/work/git/person/hera/pom.xml 中profiles配置 # +############################################################################################################################## +############################################################################################################################## +############################################################################################################################## +############################################################################################################################## + +## 印度预发环境 +spring: + profiles: pre_ind +hera: + emrJob: true:amazon + area: IND + maxParallelNum: 40 +server: + port: 8121 + context-path: / +druid: + datasource: + username: xx + password: xx + url: xx + + +--- +## 欧州预发环境 +spring: + profiles: pre_eu +hera: + emrJob: true:amazon + area: EU + maxParallelNum: 40 + emr_fixed_host: xx.xx.xx.xx + hdfsUploadPath: s3://xxx/pre/hera/ + +server: + port: 8121 + context-path: / +druid: + datasource: + username: xx + password: xx + url: xx +--- +## 欧州线上环境 +spring: + profiles: prod_eu +hera: + emrJob: true:amazon + area: EU + maxParallelNum: 40 + emr_fixed_host: xx.xx.xx + hdfsUploadPath: s3://xxx/hera/ + +server: + port: 8121 + context-path: / +druid: + datasource: + username: xx + password: xx + url: xx +--- +## 美国预发环境 +spring: + profiles: pre_us +hera: + emrJob: true:amazon + area: US + maxParallelNum: 40 + emr_fixed_host: xx.xx.xx.xx + hdfsUploadPath: s3://xxx/pre/hera/ + +server: + port: 8121 + context-path: / +druid: + datasource: + username: xx + password: xx + url: xx + +--- +## 美国线上环境 +spring: + profiles: prod_us +hera: + emrJob: true:amazon + area: US + maxParallelNum: 40 + emr_fixed_host: xx.xx.xx.xx + hdfsUploadPath: s3://xxx/hera/ +server: + port: 8121 + context-path: / +druid: + datasource: + username: xx + password: xx + url: xx +--- + diff --git a/hera-admin/src/main/resources/config/hera.properties b/hera-admin/src/main/resources/config/hera.properties new file mode 100755 index 00000000..ba24efc8 --- /dev/null +++ b/hera-admin/src/main/resources/config/hera.properties @@ -0,0 +1,2 @@ +# \u81EA\u5DF1\u8BBE\u7F6E\u670D\u52A1\u5668ip\uFF0C127.0.0.1 \u9ED8\u8BA4\u7CFB\u7EDF\u81EA\u5DF1\u67E5\u627E +server.ip=127.0.0.1 diff --git a/hera-admin/src/main/resources/config/logback-spring.xml b/hera-admin/src/main/resources/config/logback-spring.xml new file mode 100755 index 00000000..7572dfcd --- /dev/null +++ b/hera-admin/src/main/resources/config/logback-spring.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + ${PATTERN} + ${immediateFlush} + + + + + + ${logPath}/schedule.log + true + + ${logPath}/bak/schedule.%d{yyyy-MM-dd}.log.zip + + 10 + + + ${PATTERN} + ${immediateFlush} + + + + ${logPath}/socket.log + true + + ${logPath}/bak/socket.%d{yyyy-MM-dd}.log.zip + + 10 + + + ${PATTERN} + ${immediateFlush} + + + + ${logPath}/hera.log + true + + ${logPath}/bak/hera.%d{yyyy-MM-dd}.log.zip + + 10 + + + ${PATTERN} + ${immediateFlush} + + + + ${logPath}/debug.log + true + + ${logPath}/bak/debug.%d{yyyy-MM-dd}.log.zip + + 10 + + + ${PATTERN} + ${immediateFlush} + + + + + ${logPath}/info.log + true + + ${logPath}/bak/info.%d{yyyy-MM-dd}.log.zip + + 10 + + + ${PATTERN} + ${immediateFlush} + UTF-8 + + + + + ${logPath}/master.log + true + + ${logPath}/bak/master.%d{yyyy-MM-dd}.log.zip + + 10 + + + ${PATTERN} + ${immediateFlush} + + + + + ${logPath}/worker.log + true + + ${logPath}/bak/worker.%d{yyyy-MM-dd}.log.zip + + 10 + + + ${PATTERN} + ${immediateFlush} + + + + + + ${logPath}/heart.log + true + + ${logPath}/bak/heart.%d{yyyy-MM-dd}.log.zip + + 3 + + + ${PATTERN} + ${immediateFlush} + + + + + ${logPath}/scanLog.log + true + + ${logPath}/bak/scan.%d{yyyy-MM-dd}.log.zip + + 3 + + + ${PATTERN} + ${immediateFlush} + + + + + ${logPath}/taskLog.log + true + + ${logPath}/bak/task.%d{yyyy-MM-dd}.log.zip + + 3 + + + ${PATTERN} + ${immediateFlush} + + + + ${logPath}/errorLog.log + true + + ${logPath}/bak/error.%d{yyyy-MM-dd}.log.zip + + 3 + + + ${PATTERN} + ${immediateFlush} + + + + ${logPath}/monitorLog.log + true + + ${logPath}/bak/monitor.%d{yyyy-MM-dd}.log.zip + + 3 + + + ${PATTERN} + ${immediateFlush} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hera-admin/src/main/resources/hera.sql b/hera-admin/src/main/resources/hera.sql new file mode 100755 index 00000000..5fec863b --- /dev/null +++ b/hera-admin/src/main/resources/hera.sql @@ -0,0 +1,380 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + + +CREATE TABLE IF NOT EXISTS `hera_action` +( + `id` bigint(20) NOT NULL COMMENT '任务对应的唯一18位数字版本号', + `job_id` bigint(20) NOT NULL COMMENT '版本对应的任务id', + `auto` tinyint(2) DEFAULT NULL, + `configs` text COMMENT '任务的配置的变量', + `cron_expression` varchar(256) DEFAULT NULL COMMENT '当前版本对应的cron表达式', + `cycle` varchar(256) DEFAULT NULL COMMENT '是否为循环任务', + `dependencies` text COMMENT '依赖任务的版本号,逗号分隔', + `job_dependencies` varchar(2048) DEFAULT NULL COMMENT '依赖任务的id,逗号分隔', + `description` varchar(256) DEFAULT NULL COMMENT '版本描述', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `group_id` int(11) NOT NULL COMMENT '版本可运行分发的机器组', + `history_id` bigint(20) DEFAULT NULL COMMENT '当前版本运行的history id', + `host` varchar(32) DEFAULT NULL COMMENT '执行机器ip ', + `last_end_time` datetime DEFAULT NULL, + `last_result` varchar(256) DEFAULT NULL, + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '任务描述', + `offset` tinyint(2) unsigned zerofill DEFAULT NULL, + `owner` varchar(32) NOT NULL COMMENT '任务的owner', + `post_processors` varchar(256) DEFAULT NULL, + `pre_processors` varchar(256) DEFAULT NULL, + `ready_dependency` text COMMENT '上游任务已完成的版本号', + `resources` text COMMENT '任务上传的资源配置', + `run_type` varchar(16) DEFAULT NULL COMMENT '任务触发类型(shell, hive)', + `schedule_type` tinyint(2) DEFAULT NULL COMMENT '任务调度类型(1,依赖调度,2,被依赖调度)', + `script` mediumtext COMMENT '任务对应的脚本', + `start_time` bigint(20) DEFAULT NULL, + `start_timestamp` bigint(20) DEFAULT NULL, + `statistic_end_time` datetime DEFAULT NULL, + `statistic_start_time` datetime DEFAULT NULL, + `status` varchar(16) DEFAULT NULL COMMENT '当前版本的运行状态,job_history完成后,会写更新此状态', + `timezone` varchar(32) DEFAULT NULL, + `host_group_id` tinyint(2) DEFAULT NULL COMMENT '任务可分配的执行服务器组', + `down_actions` varchar(16) DEFAULT NULL, + `batch_id` varchar(50) DEFAULT NULL COMMENT '批次号', + PRIMARY KEY (`id`), + KEY `ind_action_groupid` (`group_id`), + KEY `ind_actionjobid` (`job_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='job版本记录表'; + +CREATE TABLE IF NOT EXISTS `hera_action_history` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `job_id` bigint(20) DEFAULT NULL COMMENT 'hera任务id', + `action_id` bigint(20) DEFAULT NULL COMMENT '任务对应的版本号,18位整数', + `cycle` varchar(16) DEFAULT NULL COMMENT '是否是循环任务', + `end_time` datetime DEFAULT NULL COMMENT '任务执行结束时间', + `execute_host` varchar(32) DEFAULT NULL COMMENT '当前版本任务执行的服务器', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `illustrate` varchar(256) DEFAULT NULL COMMENT '任务运行描述', + `log` longtext COMMENT '任务运行日志', + `operator` varchar(32) DEFAULT NULL COMMENT '任务运行操作人', + `properties` varchar(6144) DEFAULT NULL, + `start_time` datetime DEFAULT NULL COMMENT '任务开始执行的时间', + `statistic_end_time` datetime DEFAULT NULL COMMENT '版本生成结束时间', + `status` varchar(16) DEFAULT NULL COMMENT '当前版本的任务运行状态', + `timezone` varchar(32) DEFAULT NULL, + `trigger_type` tinyint(4) DEFAULT NULL COMMENT '任务触发类型(1,自动调度,2,手动触发,3,手动恢复)', + `host_group_id` int(11) DEFAULT NULL COMMENT '任务可分配的执行服务器组', + batch_id varchar(50) DEFAULT NULL COMMENT '批次号', + biz_label varchar(500) DEFAULT NULL COMMENT '标签', + PRIMARY KEY (`id`), + KEY `ind_acthisactionjobid` (`action_id`, `job_id`), + KEY `idx_job_id` (`job_id`), + KEY `ind_his_gmtcreate` (`gmt_create`), + KEY `ind_end_time` (`end_time`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='Job运行日志表'; +CREATE TABLE IF NOT EXISTS `hera_advice` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `msg` varchar(256) DEFAULT NULL COMMENT '消息', + `address` varchar(256) DEFAULT NULL COMMENT 'ip地址', + `color` varchar(7) DEFAULT NULL COMMENT '颜色', + `create_time` varchar(19) DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='hera建议表'; + + +CREATE TABLE IF NOT EXISTS `hera_area` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '区域id', + `name` varchar(50) DEFAULT NULL COMMENT '区域名', + `timezone` varchar(25) DEFAULT NULL COMMENT '时区', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='hera任务区域表'; + +CREATE TABLE IF NOT EXISTS `hera_debug_history` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `end_time` datetime DEFAULT NULL COMMENT '运行结束时间', + `execute_host` varchar(255) DEFAULT NULL COMMENT '执行服务器', + `file_id` bigint(20) DEFAULT NULL COMMENT '脚本文件id', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '运行日志创建时间', + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '运行日志修改时间', + `log` longtext COMMENT '脚本运行日志', + `run_type` varchar(16) DEFAULT NULL COMMENT '运行类型(hive,shell)', + `script` longtext COMMENT '完整运行脚本,', + `start_time` datetime DEFAULT NULL COMMENT '统计开始时间', + `status` varchar(32) DEFAULT NULL COMMENT '脚本运行状态(runnin,success,failed,wait)', + `owner` varchar(32) DEFAULT NULL COMMENT '脚本owner', + `host_group_id` tinyint(4) DEFAULT NULL COMMENT '执行机器组id', + `job_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '关联调度任务id', + PRIMARY KEY (`id`), + KEY `idx_file_id` (`file_id`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + ROW_FORMAT = COMPACT COMMENT ='开发中心脚本运行日志表'; + +CREATE TABLE IF NOT EXISTS `hera_file` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `content` mediumtext COMMENT '脚本文件内容', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '脚本文件创建时间', + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `name` varchar(128) NOT NULL COMMENT '脚本名称', + `owner` varchar(32) NOT NULL COMMENT '脚本的owner', + `parent` int(20) DEFAULT NULL COMMENT '父目录id', + `type` tinyint(4) NOT NULL COMMENT '文件类型(1,目录,2,文件)', + `host_group_id` tinyint(2) DEFAULT NULL COMMENT '执行机器组id', + `job_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '关联调度任务id', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='开发中心脚本记录表'; + +CREATE TABLE IF NOT EXISTS `hera_group` +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `configs` text, + `description` varchar(256) DEFAULT NULL, + `directory` int(11) NOT NULL, + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `name` varchar(255) NOT NULL, + `owner` varchar(255) NOT NULL, + `parent` int(11) DEFAULT NULL, + `resources` text, + `existed` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `ind_heragroupparent` (`parent`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4; + +CREATE TABLE IF NOT EXISTS `hera_host_group` +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(128) DEFAULT NULL COMMENT '组描述', + `effective` tinyint(2) DEFAULT '0' COMMENT '是否有效(1,有效,0,无效)', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `description` varchar(256) DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='机器组记录表'; + +CREATE TABLE IF NOT EXISTS `hera_host_relation` +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `host` varchar(32) DEFAULT NULL COMMENT '机器ip', + `host_group_id` int(11) DEFAULT NULL COMMENT '机器所在组id', + `domain` varchar(16) DEFAULT '' COMMENT '机器域名', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='机器与机器组关联表'; + + +CREATE TABLE IF NOT EXISTS `hera_job` +( + `id` bigint(30) NOT NULL AUTO_INCREMENT COMMENT '任务id', + `auto` tinyint(2) DEFAULT '0' COMMENT '自动调度是否开启', + `configs` text COMMENT '配置的环境变量', + `cron_expression` varchar(32) DEFAULT NULL COMMENT 'cron表达式', + `cycle` varchar(16) DEFAULT NULL COMMENT '是否是循环任务', + `dependencies` varchar(2000) DEFAULT NULL COMMENT '依赖的任务id,逗号分隔', + `description` varchar(256) DEFAULT NULL COMMENT '任务描述', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `group_id` int(11) NOT NULL COMMENT '所在的目录 id', + `history_id` bigint(20) DEFAULT NULL COMMENT '运行历史id', + `host` varchar(32) DEFAULT NULL COMMENT '运行服务器ip', + `last_end_time` datetime DEFAULT NULL, + `last_result` varchar(16) DEFAULT NULL, + `name` varchar(256) NOT NULL COMMENT '任务名称', + `offset` int(11) DEFAULT NULL, + `owner` varchar(256) NOT NULL, + `post_processors` varchar(256) DEFAULT NULL COMMENT '任务运行所需的后置处理', + `pre_processors` varchar(256) DEFAULT NULL COMMENT '任务运行所需的前置处理', + `ready_dependency` varchar(16) DEFAULT NULL COMMENT '任务已完成的依赖', + `resources` text COMMENT '上传的资源文件配置', + `run_type` varchar(16) DEFAULT NULL COMMENT '运行的job类型(hive,shell)', + `schedule_type` tinyint(4) DEFAULT NULL COMMENT '任务调度类型', + `script` mediumtext COMMENT '脚本内容', + `start_time` datetime DEFAULT NULL, + `start_timestamp` bigint(20) DEFAULT NULL, + `statistic_end_time` datetime DEFAULT NULL, + `statistic_start_time` datetime DEFAULT NULL, + `status` varchar(16) DEFAULT NULL, + `timezone` varchar(32) DEFAULT NULL, + `host_group_id` tinyint(2) DEFAULT NULL COMMENT '分发的执行机器组id', + `must_end_minute` int(2) DEFAULT '0', + `area_id` varchar(50) DEFAULT '1' COMMENT '区域ID,多个用,分割', + `repeat_run` tinyint(2) DEFAULT '0' COMMENT '是否允许任务重复执行', + `is_valid` tinyint(1) DEFAULT '1' COMMENT '任务是否删除', + cron_period varchar(100) DEFAULT NULL, + cron_interval int(11) DEFAULT NULL, + biz_label varchar(500) DEFAULT '', + `estimated_end_hour` int(4) NOT NULL DEFAULT '0' COMMENT '预计结束结束时间', + PRIMARY KEY (`id`), + KEY `ind_zeusjobgroupid` (`group_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='hera的job 记录表'; + +CREATE TABLE IF NOT EXISTS `hera_job_monitor` +( + `job_id` bigint(20) NOT NULL, + `user_ids` varchar(100) NOT NULL, + PRIMARY KEY (`job_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4; + +CREATE TABLE IF NOT EXISTS `hera_lock` +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `host` varchar(32) DEFAULT NULL COMMENT '机器对应ip', + `server_update` datetime DEFAULT NULL COMMENT '心跳更新时间', + `subgroup` varchar(32) DEFAULT NULL COMMENT '机器所在组,', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='分布式锁记录表'; + +CREATE TABLE IF NOT EXISTS `hera_permission` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `target_id` bigint(20) DEFAULT NULL COMMENT '授权的任务或者组id', + `type` varchar(32) DEFAULT NULL COMMENT '授权类型(job或者group)', + `uid` varchar(32) DEFAULT NULL COMMENT '被授权着名称', + `is_valid` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='任务授权记录表'; + +CREATE TABLE IF NOT EXISTS `hera_profile` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `hadoop_conf` varchar(2024) DEFAULT NULL COMMENT 'hadoop配置信息', + `uid` varchar(32) DEFAULT NULL COMMENT '用户名称', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='用户配置表'; + + +CREATE TABLE IF NOT EXISTS `hera_user` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `email` varchar(255) DEFAULT NULL, + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `name` varchar(255) DEFAULT NULL, + `phone` varchar(2000) DEFAULT NULL, + `uid` varchar(255) DEFAULT NULL, + `wangwang` varchar(255) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `user_type` int(11) DEFAULT '0', + `is_effective` int(11) DEFAULT '0', + `description` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4; + + +CREATE TABLE IF NOT EXISTS `hera_sso` +( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(16) NOT NULL DEFAULT '' COMMENT '用户名', + `password` varchar(32) NOT NULL DEFAULT '' COMMENT '密码', + `gid` int(11) NOT NULL DEFAULT '0' COMMENT '组id,对应hera_user的主键', + `phone` char(11) NOT NULL DEFAULT '' COMMENT '手机号', + `email` varchar(52) NOT NULL DEFAULT '' COMMENT '邮箱', + `job_number` char(5) NOT NULL DEFAULT '' COMMENT '工号', + `gmt_modified` bigint(20) NOT NULL DEFAULT '0' COMMENT '编辑时间', + `is_valid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否有效:0:无效:1:有效', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间', + PRIMARY KEY (`id`), + UNIQUE KEY `unq_name` (`name`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='sso用户表'; + +CREATE TABLE IF NOT EXISTS `hera_record` +( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '日志类型:比如编辑、更新', + `content` mediumtext COMMENT '脚本的变更前的内容', + `log_type` varchar(15) NOT NULL DEFAULT '-1' COMMENT '记录的日志的类型 比如:任务/组', + `log_id` int(11) NOT NULL DEFAULT '-1' COMMENT '任务id/组id', + `gmt_create` bigint(13) NOT NULL DEFAULT '1557814087800' COMMENT '创建时间', + `gmt_modified` bigint(13) NOT NULL DEFAULT '1557814087800' COMMENT '同步专用字段', + `sso` varchar(32) NOT NULL DEFAULT 'hera' COMMENT '用户名称', + `gId` int(11) NOT NULL DEFAULT '-1' COMMENT '组id', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 37 + DEFAULT CHARSET = utf8mb4 COMMENT ='日志记录表'; + + +CREATE TABLE `hera_rerun` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '重跑名称', + `start_millis` bigint(13) NOT NULL DEFAULT '0' COMMENT '其实跑的日期', + `end_millis` bigint(13) NOT NULL COMMENT '结束跑的日期', + `sso_name` varchar(16) NOT NULL COMMENT '创建人', + `extra` varchar(1000) NOT NULL DEFAULT '' COMMENT '其它配置', + `gmt_create` bigint(13) NOT NULL DEFAULT '0' COMMENT '创建时间', + `gmt_modified` bigint(13) NOT NULL DEFAULT '0' COMMENT '更新时间', + `job_id` int(11) NOT NULL DEFAULT '0' COMMENT '任务ID', + `is_end` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否结束', + `action_now` varchar(18) NOT NULL DEFAULT '' COMMENT '当前执行的版本号', + PRIMARY KEY (`id`), + KEY `idx_job_id` (`job_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='hera重跑任务表'; + +BEGIN; +## 添加默认用户组 + +insert into hera_user (email, name, uid, password, user_type, is_effective) +values ('1142819049@qq.com', 'hera', 'hera', 'd3886bd3bcba3d88e2ab14ba8c9326da', 0, 1); + + +## 添加默认用户 +insert into hera_sso (name,password,gid,email,is_valid) values('hera','d3886bd3bcba3d88e2ab14ba8c9326da',1,'1142819049@qq.com',1); +## 添加默认区域 +insert into hera_area (name) +values ('all'); + +## 初始化任务目录 +INSERT INTO `hera_group` +VALUES ('1', '{\"name\":\"赫拉分布式任务调度系统\"}', '', '0', '2018-12-21 15:11:39', '2018-12-28 10:46:47', 'hera分布式调度系统', 'hera', + '0', '[]', '1'), + ('2', '{\"qq\":\"1142819049\"}', '', '1', '2018-12-21 15:15:36', '2018-12-21 15:31:08', 'test', 'hera', '1', + '[]', '1'); + +## 添加初始化机器组 +insert into hera_host_group (id, name, effective, description) +values (1, '默认组', 1, '机器默认组'); +insert into hera_host_group (id, name, effective, description) +values (2, 'spark组', 1, '执行spark任务'); +## 添加初始化任务 +INSERT INTO `hera_job` +VALUES ('1', '0', + '{\"run.priority.level\":\"1\",\"roll.back.wait.time\":\"1\",\"roll.back.times\":\"0\",\"qqGroup\":\"965839395\"}', + '0 0 3 * * ?', null, '', '输出测试', '2018-12-22 11:14:55', '2019-01-04 11:14:09', '2', null, null, null, null, + 'echoTest', null, 'hera', null, null, null, null, 'shell', '0', + 'echo ${name}\n\necho \"当前时间戳\":${zdt.getTime()}\necho \" 明天\":${zdt.addDay(1).format(\"yyyy-MM-dd HH:mm:ss\")}\n\necho \"上个月的今天\": ${zdt.add(2,-1).format(\"yyyy-MM-dd HH:mm:ss\")}\n\necho \"真实的今天\":${zdt.getToday()}\n\n\necho \"如果需要更多时间查看HeraDateTool类,可以自定义时间\"\n\n\necho ${qqGroup}', + null, null, null, null, null, null, '1', null, '1', 0,1 ,'day', -1 ,'数据层,XXX业务','0'); +## 初始化开发中心文档 +INSERT INTO `hera_file` +VALUES ('1', null, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '个人文档', 'hera', null, '1', '0',0); +INSERT INTO `hera_file` +VALUES ('2', null, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '共享文档', 'all', null, '1', '0',0); + +COMMIT; +SET FOREIGN_KEY_CHECKS = 1; + diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-datetimepicker.css b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-datetimepicker.css new file mode 100755 index 00000000..537c6a4c --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-datetimepicker.css @@ -0,0 +1,418 @@ +/*! + * Datetimepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.datetimepicker { + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + direction: ltr; +} + +.datetimepicker-inline { + width: 220px; +} + +.datetimepicker.datetimepicker-rtl { + direction: rtl; +} + +.datetimepicker.datetimepicker-rtl table tr td span { + float: right; +} + +.datetimepicker-dropdown, .datetimepicker-dropdown-left { + top: 0; + left: 0; +} + +[class*=" datetimepicker-dropdown"]:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #cccccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; +} + +[class*=" datetimepicker-dropdown"]:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; +} + +[class*=" datetimepicker-dropdown-top"]:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 7px solid #cccccc; + border-top-color: rgba(0, 0, 0, 0.2); + border-bottom: 0; +} + +[class*=" datetimepicker-dropdown-top"]:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.datetimepicker-dropdown-bottom-left:before { + top: -7px; + right: 6px; +} + +.datetimepicker-dropdown-bottom-left:after { + top: -6px; + right: 7px; +} + +.datetimepicker-dropdown-bottom-right:before { + top: -7px; + left: 6px; +} + +.datetimepicker-dropdown-bottom-right:after { + top: -6px; + left: 7px; +} + +.datetimepicker-dropdown-top-left:before { + bottom: -7px; + right: 6px; +} + +.datetimepicker-dropdown-top-left:after { + bottom: -6px; + right: 7px; +} + +.datetimepicker-dropdown-top-right:before { + bottom: -7px; + left: 6px; +} + +.datetimepicker-dropdown-top-right:after { + bottom: -6px; + left: 7px; +} + +.datetimepicker > div { + display: none; +} + +.datetimepicker.minutes div.datetimepicker-minutes { + display: block; +} + +.datetimepicker.hours div.datetimepicker-hours { + display: block; +} + +.datetimepicker.days div.datetimepicker-days { + display: block; +} + +.datetimepicker.months div.datetimepicker-months { + display: block; +} + +.datetimepicker.years div.datetimepicker-years { + display: block; +} + +.datetimepicker table { + margin: 0; +} + +.datetimepicker td, +.datetimepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; +} + +.table-striped .datetimepicker table tr td, +.table-striped .datetimepicker table tr th { + background-color: transparent; +} + +.datetimepicker table tr td.minute:hover { + background: #eeeeee; + cursor: pointer; +} + +.datetimepicker table tr td.hour:hover { + background: #eeeeee; + cursor: pointer; +} + +.datetimepicker table tr td.day:hover { + background: #eeeeee; + cursor: pointer; +} + +.datetimepicker table tr td.old, +.datetimepicker table tr td.new { + color: #999999; +} + +.datetimepicker table tr td.disabled, +.datetimepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} + +.datetimepicker table tr td.today, +.datetimepicker table tr td.today:hover, +.datetimepicker table tr td.today.disabled, +.datetimepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); + background-image: linear-gradient(to bottom, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.datetimepicker table tr td.today:hover, +.datetimepicker table tr td.today:hover:hover, +.datetimepicker table tr td.today.disabled:hover, +.datetimepicker table tr td.today.disabled:hover:hover, +.datetimepicker table tr td.today:active, +.datetimepicker table tr td.today:hover:active, +.datetimepicker table tr td.today.disabled:active, +.datetimepicker table tr td.today.disabled:hover:active, +.datetimepicker table tr td.today.active, +.datetimepicker table tr td.today:hover.active, +.datetimepicker table tr td.today.disabled.active, +.datetimepicker table tr td.today.disabled:hover.active, +.datetimepicker table tr td.today.disabled, +.datetimepicker table tr td.today:hover.disabled, +.datetimepicker table tr td.today.disabled.disabled, +.datetimepicker table tr td.today.disabled:hover.disabled, +.datetimepicker table tr td.today[disabled], +.datetimepicker table tr td.today:hover[disabled], +.datetimepicker table tr td.today.disabled[disabled], +.datetimepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; +} + +.datetimepicker table tr td.today:active, +.datetimepicker table tr td.today:hover:active, +.datetimepicker table tr td.today.disabled:active, +.datetimepicker table tr td.today.disabled:hover:active, +.datetimepicker table tr td.today.active, +.datetimepicker table tr td.today:hover.active, +.datetimepicker table tr td.today.disabled.active, +.datetimepicker table tr td.today.disabled:hover.active { + background-color: #fbf069; +} + +.datetimepicker table tr td.active, +.datetimepicker table tr td.active:hover, +.datetimepicker table tr td.active.disabled, +.datetimepicker table tr td.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.datetimepicker table tr td.active:hover, +.datetimepicker table tr td.active:hover:hover, +.datetimepicker table tr td.active.disabled:hover, +.datetimepicker table tr td.active.disabled:hover:hover, +.datetimepicker table tr td.active:active, +.datetimepicker table tr td.active:hover:active, +.datetimepicker table tr td.active.disabled:active, +.datetimepicker table tr td.active.disabled:hover:active, +.datetimepicker table tr td.active.active, +.datetimepicker table tr td.active:hover.active, +.datetimepicker table tr td.active.disabled.active, +.datetimepicker table tr td.active.disabled:hover.active, +.datetimepicker table tr td.active.disabled, +.datetimepicker table tr td.active:hover.disabled, +.datetimepicker table tr td.active.disabled.disabled, +.datetimepicker table tr td.active.disabled:hover.disabled, +.datetimepicker table tr td.active[disabled], +.datetimepicker table tr td.active:hover[disabled], +.datetimepicker table tr td.active.disabled[disabled], +.datetimepicker table tr td.active.disabled:hover[disabled] { + background-color: #0044cc; +} + +.datetimepicker table tr td.active:active, +.datetimepicker table tr td.active:hover:active, +.datetimepicker table tr td.active.disabled:active, +.datetimepicker table tr td.active.disabled:hover:active, +.datetimepicker table tr td.active.active, +.datetimepicker table tr td.active:hover.active, +.datetimepicker table tr td.active.disabled.active, +.datetimepicker table tr td.active.disabled:hover.active { + background-color: #003399; +} + +.datetimepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.datetimepicker .datetimepicker-hours span { + height: 26px; + line-height: 26px; +} + +.datetimepicker .datetimepicker-hours table tr td span.hour_am, +.datetimepicker .datetimepicker-hours table tr td span.hour_pm { + width: 14.6%; +} + +.datetimepicker .datetimepicker-hours fieldset legend, +.datetimepicker .datetimepicker-minutes fieldset legend { + margin-bottom: inherit; + line-height: 30px; +} + +.datetimepicker .datetimepicker-minutes span { + height: 26px; + line-height: 26px; +} + +.datetimepicker table tr td span:hover { + background: #eeeeee; +} + +.datetimepicker table tr td span.disabled, +.datetimepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} + +.datetimepicker table tr td span.active, +.datetimepicker table tr td span.active:hover, +.datetimepicker table tr td span.active.disabled, +.datetimepicker table tr td span.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.datetimepicker table tr td span.active:hover, +.datetimepicker table tr td span.active:hover:hover, +.datetimepicker table tr td span.active.disabled:hover, +.datetimepicker table tr td span.active.disabled:hover:hover, +.datetimepicker table tr td span.active:active, +.datetimepicker table tr td span.active:hover:active, +.datetimepicker table tr td span.active.disabled:active, +.datetimepicker table tr td span.active.disabled:hover:active, +.datetimepicker table tr td span.active.active, +.datetimepicker table tr td span.active:hover.active, +.datetimepicker table tr td span.active.disabled.active, +.datetimepicker table tr td span.active.disabled:hover.active, +.datetimepicker table tr td span.active.disabled, +.datetimepicker table tr td span.active:hover.disabled, +.datetimepicker table tr td span.active.disabled.disabled, +.datetimepicker table tr td span.active.disabled:hover.disabled, +.datetimepicker table tr td span.active[disabled], +.datetimepicker table tr td span.active:hover[disabled], +.datetimepicker table tr td span.active.disabled[disabled], +.datetimepicker table tr td span.active.disabled:hover[disabled] { + background-color: #0044cc; +} + +.datetimepicker table tr td span.active:active, +.datetimepicker table tr td span.active:hover:active, +.datetimepicker table tr td span.active.disabled:active, +.datetimepicker table tr td span.active.disabled:hover:active, +.datetimepicker table tr td span.active.active, +.datetimepicker table tr td span.active:hover.active, +.datetimepicker table tr td span.active.disabled.active, +.datetimepicker table tr td span.active.disabled:hover.active { + background-color: #003399; +} + +.datetimepicker table tr td span.old { + color: #999999; +} + +.datetimepicker th.switch { + width: 145px; +} + +.datetimepicker th span.glyphicon { + pointer-events: none; +} + +.datetimepicker thead tr:first-child th, +.datetimepicker tfoot th { + cursor: pointer; +} + +.datetimepicker thead tr:first-child th:hover, +.datetimepicker tfoot th:hover { + background: #eeeeee; +} + +.input-append.date .add-on i, +.input-prepend.date .add-on i, +.input-group.date .input-group-addon span { + cursor: pointer; + width: 14px; + height: 14px; +} diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-datetimepicker.min.css b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-datetimepicker.min.css new file mode 100755 index 00000000..78485fee --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,9 @@ +/*! + * Datetimepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.datetimepicker{padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datetimepicker-inline{width:220px}.datetimepicker.datetimepicker-rtl{direction:rtl}.datetimepicker.datetimepicker-rtl table tr td span{float:right}.datetimepicker-dropdown,.datetimepicker-dropdown-left{top:0;left:0}[class*=" datetimepicker-dropdown"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute}[class*=" datetimepicker-dropdown"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute}[class*=" datetimepicker-dropdown-top"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0}[class*=" datetimepicker-dropdown-top"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;border-bottom:0}.datetimepicker-dropdown-bottom-left:before{top:-7px;right:6px}.datetimepicker-dropdown-bottom-left:after{top:-6px;right:7px}.datetimepicker-dropdown-bottom-right:before{top:-7px;left:6px}.datetimepicker-dropdown-bottom-right:after{top:-6px;left:7px}.datetimepicker-dropdown-top-left:before{bottom:-7px;right:6px}.datetimepicker-dropdown-top-left:after{bottom:-6px;right:7px}.datetimepicker-dropdown-top-right:before{bottom:-7px;left:6px}.datetimepicker-dropdown-top-right:after{bottom:-6px;left:7px}.datetimepicker>div{display:none}.datetimepicker.minutes div.datetimepicker-minutes{display:block}.datetimepicker.hours div.datetimepicker-hours{display:block}.datetimepicker.days div.datetimepicker-days{display:block}.datetimepicker.months div.datetimepicker-months{display:block}.datetimepicker.years div.datetimepicker-years{display:block}.datetimepicker table{margin:0}.datetimepicker td,.datetimepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0}.table-striped .datetimepicker table tr td,.table-striped .datetimepicker table tr th{background-color:transparent}.datetimepicker table tr td.minute:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.hour:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.day:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.old,.datetimepicker table tr td.new{color:#999}.datetimepicker table tr td.disabled,.datetimepicker table tr td.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td.today,.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top,#fdd49a,#fdf59a);background-image:-ms-linear-gradient(top,#fdd49a,#fdf59a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));background-image:-webkit-linear-gradient(top,#fdd49a,#fdf59a);background-image:-o-linear-gradient(top,#fdd49a,#fdf59a);background-image:linear-gradient(to bottom,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a',endColorstr='#fdf59a',GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today:hover:hover,.datetimepicker table tr td.today.disabled:hover,.datetimepicker table tr td.today.disabled:hover:hover,.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today:hover.disabled,.datetimepicker table tr td.today.disabled.disabled,.datetimepicker table tr td.today.disabled:hover.disabled,.datetimepicker table tr td.today[disabled],.datetimepicker table tr td.today:hover[disabled],.datetimepicker table tr td.today.disabled[disabled],.datetimepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active{background-color:#fbf069}.datetimepicker table tr td.active,.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active:hover:hover,.datetimepicker table tr td.active.disabled:hover,.datetimepicker table tr td.active.disabled:hover:hover,.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active:hover.disabled,.datetimepicker table tr td.active.disabled.disabled,.datetimepicker table tr td.active.disabled:hover.disabled,.datetimepicker table tr td.active[disabled],.datetimepicker table tr td.active:hover[disabled],.datetimepicker table tr td.active.disabled[disabled],.datetimepicker table tr td.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datetimepicker .datetimepicker-hours span{height:26px;line-height:26px}.datetimepicker .datetimepicker-hours table tr td span.hour_am,.datetimepicker .datetimepicker-hours table tr td span.hour_pm{width:14.6%}.datetimepicker .datetimepicker-hours fieldset legend,.datetimepicker .datetimepicker-minutes fieldset legend{margin-bottom:inherit;line-height:30px}.datetimepicker .datetimepicker-minutes span{height:26px;line-height:26px}.datetimepicker table tr td span:hover{background:#eee}.datetimepicker table tr td span.disabled,.datetimepicker table tr td span.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td span.active,.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active:hover:hover,.datetimepicker table tr td span.active.disabled:hover,.datetimepicker table tr td span.active.disabled:hover:hover,.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active:hover.disabled,.datetimepicker table tr td span.active.disabled.disabled,.datetimepicker table tr td span.active.disabled:hover.disabled,.datetimepicker table tr td span.active[disabled],.datetimepicker table tr td span.active:hover[disabled],.datetimepicker table tr td span.active.disabled[disabled],.datetimepicker table tr td span.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span.old{color:#999}.datetimepicker th.switch{width:145px}.datetimepicker th span.glyphicon{pointer-events:none}.datetimepicker thead tr:first-child th,.datetimepicker tfoot th{cursor:pointer}.datetimepicker thead tr:first-child th:hover,.datetimepicker tfoot th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i,.input-group.date .input-group-addon span{cursor:pointer;width:14px;height:14px} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-tab.css b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-tab.css new file mode 100755 index 00000000..c786b967 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-tab.css @@ -0,0 +1,59 @@ +.nav-tabs li .closeable { +/* top: 65px; */ +/* position: fixed; */ + padding-left: 3px; + cursor: pointer; +} + +/*修改tab高度样式*/ + +.nav-tabs li a{ + line-height:1px; +} +.nav-tabs .active a{ + border-top: solid 1px #3498db !important; +} + + +.nav-tabs{ + background: #fafafa; + border-bottom: 1px #3498db solid; +} + +.nav-tabs li a{ + line-height:1; + border:1px #ddd solid; + margin-right: -1px; + color: #999; + border-radius: 0; +} +.nav-tabs li a .glyphicon-remove-sign:hover{ + color:red; + cursor: pointer; +} +.nav-tabs li a i:first-child{ + margin-right: 1px; +} +.nav-tabs .active a{ + border-top: solid 1px #3498db !important; + background: #3498db !important; + color:#fff !important; +} + +.nav-my-tab{ + padding-left: 0px; + margin-bottom: 0px; +} +.nav-my-tab .middletab{ + height: 36px; + overflow: hidden; + border-bottom: 3px #3498db solid; + position: relative; + background: #fafafa; +} +.nav-my-tab li{ + list-style-type: none; +} +.nav-my-tab li a{ + padding:5px 10px; +} diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.css b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.css new file mode 100755 index 00000000..31d88826 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.css.map b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.css.map new file mode 100755 index 00000000..d876f60f --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.min.css b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.min.css new file mode 100755 index 00000000..5e394019 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.min.css.map b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.min.css.map new file mode 100755 index 00000000..94813e90 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.css b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.css new file mode 100755 index 00000000..6167622c --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.css.map b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.css.map new file mode 100755 index 00000000..f010c82d --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;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ukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBA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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.min.css b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.min.css new file mode 100755 index 00000000..ed3905e0 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.min.css.map b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.min.css.map new file mode 100755 index 00000000..6c7fa40b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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kDG,edokDH,MAAA,acpkDG,edukDH,MAAA,IcvkDG,ed0kDH,MAAA,ac1kDG,ed6kDH,MAAA,ac7kDG,edglDH,MAAA,IchlDG,edmlDH,MAAA,ac9kDG,edilDH,MAAA,YchmDG,edmmDH,MAAA,KcnmDG,gBdsmDH,KAAA,KctmDG,gBdymDH,KAAA,aczmDG,gBd4mDH,KAAA,ac5mDG,ed+mDH,KAAA,Ic/mDG,edknDH,KAAA,aclnDG,edqnDH,KAAA,acrnDG,edwnDH,KAAA,IcxnDG,ed2nDH,KAAA,ac3nDG,ed8nDH,KAAA,ac9nDG,edioDH,KAAA,IcjoDG,edooDH,KAAA,ac/nDG,edkoDH,KAAA,YcnnDG,edsnDH,KAAA,KctnDG,kBdynDH,YAAA,KcznDG,kBd4nDH,YAAA,ac5nDG,kBd+nDH,YAAA,ac/nDG,iBdkoDH,YAAA,IcloDG,iBdqoDH,YAAA,acroDG,iBdwoDH,YAAA,acxoDG,iBd2oDH,YAAA,Ic3oDG,iBd8oDH,YAAA,ac9oDG,iBdipDH,YAAA,acjpDG,iBdopDH,YAAA,IcppDG,iBdupDH,YAAA,acvpDG,iBd0pDH,YAAA,Yc5rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud0rDD,MAAA,Kc1rDC,Wd6rDD,MAAA,Kc7rDC,WdgsDD,MAAA,achsDC,WdmsDD,MAAA,acnsDC,UdssDD,MAAA,IctsDC,UdysDD,MAAA,aczsDC,Ud4sDD,MAAA,ac5sDC,Ud+sDD,MAAA,Ic/sDC,UdktDD,MAAA,acltDC,UdqtDD,MAAA,acrtDC,UdwtDD,MAAA,IcxtDC,Ud2tDD,MAAA,ac5sDC,Ud+sDD,MAAA,Yc/sDC,gBdktDD,MAAA,KcltDC,gBdqtDD,MAAA,acrtDC,gBdwtDD,MAAA,acxtDC,ed2tDD,MAAA,Ic3tDC,ed8tDD,MAAA,ac9tDC,ediuDD,MAAA,acjuDC,edouDD,MAAA,IcpuDC,eduuDD,MAAA,acvuDC,ed0uDD,MAAA,ac1uDC,ed6uDD,MAAA,Ic7uDC,edgvDD,MAAA,ac3uDC,ed8uDD,MAAA,Yc7vDC,edgwDD,MAAA,KchwDC,gBdmwDD,KAAA,KcnwDC,gBdswDD,KAAA,actwDC,gBdywDD,KAAA,aczwDC,ed4wDD,KAAA,Ic5wDC,ed+wDD,KAAA,ac/wDC,edkxDD,KAAA,aclxDC,edqxDD,KAAA,IcrxDC,edwxDD,KAAA,acxxDC,ed2xDD,KAAA,ac3xDC,ed8xDD,KAAA,Ic9xDC,ediyDD,KAAA,ac5xDC,ed+xDD,KAAA,YchxDC,edmxDD,KAAA,KcnxDC,kBdsxDD,YAAA,KctxDC,kBdyxDD,YAAA,aczxDC,kBd4xDD,YAAA,ac5xDC,iBd+xDD,YAAA,Ic/xDC,iBdkyDD,YAAA,aclyDC,iBdqyDD,YAAA,acryDC,iBdwyDD,YAAA,IcxyDC,iBd2yDD,YAAA,ac3yDC,iBd8yDD,YAAA,ac9yDC,iBdizDD,YAAA,IcjzDC,iBdozDD,YAAA,acpzDC,iBduzDD,YAAA,YY9yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udw1DD,MAAA,Kcx1DC,Wd21DD,MAAA,Kc31DC,Wd81DD,MAAA,ac91DC,Wdi2DD,MAAA,acj2DC,Udo2DD,MAAA,Icp2DC,Udu2DD,MAAA,acv2DC,Ud02DD,MAAA,ac12DC,Ud62DD,MAAA,Ic72DC,Udg3DD,MAAA,ach3DC,Udm3DD,MAAA,acn3DC,Uds3DD,MAAA,Ict3DC,Udy3DD,MAAA,ac12DC,Ud62DD,MAAA,Yc72DC,gBdg3DD,MAAA,Kch3DC,gBdm3DD,MAAA,acn3DC,gBds3DD,MAAA,act3DC,edy3DD,MAAA,Icz3DC,ed43DD,MAAA,ac53DC,ed+3DD,MAAA,ac/3DC,edk4DD,MAAA,Icl4DC,edq4DD,MAAA,acr4DC,edw4DD,MAAA,acx4DC,ed24DD,MAAA,Ic34DC,ed84DD,MAAA,acz4DC,ed44DD,MAAA,Yc35DC,ed85DD,MAAA,Kc95DC,gBdi6DD,KAAA,Kcj6DC,gBdo6DD,KAAA,acp6DC,gBdu6DD,KAAA,acv6DC,ed06DD,KAAA,Ic16DC,ed66DD,KAAA,ac76DC,edg7DD,KAAA,ach7DC,edm7DD,KAAA,Icn7DC,eds7DD,KAAA,act7DC,edy7DD,KAAA,acz7DC,ed47DD,KAAA,Ic57DC,ed+7DD,KAAA,ac17DC,ed67DD,KAAA,Yc96DC,edi7DD,KAAA,Kcj7DC,kBdo7DD,YAAA,Kcp7DC,kBdu7DD,YAAA,acv7DC,kBd07DD,YAAA,ac17DC,iBd67DD,YAAA,Ic77DC,iBdg8DD,YAAA,ach8DC,iBdm8DD,YAAA,acn8DC,iBds8DD,YAAA,Ict8DC,iBdy8DD,YAAA,acz8DC,iBd48DD,YAAA,ac58DC,iBd+8DD,YAAA,Ic/8DC,iBdk9DD,YAAA,acl9DC,iBdq9DD,YAAA,YYz8DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Uds/DD,MAAA,Kct/DC,Wdy/DD,MAAA,Kcz/DC,Wd4/DD,MAAA,ac5/DC,Wd+/DD,MAAA,ac//DC,UdkgED,MAAA,IclgEC,UdqgED,MAAA,acrgEC,UdwgED,MAAA,acxgEC,Ud2gED,MAAA,Ic3gEC,Ud8gED,MAAA,ac9gEC,UdihED,MAAA,acjhEC,UdohED,MAAA,IcphEC,UduhED,MAAA,acxgEC,Ud2gED,MAAA,Yc3gEC,gBd8gED,MAAA,Kc9gEC,gBdihED,MAAA,acjhEC,gBdohED,MAAA,acphEC,eduhED,MAAA,IcvhEC,ed0hED,MAAA,ac1hEC,ed6hED,MAAA,ac7hEC,edgiED,MAAA,IchiEC,edmiED,MAAA,acniEC,edsiED,MAAA,actiEC,edyiED,MAAA,IcziEC,ed4iED,MAAA,acviEC,ed0iED,MAAA,YczjEC,ed4jED,MAAA,Kc5jEC,gBd+jED,KAAA,Kc/jEC,gBdkkED,KAAA,aclkEC,gBdqkED,KAAA,acrkEC,edwkED,KAAA,IcxkEC,ed2kED,KAAA,ac3kEC,ed8kED,KAAA,ac9kEC,edilED,KAAA,IcjlEC,edolED,KAAA,acplEC,edulED,KAAA,acvlEC,ed0lED,KAAA,Ic1lEC,ed6lED,KAAA,acxlEC,ed2lED,KAAA,Yc5kEC,ed+kED,KAAA,Kc/kEC,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A,KlBq7FM,WAAY,KkBn7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBi+FD,aoB99FC,MAAA,KnB0+FA,iBAAkB,KmBx+FhB,aAAA,KpBk+FH,mBoBh+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBi+FH,mBoB99FC,MAAA,KnB0+FA,iBAAkB,QAClB,aAAc,QmBt+FR,oBADJ,oBpBi+FH,mCoB99FG,MAAA,KnB0+FF,iBAAkB,QAClB,aAAc,QmBt+FN,0BnB4+FV,0BAHA,0BmB1+FM,0BnB4+FN,0BAHA,0BDFC,yCoBx+FK,yCnB4+FN,yCmBv+FE,MAAA,KnB++FA,iBAAkB,QAClB,aAAc,QmBx+FZ,oBpBg+FH,oBoBh+FG,mCnB6+FF,iBAAkB,KmBz+FV,4BnB8+FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB39FA,sCClBM,sCnB8+FN,sCmBx+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB0hGD,aoBvhGC,MAAA,KnBmiGA,iBAAkB,QmBjiGhB,aAAA,QpB2hGH,mBoBzhGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB0hGH,mBoBvhGC,MAAA,KnBmiGA,iBAAkB,QAClB,aAAc,QmB/hGR,oBADJ,oBpB0hGH,mCoBvhGG,MAAA,KnBmiGF,iBAAkB,QAClB,aAAc,QmB/hGN,0BnBqiGV,0BAHA,0BmBniGM,0BnBqiGN,0BAHA,0BDFC,yCoBjiGK,yCnBqiGN,yCmBhiGE,MAAA,KnBwiGA,iBAAkB,QAClB,aAAc,QmBjiGZ,oBpByhGH,oBoBzhGG,mCnBsiGF,iBAAkB,KmBliGV,4BnBuiGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBjhGA,sCCrBM,sCnBuiGN,sCmBjiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBmlGD,aoBhlGC,MAAA,KnB4lGA,iBAAkB,QmB1lGhB,aAAA,QpBolGH,mBoBllGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBmlGH,mBoBhlGC,MAAA,KnB4lGA,iBAAkB,QAClB,aAAc,QmBxlGR,oBADJ,oBpBmlGH,mCoBhlGG,MAAA,KnB4lGF,iBAAkB,QAClB,aAAc,QmBxlGN,0BnB8lGV,0BAHA,0BmB5lGM,0BnB8lGN,0BAHA,0BDFC,yCoB1lGK,yCnB8lGN,yCmBzlGE,MAAA,KnBimGA,iBAAkB,QAClB,aAAc,QmB1lGZ,oBpBklGH,oBoBllGG,mCnB+lGF,iBAAkB,KmB3lGV,4BnBgmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBtkGA,sCCzBM,sCnBgmGN,sCmB1lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB4oGD,UoBzoGC,MAAA,KnBqpGA,iBAAkB,QmBnpGhB,aAAA,QpB6oGH,gBoB3oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB4oGH,gBoBzoGC,MAAA,KnBqpGA,iBAAkB,QAClB,aAAc,QmBjpGR,iBADJ,iBpB4oGH,gCoBzoGG,MAAA,KnBqpGF,iBAAkB,QAClB,aAAc,QmBjpGN,uBnBupGV,uBAHA,uBmBrpGM,uBnBupGN,uBAHA,uBDFC,sCoBnpGK,sCnBupGN,sCmBlpGE,MAAA,KnB0pGA,iBAAkB,QAClB,aAAc,QmBnpGZ,iBpB2oGH,iBoB3oGG,gCnBwpGF,iBAAkB,KmBppGV,yBnBypGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB3nGA,mCC7BM,mCnBypGN,mCmBnpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBqsGD,aoBlsGC,MAAA,KnB8sGA,iBAAkB,QmB5sGhB,aAAA,QpBssGH,mBoBpsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBqsGH,mBoBlsGC,MAAA,KnB8sGA,iBAAkB,QAClB,aAAc,QmB1sGR,oBADJ,oBpBqsGH,mCoBlsGG,MAAA,KnB8sGF,iBAAkB,QAClB,aAAc,QmB1sGN,0BnBgtGV,0BAHA,0BmB9sGM,0BnBgtGN,0BAHA,0BDFC,yCoB5sGK,yCnBgtGN,yCmB3sGE,MAAA,KnBmtGA,iBAAkB,QAClB,aAAc,QmB5sGZ,oBpBosGH,oBoBpsGG,mCnBitGF,iBAAkB,KmB7sGV,4BnBktGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBhrGA,sCCjC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A,QkDrxKC,WAAY,IAAI,MAAM,KjDizKtB,2BAA4B,IiD9yK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElDwxKL,oCkDnxKG,oDjD+yKF,aAAc,IAAI,EiD7yKZ,cAAA,EvBtEL,4D3B61KF,4EkDjxKG,WAAA,EjD6yKF,uBAAwB,IiD3yKlB,wBAAA,IvBtEL,0D3B21KF,0EkD1yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElD8wKH,wBAAA,EkD1wKC,wDlD6wKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDlyKpB,8BlD0wKC,ckD1wKD,gCjDuyKE,cAAe,EiDvyKjB,sCAQM,sBlDwwKL,wCC4BC,cAAe,K0Br5Kf,aAAA,KuByGF,wDlDqxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDlzK3B,yFAoBQ,yFlDwwKP,2DkDzwKO,2DjDqyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiD9zKA,wGjD4zKA,wGDtBC,wGCuBD,0EiD7zKA,0EjD2zKA,0EiDnyKU,0EjD2yKR,uBAAwB,IAK1B,uGiDx0KA,uGjDs0KA,uGDtBC,uGCuBD,yEiDv0KA,yEjDq0KA,yEiDzyKU,yEvB7HR,wBAAA,IuBiGF,sDlDqzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiDxyKrB,qFA1CR,qFAyCQ,wDlDmxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiD91KA,oGjD21KA,uEiD7yKU,uEjD+yKV,uEiD71KA,uEjDm2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiDx2KA,mGjDq2KA,sEiDnzKU,sEjDqzKV,sEiDv2KA,sEjD62KE,2BAA4B,IiDlzK1B,0BlD2xKH,qCkDt1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD23KE,OAAQ,EiDjzKA,+CjDqzKV,+CiD/3KA,+CjDi4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDh4KA,iEjDk4KA,iEAEA,iEANA,iEAWE,YAAa,EiD3zKL,8CjD+zKV,8CiD74KA,8CjD+4KA,8CAEA,8CANA,8CDjBC,gECo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Dk2MD,kBACF,QAAA,iB+D91MG,yB/Dk2MD,mBACF,QAAA,kBgEh6MC,yBhEo6MC,yBgEn6MD,QAAA,wBACA,+CAAU,YhEw6MT,QAAA,gBC4BD,iB+Dl8MU,QAAA,gBhE26MX,c+Dr2MG,QAAS,oB/Dy2MV,c+D32MC,c/D42MH,QAAA,sB+Dv2MG,+C/D22MD,kBACF,QAAA,iB+Dv2MG,+C/D22MD,mBACF,QAAA,kBgE97MC,+ChEk8MC,yBgEj8MD,QAAA,wBACA,gDAAU,YhEs8MT,QAAA,gBC4BD,iB+Dh+MU,QAAA,gBhEy8MX,c+D92MG,QAAS,oB/Dk3MV,c+Dp3MC,c/Dq3MH,QAAA,sB+Dh3MG,gD/Do3MD,kBACF,QAAA,iB+Dh3MG,gD/Do3MD,mBACF,QAAA,kBgE59MC,gDhEg+MC,yBgE/9MD,QAAA,wBACA,0BAAU,YhEo+MT,QAAA,gBC4BD,iB+D9/MU,QAAA,gBhEu+MX,c+Dv3MG,QAAS,oB/D23MV,c+D73MC,c/D83MH,QAAA,sB+Dz3MG,0B/D63MD,kBACF,QAAA,iB+Dz3MG,0B/D63MD,mBACF,QAAA,kBgEl/MC,0BhEs/MC,yBACF,QAAA,wBgEv/MC,yBhE2/MC,WACF,QAAA,gBgE5/MC,+ChEggNC,WACF,QAAA,gBgEjgNC,gDhEqgNC,WACF,QAAA,gBAGA,0B+Dh3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehEyhNT,QAAA,gBC4BD,oB+DnjNU,QAAA,gBhE4hNX,iB+D93MG,QAAS,oBAMX,iB/D23MD,iB+Dt2MG,QAAS,sB/D22MZ,qB+D/3MC,QAAS,e/Dk4MV,a+D53MC,qBAcE,QAAS,iB/Dm3MZ,sB+Dh4MC,QAAS,e/Dm4MV,a+D73MC,sBAOE,QAAS,kB/D23MZ,4B+D53MC,QAAS,eCpLT,ahEojNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS","sourcesContent":["/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n margin: .67em 0;\n font-size: 2em;\n}\nmark {\n color: #000;\n background: #ff0;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsup {\n top: -.5em;\n}\nsub {\n bottom: -.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n height: 0;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font: inherit;\n color: inherit;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n padding: .35em .625em .75em;\n margin: 0 2px;\n border: 1px solid #c0c0c0;\n}\nlegend {\n padding: 0;\n border: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n display: inline-block;\n max-width: 100%;\n height: auto;\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all .2s ease-in-out;\n -o-transition: all .2s ease-in-out;\n transition: all .2s ease-in-out;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: .2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n margin-left: -5px;\n list-style: none;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n overflow: hidden;\n clear: left;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: .01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n padding: 6px 12px;\n margin-bottom: 0;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: normal;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity .15s linear;\n -o-transition: opacity .15s linear;\n transition: opacity .15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n -webkit-transition-duration: .35s;\n -o-transition-duration: .35s;\n transition-duration: .35s;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555;\n text-align: center;\n background-color: #eee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.nav > li.disabled > a {\n color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n -webkit-overflow-scrolling: touch;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-top: 8px;\n margin-right: 15px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-top: 8px;\n margin-right: -15px;\n margin-bottom: 8px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border .2s ease-in-out;\n -o-transition: border .2s ease-in-out;\n transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n float: left;\n width: 0;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n -webkit-transition: width .6s ease;\n -o-transition: width .6s ease;\n transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: .2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: .5;\n}\nbutton.close {\n -webkit-appearance: none;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transition: -webkit-transform .3s ease-out;\n -o-transition: -o-transform .3s ease-out;\n transition: transform .3s ease-out;\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n outline: 0;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n filter: alpha(opacity=0);\n opacity: 0;\n\n line-break: auto;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: .9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n line-break: auto;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999;\n border-top-color: rgba(0, 0, 0, .25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999;\n border-right-color: rgba(0, 0, 0, .25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999;\n border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999;\n border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: .6s ease-in-out left;\n -o-transition: .6s ease-in-out left;\n transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform .6s ease-in-out;\n -o-transition: -o-transform .6s ease-in-out;\n transition: transform .6s ease-in-out;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n left: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n left: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n left: 0;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n filter: alpha(opacity=90);\n outline: 0;\n opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
        ,
          , or
          .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.eot b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100755 index 00000000..b93a4953 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.eot differ diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.svg b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.svg new file mode 100755 index 00000000..94fb5490 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.ttf b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100755 index 00000000..1413fc60 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.ttf differ diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff new file mode 100755 index 00000000..9e612858 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff differ diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100755 index 00000000..64539b54 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.js b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.js new file mode 100755 index 00000000..f66d69c1 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.js @@ -0,0 +1,1967 @@ +/* ========================================================= + * bootstrap-datetimepicker.js + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Improvements by Andrew Rowls + * Improvements by Sébastien Malot + * Improvements by Yun Lai + * Improvements by Kenneth Henderick + * Improvements by CuGBabyBeaR + * Improvements by Christian Vaas + * + * Project URL : http://www.malot.fr/bootstrap-datetimepicker + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +(function(factory){ + if (typeof define === 'function' && define.amd) + define(['jquery'], factory); + else if (typeof exports === 'object') + factory(require('jquery')); + else + factory(jQuery); + +}(function($, undefined){ + + // Add ECMA262-5 Array methods if not supported natively (IE8) + if (!('indexOf' in Array.prototype)) { + Array.prototype.indexOf = function (find, i) { + if (i === undefined) i = 0; + if (i < 0) i += this.length; + if (i < 0) i = 0; + for (var n = this.length; i < n; i++) { + if (i in this && this[i] === find) { + return i; + } + } + return -1; + } + } + + // Add timezone abbreviation support for ie6+, Chrome, Firefox + function timeZoneAbbreviation() { + var abbreviation, date, formattedStr, i, len, matchedStrings, ref, str; + date = (new Date()).toString(); + formattedStr = ((ref = date.split('(')[1]) != null ? ref.slice(0, -1) : 0) || date.split(' '); + if (formattedStr instanceof Array) { + matchedStrings = []; + for (var i = 0, len = formattedStr.length; i < len; i++) { + str = formattedStr[i]; + if ((abbreviation = (ref = str.match(/\b[A-Z]+\b/)) !== null) ? ref[0] : 0) { + matchedStrings.push(abbreviation); + } + } + formattedStr = matchedStrings.pop(); + } + return formattedStr; + } + + function UTCDate() { + return new Date(Date.UTC.apply(Date, arguments)); + } + + // Picker object + var Datetimepicker = function (element, options) { + var that = this; + + this.element = $(element); + + // add container for single page application + // when page switch the datetimepicker div will be removed also. + this.container = options.container || 'body'; + + this.language = options.language || this.element.data('date-language') || 'en'; + this.language = this.language in dates ? this.language : this.language.split('-')[0]; // fr-CA fallback to fr + this.language = this.language in dates ? this.language : 'en'; + this.isRTL = dates[this.language].rtl || false; + this.formatType = options.formatType || this.element.data('format-type') || 'standard'; + this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || dates[this.language].format || DPGlobal.getDefaultFormat(this.formatType, 'input'), this.formatType); + this.isInline = false; + this.isVisible = false; + this.isInput = this.element.is('input'); + this.fontAwesome = options.fontAwesome || this.element.data('font-awesome') || false; + + this.bootcssVer = options.bootcssVer || (this.isInput ? (this.element.is('.form-control') ? 3 : 2) : ( this.bootcssVer = this.element.is('.input-group') ? 3 : 2 )); + + this.component = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-th, .input-group-addon .glyphicon-time, .input-group-addon .glyphicon-remove, .input-group-addon .glyphicon-calendar, .input-group-addon .fa-calendar, .input-group-addon .fa-clock-o').parent() : this.element.find('.add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar, .add-on .fa-calendar, .add-on .fa-clock-o').parent()) : false; + this.componentReset = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-remove, .input-group-addon .fa-times').parent():this.element.find('.add-on .icon-remove, .add-on .fa-times').parent()) : false; + this.hasInput = this.component && this.element.find('input').length; + if (this.component && this.component.length === 0) { + this.component = false; + } + this.linkField = options.linkField || this.element.data('link-field') || false; + this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType); + this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5; + this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right'; + this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false; + this.initialDate = options.initialDate || new Date(); + this.zIndex = options.zIndex || this.element.data('z-index') || undefined; + this.title = typeof options.title === 'undefined' ? false : options.title; + this.timezone = options.timezone || timeZoneAbbreviation(); + + this.icons = { + leftArrow: this.fontAwesome ? 'fa-arrow-left' : (this.bootcssVer === 3 ? 'glyphicon-arrow-left' : 'icon-arrow-left'), + rightArrow: this.fontAwesome ? 'fa-arrow-right' : (this.bootcssVer === 3 ? 'glyphicon-arrow-right' : 'icon-arrow-right') + } + this.icontype = this.fontAwesome ? 'fa' : 'glyphicon'; + + this._attachEvents(); + + this.clickedOutside = function (e) { + // Clicked outside the datetimepicker, hide it + if ($(e.target).closest('.datetimepicker').length === 0) { + that.hide(); + } + } + + this.formatViewType = 'datetime'; + if ('formatViewType' in options) { + this.formatViewType = options.formatViewType; + } else if ('formatViewType' in this.element.data()) { + this.formatViewType = this.element.data('formatViewType'); + } + + this.minView = 0; + if ('minView' in options) { + this.minView = options.minView; + } else if ('minView' in this.element.data()) { + this.minView = this.element.data('min-view'); + } + this.minView = DPGlobal.convertViewMode(this.minView); + + this.maxView = DPGlobal.modes.length - 1; + if ('maxView' in options) { + this.maxView = options.maxView; + } else if ('maxView' in this.element.data()) { + this.maxView = this.element.data('max-view'); + } + this.maxView = DPGlobal.convertViewMode(this.maxView); + + this.wheelViewModeNavigation = false; + if ('wheelViewModeNavigation' in options) { + this.wheelViewModeNavigation = options.wheelViewModeNavigation; + } else if ('wheelViewModeNavigation' in this.element.data()) { + this.wheelViewModeNavigation = this.element.data('view-mode-wheel-navigation'); + } + + this.wheelViewModeNavigationInverseDirection = false; + + if ('wheelViewModeNavigationInverseDirection' in options) { + this.wheelViewModeNavigationInverseDirection = options.wheelViewModeNavigationInverseDirection; + } else if ('wheelViewModeNavigationInverseDirection' in this.element.data()) { + this.wheelViewModeNavigationInverseDirection = this.element.data('view-mode-wheel-navigation-inverse-dir'); + } + + this.wheelViewModeNavigationDelay = 100; + if ('wheelViewModeNavigationDelay' in options) { + this.wheelViewModeNavigationDelay = options.wheelViewModeNavigationDelay; + } else if ('wheelViewModeNavigationDelay' in this.element.data()) { + this.wheelViewModeNavigationDelay = this.element.data('view-mode-wheel-navigation-delay'); + } + + this.startViewMode = 2; + if ('startView' in options) { + this.startViewMode = options.startView; + } else if ('startView' in this.element.data()) { + this.startViewMode = this.element.data('start-view'); + } + this.startViewMode = DPGlobal.convertViewMode(this.startViewMode); + this.viewMode = this.startViewMode; + + this.viewSelect = this.minView; + if ('viewSelect' in options) { + this.viewSelect = options.viewSelect; + } else if ('viewSelect' in this.element.data()) { + this.viewSelect = this.element.data('view-select'); + } + this.viewSelect = DPGlobal.convertViewMode(this.viewSelect); + + this.forceParse = true; + if ('forceParse' in options) { + this.forceParse = options.forceParse; + } else if ('dateForceParse' in this.element.data()) { + this.forceParse = this.element.data('date-force-parse'); + } + var template = this.bootcssVer === 3 ? DPGlobal.templateV3 : DPGlobal.template; + while (template.indexOf('{iconType}') !== -1) { + template = template.replace('{iconType}', this.icontype); + } + while (template.indexOf('{leftArrow}') !== -1) { + template = template.replace('{leftArrow}', this.icons.leftArrow); + } + while (template.indexOf('{rightArrow}') !== -1) { + template = template.replace('{rightArrow}', this.icons.rightArrow); + } + this.picker = $(template) + .appendTo(this.isInline ? this.element : this.container) // 'body') + .on({ + click: $.proxy(this.click, this), + mousedown: $.proxy(this.mousedown, this) + }); + + if (this.wheelViewModeNavigation) { + if ($.fn.mousewheel) { + this.picker.on({mousewheel: $.proxy(this.mousewheel, this)}); + } else { + console.log('Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option'); + } + } + + if (this.isInline) { + this.picker.addClass('datetimepicker-inline'); + } else { + this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu'); + } + if (this.isRTL) { + this.picker.addClass('datetimepicker-rtl'); + var selector = this.bootcssVer === 3 ? '.prev span, .next span' : '.prev i, .next i'; + this.picker.find(selector).toggleClass(this.icons.leftArrow + ' ' + this.icons.rightArrow); + } + + $(document).on('mousedown touchend', this.clickedOutside); + + this.autoclose = false; + if ('autoclose' in options) { + this.autoclose = options.autoclose; + } else if ('dateAutoclose' in this.element.data()) { + this.autoclose = this.element.data('date-autoclose'); + } + + this.keyboardNavigation = true; + if ('keyboardNavigation' in options) { + this.keyboardNavigation = options.keyboardNavigation; + } else if ('dateKeyboardNavigation' in this.element.data()) { + this.keyboardNavigation = this.element.data('date-keyboard-navigation'); + } + + this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false); + this.clearBtn = (options.clearBtn || this.element.data('date-clear-btn') || false); + this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false); + + this.weekStart = 0; + if (typeof options.weekStart !== 'undefined') { + this.weekStart = options.weekStart; + } else if (typeof this.element.data('date-weekstart') !== 'undefined') { + this.weekStart = this.element.data('date-weekstart'); + } else if (typeof dates[this.language].weekStart !== 'undefined') { + this.weekStart = dates[this.language].weekStart; + } + this.weekStart = this.weekStart % 7; + this.weekEnd = ((this.weekStart + 6) % 7); + this.onRenderDay = function (date) { + var render = (options.onRenderDay || function () { return []; })(date); + if (typeof render === 'string') { + render = [render]; + } + var res = ['day']; + return res.concat((render ? render : [])); + }; + this.onRenderHour = function (date) { + var render = (options.onRenderHour || function () { return []; })(date); + var res = ['hour']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + }; + this.onRenderMinute = function (date) { + var render = (options.onRenderMinute || function () { return []; })(date); + var res = ['minute']; + if (typeof render === 'string') { + render = [render]; + } + if (date < this.startDate || date > this.endDate) { + res.push('disabled'); + } else if (Math.floor(this.date.getUTCMinutes() / this.minuteStep) === Math.floor(date.getUTCMinutes() / this.minuteStep)) { + res.push('active'); + } + return res.concat((render ? render : [])); + }; + this.onRenderYear = function (date) { + var render = (options.onRenderYear || function () { return []; })(date); + var res = ['year']; + if (typeof render === 'string') { + render = [render]; + } + if (this.date.getUTCFullYear() === date.getUTCFullYear()) { + res.push('active'); + } + var currentYear = date.getUTCFullYear(); + var endYear = this.endDate.getUTCFullYear(); + if (date < this.startDate || currentYear > endYear) { + res.push('disabled'); + } + return res.concat((render ? render : [])); + } + this.onRenderMonth = function (date) { + var render = (options.onRenderMonth || function () { return []; })(date); + var res = ['month']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + } + this.startDate = new Date(-8639968443048000); + this.endDate = new Date(8639968443048000); + this.datesDisabled = []; + this.daysOfWeekDisabled = []; + this.setStartDate(options.startDate || this.element.data('date-startdate')); + this.setEndDate(options.endDate || this.element.data('date-enddate')); + this.setDatesDisabled(options.datesDisabled || this.element.data('date-dates-disabled')); + this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled')); + this.setMinutesDisabled(options.minutesDisabled || this.element.data('date-minute-disabled')); + this.setHoursDisabled(options.hoursDisabled || this.element.data('date-hour-disabled')); + this.fillDow(); + this.fillMonths(); + this.update(); + this.showMode(); + + if (this.isInline) { + this.show(); + } + }; + + Datetimepicker.prototype = { + constructor: Datetimepicker, + + _events: [], + _attachEvents: function () { + this._detachEvents(); + if (this.isInput) { // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + else if (this.component && this.hasInput) { // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + if (this.componentReset) { + this._events.push([ + this.componentReset, + {click: $.proxy(this.reset, this)} + ]); + } + } + else if (this.element.is('div')) { // inline datetimepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.on(ev); + } + }, + + _detachEvents: function () { + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.off(ev); + } + this._events = []; + }, + + show: function (e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + if (this.forceParse) { + this.update(); + } + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + this.isVisible = true; + this.element.trigger({ + type: 'show', + date: this.date + }); + }, + + hide: function () { + if (!this.isVisible) return; + if (this.isInline) return; + this.picker.hide(); + $(window).off('resize', this.place); + this.viewMode = this.startViewMode; + this.showMode(); + if (!this.isInput) { + $(document).off('mousedown', this.hide); + } + + if ( + this.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this.isVisible = false; + this.element.trigger({ + type: 'hide', + date: this.date + }); + }, + + remove: function () { + this._detachEvents(); + $(document).off('mousedown', this.clickedOutside); + this.picker.remove(); + delete this.picker; + delete this.element.data().datetimepicker; + }, + + getDate: function () { + var d = this.getUTCDate(); + if (d === null) { + return null; + } + return new Date(d.getTime() + (d.getTimezoneOffset() * 60000)); + }, + + getUTCDate: function () { + return this.date; + }, + + getInitialDate: function () { + return this.initialDate + }, + + setInitialDate: function (initialDate) { + this.initialDate = initialDate; + }, + + setDate: function (d) { + this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000))); + }, + + setUTCDate: function (d) { + if (d >= this.startDate && d <= this.endDate) { + this.date = d; + this.setValue(); + this.viewDate = this.date; + this.fill(); + } else { + this.element.trigger({ + type: 'outOfRange', + date: d, + startDate: this.startDate, + endDate: this.endDate + }); + } + }, + + setFormat: function (format) { + this.format = DPGlobal.parseFormat(format, this.formatType); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element && element.val()) { + this.setValue(); + } + }, + + setValue: function () { + var formatted = this.getFormattedDate(); + if (!this.isInput) { + if (this.component) { + this.element.find('input').val(formatted); + } + this.element.data('date', formatted); + } else { + this.element.val(formatted); + } + if (this.linkField) { + $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat)); + } + }, + + getFormattedDate: function (format) { + format = format || this.format; + return DPGlobal.formatDate(this.date, format, this.language, this.formatType, this.timezone); + }, + + setStartDate: function (startDate) { + this.startDate = startDate || this.startDate; + if (this.startDate.valueOf() !== 8639968443048000) { + this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setEndDate: function (endDate) { + this.endDate = endDate || this.endDate; + if (this.endDate.valueOf() !== 8639968443048000) { + this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setDatesDisabled: function (datesDisabled) { + this.datesDisabled = datesDisabled || []; + if (!$.isArray(this.datesDisabled)) { + this.datesDisabled = this.datesDisabled.split(/,\s*/); + } + var mThis = this; + this.datesDisabled = $.map(this.datesDisabled, function (d) { + return DPGlobal.parseDate(d, mThis.format, mThis.language, mThis.formatType, mThis.timezone).toDateString(); + }); + this.update(); + this.updateNavArrows(); + }, + + setTitle: function (selector, value) { + return this.picker.find(selector) + .find('th:eq(1)') + .text(this.title === false ? value : this.title); + }, + + setDaysOfWeekDisabled: function (daysOfWeekDisabled) { + this.daysOfWeekDisabled = daysOfWeekDisabled || []; + if (!$.isArray(this.daysOfWeekDisabled)) { + this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/); + } + this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setMinutesDisabled: function (minutesDisabled) { + this.minutesDisabled = minutesDisabled || []; + if (!$.isArray(this.minutesDisabled)) { + this.minutesDisabled = this.minutesDisabled.split(/,\s*/); + } + this.minutesDisabled = $.map(this.minutesDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setHoursDisabled: function (hoursDisabled) { + this.hoursDisabled = hoursDisabled || []; + if (!$.isArray(this.hoursDisabled)) { + this.hoursDisabled = this.hoursDisabled.split(/,\s*/); + } + this.hoursDisabled = $.map(this.hoursDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + place: function () { + if (this.isInline) return; + + if (!this.zIndex) { + var index_highest = 0; + $('div').each(function () { + var index_current = parseInt($(this).css('zIndex'), 10); + if (index_current > index_highest) { + index_highest = index_current; + } + }); + this.zIndex = index_highest + 10; + } + + var offset, top, left, containerOffset; + if (this.container instanceof $) { + containerOffset = this.container.offset(); + } else { + containerOffset = $(this.container).offset(); + } + + if (this.component) { + offset = this.component.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.component.outerWidth() - this.picker.outerWidth(); + } + } else { + offset = this.element.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.element.outerWidth() - this.picker.outerWidth(); + } + } + + var bodyWidth = document.body.clientWidth || window.innerWidth; + if (left + 220 > bodyWidth) { + left = bodyWidth - 220; + } + + if (this.pickerPosition === 'top-left' || this.pickerPosition === 'top-right') { + top = offset.top - this.picker.outerHeight(); + } else { + top = offset.top + this.height; + } + + top = top - containerOffset.top; + left = left - containerOffset.left; + + this.picker.css({ + top: top, + left: left, + zIndex: this.zIndex + }); + }, + + hour_minute: "^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]", + + update: function () { + var date, fromArgs = false; + if (arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) { + date = arguments[0]; + fromArgs = true; + } else { + date = (this.isInput ? this.element.val() : this.element.find('input').val()) || this.element.data('date') || this.initialDate; + if (typeof date === 'string') { + date = date.replace(/^\s+|\s+$/g,''); + } + } + + if (!date) { + date = new Date(); + fromArgs = false; + } + + if (typeof date === "string") { + if (new RegExp(this.hour_minute).test(date) || new RegExp(this.hour_minute + ":[0-5][0-9]").test(date)) { + date = this.getDate() + } + } + + this.date = DPGlobal.parseDate(date, this.format, this.language, this.formatType, this.timezone); + + if (fromArgs) this.setValue(); + + if (this.date < this.startDate) { + this.viewDate = new Date(this.startDate); + } else if (this.date > this.endDate) { + this.viewDate = new Date(this.endDate); + } else { + this.viewDate = new Date(this.date); + } + this.fill(); + }, + + fillDow: function () { + var dowCnt = this.weekStart, + html = ''; + while (dowCnt < this.weekStart + 7) { + html += '' + dates[this.language].daysMin[(dowCnt++) % 7] + ''; + } + html += ''; + this.picker.find('.datetimepicker-days thead').append(html); + }, + + fillMonths: function () { + var html = ''; + var d = new Date(this.viewDate); + for (var i = 0; i < 12; i++) { + d.setUTCMonth(i); + var classes = this.onRenderMonth(d); + html += '' + dates[this.language].monthsShort[i] + ''; + } + this.picker.find('.datetimepicker-months td').html(html); + }, + + fill: function () { + if (!this.date || !this.viewDate) { + return; + } + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + dayMonth = d.getUTCDate(), + hours = d.getUTCHours(), + startYear = this.startDate.getUTCFullYear(), + startMonth = this.startDate.getUTCMonth(), + endYear = this.endDate.getUTCFullYear(), + endMonth = this.endDate.getUTCMonth() + 1, + currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(), + today = new Date(); + this.setTitle('.datetimepicker-days', dates[this.language].months[month] + ' ' + year) + if (this.formatViewType === 'time') { + var formatted = this.getFormattedDate(); + this.setTitle('.datetimepicker-hours', formatted); + this.setTitle('.datetimepicker-minutes', formatted); + } else { + this.setTitle('.datetimepicker-hours', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + this.setTitle('.datetimepicker-minutes', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + } + this.picker.find('tfoot th.today') + .text(dates[this.language].today || dates['en'].today) + .toggle(this.todayBtn !== false); + this.picker.find('tfoot th.clear') + .text(dates[this.language].clear || dates['en'].clear) + .toggle(this.clearBtn !== false); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month - 1, 28, 0, 0, 0, 0), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7) % 7); + var nextMonth = new Date(prevMonth); + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var classes; + while (prevMonth.valueOf() < nextMonth) { + if (prevMonth.getUTCDay() === this.weekStart) { + html.push(''); + } + classes = this.onRenderDay(prevMonth); + if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() < month)) { + classes.push('old'); + } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() > month)) { + classes.push('new'); + } + // Compare internal UTC date with local today, not UTC today + if (this.todayHighlight && + prevMonth.getUTCFullYear() === today.getFullYear() && + prevMonth.getUTCMonth() === today.getMonth() && + prevMonth.getUTCDate() === today.getDate()) { + classes.push('today'); + } + if (prevMonth.valueOf() === currentDate) { + classes.push('active'); + } + if ((prevMonth.valueOf() + 86400000) <= this.startDate || prevMonth.valueOf() > this.endDate || + $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1 || + $.inArray(prevMonth.toDateString(), this.datesDisabled) !== -1) { + classes.push('disabled'); + } + html.push('' + prevMonth.getUTCDate() + ''); + if (prevMonth.getUTCDay() === this.weekEnd) { + html.push(''); + } + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); + } + this.picker.find('.datetimepicker-days tbody').empty().append(html.join('')); + + html = []; + var txt = '', meridian = '', meridianOld = ''; + var hoursDisabled = this.hoursDisabled || []; + d = new Date(this.viewDate) + for (var i = 0; i < 24; i++) { + d.setUTCHours(i); + classes = this.onRenderHour(d); + if (hoursDisabled.indexOf(i) !== -1) { + classes.push('disabled'); + } + var actual = UTCDate(year, month, dayMonth, i); + // We want the previous hour for the startDate + if ((actual.valueOf() + 3600000) <= this.startDate || actual.valueOf() > this.endDate) { + classes.push('disabled'); + } else if (hours === i) { + classes.push('active'); + } + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (i < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push(''); + } + html.push('
          ' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (i % 12 ? i % 12 : 12); + if (i < 12) { + classes.push('hour_am'); + } else { + classes.push('hour_pm'); + } + html.push('' + txt + ''); + if (i === 23) { + html.push('
          '); + } + } else { + txt = i + ':00'; + html.push('' + txt + ''); + } + } + this.picker.find('.datetimepicker-hours td').html(html.join('')); + + html = []; + txt = ''; + meridian = ''; + meridianOld = ''; + var minutesDisabled = this.minutesDisabled || []; + d = new Date(this.viewDate); + for (var i = 0; i < 60; i += this.minuteStep) { + if (minutesDisabled.indexOf(i) !== -1) continue; + d.setUTCMinutes(i); + d.setUTCSeconds(0); + classes = this.onRenderMinute(d); + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (hours < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push(''); + } + html.push('
          ' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (hours % 12 ? hours % 12 : 12); + html.push('' + txt + ':' + (i < 10 ? '0' + i : i) + ''); + if (i === 59) { + html.push('
          '); + } + } else { + txt = i + ':00'; + html.push('' + hours + ':' + (i < 10 ? '0' + i : i) + ''); + } + } + this.picker.find('.datetimepicker-minutes td').html(html.join('')); + + var currentYear = this.date.getUTCFullYear(); + var months = this.setTitle('.datetimepicker-months', year) + .end() + .find('.month').removeClass('active'); + if (currentYear === year) { + // getUTCMonths() returns 0 based, and we need to select the next one + // To cater bootstrap 2 we don't need to select the next one + months.eq(this.date.getUTCMonth()).addClass('active'); + } + if (year < startYear || year > endYear) { + months.addClass('disabled'); + } + if (year === startYear) { + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear) { + months.slice(endMonth).addClass('disabled'); + } + + html = ''; + year = parseInt(year / 10, 10) * 10; + var yearCont = this.setTitle('.datetimepicker-years', year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + d = new Date(this.viewDate); + for (var i = -1; i < 11; i++) { + d.setUTCFullYear(year); + classes = this.onRenderYear(d); + if (i === -1 || i === 10) { + classes.push(old); + } + html += '' + year + ''; + year += 1; + } + yearCont.html(html); + this.place(); + }, + + updateNavArrows: function () { + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + day = d.getUTCDate(), + hour = d.getUTCHours(); + switch (this.viewMode) { + case 0: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate() + && hour <= this.startDate.getUTCHours()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate() + && hour >= this.endDate.getUTCHours()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 2: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 3: + case 4: + if (year <= this.startDate.getUTCFullYear()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + mousewheel: function (e) { + + e.preventDefault(); + e.stopPropagation(); + + if (this.wheelPause) { + return; + } + + this.wheelPause = true; + + var originalEvent = e.originalEvent; + + var delta = originalEvent.wheelDelta; + + var mode = delta > 0 ? 1 : (delta === 0) ? 0 : -1; + + if (this.wheelViewModeNavigationInverseDirection) { + mode = -mode; + } + + this.showMode(mode); + + setTimeout($.proxy(function () { + + this.wheelPause = false + + }, this), this.wheelViewModeNavigationDelay); + + }, + + click: function (e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(e.target).closest('span, td, th, legend'); + if (target.is('.' + this.icontype)) { + target = $(target).parent().closest('span, td, th, legend'); + } + if (target.length === 1) { + if (target.is('.disabled')) { + this.element.trigger({ + type: 'outOfRange', + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + return; + } + switch (target[0].nodeName.toLowerCase()) { + case 'th': + switch (target[0].className) { + case 'switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); + switch (this.viewMode) { + case 0: + this.viewDate = this.moveHour(this.viewDate, dir); + break; + case 1: + this.viewDate = this.moveDate(this.viewDate, dir); + break; + case 2: + this.viewDate = this.moveMonth(this.viewDate, dir); + break; + case 3: + case 4: + this.viewDate = this.moveYear(this.viewDate, dir); + break; + } + this.fill(); + this.element.trigger({ + type: target[0].className + ':' + this.convertViewModeText(this.viewMode), + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + break; + case 'clear': + this.reset(); + if (this.autoclose) { + this.hide(); + } + break; + case 'today': + var date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0); + + // Respect startDate and endDate. + if (date < this.startDate) date = this.startDate; + else if (date > this.endDate) date = this.endDate; + + this.viewMode = this.startViewMode; + this.showMode(0); + this._setDate(date); + this.fill(); + if (this.autoclose) { + this.hide(); + } + break; + } + break; + case 'span': + if (!target.is('.disabled')) { + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + day = this.viewDate.getUTCDate(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + + if (target.is('.month')) { + this.viewDate.setUTCDate(1); + month = target.parent().find('span').index(target); + day = this.viewDate.getUTCDate(); + this.viewDate.setUTCMonth(month); + this.element.trigger({ + type: 'changeMonth', + date: this.viewDate + }); + if (this.viewSelect >= 3) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.year')) { + this.viewDate.setUTCDate(1); + year = parseInt(target.text(), 10) || 0; + this.viewDate.setUTCFullYear(year); + this.element.trigger({ + type: 'changeYear', + date: this.viewDate + }); + if (this.viewSelect >= 4) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.hour')) { + hours = parseInt(target.text(), 10) || 0; + if (target.hasClass('hour_am') || target.hasClass('hour_pm')) { + if (hours === 12 && target.hasClass('hour_am')) { + hours = 0; + } else if (hours !== 12 && target.hasClass('hour_pm')) { + hours += 12; + } + } + this.viewDate.setUTCHours(hours); + this.element.trigger({ + type: 'changeHour', + date: this.viewDate + }); + if (this.viewSelect >= 1) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.minute')) { + minutes = parseInt(target.text().substr(target.text().indexOf(':') + 1), 10) || 0; + this.viewDate.setUTCMinutes(minutes); + this.element.trigger({ + type: 'changeMinute', + date: this.viewDate + }); + if (this.viewSelect >= 0) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + } + break; + case 'td': + if (target.is('.day') && !target.is('.disabled')) { + var day = parseInt(target.text(), 10) || 1; + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + if (target.is('.old')) { + if (month === 0) { + month = 11; + year -= 1; + } else { + month -= 1; + } + } else if (target.is('.new')) { + if (month === 11) { + month = 0; + year += 1; + } else { + month += 1; + } + } + this.viewDate.setUTCFullYear(year); + this.viewDate.setUTCMonth(month, day); + this.element.trigger({ + type: 'changeDay', + date: this.viewDate + }); + if (this.viewSelect >= 2) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + break; + } + } + }, + + _setDate: function (date, which) { + if (!which || which === 'date') + this.date = date; + if (!which || which === 'view') + this.viewDate = date; + this.fill(); + this.setValue(); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + if(date === null) + this.date = this.viewDate; + }, + + moveMinute: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCMinutes(new_date.getUTCMinutes() + (dir * this.minuteStep)); + return new_date; + }, + + moveHour: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCHours(new_date.getUTCHours() + dir); + return new_date; + }, + + moveDate: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCDate(new_date.getUTCDate() + dir); + return new_date; + }, + + moveMonth: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1) { + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 === Feb 28, not Mar 02) + ? function () { + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 === Feb 28, not Mar 02) + : function () { + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } else { + // For magnitudes >1, move one month at a time... + for (var i = 0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function () { + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()) { + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function (date, dir) { + return this.moveMonth(date, dir * 12); + }, + + dateWithinRange: function (date) { + return date >= this.startDate && date <= this.endDate; + }, + + keydown: function (e) { + if (this.picker.is(':not(:visible)')) { + if (e.keyCode === 27) // allow escape to hide and re-show picker + this.show(); + return; + } + var dateChanged = false, + dir, newDate, newViewDate; + switch (e.keyCode) { + case 27: // escape + this.hide(); + e.preventDefault(); + break; + case 37: // left + case 39: // right + if (!this.keyboardNavigation) break; + dir = e.keyCode === 37 ? -1 : 1; + var viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir); + newViewDate = this.moveDate(this.viewDate, dir); + } else if (viewMode === 1) { + newDate = this.moveHour(this.date, dir); + newViewDate = this.moveHour(this.viewDate, dir); + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir); + newViewDate = this.moveMinute(this.viewDate, dir); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 38: // up + case 40: // down + if (!this.keyboardNavigation) break; + dir = e.keyCode === 38 ? -1 : 1; + viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir * 7); + newViewDate = this.moveDate(this.viewDate, dir * 7); + } else if (viewMode === 1) { + if (this.showMeridian) { + newDate = this.moveHour(this.date, dir * 6); + newViewDate = this.moveHour(this.viewDate, dir * 6); + } else { + newDate = this.moveHour(this.date, dir * 4); + newViewDate = this.moveHour(this.viewDate, dir * 4); + } + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir * 4); + newViewDate = this.moveMinute(this.viewDate, dir * 4); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 13: // enter + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + e.preventDefault(); + break; + case 9: // tab + this.hide(); + break; + } + if (dateChanged) { + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + } + }, + + showMode: function (dir) { + if (dir) { + var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir)); + if (newViewMode >= this.minView && newViewMode <= this.maxView) { + this.element.trigger({ + type: 'changeMode', + date: this.viewDate, + oldViewMode: this.viewMode, + newViewMode: newViewMode + }); + + this.viewMode = newViewMode; + } + } + /* + vitalets: fixing bug of very special conditions: + jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover. + Method show() does not set display css correctly and datetimepicker is not shown. + Changed to .css('display', 'block') solve the problem. + See https://github.com/vitalets/x-editable/issues/37 + + In jquery 1.7.2+ everything works fine. + */ + //this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + this.picker.find('>div').hide().filter('.datetimepicker-' + DPGlobal.modes[this.viewMode].clsName).css('display', 'block'); + this.updateNavArrows(); + }, + + reset: function () { + this._setDate(null, 'date'); + }, + + convertViewModeText: function (viewMode) { + switch (viewMode) { + case 4: + return 'decade'; + case 3: + return 'year'; + case 2: + return 'month'; + case 1: + return 'day'; + case 0: + return 'hour'; + } + } + }; + + var old = $.fn.datetimepicker; + $.fn.datetimepicker = function (option) { + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function () { + var $this = $(this), + data = $this.data('datetimepicker'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('datetimepicker', (data = new Datetimepicker(this, $.extend({}, $.fn.datetimepicker.defaults, options)))); + } + if (typeof option === 'string' && typeof data[option] === 'function') { + internal_return = data[option].apply(data, args); + if (internal_return !== undefined) { + return false; + } + } + }); + if (internal_return !== undefined) + return internal_return; + else + return this; + }; + + $.fn.datetimepicker.defaults = { + }; + $.fn.datetimepicker.Constructor = Datetimepicker; + var dates = $.fn.datetimepicker.dates = { + en: { + days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], + daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], + months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + meridiem: ['am', 'pm'], + suffix: ['st', 'nd', 'rd', 'th'], + today: 'Today', + clear: 'Clear' + } + }; + + var DPGlobal = { + modes: [ + { + clsName: 'minutes', + navFnc: 'Hours', + navStep: 1 + }, + { + clsName: 'hours', + navFnc: 'Date', + navStep: 1 + }, + { + clsName: 'days', + navFnc: 'Month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'FullYear', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'FullYear', + navStep: 10 + } + ], + isLeapYear: function (year) { + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) + }, + getDaysInMonth: function (year, month) { + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] + }, + getDefaultFormat: function (type, field) { + if (type === 'standard') { + if (field === 'input') + return 'yyyy-mm-dd hh:ii'; + else + return 'yyyy-mm-dd hh:ii:ss'; + } else if (type === 'php') { + if (field === 'input') + return 'Y-m-d H:i'; + else + return 'Y-m-d H:i:s'; + } else { + throw new Error('Invalid format type.'); + } + }, + validParts: function (type) { + if (type === 'standard') { + return /t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g; + } else if (type === 'php') { + return /[dDjlNwzFmMnStyYaABgGhHis]/g; + } else { + throw new Error('Invalid format type.'); + } + }, + nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g, + parseFormat: function (format, type) { + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts(type), '\0').split('\0'), + parts = format.match(this.validParts(type)); + if (!separators || !separators.length || !parts || parts.length === 0) { + throw new Error('Invalid date format.'); + } + return {separators: separators, parts: parts}; + }, + parseDate: function (date, format, language, type, timezone) { + if (date instanceof Date) { + var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000); + dateUTC.setMilliseconds(0); + return dateUTC; + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii:ss', type); + } + if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) { + var part_re = /([-+]\d+)([dmwy])/, + parts = date.match(/([-+]\d+)([dmwy])/g), + part, dir; + date = new Date(); + for (var i = 0; i < parts.length; i++) { + part = part_re.exec(parts[i]); + dir = parseInt(part[1]); + switch (part[2]) { + case 'd': + date.setUTCDate(date.getUTCDate() + dir); + break; + case 'm': + date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir); + break; + case 'w': + date.setUTCDate(date.getUTCDate() + dir * 7); + break; + case 'y': + date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir); + break; + } + } + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0); + } + var parts = date && date.toString().match(this.nonpunctuation) || [], + date = new Date(0, 0, 0, 0, 0, 0, 0), + parsed = {}, + setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'D', 'DD', 'd', 'dd', 'H', 'HH', 'p', 'P', 'z', 'Z'], + setters_map = { + hh: function (d, v) { + return d.setUTCHours(v); + }, + h: function (d, v) { + return d.setUTCHours(v); + }, + HH: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + H: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + ii: function (d, v) { + return d.setUTCMinutes(v); + }, + i: function (d, v) { + return d.setUTCMinutes(v); + }, + ss: function (d, v) { + return d.setUTCSeconds(v); + }, + s: function (d, v) { + return d.setUTCSeconds(v); + }, + yyyy: function (d, v) { + return d.setUTCFullYear(v); + }, + yy: function (d, v) { + return d.setUTCFullYear(2000 + v); + }, + m: function (d, v) { + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + if (isNaN(d.getUTCMonth())) + return d; + else + d.setUTCDate(d.getUTCDate() - 1); + return d; + }, + d: function (d, v) { + return d.setUTCDate(v); + }, + p: function (d, v) { + return d.setUTCHours(v === 1 ? d.getUTCHours() + 12 : d.getUTCHours()); + }, + z: function () { + return timezone + } + }, + val, filtered, part; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + setters_map['P'] = setters_map['p']; + setters_map['Z'] = setters_map['z']; + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); + if (parts.length === format.parts.length) { + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + val = parseInt(parts[i], 10); + part = format.parts[i]; + if (isNaN(val)) { + switch (part) { + case 'MM': + filtered = $(dates[language].months).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m === p; + }); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() === p.toLowerCase(); + }); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + case 'p': + case 'P': + val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem); + break; + case 'z': + case 'Z': + timezone; + break; + + } + } + parsed[part] = val; + } + for (var i = 0, s; i < setters_order.length; i++) { + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])) + setters_map[s](date, parsed[s]) + } + } + return date; + }, + formatDate: function (date, format, language, type, timezone) { + if (date === null) { + return ''; + } + var val; + if (type === 'standard') { + val = { + t: date.getTime(), + // year + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear(), + // month + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + // day + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + p: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + // hour + h: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds(), + // timezone + z: timezone + }; + + if (dates[language].meridiem.length === 2) { + val.H = (val.h % 12 === 0 ? 12 : val.h % 12); + } + else { + val.H = val.h; + } + val.HH = (val.H < 10 ? '0' : '') + val.H; + val.P = val.p.toUpperCase(); + val.Z = val.z; + val.hh = (val.h < 10 ? '0' : '') + val.h; + val.ii = (val.i < 10 ? '0' : '') + val.i; + val.ss = (val.s < 10 ? '0' : '') + val.s; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + } else if (type === 'php') { + // php format + val = { + // year + y: date.getUTCFullYear().toString().substring(2), + Y: date.getUTCFullYear(), + // month + F: dates[language].months[date.getUTCMonth()], + M: dates[language].monthsShort[date.getUTCMonth()], + n: date.getUTCMonth() + 1, + t: DPGlobal.getDaysInMonth(date.getUTCFullYear(), date.getUTCMonth()), + // day + j: date.getUTCDate(), + l: dates[language].days[date.getUTCDay()], + D: dates[language].daysShort[date.getUTCDay()], + w: date.getUTCDay(), // 0 -> 6 + N: (date.getUTCDay() === 0 ? 7 : date.getUTCDay()), // 1 -> 7 + S: (date.getUTCDate() % 10 <= dates[language].suffix.length ? dates[language].suffix[date.getUTCDate() % 10 - 1] : ''), + // hour + a: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + g: (date.getUTCHours() % 12 === 0 ? 12 : date.getUTCHours() % 12), + G: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds() + }; + val.m = (val.n < 10 ? '0' : '') + val.n; + val.d = (val.j < 10 ? '0' : '') + val.j; + val.A = val.a.toString().toUpperCase(); + val.h = (val.g < 10 ? '0' : '') + val.g; + val.H = (val.G < 10 ? '0' : '') + val.G; + val.i = (val.i < 10 ? '0' : '') + val.i; + val.s = (val.s < 10 ? '0' : '') + val.s; + } else { + throw new Error('Invalid format type.'); + } + var date = [], + seps = $.extend([], format.separators); + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + if (seps.length) { + date.push(seps.shift()); + } + date.push(val[format.parts[i]]); + } + if (seps.length) { + date.push(seps.shift()); + } + return date.join(''); + }, + convertViewMode: function (viewMode) { + switch (viewMode) { + case 4: + case 'decade': + viewMode = 4; + break; + case 3: + case 'year': + viewMode = 3; + break; + case 2: + case 'month': + viewMode = 2; + break; + case 1: + case 'day': + viewMode = 1; + break; + case 0: + case 'hour': + viewMode = 0; + break; + } + + return viewMode; + }, + headTemplate: '' + + '' + + '' + + '' + + '' + + '' + + '', + headTemplateV3: '' + + '' + + ' ' + + '' + + ' ' + + '' + + '', + contTemplate: '', + footTemplate: '' + + '' + + '' + + '' + }; + DPGlobal.template = '
          ' + + '
          ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplate + + '' + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          '; + DPGlobal.templateV3 = '
          ' + + '
          ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplateV3 + + '' + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
          ' + + '
          ' + + '
          '; + $.fn.datetimepicker.DPGlobal = DPGlobal; + + /* DATETIMEPICKER NO CONFLICT + * =================== */ + + $.fn.datetimepicker.noConflict = function () { + $.fn.datetimepicker = old; + return this; + }; + + /* DATETIMEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datetimepicker.data-api click.datetimepicker.data-api', + '[data-provide="datetimepicker"]', + function (e) { + var $this = $(this); + if ($this.data('datetimepicker')) return; + e.preventDefault(); + // component click requires us to explicitly show it + $this.datetimepicker('show'); + } + ); + $(function () { + $('[data-provide="datetimepicker-inline"]').datetimepicker(); + }); + +})); diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.min.js b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.min.js new file mode 100755 index 00000000..eba15ce5 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.min.js @@ -0,0 +1 @@ +(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof exports==="object"){a(require("jquery"))}else{a(jQuery)}}}(function(d,f){if(!("indexOf" in Array.prototype)){Array.prototype.indexOf=function(k,j){if(j===f){j=0}if(j<0){j+=this.length}if(j<0){j=0}for(var l=this.length;jthis.endDate){o.push("disabled")}else{if(Math.floor(this.date.getUTCMinutes()/this.minuteStep)===Math.floor(n.getUTCMinutes()/this.minuteStep)){o.push("active")}}return o.concat((p?p:[]))};this.onRenderYear=function(o){var q=(j.onRenderYear||function(){return[]})(o);var p=["year"];if(typeof q==="string"){q=[q]}if(this.date.getUTCFullYear()===o.getUTCFullYear()){p.push("active")}var n=o.getUTCFullYear();var r=this.endDate.getUTCFullYear();if(or){p.push("disabled")}return p.concat((q?q:[]))};this.onRenderMonth=function(n){var p=(j.onRenderMonth||function(){return[]})(n);var o=["month"];if(typeof p==="string"){p=[p]}return o.concat((p?p:[]))};this.startDate=new Date(-8639968443048000);this.endDate=new Date(8639968443048000);this.datesDisabled=[];this.daysOfWeekDisabled=[];this.setStartDate(j.startDate||this.element.data("date-startdate"));this.setEndDate(j.endDate||this.element.data("date-enddate"));this.setDatesDisabled(j.datesDisabled||this.element.data("date-dates-disabled"));this.setDaysOfWeekDisabled(j.daysOfWeekDisabled||this.element.data("date-days-of-week-disabled"));this.setMinutesDisabled(j.minutesDisabled||this.element.data("date-minute-disabled"));this.setHoursDisabled(j.hoursDisabled||this.element.data("date-hour-disabled"));this.fillDow();this.fillMonths();this.update();this.showMode();if(this.isInline){this.show()}};g.prototype={constructor:g,_events:[],_attachEvents:function(){this._detachEvents();if(this.isInput){this._events=[[this.element,{focus:d.proxy(this.show,this),keyup:d.proxy(this.update,this),keydown:d.proxy(this.keydown,this)}]]}else{if(this.component&&this.hasInput){this._events=[[this.element.find("input"),{focus:d.proxy(this.show,this),keyup:d.proxy(this.update,this),keydown:d.proxy(this.keydown,this)}],[this.component,{click:d.proxy(this.show,this)}]];if(this.componentReset){this._events.push([this.componentReset,{click:d.proxy(this.reset,this)}])}}else{if(this.element.is("div")){this.isInline=true}else{this._events=[[this.element,{click:d.proxy(this.show,this)}]]}}}for(var j=0,k,l;j=this.startDate&&i<=this.endDate){this.date=i;this.setValue();this.viewDate=this.date;this.fill()}else{this.element.trigger({type:"outOfRange",date:i,startDate:this.startDate,endDate:this.endDate})}},setFormat:function(j){this.format=c.parseFormat(j,this.formatType);var i;if(this.isInput){i=this.element}else{if(this.component){i=this.element.find("input")}}if(i&&i.val()){this.setValue()}},setValue:function(){var i=this.getFormattedDate();if(!this.isInput){if(this.component){this.element.find("input").val(i)}this.element.data("date",i)}else{this.element.val(i)}if(this.linkField){d("#"+this.linkField).val(this.getFormattedDate(this.linkFormat))}},getFormattedDate:function(i){i=i||this.format;return c.formatDate(this.date,i,this.language,this.formatType,this.timezone)},setStartDate:function(i){this.startDate=i||this.startDate;if(this.startDate.valueOf()!==8639968443048000){this.startDate=c.parseDate(this.startDate,this.format,this.language,this.formatType,this.timezone)}this.update();this.updateNavArrows()},setEndDate:function(i){this.endDate=i||this.endDate;if(this.endDate.valueOf()!==8639968443048000){this.endDate=c.parseDate(this.endDate,this.format,this.language,this.formatType,this.timezone)}this.update();this.updateNavArrows()},setDatesDisabled:function(j){this.datesDisabled=j||[];if(!d.isArray(this.datesDisabled)){this.datesDisabled=this.datesDisabled.split(/,\s*/)}var i=this;this.datesDisabled=d.map(this.datesDisabled,function(k){return c.parseDate(k,i.format,i.language,i.formatType,i.timezone).toDateString()});this.update();this.updateNavArrows()},setTitle:function(i,j){return this.picker.find(i).find("th:eq(1)").text(this.title===false?j:this.title)},setDaysOfWeekDisabled:function(i){this.daysOfWeekDisabled=i||[];if(!d.isArray(this.daysOfWeekDisabled)){this.daysOfWeekDisabled=this.daysOfWeekDisabled.split(/,\s*/)}this.daysOfWeekDisabled=d.map(this.daysOfWeekDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},setMinutesDisabled:function(i){this.minutesDisabled=i||[];if(!d.isArray(this.minutesDisabled)){this.minutesDisabled=this.minutesDisabled.split(/,\s*/)}this.minutesDisabled=d.map(this.minutesDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},setHoursDisabled:function(i){this.hoursDisabled=i||[];if(!d.isArray(this.hoursDisabled)){this.hoursDisabled=this.hoursDisabled.split(/,\s*/)}this.hoursDisabled=d.map(this.hoursDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},place:function(){if(this.isInline){return}if(!this.zIndex){var j=0;d("div").each(function(){var o=parseInt(d(this).css("zIndex"),10);if(o>j){j=o}});this.zIndex=j+10}var n,m,l,k;if(this.container instanceof d){k=this.container.offset()}else{k=d(this.container).offset()}if(this.component){n=this.component.offset();l=n.left;if(this.pickerPosition==="bottom-left"||this.pickerPosition==="top-left"){l+=this.component.outerWidth()-this.picker.outerWidth()}}else{n=this.element.offset();l=n.left;if(this.pickerPosition==="bottom-left"||this.pickerPosition==="top-left"){l+=this.element.outerWidth()-this.picker.outerWidth()}}var i=document.body.clientWidth||window.innerWidth;if(l+220>i){l=i-220}if(this.pickerPosition==="top-left"||this.pickerPosition==="top-right"){m=n.top-this.picker.outerHeight()}else{m=n.top+this.height}m=m-k.top;l=l-k.left;this.picker.css({top:m,left:l,zIndex:this.zIndex})},hour_minute:"^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]",update:function(){var i,j=false;if(arguments&&arguments.length&&(typeof arguments[0]==="string"||arguments[0] instanceof Date)){i=arguments[0];j=true}else{i=(this.isInput?this.element.val():this.element.find("input").val())||this.element.data("date")||this.initialDate;if(typeof i==="string"){i=i.replace(/^\s+|\s+$/g,"")}}if(!i){i=new Date();j=false}if(typeof i==="string"){if(new RegExp(this.hour_minute).test(i)||new RegExp(this.hour_minute+":[0-5][0-9]").test(i)){i=this.getDate()}}this.date=c.parseDate(i,this.format,this.language,this.formatType,this.timezone);if(j){this.setValue()}if(this.datethis.endDate){this.viewDate=new Date(this.endDate)}else{this.viewDate=new Date(this.date)}}this.fill()},fillDow:function(){var i=this.weekStart,j="";while(i'+e[this.language].daysMin[(i++)%7]+""}j+="";this.picker.find(".datetimepicker-days thead").append(j)},fillMonths:function(){var l="";var m=new Date(this.viewDate);for(var k=0;k<12;k++){m.setUTCMonth(k);var j=this.onRenderMonth(m);l+=''+e[this.language].monthsShort[k]+""}this.picker.find(".datetimepicker-months td").html(l)},fill:function(){if(!this.date||!this.viewDate){return}var E=new Date(this.viewDate),t=E.getUTCFullYear(),G=E.getUTCMonth(),n=E.getUTCDate(),A=E.getUTCHours(),w=this.startDate.getUTCFullYear(),B=this.startDate.getUTCMonth(),p=this.endDate.getUTCFullYear(),x=this.endDate.getUTCMonth()+1,q=(new h(this.date.getUTCFullYear(),this.date.getUTCMonth(),this.date.getUTCDate())).valueOf(),D=new Date();this.setTitle(".datetimepicker-days",e[this.language].months[G]+" "+t);if(this.formatViewType==="time"){var k=this.getFormattedDate();this.setTitle(".datetimepicker-hours",k);this.setTitle(".datetimepicker-minutes",k)}else{this.setTitle(".datetimepicker-hours",n+" "+e[this.language].months[G]+" "+t);this.setTitle(".datetimepicker-minutes",n+" "+e[this.language].months[G]+" "+t)}this.picker.find("tfoot th.today").text(e[this.language].today||e.en.today).toggle(this.todayBtn!==false);this.picker.find("tfoot th.clear").text(e[this.language].clear||e.en.clear).toggle(this.clearBtn!==false);this.updateNavArrows();this.fillMonths();var I=h(t,G-1,28,0,0,0,0),z=c.getDaysInMonth(I.getUTCFullYear(),I.getUTCMonth());I.setUTCDate(z);I.setUTCDate(z-(I.getUTCDay()-this.weekStart+7)%7);var j=new Date(I);j.setUTCDate(j.getUTCDate()+42);j=j.valueOf();var r=[];var F;while(I.valueOf()")}F=this.onRenderDay(I);if(I.getUTCFullYear()t||(I.getUTCFullYear()===t&&I.getUTCMonth()>G)){F.push("new")}}if(this.todayHighlight&&I.getUTCFullYear()===D.getFullYear()&&I.getUTCMonth()===D.getMonth()&&I.getUTCDate()===D.getDate()){F.push("today")}if(I.valueOf()===q){F.push("active")}if((I.valueOf()+86400000)<=this.startDate||I.valueOf()>this.endDate||d.inArray(I.getUTCDay(),this.daysOfWeekDisabled)!==-1||d.inArray(I.toDateString(),this.datesDisabled)!==-1){F.push("disabled")}r.push(''+I.getUTCDate()+"");if(I.getUTCDay()===this.weekEnd){r.push("")}I.setUTCDate(I.getUTCDate()+1)}this.picker.find(".datetimepicker-days tbody").empty().append(r.join(""));r=[];var u="",C="",s="";var l=this.hoursDisabled||[];E=new Date(this.viewDate);for(var y=0;y<24;y++){E.setUTCHours(y);F=this.onRenderHour(E);if(l.indexOf(y)!==-1){F.push("disabled")}var v=h(t,G,n,y);if((v.valueOf()+3600000)<=this.startDate||v.valueOf()>this.endDate){F.push("disabled")}else{if(A===y){F.push("active")}}if(this.showMeridian&&e[this.language].meridiem.length===2){C=(y<12?e[this.language].meridiem[0]:e[this.language].meridiem[1]);if(C!==s){if(s!==""){r.push("")}r.push('
          '+C.toUpperCase()+"")}s=C;u=(y%12?y%12:12);if(y<12){F.push("hour_am")}else{F.push("hour_pm")}r.push(''+u+"");if(y===23){r.push("
          ")}}else{u=y+":00";r.push(''+u+"")}}this.picker.find(".datetimepicker-hours td").html(r.join(""));r=[];u="";C="";s="";var m=this.minutesDisabled||[];E=new Date(this.viewDate);for(var y=0;y<60;y+=this.minuteStep){if(m.indexOf(y)!==-1){continue}E.setUTCMinutes(y);E.setUTCSeconds(0);F=this.onRenderMinute(E);if(this.showMeridian&&e[this.language].meridiem.length===2){C=(A<12?e[this.language].meridiem[0]:e[this.language].meridiem[1]);if(C!==s){if(s!==""){r.push("")}r.push('
          '+C.toUpperCase()+"")}s=C;u=(A%12?A%12:12);r.push(''+u+":"+(y<10?"0"+y:y)+"");if(y===59){r.push("
          ")}}else{u=y+":00";r.push(''+A+":"+(y<10?"0"+y:y)+"")}}this.picker.find(".datetimepicker-minutes td").html(r.join(""));var J=this.date.getUTCFullYear();var o=this.setTitle(".datetimepicker-months",t).end().find(".month").removeClass("active");if(J===t){o.eq(this.date.getUTCMonth()).addClass("active")}if(tp){o.addClass("disabled")}if(t===w){o.slice(0,B).addClass("disabled")}if(t===p){o.slice(x).addClass("disabled")}r="";t=parseInt(t/10,10)*10;var H=this.setTitle(".datetimepicker-years",t+"-"+(t+9)).end().find("td");t-=1;E=new Date(this.viewDate);for(var y=-1;y<11;y++){E.setUTCFullYear(t);F=this.onRenderYear(E);if(y===-1||y===10){F.push(b)}r+=''+t+"";t+=1}H.html(r);this.place()},updateNavArrows:function(){var m=new Date(this.viewDate),k=m.getUTCFullYear(),l=m.getUTCMonth(),j=m.getUTCDate(),i=m.getUTCHours();switch(this.viewMode){case 0:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()&&j<=this.startDate.getUTCDate()&&i<=this.startDate.getUTCHours()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()&&j>=this.endDate.getUTCDate()&&i>=this.endDate.getUTCHours()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 1:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()&&j<=this.startDate.getUTCDate()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()&&j>=this.endDate.getUTCDate()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 2:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 3:case 4:if(k<=this.startDate.getUTCFullYear()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break}},mousewheel:function(j){j.preventDefault();j.stopPropagation();if(this.wheelPause){return}this.wheelPause=true;var i=j.originalEvent;var l=i.wheelDelta;var k=l>0?1:(l===0)?0:-1;if(this.wheelViewModeNavigationInverseDirection){k=-k}this.showMode(k);setTimeout(d.proxy(function(){this.wheelPause=false},this),this.wheelViewModeNavigationDelay)},click:function(m){m.stopPropagation();m.preventDefault();var n=d(m.target).closest("span, td, th, legend");if(n.is("."+this.icontype)){n=d(n).parent().closest("span, td, th, legend")}if(n.length===1){if(n.is(".disabled")){this.element.trigger({type:"outOfRange",date:this.viewDate,startDate:this.startDate,endDate:this.endDate});return}switch(n[0].nodeName.toLowerCase()){case"th":switch(n[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var i=c.modes[this.viewMode].navStep*(n[0].className==="prev"?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveHour(this.viewDate,i);break;case 1:this.viewDate=this.moveDate(this.viewDate,i);break;case 2:this.viewDate=this.moveMonth(this.viewDate,i);break;case 3:case 4:this.viewDate=this.moveYear(this.viewDate,i);break}this.fill();this.element.trigger({type:n[0].className+":"+this.convertViewModeText(this.viewMode),date:this.viewDate,startDate:this.startDate,endDate:this.endDate});break;case"clear":this.reset();if(this.autoclose){this.hide()}break;case"today":var j=new Date();j=h(j.getFullYear(),j.getMonth(),j.getDate(),j.getHours(),j.getMinutes(),j.getSeconds(),0);if(jthis.endDate){j=this.endDate}}this.viewMode=this.startViewMode;this.showMode(0);this._setDate(j);this.fill();if(this.autoclose){this.hide()}break}break;case"span":if(!n.is(".disabled")){var p=this.viewDate.getUTCFullYear(),o=this.viewDate.getUTCMonth(),q=this.viewDate.getUTCDate(),r=this.viewDate.getUTCHours(),k=this.viewDate.getUTCMinutes(),s=this.viewDate.getUTCSeconds();if(n.is(".month")){this.viewDate.setUTCDate(1);o=n.parent().find("span").index(n);q=this.viewDate.getUTCDate();this.viewDate.setUTCMonth(o);this.element.trigger({type:"changeMonth",date:this.viewDate});if(this.viewSelect>=3){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".year")){this.viewDate.setUTCDate(1);p=parseInt(n.text(),10)||0;this.viewDate.setUTCFullYear(p);this.element.trigger({type:"changeYear",date:this.viewDate});if(this.viewSelect>=4){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".hour")){r=parseInt(n.text(),10)||0;if(n.hasClass("hour_am")||n.hasClass("hour_pm")){if(r===12&&n.hasClass("hour_am")){r=0}else{if(r!==12&&n.hasClass("hour_pm")){r+=12}}}this.viewDate.setUTCHours(r);this.element.trigger({type:"changeHour",date:this.viewDate});if(this.viewSelect>=1){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".minute")){k=parseInt(n.text().substr(n.text().indexOf(":")+1),10)||0;this.viewDate.setUTCMinutes(k);this.element.trigger({type:"changeMinute",date:this.viewDate});if(this.viewSelect>=0){this._setDate(h(p,o,q,r,k,s,0))}}}}}if(this.viewMode!==0){var l=this.viewMode;this.showMode(-1);this.fill();if(l===this.viewMode&&this.autoclose){this.hide()}}else{this.fill();if(this.autoclose){this.hide()}}}break;case"td":if(n.is(".day")&&!n.is(".disabled")){var q=parseInt(n.text(),10)||1;var p=this.viewDate.getUTCFullYear(),o=this.viewDate.getUTCMonth(),r=this.viewDate.getUTCHours(),k=this.viewDate.getUTCMinutes(),s=this.viewDate.getUTCSeconds();if(n.is(".old")){if(o===0){o=11;p-=1}else{o-=1}}else{if(n.is(".new")){if(o===11){o=0;p+=1}else{o+=1}}}this.viewDate.setUTCFullYear(p);this.viewDate.setUTCMonth(o,q);this.element.trigger({type:"changeDay",date:this.viewDate});if(this.viewSelect>=2){this._setDate(h(p,o,q,r,k,s,0))}}var l=this.viewMode;this.showMode(-1);this.fill();if(l===this.viewMode&&this.autoclose){this.hide()}break}}},_setDate:function(i,k){if(!k||k==="date"){this.date=i}if(!k||k==="view"){this.viewDate=i}this.fill();this.setValue();var j;if(this.isInput){j=this.element}else{if(this.component){j=this.element.find("input")}}if(j){j.change()}this.element.trigger({type:"changeDate",date:this.getDate()});if(i===null){this.date=this.viewDate}},moveMinute:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCMinutes(k.getUTCMinutes()+(i*this.minuteStep));return k},moveHour:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCHours(k.getUTCHours()+i);return k},moveDate:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCDate(k.getUTCDate()+i);return k},moveMonth:function(j,k){if(!k){return j}var n=new Date(j.valueOf()),r=n.getUTCDate(),o=n.getUTCMonth(),m=Math.abs(k),q,p;k=k>0?1:-1;if(m===1){p=k===-1?function(){return n.getUTCMonth()===o}:function(){return n.getUTCMonth()!==q};q=o+k;n.setUTCMonth(q);if(q<0||q>11){q=(q+12)%12}}else{for(var l=0;l=this.startDate&&i<=this.endDate},keydown:function(o){if(this.picker.is(":not(:visible)")){if(o.keyCode===27){this.show()}return}var k=false,j,i,n;switch(o.keyCode){case 27:this.hide();o.preventDefault();break;case 37:case 39:if(!this.keyboardNavigation){break}j=o.keyCode===37?-1:1;var m=this.viewMode;if(o.ctrlKey){m+=2}else{if(o.shiftKey){m+=1}}if(m===4){i=this.moveYear(this.date,j);n=this.moveYear(this.viewDate,j)}else{if(m===3){i=this.moveMonth(this.date,j);n=this.moveMonth(this.viewDate,j)}else{if(m===2){i=this.moveDate(this.date,j);n=this.moveDate(this.viewDate,j)}else{if(m===1){i=this.moveHour(this.date,j);n=this.moveHour(this.viewDate,j)}else{if(m===0){i=this.moveMinute(this.date,j);n=this.moveMinute(this.viewDate,j)}}}}}if(this.dateWithinRange(i)){this.date=i;this.viewDate=n;this.setValue();this.update();o.preventDefault();k=true}break;case 38:case 40:if(!this.keyboardNavigation){break}j=o.keyCode===38?-1:1;m=this.viewMode;if(o.ctrlKey){m+=2}else{if(o.shiftKey){m+=1}}if(m===4){i=this.moveYear(this.date,j);n=this.moveYear(this.viewDate,j)}else{if(m===3){i=this.moveMonth(this.date,j);n=this.moveMonth(this.viewDate,j)}else{if(m===2){i=this.moveDate(this.date,j*7);n=this.moveDate(this.viewDate,j*7)}else{if(m===1){if(this.showMeridian){i=this.moveHour(this.date,j*6);n=this.moveHour(this.viewDate,j*6)}else{i=this.moveHour(this.date,j*4);n=this.moveHour(this.viewDate,j*4)}}else{if(m===0){i=this.moveMinute(this.date,j*4);n=this.moveMinute(this.viewDate,j*4)}}}}}if(this.dateWithinRange(i)){this.date=i;this.viewDate=n;this.setValue();this.update();o.preventDefault();k=true}break;case 13:if(this.viewMode!==0){var p=this.viewMode;this.showMode(-1);this.fill();if(p===this.viewMode&&this.autoclose){this.hide()}}else{this.fill();if(this.autoclose){this.hide()}}o.preventDefault();break;case 9:this.hide();break}if(k){var l;if(this.isInput){l=this.element}else{if(this.component){l=this.element.find("input")}}if(l){l.change()}this.element.trigger({type:"changeDate",date:this.getDate()})}},showMode:function(i){if(i){var j=Math.max(0,Math.min(c.modes.length-1,this.viewMode+i));if(j>=this.minView&&j<=this.maxView){this.element.trigger({type:"changeMode",date:this.viewDate,oldViewMode:this.viewMode,newViewMode:j});this.viewMode=j}}this.picker.find(">div").hide().filter(".datetimepicker-"+c.modes[this.viewMode].clsName).css("display","block");this.updateNavArrows()},reset:function(){this._setDate(null,"date")},convertViewModeText:function(i){switch(i){case 4:return"decade";case 3:return"year";case 2:return"month";case 1:return"day";case 0:return"hour"}}};var b=d.fn.datetimepicker;d.fn.datetimepicker=function(k){var i=Array.apply(null,arguments);i.shift();var j;this.each(function(){var n=d(this),m=n.data("datetimepicker"),l=typeof k==="object"&&k;if(!m){n.data("datetimepicker",(m=new g(this,d.extend({},d.fn.datetimepicker.defaults,l))))}if(typeof k==="string"&&typeof m[k]==="function"){j=m[k].apply(m,i);if(j!==f){return false}}});if(j!==f){return j}else{return this}};d.fn.datetimepicker.defaults={};d.fn.datetimepicker.Constructor=g;var e=d.fn.datetimepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],today:"Today",clear:"Clear"}};var c={modes:[{clsName:"minutes",navFnc:"Hours",navStep:1},{clsName:"hours",navFnc:"Date",navStep:1},{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(i){return(((i%4===0)&&(i%100!==0))||(i%400===0))},getDaysInMonth:function(i,j){return[31,(c.isLeapYear(i)?29:28),31,30,31,30,31,31,30,31,30,31][j]},getDefaultFormat:function(i,j){if(i==="standard"){if(j==="input"){return"yyyy-mm-dd hh:ii"}else{return"yyyy-mm-dd hh:ii:ss"}}else{if(i==="php"){if(j==="input"){return"Y-m-d H:i"}else{return"Y-m-d H:i:s"}}else{throw new Error("Invalid format type.")}}},validParts:function(i){if(i==="standard"){return/t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g}else{if(i==="php"){return/[dDjlNwzFmMnStyYaABgGhHis]/g}else{throw new Error("Invalid format type.")}}},nonpunctuation:/[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,parseFormat:function(l,j){var i=l.replace(this.validParts(j),"\0").split("\0"),k=l.match(this.validParts(j));if(!i||!i.length||!k||k.length===0){throw new Error("Invalid date format.")}return{separators:i,parts:k}},parseDate:function(A,y,v,j,r){if(A instanceof Date){var u=new Date(A.valueOf()-A.getTimezoneOffset()*60000);u.setMilliseconds(0);return u}if(/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(A)){y=this.parseFormat("yyyy-mm-dd",j)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(A)){y=this.parseFormat("yyyy-mm-dd hh:ii",j)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(A)){y=this.parseFormat("yyyy-mm-dd hh:ii:ss",j)}if(/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(A)){var l=/([-+]\d+)([dmwy])/,q=A.match(/([-+]\d+)([dmwy])/g),t,p;A=new Date();for(var x=0;x',headTemplateV3:' ',contTemplate:'',footTemplate:''};c.template='
          '+c.headTemplate+c.contTemplate+c.footTemplate+'
          '+c.headTemplate+c.contTemplate+c.footTemplate+'
          '+c.headTemplate+""+c.footTemplate+'
          '+c.headTemplate+c.contTemplate+c.footTemplate+'
          '+c.headTemplate+c.contTemplate+c.footTemplate+"
          ";c.templateV3='
          '+c.headTemplateV3+c.contTemplate+c.footTemplate+'
          '+c.headTemplateV3+c.contTemplate+c.footTemplate+'
          '+c.headTemplateV3+""+c.footTemplate+'
          '+c.headTemplateV3+c.contTemplate+c.footTemplate+'
          '+c.headTemplateV3+c.contTemplate+c.footTemplate+"
          ";d.fn.datetimepicker.DPGlobal=c;d.fn.datetimepicker.noConflict=function(){d.fn.datetimepicker=b;return this};d(document).on("focus.datetimepicker.data-api click.datetimepicker.data-api",'[data-provide="datetimepicker"]',function(j){var i=d(this);if(i.data("datetimepicker")){return}j.preventDefault();i.datetimepicker("show")});d(function(){d('[data-provide="datetimepicker-inline"]').datetimepicker()})})); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.zh-CN.js b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.zh-CN.js new file mode 100755 index 00000000..418fb307 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-datetimepicker.zh-CN.js @@ -0,0 +1,16 @@ +/** + * Simplified Chinese translation for bootstrap-datetimepicker + * Yuan Cheung + */ +;(function($){ + $.fn.datetimepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今天", + suffix: [], + meridiem: ["上午", "下午"] + }; +}(jQuery)); diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-tab.js b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-tab.js new file mode 100755 index 00000000..44ea3af0 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap-tab.js @@ -0,0 +1,240 @@ +/** + * Bootstrap tab组件封装 + * @author billjiang qq:475572229 + * @created 2017/7/24 + * + */ +(function ($, window, document, undefined) { + 'use strict'; + + var pluginName = 'tabs'; + + //入口方法 + $.fn[pluginName] = function (options) { + var self = $(this); + if (this == null) + return null; + var data = this.data(pluginName); + if (!data) { + data = new BaseTab(this, options); + self.data(pluginName, data); + } + return data; + }; + + + var BaseTab = function (element, options) { + this.$element = $(element); + this.options = $.extend(true, {}, this.default, options); + this.init(); + } + + //默认配置 + BaseTab.prototype.default = { + showIndex: 0, //默认显示页索引 + loadAll: true//true=一次全部加在页面,false=只加在showIndex指定的页面,其他点击时加载,提高响应速度 + } + + /** + * 结构模板 + *
          + +
          +
          home1111
          +
          profile11111
          +
          messages111
          +
          settings1111
          + *
          + * + */ + + BaseTab.prototype.template = { + ul_nav: '', + ul_li: '
        1. {1}
        2. ', + ul_li_close: '', + div_content: '
          ', + div_content_panel: '
          ' + } + + //初始化 + BaseTab.prototype.init = function () { + if (!this.options.data || this.options.data.length == 0) { + console.error("请指定tab页数据"); + return; + } + //当前显示的显示的页面是否超出索引 + if (this.options.showIndex < 0 || this.options.showIndex > this.options.data.length - 1) { + console.error("showIndex超出了范围"); + //指定为默认值 + this.options.showIndex = this.default.showIndex; + } + //清除原来的tab页 + this.$element.html(""); + this.builder(this.options.data); + } + + //使用模板搭建页面结构 + BaseTab.prototype.builder = function (data) { + var ul_nav = $(this.template.ul_nav); + ul_nav.on("click", "li", function () { + var id = $(this).children().attr('href').substring(1); + $("#scriptEditor").attr("style", "display:block;"); + setScript(id); + }) + var div_content = $(this.template.div_content); + + for (var i = 0; i < data.length; i++) { + //nav-tab + var ul_li = $(this.template.ul_li.format(data[i].id, data[i].text)); + //如果可关闭,插入关闭图标,并绑定关闭事件 + if (data[i].closeable) { + var ul_li_close = $(this.template.ul_li_close); + + ul_li.find("a").append(ul_li_close); + ul_li.find("a").append(" "); + } + ul_nav.prepend(ul_li); + //div-content + var div_content_panel = $(this.template.div_content_panel.format(data[i].id)); + div_content.append(div_content_panel); + } + + this.$element.append(ul_nav); + this.$element.append(div_content); + this.loadData(); + + this.$element.find(".nav-tabs li:eq(" + this.options.showIndex + ") a").tab("show"); + + } + + BaseTab.prototype.loadData = function () { + var self = this; + //tab点击即加载事件 + //设置一个值,记录每个tab页是否加载过 + this.stateObj = {}; + var data = this.options.data; + //如果是当前页或者配置了一次性全部加载,否则点击tab页时加载 + for (var i = 0; i < data.length; i++) { + if (this.options.loadAll || this.options.showIndex == i) { + if (data[i].url) { + this.stateObj[data[i].id] = true; + } else { + console.error("id=" + data[i].id + "的tab页未指定url"); + this.stateObj[data[i].id] = false; + } + } else { + this.stateObj[data[i].id] = false; + (function (id, url, parameter) { + self.$element.find(".nav-tabs a[href='#" + id + "']").on('show.bs.tab', function () { + if (!self.stateObj[id]) { + self.stateObj[id] = true; + } + }); + }(data[i].id, data[i].url, data[i].parameter)) + } + } + } + + //新增一个tab页 + BaseTab.prototype.addTab = function (obj) { + var self = this; + //nav-tab + var ul_li = $(this.template.ul_li.format(obj.id, obj.text)); + //如果可关闭,插入关闭图标,并绑定关闭事件 + if (obj.closeable) { + var ul_li_close = $(this.template.ul_li_close); + + ul_li.find("a").append(ul_li_close); + ul_li.find("a").append(" "); + } + + this.$element.find(".nav-tabs:eq(0)").prepend(ul_li); + //div-content + var div_content_panel = $(this.template.div_content_panel.format(obj.id)); + this.$element.find(".tab-content:eq(0)").append(div_content_panel); + + this.stateObj[obj.id] = true; + + if (obj.closeable) { + this.$element.find(".nav-tabs li a[href='#" + obj.id + "'] i.closeable").click(function () { + + var href = $(this).parents("a").attr("href").substring(1);// id + + //关闭的时候,tab点击事件,删除tabData中的数据 + var tabData = JSON.parse(localStorage.getItem('tabData')); + tabData = tabData.filter(function (item) { + return item['id'] != href; + }); + localStorage.setItem("tabData", JSON.stringify(tabData)); + var headId = self.$element.find(".nav-tabs li:eq(0) a").attr("href").substring(1); + + if (self.getCurrentTabId() == href) { + self.$element.find(".nav-tabs li:eq(0) a").tab("show"); + + setScript(headId); + } + //传递tab 删除事件给外部 来减少删除的tab长度 + var length = $(this).parents("li").width(); + $("#tabContainer").trigger('deleteTab',length); + + $(this).parents("li").remove(); + $("#" + href).remove(); + + }) + } + + this.$element.find(".nav-tabs a[href='#" + obj.id + "']").tab("show"); + } + + //根据id获取活动也标签名 + BaseTab.prototype.find = function (tabId) { + return this.$element.find(".nav-tabs li a[href='#" + tabId + "']").text(); + } + + // 删除活动页 + BaseTab.prototype.remove = function (tabId) { + var self = this; + $("#" + tabId).remove(); + this.$element.find(".nav-tabs li a[href='#" + tabId + "']").parents("li").remove(); + + } + + // 重新加载页面 + BaseTab.prototype.reload = function (obj) { + var self = this; + if (self.find(obj.id) != null) { + $("#" + obj.id).remove(); + this.$element.find(".nav-tabs li a[href='#" + obj.id + "']").parents("li").remove(); + self.addTab(obj); + } else { + self.addTab(obj); + + } + } + //根据id设置活动tab页 + BaseTab.prototype.showTab = function (tabId) { + this.$element.find(".nav-tabs li a[href='#" + tabId + "']").tab("show"); + } + //根据id修改text + BaseTab.prototype.changeText = function (tabId,text) { + this.options.data.text = text; + this.$element.find(".nav-tabs li a[href='#" + tabId + "']").children('span').html(text); + } + //获取当前活动tab页的ID + BaseTab.prototype.getCurrentTabId = function () { + var href = this.$element.find(".nav-tabs li.active a").attr("href"); + href = href.substring(1); + return href; + } + String.prototype.format = function () { + if (arguments.length == 0) return this; + for (var s = this, i = 0; i < arguments.length; i++) + s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]); + return s; + }; +})(jQuery, window, document) diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap.js b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap.js new file mode 100755 index 00000000..8a2e99a5 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap.js @@ -0,0 +1,2377 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.7 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.7' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector === '#' ? [] : selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.7 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.7' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d).prop(d, true) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d).prop(d, false) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target).closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.7 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.7' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.7 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + +/* jshint latedef: false */ + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.7' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.7 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.7' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.7 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.7' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.7 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.7' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.7 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.7' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.7 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.7' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap.min.js b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap.min.js new file mode 100755 index 00000000..9bcd2fcc --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
          ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/bootstrap/js/npm.js b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/npm.js new file mode 100755 index 00000000..bf6aa806 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/bootstrap/js/npm.js @@ -0,0 +1,13 @@ +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. +require('../../js/transition.js') +require('../../js/alert.js') +require('../../js/button.js') +require('../../js/carousel.js') +require('../../js/collapse.js') +require('../../js/dropdown.js') +require('../../js/modal.js') +require('../../js/tooltip.js') +require('../../js/popover.js') +require('../../js/scrollspy.js') +require('../../js/tab.js') +require('../../js/affix.js') \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins.less new file mode 100755 index 00000000..0cdf66e0 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins.less @@ -0,0 +1,36 @@ +// Mixins +// -------------------------------------------------- +// Utilities +@import "mixins/hide-text.less"; +@import "mixins/opacity.less"; +@import "mixins/image.less"; +@import "mixins/labels.less"; +@import "mixins/reset-filter.less"; +@import "mixins/resize.less"; +@import "mixins/responsive-visibility.less"; +@import "mixins/size.less"; +@import "mixins/tab-focus.less"; +@import "mixins/reset-text.less"; +@import "mixins/text-emphasis.less"; +@import "mixins/text-overflow.less"; +@import "mixins/vendor-prefixes.less"; +// Components +@import "mixins/alerts.less"; +@import "mixins/buttons.less"; +@import "mixins/panels.less"; +@import "mixins/pagination.less"; +@import "mixins/list-group.less"; +@import "mixins/nav-divider.less"; +@import "mixins/forms.less"; +@import "mixins/progress-bar.less"; +@import "mixins/table-row.less"; +// Skins +@import "mixins/background-variant.less"; +@import "mixins/border-radius.less"; +@import "mixins/gradients.less"; +// Layout +@import "mixins/clearfix.less"; +@import "mixins/center-block.less"; +@import "mixins/nav-vertical-align.less"; +@import "mixins/grid-framework.less"; +@import "mixins/grid.less"; diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/alerts.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/alerts.less new file mode 100755 index 00000000..396196f4 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/alerts.less @@ -0,0 +1,14 @@ +// Alerts + +.alert-variant(@background; @border; @text-color) { + background-color: @background; + border-color: @border; + color: @text-color; + + hr { + border-top-color: darken(@border, 5%); + } + .alert-link { + color: darken(@text-color, 10%); + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/background-variant.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/background-variant.less new file mode 100755 index 00000000..a85c22b7 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/background-variant.less @@ -0,0 +1,9 @@ +// Contextual backgrounds + +.bg-variant(@color) { + background-color: @color; + a&:hover, + a&:focus { + background-color: darken(@color, 10%); + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/border-radius.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/border-radius.less new file mode 100755 index 00000000..727cc150 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/border-radius.less @@ -0,0 +1,21 @@ +// Single side border-radius + +.border-top-radius(@radius) { + border-top-right-radius: @radius; + border-top-left-radius: @radius; +} + +.border-right-radius(@radius) { + border-bottom-right-radius: @radius; + border-top-right-radius: @radius; +} + +.border-bottom-radius(@radius) { + border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; +} + +.border-left-radius(@radius) { + border-bottom-left-radius: @radius; + border-top-left-radius: @radius; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/buttons.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/buttons.less new file mode 100755 index 00000000..cd9635a9 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/buttons.less @@ -0,0 +1,68 @@ +// Button variants +// +// Easily pump out default styles, as well as :hover, :focus, :active, +// and disabled options for all buttons + +.button-variant(@color; @background; @border) { + color: @color; + background-color: @background; + border-color: @border; + + &:focus, + &.focus { + color: @color; + background-color: darken(@background, 10%); + border-color: darken(@border, 25%); + } + &:hover { + color: @color; + background-color: darken(@background, 10%); + border-color: darken(@border, 12%); + } + &:active, + &.active, + .open > .dropdown-toggle& { + color: @color; + background-color: darken(@background, 10%); + border-color: darken(@border, 12%); + + &:hover, + &:focus, + &.focus { + color: @color; + background-color: darken(@background, 17%); + border-color: darken(@border, 25%); + } + } + &:active, + &.active, + .open > .dropdown-toggle& { + background-image: none; + } + &.disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: @background; + border-color: @border; + } + } + + .badge { + color: @background; + background-color: @color; + } +} + +// Button sizes +.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + border-radius: @border-radius; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/center-block.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/center-block.less new file mode 100755 index 00000000..d18d6de9 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/center-block.less @@ -0,0 +1,7 @@ +// Center-align a block level element + +.center-block() { + display: block; + margin-left: auto; + margin-right: auto; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/clearfix.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/clearfix.less new file mode 100755 index 00000000..3f7a3820 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/clearfix.less @@ -0,0 +1,22 @@ +// Clearfix +// +// For modern browsers +// 1. The space content is one way to avoid an Opera bug when the +// contenteditable attribute is included anywhere else in the document. +// Otherwise it causes space to appear at the top and bottom of elements +// that are clearfixed. +// 2. The use of `table` rather than `block` is only necessary if using +// `:before` to contain the top-margins of child elements. +// +// Source: http://nicolasgallagher.com/micro-clearfix-hack/ + +.clearfix() { + &:before, + &:after { + content: " "; // 1 + display: table; // 2 + } + &:after { + clear: both; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/forms.less b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/forms.less new file mode 100755 index 00000000..3e864e71 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/bootstrap-less/mixins/forms.less @@ -0,0 +1,84 @@ +// Form validation states +// +// Used in forms.less to generate the form validation CSS for warnings, errors, +// and successes. + +.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { + // Color the label and help text + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label { + color: @text-color; + } + // Set the border and box shadow on specific inputs to match + .form-control { + border-color: @border-color; + .box-shadow(inset 0 1px 1px rgba(0, 0, 0, .075)); // Redeclare so transitions work + &:focus { + border-color: darken(@border-color, 10%); + @shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px lighten(@border-color, 20%); + .box-shadow(@shadow); + } + } + // Set validation states also for addons + .input-group-addon { + color: @text-color; + border-color: @border-color; + background-color: @background-color; + } + // Optional feedback icon + .form-control-feedback { + color: @text-color; + } +} + +// Form control focus state +// +// Generate a customized focus state and for any input with the specified color, +// which defaults to the `@input-border-focus` variable. +// +// We highly encourage you to not customize the default value, but instead use +// this to tweak colors on an as-needed basis. This aesthetic change is based on +// WebKit's default styles, but applicable to a wider range of browsers. Its +// usability and accessibility should be taken into account with any change. +// +// Example usage: change the default blue border and shadow to white for better +// contrast against a dark gray background. +.form-control-focus(@color: @input-border-focus) { + @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); + &:focus { + border-color: @color; + outline: 0; + .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); + } +} + +// Form control sizing +// +// Relative text size, padding, and border-radii changes for form controls. For +// horizontal sizing, wrap controls in the predefined grid classes. `` background color +@input-bg: #fff; +//** `` background color +@input-bg-disabled: @gray-lighter; + +//** Text color for ``s +@input-color: @gray; +//** `` border color +@input-border: #ccc; + +// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4 +//** Default `.form-control` border radius +// This has no effect on ``s in CSS. +@input-border-radius: @border-radius-base; +//** Large `.form-control` border radius +@input-border-radius-large: @border-radius-large; +//** Small `.form-control` border radius +@input-border-radius-small: @border-radius-small; + +//** Border color for inputs on focus +@input-border-focus: #66afe9; + +//** Placeholder text color +@input-color-placeholder: #999; + +//** Default `.form-control` height +@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); +//** Large `.form-control` height +@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); +//** Small `.form-control` height +@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); + +//** `.form-group` margin +@form-group-margin-bottom: 15px; + +@legend-color: @gray-dark; +@legend-border-color: #e5e5e5; + +//** Background color for textual input addons +@input-group-addon-bg: @gray-lighter; +//** Border color for textual input addons +@input-group-addon-border-color: @input-border; + +//** Disabled cursor for form controls and buttons. +@cursor-disabled: not-allowed; + +//== Dropdowns +// +//## Dropdown menu container and contents. + +//** Background for the dropdown menu. +@dropdown-bg: #fff; +//** Dropdown menu `border-color`. +@dropdown-border: rgba(0, 0, 0, .15); +//** Dropdown menu `border-color` **for IE8**. +@dropdown-fallback-border: #ccc; +//** Divider color for between dropdown items. +@dropdown-divider-bg: #e5e5e5; + +//** Dropdown link text color. +@dropdown-link-color: @gray-dark; +//** Hover color for dropdown links. +@dropdown-link-hover-color: darken(@gray-dark, 5%); +//** Hover background for dropdown links. +@dropdown-link-hover-bg: #f5f5f5; + +//** Active dropdown menu item text color. +@dropdown-link-active-color: @component-active-color; +//** Active dropdown menu item background color. +@dropdown-link-active-bg: @component-active-bg; + +//** Disabled dropdown menu item background color. +@dropdown-link-disabled-color: @gray-light; + +//** Text color for headers within dropdown menus. +@dropdown-header-color: @gray-light; + +//** Deprecated `@dropdown-caret-color` as of v3.1.0 +@dropdown-caret-color: #000; + +//-- Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. +// +// Note: These variables are not generated into the Customizer. + +@zindex-navbar: 1000; +@zindex-dropdown: 1000; +@zindex-popover: 1060; +@zindex-tooltip: 1070; +@zindex-navbar-fixed: 1030; +@zindex-modal-background: 1040; +@zindex-modal: 1050; + +//== Media queries breakpoints +// +//## Define the breakpoints at which your layout will change, adapting to different screen sizes. + +// Extra small screen / phone +//** Deprecated `@screen-xs` as of v3.0.1 +@screen-xs: 480px; +//** Deprecated `@screen-xs-min` as of v3.2.0 +@screen-xs-min: @screen-xs; +//** Deprecated `@screen-phone` as of v3.0.1 +@screen-phone: @screen-xs-min; + +// Small screen / tablet +//** Deprecated `@screen-sm` as of v3.0.1 +@screen-sm: 768px; +@screen-sm-min: @screen-sm; +//** Deprecated `@screen-tablet` as of v3.0.1 +@screen-tablet: @screen-sm-min; + +// Medium screen / desktop +//** Deprecated `@screen-md` as of v3.0.1 +@screen-md: 992px; +@screen-md-min: @screen-md; +//** Deprecated `@screen-desktop` as of v3.0.1 +@screen-desktop: @screen-md-min; + +// Large screen / wide desktop +//** Deprecated `@screen-lg` as of v3.0.1 +@screen-lg: 1200px; +@screen-lg-min: @screen-lg; +//** Deprecated `@screen-lg-desktop` as of v3.0.1 +@screen-lg-desktop: @screen-lg-min; + +// So media queries don't overlap when required, provide a maximum +@screen-xs-max: (@screen-sm-min - 1); +@screen-sm-max: (@screen-md-min - 1); +@screen-md-max: (@screen-lg-min - 1); + +//== Grid system +// +//## Define your custom responsive grid. + +//** Number of columns in the grid. +@grid-columns: 12; +//** Padding between columns. Gets divided in half for the left and right. +@grid-gutter-width: 30px; +// Navbar collapse +//** Point at which the navbar becomes uncollapsed. +@grid-float-breakpoint: @screen-sm-min; +//** Point at which the navbar begins collapsing. +@grid-float-breakpoint-max: (@grid-float-breakpoint - 1); + +//== Container sizes +// +//## Define the maximum width of `.container` for different screen sizes. + +// Small screen / tablet +@container-tablet: (720px + @grid-gutter-width); +//** For `@screen-sm-min` and up. +@container-sm: @container-tablet; + +// Medium screen / desktop +@container-desktop: (940px + @grid-gutter-width); +//** For `@screen-md-min` and up. +@container-md: @container-desktop; + +// Large screen / wide desktop +@container-large-desktop: (1140px + @grid-gutter-width); +//** For `@screen-lg-min` and up. +@container-lg: @container-large-desktop; + +//== Navbar +// +//## + +// Basics of a navbar +@navbar-height: 50px; +@navbar-margin-bottom: @line-height-computed; +@navbar-border-radius: @border-radius-base; +@navbar-padding-horizontal: floor((@grid-gutter-width / 2)); +@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); +@navbar-collapse-max-height: 340px; + +@navbar-default-color: #777; +@navbar-default-bg: #f8f8f8; +@navbar-default-border: darken(@navbar-default-bg, 6.5%); + +// Navbar links +@navbar-default-link-color: #777; +@navbar-default-link-hover-color: #333; +@navbar-default-link-hover-bg: transparent; +@navbar-default-link-active-color: #555; +@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%); +@navbar-default-link-disabled-color: #ccc; +@navbar-default-link-disabled-bg: transparent; + +// Navbar brand label +@navbar-default-brand-color: @navbar-default-link-color; +@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%); +@navbar-default-brand-hover-bg: transparent; + +// Navbar toggle +@navbar-default-toggle-hover-bg: #ddd; +@navbar-default-toggle-icon-bar-bg: #888; +@navbar-default-toggle-border-color: #ddd; + +// Inverted navbar +// Reset inverted navbar basics +@navbar-inverse-color: lighten(@gray-light, 15%); +@navbar-inverse-bg: #222; +@navbar-inverse-border: darken(@navbar-inverse-bg, 10%); + +// Inverted navbar links +@navbar-inverse-link-color: lighten(@gray-light, 15%); +@navbar-inverse-link-hover-color: #fff; +@navbar-inverse-link-hover-bg: transparent; +@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color; +@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%); +@navbar-inverse-link-disabled-color: #444; +@navbar-inverse-link-disabled-bg: transparent; + +// Inverted navbar brand label +@navbar-inverse-brand-color: @navbar-inverse-link-color; +@navbar-inverse-brand-hover-color: #fff; +@navbar-inverse-brand-hover-bg: transparent; + +// Inverted navbar toggle +@navbar-inverse-toggle-hover-bg: #333; +@navbar-inverse-toggle-icon-bar-bg: #fff; +@navbar-inverse-toggle-border-color: #333; + +//== Navs +// +//## + +//=== Shared nav styles +@nav-link-padding: 10px 15px; +@nav-link-hover-bg: @gray-lighter; + +@nav-disabled-link-color: @gray-light; +@nav-disabled-link-hover-color: @gray-light; + +//== Tabs +@nav-tabs-border-color: #ddd; + +@nav-tabs-link-hover-border-color: @gray-lighter; + +@nav-tabs-active-link-hover-bg: @body-bg; +@nav-tabs-active-link-hover-color: @gray; +@nav-tabs-active-link-hover-border-color: #ddd; + +@nav-tabs-justified-link-border-color: #ddd; +@nav-tabs-justified-active-link-border-color: @body-bg; + +//== Pills +@nav-pills-border-radius: @border-radius-base; +@nav-pills-active-link-hover-bg: @component-active-bg; +@nav-pills-active-link-hover-color: @component-active-color; + +//== Pagination +// +//## + +@pagination-color: @link-color; +@pagination-bg: #fff; +@pagination-border: #ddd; + +@pagination-hover-color: @link-hover-color; +@pagination-hover-bg: @gray-lighter; +@pagination-hover-border: #ddd; + +@pagination-active-color: #fff; +@pagination-active-bg: @brand-primary; +@pagination-active-border: @brand-primary; + +@pagination-disabled-color: @gray-light; +@pagination-disabled-bg: #fff; +@pagination-disabled-border: #ddd; + +//== Pager +// +//## + +@pager-bg: @pagination-bg; +@pager-border: @pagination-border; +@pager-border-radius: 15px; + +@pager-hover-bg: @pagination-hover-bg; + +@pager-active-bg: @pagination-active-bg; +@pager-active-color: @pagination-active-color; + +@pager-disabled-color: @pagination-disabled-color; + +//== Jumbotron +// +//## + +@jumbotron-padding: 30px; +@jumbotron-color: inherit; +@jumbotron-bg: @gray-lighter; +@jumbotron-heading-color: inherit; +@jumbotron-font-size: ceil((@font-size-base * 1.5)); + +//== Form states and alerts +// +//## Define colors for form feedback states and, by default, alerts. + +@state-success-text: #3c763d; +@state-success-bg: #dff0d8; +@state-success-border: darken(spin(@state-success-bg, -10), 5%); + +@state-info-text: #31708f; +@state-info-bg: #d9edf7; +@state-info-border: darken(spin(@state-info-bg, -10), 7%); + +@state-warning-text: #8a6d3b; +@state-warning-bg: #fcf8e3; +@state-warning-border: darken(spin(@state-warning-bg, -10), 5%); + +@state-danger-text: #a94442; +@state-danger-bg: #f2dede; +@state-danger-border: darken(spin(@state-danger-bg, -10), 5%); + +//== Tooltips +// +//## + +//** Tooltip max width +@tooltip-max-width: 200px; +//** Tooltip text color +@tooltip-color: #fff; +//** Tooltip background color +@tooltip-bg: #000; +@tooltip-opacity: .9; + +//** Tooltip arrow width +@tooltip-arrow-width: 5px; +//** Tooltip arrow color +@tooltip-arrow-color: @tooltip-bg; + +//== Popovers +// +//## + +//** Popover body background color +@popover-bg: #fff; +//** Popover maximum width +@popover-max-width: 276px; +//** Popover border color +@popover-border-color: rgba(0, 0, 0, .2); +//** Popover fallback border color +@popover-fallback-border-color: #ccc; + +//** Popover title background color +@popover-title-bg: darken(@popover-bg, 3%); + +//** Popover arrow width +@popover-arrow-width: 10px; +//** Popover arrow color +@popover-arrow-color: @popover-bg; + +//** Popover outer arrow width +@popover-arrow-outer-width: (@popover-arrow-width + 1); +//** Popover outer arrow color +@popover-arrow-outer-color: fadein(@popover-border-color, 5%); +//** Popover outer arrow fallback color +@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%); + +//== Labels +// +//## + +//** Default label background color +@label-default-bg: @gray-light; +//** Primary label background color +@label-primary-bg: @brand-primary; +//** Success label background color +@label-success-bg: @brand-success; +//** Info label background color +@label-info-bg: @brand-info; +//** Warning label background color +@label-warning-bg: @brand-warning; +//** Danger label background color +@label-danger-bg: @brand-danger; + +//** Default label text color +@label-color: #fff; +//** Default text color of a linked label +@label-link-hover-color: #fff; + +//== Modals +// +//## + +//** Padding applied to the modal body +@modal-inner-padding: 15px; + +//** Padding applied to the modal title +@modal-title-padding: 15px; +//** Modal title line-height +@modal-title-line-height: @line-height-base; + +//** Background color of modal content area +@modal-content-bg: #fff; +//** Modal content border color +@modal-content-border-color: rgba(0, 0, 0, .2); +//** Modal content border color **for IE8** +@modal-content-fallback-border-color: #999; + +//** Modal backdrop background color +@modal-backdrop-bg: #000; +//** Modal backdrop opacity +@modal-backdrop-opacity: .5; +//** Modal header border color +@modal-header-border-color: #e5e5e5; +//** Modal footer border color +@modal-footer-border-color: @modal-header-border-color; + +@modal-lg: 900px; +@modal-md: 600px; +@modal-sm: 300px; + +//== Alerts +// +//## Define alert colors, border radius, and padding. + +@alert-padding: 15px; +@alert-border-radius: @border-radius-base; +@alert-link-font-weight: bold; + +@alert-success-bg: @state-success-bg; +@alert-success-text: @state-success-text; +@alert-success-border: @state-success-border; + +@alert-info-bg: @state-info-bg; +@alert-info-text: @state-info-text; +@alert-info-border: @state-info-border; + +@alert-warning-bg: @state-warning-bg; +@alert-warning-text: @state-warning-text; +@alert-warning-border: @state-warning-border; + +@alert-danger-bg: @state-danger-bg; +@alert-danger-text: @state-danger-text; +@alert-danger-border: @state-danger-border; + +//== Progress bars +// +//## + +//** Background color of the whole progress component +@progress-bg: #f5f5f5; +//** Progress bar text color +@progress-bar-color: #fff; +//** Variable for setting rounded corners on progress bar. +@progress-border-radius: @border-radius-base; + +//** Default progress bar color +@progress-bar-bg: @brand-primary; +//** Success progress bar color +@progress-bar-success-bg: @brand-success; +//** Warning progress bar color +@progress-bar-warning-bg: @brand-warning; +//** Danger progress bar color +@progress-bar-danger-bg: @brand-danger; +//** Info progress bar color +@progress-bar-info-bg: @brand-info; + +//== List group +// +//## + +//** Background color on `.list-group-item` +@list-group-bg: #fff; +//** `.list-group-item` border color +@list-group-border: #ddd; +//** List group border radius +@list-group-border-radius: @border-radius-base; + +//** Background color of single list items on hover +@list-group-hover-bg: #f5f5f5; +//** Text color of active list items +@list-group-active-color: @component-active-color; +//** Background color of active list items +@list-group-active-bg: @component-active-bg; +//** Border color of active list elements +@list-group-active-border: @list-group-active-bg; +//** Text color for content within active list items +@list-group-active-text-color: lighten(@list-group-active-bg, 40%); + +//** Text color of disabled list items +@list-group-disabled-color: @gray-light; +//** Background color of disabled list items +@list-group-disabled-bg: @gray-lighter; +//** Text color for content within disabled list items +@list-group-disabled-text-color: @list-group-disabled-color; + +@list-group-link-color: #555; +@list-group-link-hover-color: @list-group-link-color; +@list-group-link-heading-color: #333; + +//== Panels +// +//## + +@panel-bg: #fff; +@panel-body-padding: 15px; +@panel-heading-padding: 10px 15px; +@panel-footer-padding: @panel-heading-padding; +@panel-border-radius: @border-radius-base; + +//** Border color for elements within panels +@panel-inner-border: #ddd; +@panel-footer-bg: #f5f5f5; + +@panel-default-text: @gray-dark; +@panel-default-border: #ddd; +@panel-default-heading-bg: #f5f5f5; + +@panel-primary-text: #fff; +@panel-primary-border: @brand-primary; +@panel-primary-heading-bg: @brand-primary; + +@panel-success-text: @state-success-text; +@panel-success-border: @state-success-border; +@panel-success-heading-bg: @state-success-bg; + +@panel-info-text: @state-info-text; +@panel-info-border: @state-info-border; +@panel-info-heading-bg: @state-info-bg; + +@panel-warning-text: @state-warning-text; +@panel-warning-border: @state-warning-border; +@panel-warning-heading-bg: @state-warning-bg; + +@panel-danger-text: @state-danger-text; +@panel-danger-border: @state-danger-border; +@panel-danger-heading-bg: @state-danger-bg; + +//== Thumbnails +// +//## + +//** Padding around the thumbnail image +@thumbnail-padding: 4px; +//** Thumbnail background color +@thumbnail-bg: @body-bg; +//** Thumbnail border color +@thumbnail-border: #ddd; +//** Thumbnail border radius +@thumbnail-border-radius: @border-radius-base; + +//** Custom text color for thumbnail captions +@thumbnail-caption-color: @text-color; +//** Padding around the thumbnail caption +@thumbnail-caption-padding: 9px; + +//== Wells +// +//## + +@well-bg: #f5f5f5; +@well-border: darken(@well-bg, 7%); + +//== Badges +// +//## + +@badge-color: #fff; +//** Linked badge text color on hover +@badge-link-hover-color: #fff; +@badge-bg: @gray-light; + +//** Badge text color in active nav link +@badge-active-color: @link-color; +//** Badge background color in active nav link +@badge-active-bg: #fff; + +@badge-font-weight: bold; +@badge-line-height: 1; +@badge-border-radius: 10px; + +//== Breadcrumbs +// +//## + +@breadcrumb-padding-vertical: 8px; +@breadcrumb-padding-horizontal: 15px; +//** Breadcrumb background color +@breadcrumb-bg: #f5f5f5; +//** Breadcrumb text color +@breadcrumb-color: #ccc; +//** Text color of current page in the breadcrumb +@breadcrumb-active-color: @gray-light; +//** Textual separator for between breadcrumb elements +@breadcrumb-separator: "/"; + +//== Carousel +// +//## + +@carousel-text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + +@carousel-control-color: #fff; +@carousel-control-width: 15%; +@carousel-control-opacity: .5; +@carousel-control-font-size: 20px; + +@carousel-indicator-active-bg: #fff; +@carousel-indicator-border-color: #fff; + +@carousel-caption-color: #fff; + +//== Close +// +//## + +@close-font-weight: bold; +@close-color: #000; +@close-text-shadow: 0 1px 0 #fff; + +//== Code +// +//## + +@code-color: #c7254e; +@code-bg: #f9f2f4; + +@kbd-color: #fff; +@kbd-bg: #333; + +@pre-bg: #f5f5f5; +@pre-color: @gray-dark; +@pre-border-color: #ccc; +@pre-scrollable-max-height: 340px; + +//== Type +// +//## + +//** Horizontal offset for forms and lists. +@component-offset-horizontal: 180px; +//** Text muted color +@text-muted: @gray-light; +//** Abbreviations and acronyms border color +@abbr-border-color: @gray-light; +//** Headings small color +@headings-small-color: @gray-light; +//** Blockquote small color +@blockquote-small-color: @gray-light; +//** Blockquote font size +@blockquote-font-size: (@font-size-base * 1.25); +//** Blockquote border color +@blockquote-border-color: @gray-lighter; +//** Page header border color +@page-header-border-color: @gray-lighter; +//** Width of horizontal description list titles +@dl-horizontal-offset: @component-offset-horizontal; +//** Horizontal line color. +@hr-border: @gray-lighter; diff --git a/hera-admin/src/main/resources/static/adminlte/build/grunt/.jshintrc b/hera-admin/src/main/resources/static/adminlte/build/grunt/.jshintrc new file mode 100755 index 00000000..d7c7c8d9 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/grunt/.jshintrc @@ -0,0 +1,7 @@ +{ + "extends" : "../js/.jshintrc", + "asi" : false, + "browser" : false, + "es3" : false, + "node" : true +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/.jscsrc b/hera-admin/src/main/resources/static/adminlte/build/js/.jscsrc new file mode 100755 index 00000000..253a9d97 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/.jscsrc @@ -0,0 +1,42 @@ +{ + "disallowEmptyBlocks": true, + "disallowKeywords": ["with"], + "disallowMixedSpacesAndTabs": true, + "disallowMultipleLineStrings": true, + "disallowMultipleVarDecl": true, + "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], + "disallowSpaceBeforeBinaryOperators": [","], + "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], + "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true }, + "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true }, + "disallowSpacesInsideArrayBrackets": true, + "disallowSpacesInsideParentheses": true, + "disallowTrailingComma": true, + "disallowTrailingWhitespace": true, + "requireCamelCaseOrUpperCaseIdentifiers": true, + "requireCapitalizedConstructors": true, + "requireCommaBeforeLineBreak": true, + "requireDollarBeforejQueryAssignment": true, + "requireDotNotation": true, + "requireLineFeedAtFileEnd": true, + "requirePaddingNewLinesAfterUseStrict": true, + "requirePaddingNewLinesBeforeExport": true, + "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], + "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], + "requireSpaceAfterLineComment": true, + "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], + "requireSpaceBetweenArguments": true, + "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true }, + "requireSpacesInConditionalExpression": true, + "requireSpacesInForStatement": true, + "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true }, + "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true }, + "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true }, + "requireSpacesInsideObjectBrackets": "allButNested", + "validateAlignedFunctionParameters": true, + "validateIndentation": 2, + "validateLineBreaks": "LF", + "validateNewlineAfterArrayElements": true, + "validateQuoteMarks": "'", + "maxErrors": "3000" +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/.jshintrc b/hera-admin/src/main/resources/static/adminlte/build/js/.jshintrc new file mode 100755 index 00000000..c41edf78 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/.jshintrc @@ -0,0 +1,17 @@ +{ + "asi" : true, + "browser" : true, + "eqeqeq" : false, + "eqnull" : true, + "es3" : true, + "expr" : true, + "jquery" : true, + "latedef" : true, + "laxbreak" : true, + "nonbsp" : true, + "strict" : true, + "undef" : true, + "unused" : true, + // External variabls and plugins + "predef": [ "AdminLTEOptions", "FastClick", "moment", "Morris", "Chart" ] +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/BoxRefresh.js b/hera-admin/src/main/resources/static/adminlte/build/js/BoxRefresh.js new file mode 100755 index 00000000..3dd69256 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/BoxRefresh.js @@ -0,0 +1,119 @@ +/* BoxRefresh() + * ========= + * Adds AJAX content control to a box. + * + * @Usage: $('#my-box').boxRefresh(options) + * or add [data-widget="box-refresh"] to the box element + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.boxrefresh' + + var Default = { + source : '', + params : {}, + trigger : '.refresh-btn', + content : '.box-body', + loadInContent : true, + responseType : '', + overlayTemplate: '
          ', + onLoadStart : function () { + }, + onLoadDone : function (response) { + return response + } + } + + var Selector = { + data: '[data-widget="box-refresh"]' + } + + // BoxRefresh Class Definition + // ========================= + var BoxRefresh = function (element, options) { + this.element = element + this.options = options + this.$overlay = $(options.overlay) + + if (options.source === '') { + throw new Error('Source url was not defined. Please specify a url in your BoxRefresh source option.') + } + + this._setUpListeners() + this.load() + } + + BoxRefresh.prototype.load = function () { + this._addOverlay() + this.options.onLoadStart.call($(this)) + + $.get(this.options.source, this.options.params, function (response) { + if (this.options.loadInContent) { + $(this.options.content).html(response) + } + this.options.onLoadDone.call($(this), response) + this._removeOverlay() + }.bind(this), this.options.responseType !== '' && this.options.responseType) + } + + // Private + + BoxRefresh.prototype._setUpListeners = function () { + $(this.element).on('click', Selector.trigger, function (event) { + if (event) event.preventDefault() + this.load() + }.bind(this)) + } + + BoxRefresh.prototype._addOverlay = function () { + $(this.element).append(this.$overlay) + } + + BoxRefresh.prototype._removeOverlay = function () { + $(this.element).remove(this.$overlay) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new BoxRefresh($this, options))) + } + + if (typeof data == 'string') { + if (typeof data[option] == 'undefined') { + throw new Error('No method named ' + option) + } + data[option]() + } + }) + } + + var old = $.fn.boxRefresh + + $.fn.boxRefresh = Plugin + $.fn.boxRefresh.Constructor = BoxRefresh + + // No Conflict Mode + // ================ + $.fn.boxRefresh.noConflict = function () { + $.fn.boxRefresh = old + return this + } + + // BoxRefresh Data API + // ================= + $(window).on('load', function () { + $(Selector.data).each(function () { + Plugin.call($(this)) + }) + }) + +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/BoxWidget.js b/hera-admin/src/main/resources/static/adminlte/build/js/BoxWidget.js new file mode 100755 index 00000000..c58d6ef8 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/BoxWidget.js @@ -0,0 +1,161 @@ +/* BoxWidget() + * ====== + * Adds box widget functions to boxes. + * + * @Usage: $('.my-box').boxWidget(options) + * or add [data-widget="box-widget"] to the ul element + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.boxwidget' + + var Default = { + animationSpeed : 500, + collapseTrigger: '[data-widget="collapse"]', + removeTrigger : '[data-widget="remove"]', + collapseIcon : 'fa-minus', + expandIcon : 'fa-plus', + removeIcon : 'fa-times' + } + + var Selector = { + data : '.box', + collapsed: '.collapsed-box', + body : '.box-body', + footer : '.box-footer', + tools : '.box-tools' + } + + var ClassName = { + collapsed: 'collapsed-box' + } + + var Event = { + collapsed: 'collapsed.boxwidget', + expanded : 'expanded.boxwidget', + removed : 'removed.boxwidget' + } + + // BoxWidget Class Definition + // ===================== + var BoxWidget = function (element, options) { + this.element = element + this.options = options + + this._setUpListeners() + } + + BoxWidget.prototype.toggle = function () { + var isOpen = !$(this.element).is(Selector.collapsed) + + if (isOpen) { + this.collapse() + } else { + this.expand() + } + } + + BoxWidget.prototype.expand = function () { + var expandedEvent = $.Event(Event.expanded) + var collapseIcon = this.options.collapseIcon + var expandIcon = this.options.expandIcon + + $(this.element).removeClass(ClassName.collapsed) + + $(Selector.tools) + .find('.' + expandIcon) + .removeClass(expandIcon) + .addClass(collapseIcon) + + $(this.element).find(Selector.body + ', ' + Selector.footer) + .slideDown(this.options.animationSpeed, function () { + $(this.element).trigger(expandedEvent) + }.bind(this)) + } + + BoxWidget.prototype.collapse = function () { + var collapsedEvent = $.Event(Event.collapsed) + var collapseIcon = this.options.collapseIcon + var expandIcon = this.options.expandIcon + + $(Selector.tools) + .find('.' + collapseIcon) + .removeClass(collapseIcon) + .addClass(expandIcon) + + $(this.element).find(Selector.body + ', ' + Selector.footer) + .slideUp(this.options.animationSpeed, function () { + $(this.element).addClass(ClassName.collapsed) + $(this.element).trigger(collapsedEvent) + }.bind(this)) + } + + BoxWidget.prototype.remove = function () { + var removedEvent = $.Event(Event.removed) + + $(this.element).slideUp(this.options.animationSpeed, function () { + $(this.element).trigger(removedEvent) + $(this.element).remove() + }.bind(this)) + } + + // Private + + BoxWidget.prototype._setUpListeners = function () { + var that = this + + $(this.element).on('click', this.options.collapseTrigger, function (event) { + if (event) event.preventDefault() + that.toggle($(this)) + }) + + $(this.element).on('click', this.options.removeTrigger, function (event) { + if (event) event.preventDefault() + that.remove($(this)) + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new BoxWidget($this, options))) + } + + if (typeof option == 'string') { + if (typeof data[option] == 'undefined') { + throw new Error('No method named ' + option) + } + data[option]() + } + }) + } + + var old = $.fn.boxWidget + + $.fn.boxWidget = Plugin + $.fn.boxWidget.Constructor = BoxWidget + + // No Conflict Mode + // ================ + $.fn.boxWidget.noConflict = function () { + $.fn.boxWidget = old + return this + } + + // BoxWidget Data API + // ================== + $(window).on('load', function () { + $(Selector.data).each(function () { + Plugin.call($(this)) + }) + }) + +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/ControlSidebar.js b/hera-admin/src/main/resources/static/adminlte/build/js/ControlSidebar.js new file mode 100755 index 00000000..9f231c87 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/ControlSidebar.js @@ -0,0 +1,138 @@ +/* ControlSidebar() + * =============== + * Toggles the state of the control sidebar + * + * @Usage: $('#control-sidebar-trigger').controlSidebar(options) + * or add [data-toggle="control-sidebar"] to the trigger + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.controlsidebar' + + var Default = { + slide: true + } + + var Selector = { + sidebar: '.control-sidebar', + data : '[data-toggle="control-sidebar"]', + open : '.control-sidebar-open', + bg : '.control-sidebar-bg', + wrapper: '.wrapper', + content: '.content-wrapper', + boxed : '.layout-boxed' + } + + var ClassName = { + open : 'control-sidebar-open', + fixed: 'fixed' + } + + var Event = { + collapsed: 'collapsed.controlsidebar', + expanded : 'expanded.controlsidebar' + } + + // ControlSidebar Class Definition + // =============================== + var ControlSidebar = function (element, options) { + this.element = element + this.options = options + this.hasBindedResize = false + + this.init() + } + + ControlSidebar.prototype.init = function () { + // Add click listener if the element hasn't been + // initialized using the data API + if (!$(this.element).is(Selector.data)) { + $(this).on('click', this.toggle) + } + + this.fix() + $(window).resize(function () { + this.fix() + }.bind(this)) + } + + ControlSidebar.prototype.toggle = function (event) { + if (event) event.preventDefault() + + this.fix() + + if (!$(Selector.sidebar).is(Selector.open) && !$('body').is(Selector.open)) { + this.expand() + } else { + this.collapse() + } + } + + ControlSidebar.prototype.expand = function () { + if (!this.options.slide) { + $('body').addClass(ClassName.open) + } else { + $(Selector.sidebar).addClass(ClassName.open) + } + + $(this.element).trigger($.Event(Event.expanded)) + } + + ControlSidebar.prototype.collapse = function () { + $('body, ' + Selector.sidebar).removeClass(ClassName.open) + $(this.element).trigger($.Event(Event.collapsed)) + } + + ControlSidebar.prototype.fix = function () { + if ($('body').is(Selector.boxed)) { + this._fixForBoxed($(Selector.bg)) + } + } + + // Private + + ControlSidebar.prototype._fixForBoxed = function (bg) { + bg.css({ + position: 'absolute', + height : $(Selector.wrapper).height() + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new ControlSidebar($this, options))) + } + + if (typeof option == 'string') data.toggle() + }) + } + + var old = $.fn.controlSidebar + + $.fn.controlSidebar = Plugin + $.fn.controlSidebar.Constructor = ControlSidebar + + // No Conflict Mode + // ================ + $.fn.controlSidebar.noConflict = function () { + $.fn.controlSidebar = old + return this + } + + // ControlSidebar Data API + // ======================= + $(document).on('click', Selector.data, function (event) { + if (event) event.preventDefault() + Plugin.call($(this), 'toggle') + }) + +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/DirectChat.js b/hera-admin/src/main/resources/static/adminlte/build/js/DirectChat.js new file mode 100755 index 00000000..f196da0b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/DirectChat.js @@ -0,0 +1,66 @@ +/* DirectChat() + * =============== + * Toggles the state of the control sidebar + * + * @Usage: $('#my-chat-box').directChat() + * or add [data-widget="direct-chat"] to the trigger + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.directchat' + + var Selector = { + data: '[data-widget="chat-pane-toggle"]', + box : '.direct-chat' + } + + var ClassName = { + open: 'direct-chat-contacts-open' + } + + // DirectChat Class Definition + // =========================== + var DirectChat = function (element) { + this.element = element + } + + DirectChat.prototype.toggle = function ($trigger) { + $trigger.parents(Selector.box).first().toggleClass(ClassName.open) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + $this.data(DataKey, (data = new DirectChat($this))) + } + + if (typeof option == 'string') data.toggle($this) + }) + } + + var old = $.fn.directChat + + $.fn.directChat = Plugin + $.fn.directChat.Constructor = DirectChat + + // No Conflict Mode + // ================ + $.fn.directChat.noConflict = function () { + $.fn.directChat = old + return this + } + + // DirectChat Data API + // =================== + $(document).on('click', Selector.data, function (event) { + if (event) event.preventDefault() + Plugin.call($(this), 'toggle') + }) + +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/Layout.js b/hera-admin/src/main/resources/static/adminlte/build/js/Layout.js new file mode 100755 index 00000000..e1f6323f --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/Layout.js @@ -0,0 +1,172 @@ +/* Layout() + * ======== + * Implements AdminLTE layout. + * Fixes the layout height in case min-height fails. + * + * @usage activated automatically upon window load. + * Configure any options by passing data-option="value" + * to the body tag. + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.layout' + + var Default = { + slimscroll : true, + resetHeight: true + } + + var Selector = { + wrapper : '.wrapper', + contentWrapper: '.content-wrapper', + layoutBoxed : '.layout-boxed', + mainFooter : '.main-footer', + mainHeader : '.main-header', + sidebar : '.sidebar', + controlSidebar: '.control-sidebar', + fixed : '.fixed', + sidebarMenu : '.sidebar-menu' + } + + var ClassName = { + fixed : 'fixed', + holdTransition: 'hold-transition' + } + + var Layout = function (options) { + this.options = options + this.bindedResize = false + this.activate() + } + + Layout.prototype.activate = function () { + this.fix() + this.fixSidebar() + + $('body').removeClass(ClassName.holdTransition) + + if (this.options.resetHeight) { + $('body, html, ' + Selector.wrapper).css({ + 'height' : 'auto', + 'min-height': '100%' + }) + } + + if (!this.bindedResize) { + $(window).resize(function () { + this.fix() + this.fixSidebar() + }.bind(this)) + this.bindedResize = true + } + + $(Selector.sidebarMenu).on('expanded.tree', function () { + this.fix() + this.fixSidebar() + }.bind(this)) + + $(Selector.sidebarMenu).on('collapsed.tree', function () { + this.fix() + this.fixSidebar() + }.bind(this)) + } + + Layout.prototype.fix = function () { + // Remove overflow from .wrapper if layout-boxed exists + $(Selector.layoutBoxed + ' > ' + Selector.wrapper).css('overflow', 'hidden') + + // Get window height and the wrapper height + var footerHeight = $(Selector.mainFooter).outerHeight() || 0 + var neg = $(Selector.mainHeader).outerHeight() + footerHeight + var windowHeight = $(window).height() + var sidebarHeight = $(Selector.sidebar).height() || 0 + + // Set the min-height of the content and sidebar based on the + // the height of the document. + if ($('body').hasClass(ClassName.fixed)) { + $(Selector.contentWrapper).css('min-height', windowHeight - footerHeight) + } else { + var postSetWidth + + if (windowHeight >= sidebarHeight) { + $(Selector.contentWrapper).css('min-height', windowHeight - neg) + postSetWidth = windowHeight - neg + } else { + $(Selector.contentWrapper).css('min-height', sidebarHeight) + postSetWidth = sidebarHeight + } + + // Fix for the control sidebar height + var $controlSidebar = $(Selector.controlSidebar) + if (typeof $controlSidebar !== 'undefined') { + if ($controlSidebar.height() > postSetWidth) + $(Selector.contentWrapper).css('min-height', $controlSidebar.height()) + } + } + } + + Layout.prototype.fixSidebar = function () { + // Make sure the body tag has the .fixed class + if (!$('body').hasClass(ClassName.fixed)) { + if (typeof $.fn.slimScroll !== 'undefined') { + $(Selector.sidebar).slimScroll({ destroy: true }).height('auto') + } + return + } + + // Enable slimscroll for fixed layout + if (this.options.slimscroll) { + if (typeof $.fn.slimScroll !== 'undefined') { + // Destroy if it exists + $(Selector.sidebar).slimScroll({ destroy: true }).height('auto') + + // Add slimscroll + $(Selector.sidebar).slimScroll({ + height: ($(window).height() - $(Selector.mainHeader).height()) + 'px', + color : 'rgba(0,0,0,0.2)', + size : '3px' + }) + } + } + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option === 'object' && option) + $this.data(DataKey, (data = new Layout(options))) + } + + if (typeof option === 'string') { + if (typeof data[option] === 'undefined') { + throw new Error('No method named ' + option) + } + data[option]() + } + }) + } + + var old = $.fn.layout + + $.fn.layout = Plugin + $.fn.layout.Constuctor = Layout + + // No conflict mode + // ================ + $.fn.layout.noConflict = function () { + $.fn.layout = old + return this + } + + // Layout DATA-API + // =============== + $(window).on('load', function () { + Plugin.call($('body')) + }) +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/PushMenu.js b/hera-admin/src/main/resources/static/adminlte/build/js/PushMenu.js new file mode 100755 index 00000000..78946c69 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/PushMenu.js @@ -0,0 +1,176 @@ +/* PushMenu() + * ========== + * Adds the push menu functionality to the sidebar. + * + * @usage: $('.btn').pushMenu(options) + * or add [data-toggle="push-menu"] to any toggle button + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.pushmenu' + + var Default = { + collapseScreenSize : 767, + expandOnHover : false, + expandTransitionDelay: 200 + } + + var Selector = { + collapsed : '.sidebar-collapse', + open : '.sidebar-open', + mainSidebar : '.main-sidebar', + contentWrapper: '.content-wrapper', + searchInput : '.sidebar-form .form-control', + button : '[data-toggle="push-menu"]', + mini : '.sidebar-mini', + expanded : '.sidebar-expanded-on-hover', + layoutFixed : '.fixed' + } + + var ClassName = { + collapsed : 'sidebar-collapse', + open : 'sidebar-open', + mini : 'sidebar-mini', + expanded : 'sidebar-expanded-on-hover', + expandFeature: 'sidebar-mini-expand-feature', + layoutFixed : 'fixed' + } + + var Event = { + expanded : 'expanded.pushMenu', + collapsed: 'collapsed.pushMenu' + } + + // PushMenu Class Definition + // ========================= + var PushMenu = function (options) { + this.options = options + this.init() + } + + PushMenu.prototype.init = function () { + if (this.options.expandOnHover + || ($('body').is(Selector.mini + Selector.layoutFixed))) { + this.expandOnHover() + $('body').addClass(ClassName.expandFeature) + } + + $(Selector.contentWrapper).click(function () { + // Enable hide menu when clicking on the content-wrapper on small screens + if ($(window).width() <= this.options.collapseScreenSize && $('body').hasClass(ClassName.open)) { + this.close() + } + }.bind(this)) + + // __Fix for android devices + $(Selector.searchInput).click(function (e) { + e.stopPropagation() + }) + } + + PushMenu.prototype.toggle = function () { + var windowWidth = $(window).width() + var isOpen = !$('body').hasClass(ClassName.collapsed) + + if (windowWidth <= this.options.collapseScreenSize) { + isOpen = $('body').hasClass(ClassName.open) + } + + if (!isOpen) { + this.open() + } else { + this.close() + } + } + + PushMenu.prototype.open = function () { + var windowWidth = $(window).width() + + if (windowWidth > this.options.collapseScreenSize) { + $('body').removeClass(ClassName.collapsed) + .trigger($.Event(Event.expanded)) + } + else { + $('body').addClass(ClassName.open) + .trigger($.Event(Event.expanded)) + } + } + + PushMenu.prototype.close = function () { + var windowWidth = $(window).width() + if (windowWidth > this.options.collapseScreenSize) { + $('body').addClass(ClassName.collapsed) + .trigger($.Event(Event.collapsed)) + } else { + $('body').removeClass(ClassName.open + ' ' + ClassName.collapsed) + .trigger($.Event(Event.collapsed)) + } + } + + PushMenu.prototype.expandOnHover = function () { + $(Selector.mainSidebar).hover(function () { + if ($('body').is(Selector.mini + Selector.collapsed) + && $(window).width() > this.options.collapseScreenSize) { + this.expand() + } + }.bind(this), function () { + if ($('body').is(Selector.expanded)) { + this.collapse() + } + }.bind(this)) + } + + PushMenu.prototype.expand = function () { + setTimeout(function () { + $('body').removeClass(ClassName.collapsed) + .addClass(ClassName.expanded) + }, this.options.expandTransitionDelay) + } + + PushMenu.prototype.collapse = function () { + setTimeout(function () { + $('body').removeClass(ClassName.expanded) + .addClass(ClassName.collapsed) + }, this.options.expandTransitionDelay) + } + + // PushMenu Plugin Definition + // ========================== + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new PushMenu(options))) + } + + if (option == 'toggle') data.toggle() + }) + } + + var old = $.fn.pushMenu + + $.fn.pushMenu = Plugin + $.fn.pushMenu.Constructor = PushMenu + + // No Conflict Mode + // ================ + $.fn.pushMenu.noConflict = function () { + $.fn.pushMenu = old + return this + } + + // Data API + // ======== + $(document).on('click', Selector.button, function (e) { + e.preventDefault() + Plugin.call($(this), 'toggle') + }) + $(window).on('load', function () { + Plugin.call($(Selector.button)) + }) +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/TodoList.js b/hera-admin/src/main/resources/static/adminlte/build/js/TodoList.js new file mode 100755 index 00000000..ebac0bac --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/TodoList.js @@ -0,0 +1,107 @@ +/* TodoList() + * ========= + * Converts a list into a todoList. + * + * @Usage: $('.my-list').todoList(options) + * or add [data-widget="todo-list"] to the ul element + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.todolist' + + var Default = { + iCheck : false, + onCheck : function () { + }, + onUnCheck: function () { + } + } + + var Selector = { + data: '[data-widget="todo-list"]' + } + + var ClassName = { + done: 'done' + } + + // TodoList Class Definition + // ========================= + var TodoList = function (element, options) { + this.element = element + this.options = options + + this._setUpListeners() + } + + TodoList.prototype.toggle = function (item) { + item.parents(Selector.li).first().toggleClass(ClassName.done) + if (!item.prop('checked')) { + this.unCheck(item) + return + } + + this.check(item) + } + + TodoList.prototype.check = function (item) { + this.options.onCheck.call(item) + } + + TodoList.prototype.unCheck = function (item) { + this.options.onUnCheck.call(item) + } + + // Private + + TodoList.prototype._setUpListeners = function () { + var that = this + $(this.element).on('change ifChanged', 'input:checkbox', function () { + that.toggle($(this)) + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new TodoList($this, options))) + } + + if (typeof data == 'string') { + if (typeof data[option] == 'undefined') { + throw new Error('No method named ' + option) + } + data[option]() + } + }) + } + + var old = $.fn.todoList + + $.fn.todoList = Plugin + $.fn.todoList.Constructor = TodoList + + // No Conflict Mode + // ================ + $.fn.todoList.noConflict = function () { + $.fn.todoList = old + return this + } + + // TodoList Data API + // ================= + $(window).on('load', function () { + $(Selector.data).each(function () { + Plugin.call($(this)) + }) + }) + +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/js/Tree.js b/hera-admin/src/main/resources/static/adminlte/build/js/Tree.js new file mode 100755 index 00000000..1e9f0dfb --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/js/Tree.js @@ -0,0 +1,145 @@ +/* Tree() + * ====== + * Converts a nested list into a multilevel + * tree view menu. + * + * @Usage: $('.my-menu').tree(options) + * or add [data-widget="tree"] to the ul element + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.tree' + + var Default = { + animationSpeed: 500, + accordion : true, + followLink : false, + trigger : '.treeview a' + } + + var Selector = { + tree : '.tree', + treeview : '.treeview', + treeviewMenu: '.treeview-menu', + open : '.menu-open, .active', + li : 'li', + data : '[data-widget="tree"]', + active : '.active' + } + + var ClassName = { + open: 'menu-open', + tree: 'tree' + } + + var Event = { + collapsed: 'collapsed.tree', + expanded : 'expanded.tree' + } + + // Tree Class Definition + // ===================== + var Tree = function (element, options) { + this.element = element + this.options = options + + $(this.element).addClass(ClassName.tree) + + $(Selector.treeview + Selector.active, this.element).addClass(ClassName.open) + + this._setUpListeners() + } + + Tree.prototype.toggle = function (link, event) { + var treeviewMenu = link.next(Selector.treeviewMenu) + var parentLi = link.parent() + var isOpen = parentLi.hasClass(ClassName.open) + + if (!parentLi.is(Selector.treeview)) { + return + } + + if (!this.options.followLink || link.attr('href') == '#') { + event.preventDefault() + } + + if (isOpen) { + this.collapse(treeviewMenu, parentLi) + } else { + this.expand(treeviewMenu, parentLi) + } + } + + Tree.prototype.expand = function (tree, parent) { + var expandedEvent = $.Event(Event.expanded) + + if (this.options.accordion) { + var openMenuLi = parent.siblings(Selector.open) + var openTree = openMenuLi.children(Selector.treeviewMenu) + this.collapse(openTree, openMenuLi) + } + + parent.addClass(ClassName.open) + tree.slideDown(this.options.animationSpeed, function () { + $(this.element).trigger(expandedEvent) + }) + } + + Tree.prototype.collapse = function (tree, parentLi) { + var collapsedEvent = $.Event(Event.collapsed) + + tree.find(Selector.open).removeClass(ClassName.open) + parentLi.removeClass(ClassName.open) + tree.slideUp(this.options.animationSpeed, function () { + tree.find(Selector.open + ' > ' + Selector.treeview).slideUp() + $(this.element).trigger(collapsedEvent) + }) + } + + // Private + + Tree.prototype._setUpListeners = function () { + var that = this + + $(this.element).on('click', this.options.trigger, function (event) { + that.toggle($(this), event) + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, new Tree($this, options)) + } + }) + } + + var old = $.fn.tree + + $.fn.tree = Plugin + $.fn.tree.Constructor = Tree + + // No Conflict Mode + // ================ + $.fn.tree.noConflict = function () { + $.fn.tree = old + return this + } + + // Tree Data API + // ============= + $(window).on('load', function () { + $(Selector.data).each(function () { + Plugin.call($(this)) + }) + }) + +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/.csslintrc b/hera-admin/src/main/resources/static/adminlte/build/less/.csslintrc new file mode 100755 index 00000000..c77a7cbb --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/.csslintrc @@ -0,0 +1,23 @@ +{ + "adjoining-classes": false, + "box-sizing": false, + "box-model": false, + "compatible-vendor-prefixes": false, + "floats": false, + "font-sizes": false, + "gradients": false, + "important": false, + "known-properties": false, + "outline-none": false, + "qualified-headings": false, + "regex-selectors": false, + "shorthand": false, + "text-indent": false, + "unique-headings": false, + "universal-selector": false, + "unqualified-attributes": false, + "ids": false, + "fallback-colors": false, + "vendor-prefix": false, + "import": false +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/404_500_errors.less b/hera-admin/src/main/resources/static/adminlte/build/less/404_500_errors.less new file mode 100755 index 00000000..f7fadcf5 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/404_500_errors.less @@ -0,0 +1,36 @@ +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; + @media (max-width: @screen-sm-max) { + width: 100%; + } + //For the error number e.g: 404 + > .headline { + float: left; + font-size: 100px; + font-weight: 300; + @media (max-width: @screen-sm-max) { + float: none; + text-align: center; + } + } + //For the message + > .error-content { + margin-left: 190px; + @media (max-width: @screen-sm-max) { + margin-left: 0; + } + > h3 { + font-weight: 300; + font-size: 25px; + @media (max-width: @screen-sm-max) { + text-align: center; + } + } + display: block; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/AdminLTE-without-plugins.less b/hera-admin/src/main/resources/static/adminlte/build/less/AdminLTE-without-plugins.less new file mode 100755 index 00000000..bf696409 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/AdminLTE-without-plugins.less @@ -0,0 +1,57 @@ +/*! + * AdminLTE v2.3.5 Without Third-Party Plugins + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/ +//google fonts +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); +//Bootstrap Variables & Mixins +//The core bootstrap code have not been modified. These files +//are included only for reference. +@import (reference) "../bootstrap-less/mixins.less"; +@import (reference) "../bootstrap-less/variables.less"; +//MISC +//---- +@import "core.less"; +@import "variables.less"; +@import "mixins.less"; +//COMPONENTS +//----------- +@import "header.less"; +@import "sidebar.less"; +@import "sidebar-mini.less"; +@import "control-sidebar.less"; +@import "dropdown.less"; +@import "forms.less"; +@import "progress-bars.less"; +@import "small-box.less"; +@import "boxes.less"; +@import "info-box.less"; +@import "timeline.less"; +@import "buttons.less"; +@import "callout.less"; +@import "alerts.less"; +@import "navs.less"; +@import "products.less"; +@import "table.less"; +@import "labels.less"; +@import "direct-chat.less"; +@import "users-list.less"; +@import "carousel.less"; +@import "modal.less"; +@import "social-widgets.less"; +@import "treeview.less"; +//PAGES +//------ +@import "mailbox.less"; +@import "lockscreen.less"; +@import "login_and_register.less"; +@import "404_500_errors.less"; +@import "invoice.less"; +@import "profile"; +//Miscellaneous +//------------- +@import "miscellaneous.less"; +@import "print.less"; diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/AdminLTE.less b/hera-admin/src/main/resources/static/adminlte/build/less/AdminLTE.less new file mode 100755 index 00000000..ee9501f9 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/AdminLTE.less @@ -0,0 +1,58 @@ +/*! + * AdminLTE v2.3.12 + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information + */ +//Bootstrap Variables & Mixins +//The core bootstrap code have not been modified. These files +//are included only for reference. +@import (reference) "../bootstrap-less/mixins.less"; +@import (reference) "../bootstrap-less/variables.less"; +//MISC +//---- +@import "core.less"; +@import "variables.less"; +@import "mixins.less"; +//COMPONENTS +//----------- +@import "header.less"; +@import "sidebar.less"; +@import "sidebar-mini.less"; +@import "control-sidebar.less"; +@import "dropdown.less"; +@import "forms.less"; +@import "progress-bars.less"; +@import "small-box.less"; +@import "boxes.less"; +@import "info-box.less"; +@import "timeline.less"; +@import "buttons.less"; +@import "callout.less"; +@import "alerts.less"; +@import "navs.less"; +@import "products.less"; +@import "table.less"; +@import "labels.less"; +@import "direct-chat.less"; +@import "users-list.less"; +@import "carousel.less"; +@import "modal.less"; +@import "social-widgets.less"; +@import "treeview.less"; +//PAGES +//------ +@import "mailbox.less"; +@import "lockscreen.less"; +@import "login_and_register.less"; +@import "404_500_errors.less"; +@import "invoice.less"; +@import "profile"; +//Plugins +//-------- +@import "plugins.less"; +//Miscellaneous +//------------- +@import "miscellaneous.less"; +@import "print.less"; diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/alerts.less b/hera-admin/src/main/resources/static/adminlte/build/less/alerts.less new file mode 100755 index 00000000..dc15cb63 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/alerts.less @@ -0,0 +1,47 @@ +/* + * Component: alert + * ---------------- + */ + +.alert { + .border-radius(3px); + h4 { + font-weight: 600; + } + .icon { + margin-right: 10px; + } + .close { + color: #000; + .opacity(.2); + &:hover { + .opacity(.5); + } + } + a { + color: #fff; + text-decoration: underline; + } +} + +//Alert Variants +.alert-success { + &:extend(.bg-green); + border-color: darken(@green, 5%); +} + +.alert-danger, +.alert-error { + &:extend(.bg-red); + border-color: darken(@red, 5%); +} + +.alert-warning { + &:extend(.bg-yellow); + border-color: darken(@yellow, 5%); +} + +.alert-info { + &:extend(.bg-aqua); + border-color: darken(@aqua, 5%); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/bootstrap-social.less b/hera-admin/src/main/resources/static/adminlte/build/less/bootstrap-social.less new file mode 100755 index 00000000..d8d279b4 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/bootstrap-social.less @@ -0,0 +1,178 @@ +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ + +// Import variables and mixins as a reference for separate plugins version +@import (reference) "../bootstrap-less/mixins"; +@import (reference) "../bootstrap-less/variables"; +@import (reference) "variables"; +@import (reference) "mixins"; + +@bs-height-base: (@line-height-computed + @padding-base-vertical * 2); +@bs-height-lg: (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2); +@bs-height-sm: (floor(@font-size-small * 1.5) + @padding-small-vertical * 2); +@bs-height-xs: (floor(@font-size-small * 1.2) + @padding-small-vertical + 1); + +.btn-social { + position: relative; + padding-left: (@bs-height-base + @padding-base-horizontal); + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: @bs-height-base; + line-height: (@bs-height-base + 2); + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); + } + &.btn-lg { + padding-left: (@bs-height-lg + @padding-large-horizontal); + > :first-child { + line-height: @bs-height-lg; + width: @bs-height-lg; + font-size: 1.8em; + } + } + &.btn-sm { + padding-left: (@bs-height-sm + @padding-small-horizontal); + > :first-child { + line-height: @bs-height-sm; + width: @bs-height-sm; + font-size: 1.4em; + } + } + &.btn-xs { + padding-left: (@bs-height-xs + @padding-small-horizontal); + > :first-child { + line-height: @bs-height-xs; + width: @bs-height-xs; + font-size: 1.2em; + } + } +} + +.btn-social-icon { + .btn-social; + height: (@bs-height-base + 2); + width: (@bs-height-base + 2); + padding: 0; + > :first-child { + border: none; + text-align: center; + width: 100%; + } + &.btn-lg { + height: @bs-height-lg; + width: @bs-height-lg; + padding-left: 0; + padding-right: 0; + } + &.btn-sm { + height: (@bs-height-sm + 2); + width: (@bs-height-sm + 2); + padding-left: 0; + padding-right: 0; + } + &.btn-xs { + height: (@bs-height-xs + 2); + width: (@bs-height-xs + 2); + padding-left: 0; + padding-right: 0; + } +} + +.btn-social(@color-bg, @color: #fff) { + background-color: @color-bg; + .button-variant(@color, @color-bg, rgba(0, 0, 0, .2)); +} + +.btn-adn { + .btn-social(#d87a68); +} + +.btn-bitbucket { + .btn-social(#205081); +} + +.btn-dropbox { + .btn-social(#1087dd); +} + +.btn-facebook { + .btn-social(#3b5998); +} + +.btn-flickr { + .btn-social(#ff0084); +} + +.btn-foursquare { + .btn-social(#f94877); +} + +.btn-github { + .btn-social(#444444); +} + +.btn-google { + .btn-social(#dd4b39); +} + +.btn-instagram { + .btn-social(#3f729b); +} + +.btn-linkedin { + .btn-social(#007bb6); +} + +.btn-microsoft { + .btn-social(#2672ec); +} + +.btn-openid { + .btn-social(#f7931e); +} + +.btn-pinterest { + .btn-social(#cb2027); +} + +.btn-reddit { + .btn-social(#eff7ff, #000); +} + +.btn-soundcloud { + .btn-social(#ff5500); +} + +.btn-tumblr { + .btn-social(#2c4762); +} + +.btn-twitter { + .btn-social(#55acee); +} + +.btn-vimeo { + .btn-social(#1ab7ea); +} + +.btn-vk { + .btn-social(#587ea3); +} + +.btn-yahoo { + .btn-social(#720e9e); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/boxes.less b/hera-admin/src/main/resources/static/adminlte/build/less/boxes.less new file mode 100755 index 00000000..fc1f674a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/boxes.less @@ -0,0 +1,489 @@ +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + .border-radius(@box-border-radius); + background: #ffffff; + border-top: 3px solid @box-default-border-top-color; + margin-bottom: 20px; + width: 100%; + box-shadow: @box-boxshadow; + + // Box color variations + &.box-primary { + border-top-color: @light-blue; + } + &.box-info { + border-top-color: @aqua; + } + &.box-danger { + border-top-color: @red; + } + &.box-warning { + border-top-color: @yellow; + } + &.box-success { + border-top-color: @green; + } + &.box-default { + border-top-color: @gray-lte; + } + + // collapsed mode + &.collapsed-box { + .box-body, + .box-footer { + display: none; + } + } + + .nav-stacked { + > li { + border-bottom: 1px solid @box-border-color; + margin: 0; + &:last-of-type { + border-bottom: none; + } + } + } + + // fixed height to 300px + &.height-control { + .box-body { + max-height: 300px; + overflow: auto; + } + } + + .border-right { + border-right: 1px solid @box-border-color; + } + .border-left { + border-left: 1px solid @box-border-color; + } + + //SOLID BOX + //--------- + //use this class to get a colored header and borders + + &.box-solid { + border-top: 0; + > .box-header { + .btn.btn-default { + background: transparent; + } + .btn, + a { + &:hover { + background: rgba(0, 0, 0, 0.1); + } + } + } + + // Box color variations + &.box-default { + .box-solid-variant(@gray-lte, #444); + } + &.box-primary { + .box-solid-variant(@light-blue); + } + &.box-info { + .box-solid-variant(@aqua); + } + &.box-danger { + .box-solid-variant(@red); + } + &.box-warning { + .box-solid-variant(@yellow); + } + &.box-success { + .box-solid-variant(@green); + } + + > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; + } + + // Fix font color for tiles + &[class*='bg'] { + > .box-header { + color: #fff; + } + } + + } + + //BOX GROUP + .box-group { + > .box { + margin-bottom: 5px; + } + } + + // jQuery Knob in a box + .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; + } +} + +.box, +.overlay-wrapper { + // Box overlay for LOADING STATE effect + > .overlay, + > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + .border-radius(@box-border-radius); + > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; + } + } + + .overlay.dark { + background: rgba(0, 0, 0, 0.5); + } +} + +//Add clearfix to header, body and footer +.box-header, +.box-body, +.box-footer { + .clearfix(); +} + +//Box header +.box-header { + color: #444; + display: block; + padding: @box-padding; + position: relative; + + //Add bottom border + &.with-border { + border-bottom: 1px solid @box-border-color; + .collapsed-box & { + border-bottom: none; + } + } + + //Icons and box title + > .fa, + > .glyphicon, + > .ion, + .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; + } + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + > .box-tools { + position: absolute; + right: 10px; + top: 5px; + [data-toggle="tooltip"] { + position: relative; + } + + &.pull-right { + .dropdown-menu { + right: 0; + left: auto; + } + } + + .dropdown-menu > li > a { + color: #444!important; + } + } +} + +//Box Tools Buttons +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: darken(@box-default-border-top-color, 20%); + .open &, + &:hover { + color: darken(@box-default-border-top-color, 40%); + } + &.btn:active { + box-shadow: none; + } +} + +//Box Body +.box-body { + .border-radius(0; 0; @box-border-radius; @box-border-radius); + padding: @box-padding; + .no-header & { + .border-top-radius(@box-border-radius); + } + // Tables within the box body + > .table { + margin-bottom: 0; + } + + // Calendar within the box body + .fc { + margin-top: 5px; + } + + .full-width-chart { + margin: -19px; + } + &.no-padding .full-width-chart { + margin: -9px; + } + + .box-pane { + .border-radius(0; 0; @box-border-radius; 0); + } + .box-pane-right { + .border-radius(0; 0; 0; @box-border-radius); + } +} + +//Box footer +.box-footer { + .border-radius(0; 0; @box-border-radius; @box-border-radius); + border-top: 1px solid @box-border-color; + padding: @box-padding; + background-color: @box-footer-bg; +} + +.chart-legend { + &:extend(.list-unstyled); + margin: 10px 0; + > li { + @media (max-width: @screen-sm-max) { + float: left; + margin-right: 10px; + } + } +} + +//Comment Box +.box-comments { + background: #f7f7f7; + .box-comment { + .clearfix(); + padding: 8px 0; + border-bottom: 1px solid #eee; + &:last-of-type { + border-bottom: 0; + } + &:first-of-type { + padding-top: 0; + } + img { + &:extend(.img-sm); + float: left; + } + } + .comment-text { + margin-left: 40px; + color: #555; + } + .username { + color: #444; + display: block; + font-weight: 600; + } + .text-muted { + font-weight: 400; + font-size: 12px; + } +} + +//Widgets +//----------- + +/* Widget: TODO LIST */ + +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; + // Todo list element + > li { + .border-radius(2px); + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; + &:last-of-type { + margin-bottom: 0; + } + + > input[type='checkbox'] { + margin: 0 10px 0 5px; + } + + .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; + } + + // Time labels + .label { + margin-left: 10px; + font-size: 9px; + } + + // Tools and options box + .tools { + display: none; + float: right; + color: @red; + // icons + > .fa, > .glyphicon, > .ion { + margin-right: 5px; + cursor: pointer; + } + + } + &:hover .tools { + display: inline-block; + } + + &.done { + color: #999; + .text { + text-decoration: line-through; + font-weight: 500; + } + + .label { + background: @gray-lte !important; + } + } + } + + // Color varaity + .danger { + border-left-color: @red; + } + .warning { + border-left-color: @yellow; + } + .info { + border-left-color: @aqua; + } + .success { + border-left-color: @green; + } + .primary { + border-left-color: @light-blue; + } + + .handle { + display: inline-block; + cursor: move; + margin: 0 5px; + } + +} + +// END TODO WIDGET + +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; + + .item { + .clearfix(); + margin-bottom: 10px; + // The image + > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + .border-radius(50%); + } + + > .online { + border: 2px solid @green; + } + > .offline { + border: 2px solid @red; + } + + // The message body + > .message { + margin-left: 55px; + margin-top: -40px; + > .name { + display: block; + font-weight: 600; + } + } + + // The attachment + > .attachment { + .border-radius(@attachment-border-radius); + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; + > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; + } + > p, > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; + + } + .clearfix(); + } + } + +} + +//END CHAT WIDGET + +//Input in box +.box-input { + max-width: 200px; +} + +//A fix for panels body text color when placed within +// a modal +.modal { + .panel-body { + color: #444; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/buttons.less b/hera-admin/src/main/resources/static/adminlte/build/less/buttons.less new file mode 100755 index 00000000..7a0aaa69 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/buttons.less @@ -0,0 +1,168 @@ +/* + * Component: Button + * ----------------- + */ + +.btn { + .border-radius(@btn-border-radius); + .box-shadow(@btn-boxshadow); + border: 1px solid transparent; + + &.uppercase { + text-transform: uppercase + } + + // Flat buttons + &.btn-flat { + .border-radius(0); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; + } + + // Active state + &:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + } + + &:focus { + outline: none; + } + + // input file btn + &.btn-file { + position: relative; + overflow: hidden; + > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + .opacity(0); + outline: none; + background: white; + cursor: inherit; + display: block; + } + } +} + +//Button color variations +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; + &:hover, + &:active, + &.hover { + background-color: darken(#f4f4f4, 5%); + } +} + +.btn-primary { + background-color: @light-blue; + border-color: darken(@light-blue, 5%); + &:hover, &:active, &.hover { + background-color: darken(@light-blue, 5%); + } +} + +.btn-success { + background-color: @green; + border-color: darken(@green, 5%); + &:hover, &:active, &.hover { + background-color: darken(@green, 5%); + } +} + +.btn-info { + background-color: @aqua; + border-color: darken(@aqua, 5%); + &:hover, &:active, &.hover { + background-color: darken(@aqua, 5%); + } +} + +.btn-danger { + background-color: @red; + border-color: darken(@red, 5%); + &:hover, &:active, &.hover { + background-color: darken(@red, 5%); + } +} + +.btn-warning { + background-color: @yellow; + border-color: darken(@yellow, 5%); + &:hover, &:active, &.hover { + background-color: darken(@yellow, 5%); + } +} + +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; + &:hover, + &:focus, + &:active { + color: rgba(255, 255, 255, .7); + border-color: rgba(255, 255, 255, .7); + } +} + +.btn-link { + .box-shadow(none); +} + +//General .btn with bg class +.btn[class*='bg-']:hover { + .box-shadow(inset 0 0 100px rgba(0, 0, 0, 0.2)); +} + +// Application buttons +.btn-app { + .border-radius(3px); + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; + //Icons within the btn + > .fa, > .glyphicon, > .ion { + font-size: 20px; + display: block; + } + + &:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; + } + + &:active, &:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + } + + //The badge + > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/callout.less b/hera-admin/src/main/resources/static/adminlte/build/less/callout.less new file mode 100755 index 00000000..9f6aaa1a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/callout.less @@ -0,0 +1,48 @@ +/* + * Component: Callout + * ------------------ + */ + +// Base styles (regardless of theme) +.callout { + .border-radius(3px); + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; + a { + color: #fff; + text-decoration: underline; + &:hover { + color: #eee; + } + } + h4 { + margin-top: 0; + font-weight: 600; + } + p:last-child { + margin-bottom: 0; + } + code, + .highlight { + background-color: #fff; + } + + // Themes for different contexts + &.callout-danger { + &:extend(.bg-red); + border-color: darken(@red, 10%); + } + &.callout-warning { + &:extend(.bg-yellow); + border-color: darken(@yellow, 10%); + } + &.callout-info { + &:extend(.bg-aqua); + border-color: darken(@aqua, 10%); + } + &.callout-success { + &:extend(.bg-green); + border-color: darken(@green, 10%); + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/carousel.less b/hera-admin/src/main/resources/static/adminlte/build/less/carousel.less new file mode 100755 index 00000000..f069109a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/carousel.less @@ -0,0 +1,18 @@ +/* + * Component: Carousel + * ------------------- + */ +.carousel-control { + &.left, + &.right { + background-image: none; + } + > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/control-sidebar.less b/hera-admin/src/main/resources/static/adminlte/build/less/control-sidebar.less new file mode 100755 index 00000000..de039dbc --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/control-sidebar.less @@ -0,0 +1,299 @@ +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +// The sidebar's background control class +// This is a hack to make the background visible while scrolling +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} + +// Transitions +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -@control-sidebar-width; + width: @control-sidebar-width; + .transition(right @transition-speed ease-in-out); +} + +// The sidebar +.control-sidebar { + position: absolute; + padding-top: @navbar-height; + z-index: 1010; + // Fix position after header collapse + @media (max-width: @screen-sm) { + padding-top: @navbar-height + 50; + } + // Tab panes + > .tab-content { + padding: 10px 15px; + } + // Open state with slide over content effect + &.control-sidebar-open { + &, + + .control-sidebar-bg { + right: 0; + } + } +} + +// Open without slide over content +.control-sidebar-open { + .control-sidebar-bg, + .control-sidebar { + right: 0; + } + @media (min-width: @screen-sm) { + .content-wrapper, + .right-side, + .main-footer { + margin-right: @control-sidebar-width; + } + } +} + +// Fixed Layout +.fixed { + .control-sidebar { + position: fixed; + height: 100%; + overflow-y: auto; + padding-bottom: 50px; + } +} + +// Control sidebar tabs +.nav-tabs.control-sidebar-tabs { + > li { + &:first-of-type > a { + &, + &:hover, + &:focus { + border-left-width: 0; + } + } + > a { + .border-radius(0); + + // Hover and active states + &, + &:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; + } + .icon { + font-size: 16px; + } + } + // Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + border-top: none; + border-right: none; + border-bottom: none; + } + } + } + } + // Remove responsiveness on small screens + @media (max-width: @screen-sm) { + display: table; + > li { + display: table-cell; + } + } +} + +// Headings in the sidebar content +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} + +// Subheadings +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} + +// Control Sidebar Menu +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; + > li > a { + .clearfix(); + display: block; + padding: 10px 15px; + > .control-sidebar-subheading { + margin-top: 0; + } + } + .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; + } + .menu-info { + margin-left: 45px; + margin-top: 3px; + > .control-sidebar-subheading { + margin: 0; + } + > p { + margin: 0; + font-size: 11px; + } + } + .progress { + margin: 0; + } +} + +// Dark skin +.control-sidebar-dark { + color: @sidebar-dark-color; + // Background + &, + + .control-sidebar-bg { + background: @sidebar-dark-bg; + } + // Sidebar tabs + .nav-tabs.control-sidebar-tabs { + border-bottom: darken(@sidebar-dark-bg, 3%); + > li { + > a { + background: darken(@sidebar-dark-bg, 5%); + color: @sidebar-dark-color; + // Hover and active states + &, + &:hover, + &:focus { + border-left-color: darken(@sidebar-dark-bg, 7%); + border-bottom-color: darken(@sidebar-dark-bg, 7%); + } + &:hover, + &:focus, + &:active { + background: darken(@sidebar-dark-bg, 3%); + } + &:hover { + color: #fff; + } + } + // Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + background: @sidebar-dark-bg; + color: #fff; + } + } + } + } + } + // Heading & subheading + .control-sidebar-heading, + .control-sidebar-subheading { + color: #fff; + } + // Sidebar list + .control-sidebar-menu { + > li { + > a { + &:hover { + background: @sidebar-dark-hover-bg; + } + .menu-info { + > p { + color: @sidebar-dark-color; + } + } + } + } + } +} + +// Light skin +.control-sidebar-light { + color: lighten(@sidebar-light-color, 10%); + // Background + &, + + .control-sidebar-bg { + background: @sidebar-light-bg; + border-left: 1px solid @gray-lte; + } + // Sidebar tabs + .nav-tabs.control-sidebar-tabs { + border-bottom: @gray-lte; + > li { + > a { + background: darken(@sidebar-light-bg, 5%); + color: @sidebar-light-color; + // Hover and active states + &, + &:hover, + &:focus { + border-left-color: @gray-lte; + border-bottom-color: @gray-lte; + } + &:hover, + &:focus, + &:active { + background: darken(@sidebar-light-bg, 3%); + } + } + // Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + background: @sidebar-light-bg; + color: #111; + } + } + } + } + } + // Heading & subheading + .control-sidebar-heading, + .control-sidebar-subheading { + color: #111; + } + // Sidebar list + .control-sidebar-menu { + margin-left: -14px; + > li { + > a { + &:hover { + background: @sidebar-light-hover-bg; + } + .menu-info { + > p { + color: lighten(@sidebar-light-color, 10%); + } + } + } + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/core.less b/hera-admin/src/main/resources/static/adminlte/build/less/core.less new file mode 100755 index 00000000..0a2a19e7 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/core.less @@ -0,0 +1,177 @@ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + height: 100%; + .layout-boxed & { + height: 100%; + } +} + +body { + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} + +/* Layout */ +.wrapper { + .clearfix(); + height: 100%; + position: relative; + overflow-x: hidden; + overflow-y: auto; + .layout-boxed & { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); + position: relative; + } +} + +.layout-boxed { + background: url('@{boxed-layout-bg-image-path}') repeat fixed; +} + +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + // Using disposable variable to join statements with a comma + @transition-rule: @transition-speed @transition-fn, + margin @transition-speed @transition-fn; + .transition-transform(@transition-rule); + margin-left: @sidebar-width; + z-index: 820; + // Top nav layout + .layout-top-nav & { + margin-left: 0; + } + @media (max-width: @screen-xs-max) { + margin-left: 0; + } + // When opening the sidebar on large screens + .sidebar-collapse & { + @media (min-width: @screen-sm) { + margin-left: 0; + } + } + // When opening the sidebar on small screens + .sidebar-open & { + @media (max-width: @screen-xs-max) { + .translate(@sidebar-width, 0); + } + } +} + +.content-wrapper, +.right-side { + min-height: 100%; + background-color: @body-bg; + z-index: 800; +} + +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid @gray-lte; +} + +/* Fixed layout */ +.fixed { + .main-header, + .main-sidebar, + .left-side { + position: fixed; + } + .main-header { + top: 0; + right: 0; + left: 0; + } + .content-wrapper, + .right-side { + padding-top: 50px; + @media (max-width: @screen-header-collapse) { + padding-top: 100px; + } + } + &.layout-boxed { + .wrapper { + max-width: 100%; + } + } + .wrapper { + overflow: hidden; + } +} + +.hold-transition { + .content-wrapper, + .right-side, + .main-footer, + .main-sidebar, + .left-side, + .main-header .navbar, + .main-header .logo, + .menu-open .fa-angle-left { + /* Fix for IE */ + .transition(none); + } +} + +/* Content */ +.content { + min-height: 250px; + padding: 15px; + .container-fixed(@grid-gutter-width); +} + +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: 'Source Sans Pro', sans-serif; +} + +/* General Links */ +a { + color: @link-color; +} + +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: @link-hover-color; +} + +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; + + > small { + color: #666; + display: block; + margin-top: 5px; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/direct-chat.less b/hera-admin/src/main/resources/static/adminlte/build/less/direct-chat.less new file mode 100755 index 00000000..f35c07dd --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/direct-chat.less @@ -0,0 +1,194 @@ +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat { + .box-body { + .border-bottom-radius(0); + position: relative; + overflow-x: hidden; + padding: 0; + } + &.chat-pane-open { + .direct-chat-contacts { + .translate(0, 0); + } + } +} + +.direct-chat-messages { + .translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} + +.direct-chat-msg, +.direct-chat-text { + display: block; +} + +.direct-chat-msg { + .clearfix(); + margin-bottom: 10px; +} + +.direct-chat-messages, +.direct-chat-contacts { + .transition-transform(.5s ease-in-out); +} + +.direct-chat-text { + .border-radius(5px); + position: relative; + padding: 5px 10px; + background: @direct-chat-default-msg-bg; + border: 1px solid @direct-chat-default-msg-border-color; + margin: 5px 0 0 50px; + color: @direct-chat-default-font-color; + + //Create the arrow + &:after, + &:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: @direct-chat-default-msg-border-color; + content: ' '; + height: 0; + width: 0; + pointer-events: none; + } + + &:after { + border-width: 5px; + margin-top: -5px; + } + &:before { + border-width: 6px; + margin-top: -6px; + } + .right & { + margin-right: 50px; + margin-left: 0; + &:after, + &:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: @direct-chat-default-msg-border-color; + } + } +} + +.direct-chat-img { + .border-radius(50%); + float: left; + width: 40px; + height: 40px; + .right & { + float: right; + } +} + +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} + +.direct-chat-name { + font-weight: 600; +} + +.direct-chat-timestamp { + color: #999; +} + +//Direct chat contacts pane +.direct-chat-contacts-open { + .direct-chat-contacts { + .translate(0, 0); + } +} + +.direct-chat-contacts { + .translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} + +//Contacts list -- for displaying contacts in direct chat contacts pane +.contacts-list { + &:extend(.list-unstyled); + > li { + .clearfix(); + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 10px; + margin: 0; + &:last-of-type { + border-bottom: none; + } + } +} + +.contacts-list-img { + .border-radius(50%); + width: 40px; + float: left; +} + +.contacts-list-info { + margin-left: 45px; + color: #fff; +} + +.contacts-list-name, +.contacts-list-status { + display: block; +} + +.contacts-list-name { + font-weight: 600; +} + +.contacts-list-status { + font-size: 12px; +} + +.contacts-list-date { + color: #aaa; + font-weight: normal; +} + +.contacts-list-msg { + color: #999; +} + +//Direct Chat Variants +.direct-chat-danger { + .direct-chat-variant(@red); +} + +.direct-chat-primary { + .direct-chat-variant(@light-blue); +} + +.direct-chat-warning { + .direct-chat-variant(@yellow); +} + +.direct-chat-info { + .direct-chat-variant(@aqua); +} + +.direct-chat-success { + .direct-chat-variant(@green); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/dropdown.less b/hera-admin/src/main/resources/static/adminlte/build/less/dropdown.less new file mode 100755 index 00000000..ab5d97ed --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/dropdown.less @@ -0,0 +1,350 @@ +/* + * Component: Dropdown menus + * ------------------------- + */ + +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; + > li > a { + color: #777; + } + > li > a > .glyphicon, + > li > a > .fa, + > li > a > .ion { + margin-right: 10px; + } + > li > a:hover { + background-color: lighten(@gray-lte, 5%); + color: #333; + } + > .divider { + background-color: #eee; + } +} + +//Navbar custom dropdown menu +.navbar-nav > .notifications-menu, +.navbar-nav > .messages-menu, +.navbar-nav > .tasks-menu { + //fix width and padding + > .dropdown-menu { + > li { + position: relative; + } + width: 280px; + //Remove padding and margins + padding: 0 0 0 0; + margin: 0; + top: 100%; + } + //Define header class + > .dropdown-menu > li.header { + .border-radius(4px; 4px; 0; 0); + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; + } + + //Define footer class + > .dropdown-menu > li.footer > a { + .border-radius(0; 0; 4px; 4px); + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444 !important; + @media (max-width: @screen-sm-max) { + background: #fff !important; + color: #444 !important; + } + text-align: center; + //Hover state + &:hover { + text-decoration: none; + font-weight: normal; + } + } + + //Clear inner menu padding and margins + > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; + > li > a { + display: block; + white-space: nowrap; /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; + // Hove state + &:hover { + background: #f4f4f4; + text-decoration: none; + } + } + } +} + +//Notifications menu +.navbar-nav > .notifications-menu { + > .dropdown-menu > li .menu { + // Links inside the menu + > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + padding: 10px; + // Icons inside the menu + > .glyphicon, + > .fa, + > .ion { + width: 20px; + } + } + + } +} + +//Messages menu +.navbar-nav > .messages-menu { + //Inner menu + > .dropdown-menu > li .menu { + // Messages menu item + > li > a { + margin: 0; + //line-height: 20px; + padding: 10px 10px; + // User image + > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; + } + // Message heading + > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; + // Small for message time display + > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; + } + } + + > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; + } + + .clearfix(); + + } + + } +} + +//Tasks menu +.navbar-nav > .tasks-menu { + > .dropdown-menu > li .menu { + > li > a { + padding: 10px; + + > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; + } + + > .progress { + padding: 0; + margin: 0; + } + } + } +} + +//User menu +.navbar-nav > .user-menu { + > .dropdown-menu { + .border-top-radius(0); + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; + + &, + > .user-body { + .border-bottom-radius(4px); + } + // Header menu + > li.user-header { + height: 175px; + padding: 10px; + text-align: center; + // User image + > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); + } + > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + //text-shadow: 2px 2px 3px #333333; + margin-top: 10px; + > small { + display: block; + font-size: 12px; + } + } + } + + // Menu Body + > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; + .clearfix(); + a { + color: #444 !important; + @media (max-width: @screen-sm-max) { + background: #fff !important; + color: #444 !important; + } + } + } + + // Menu Footer + > .user-footer { + background-color: #f9f9f9; + padding: 10px; + .clearfix(); + .btn-default { + color: #666666; + &:hover { + @media (max-width: @screen-sm-max) { + background-color: #f9f9f9; + } + } + } + } + } + .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; + @media (max-width: @screen-xs-max) { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } + } +} + +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + .animation(flipInX .7s both); + +} + +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + transform: perspective(400px); + } +} + +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + } +} + +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav { + > li { + position: relative; + > .dropdown-menu { + position: absolute; + right: 0; + left: auto; + } + } +} + +@media (max-width: @screen-sm-max) { + .navbar-custom-menu > .navbar-nav { + float: right; + > li { + position: static; + > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/forms.less b/hera-admin/src/main/resources/static/adminlte/build/less/forms.less new file mode 100755 index 00000000..4ab0c03b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/forms.less @@ -0,0 +1,108 @@ +/* + * Component: Form + * --------------- + */ +.form-control { + .border-radius(@input-radius); + box-shadow: none; + border-color: @gray-lte; + &:focus { + border-color: @light-blue; + box-shadow: none; + } + &::-moz-placeholder, + &:-ms-input-placeholder, + &::-webkit-input-placeholder { + color: #bbb; + opacity: 1; + } + + &:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } +} + +.form-group { + &.has-success { + label { + color: @green; + } + .form-control, + .input-group-addon { + border-color: @green; + box-shadow: none; + } + .help-block { + color: @green; + } + } + + &.has-warning { + label { + color: @yellow; + } + .form-control, + .input-group-addon { + border-color: @yellow; + box-shadow: none; + } + .help-block { + color: @yellow; + } + } + + &.has-error { + label { + color: @red; + } + .form-control, + .input-group-addon { + border-color: @red; + box-shadow: none; + } + .help-block { + color: @red; + } + } +} + +/* Input group */ +.input-group { + .input-group-addon { + .border-radius(@input-radius); + border-color: @gray-lte; + background-color: #fff; + } +} + +/* button groups */ +.btn-group-vertical { + .btn { + &.btn-flat:first-of-type, &.btn-flat:last-of-type { + .border-radius(0); + } + } +} + +.icheck > label { + padding-left: 0; +} + +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: @input-height-base; +} + +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: @input-height-large; +} + +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: @input-height-small; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/fullcalendar.less b/hera-admin/src/main/resources/static/adminlte/build/less/fullcalendar.less new file mode 100755 index 00000000..113c2ae0 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/fullcalendar.less @@ -0,0 +1,107 @@ +/* + * Plugin: Full Calendar + * --------------------- + */ + +// Import variables and mixins as a reference for separate plugins version +@import (reference) "../bootstrap-less/mixins"; +@import (reference) "../bootstrap-less/variables"; +@import (reference) "variables"; +@import (reference) "mixins"; + +//Fullcalendar buttons +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; + &:hover, + &:active, + &.hover { + background-color: #e9e9e9; + } +} + +// Calendar title +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} + +.fc-header-right { + padding-right: 10px; +} + +.fc-header-left { + padding-left: 10px; +} + +// Calendar table header cells +.fc-widget-header { + background: #fafafa; +} + +.fc-grid { + width: 100%; + border: 0; +} + +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} + +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} + +.fc-toolbar { + padding: @box-padding; + margin: 0; +} + +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} + +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; + > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; + .fa { + .transition-transform(linear .3s); + &:hover { + .rotate(30deg); + } + } + } +} + +#add-new-event { + .transition(all linear .3s); +} + +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: @box-boxshadow; + text-shadow: @box-boxshadow; + border-radius: @box-border-radius; + cursor: move; + &:hover { + box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/header.less b/hera-admin/src/main/resources/static/adminlte/build/less/header.less new file mode 100755 index 00000000..918ec6af --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/header.less @@ -0,0 +1,248 @@ +/* + * Component: Main Header + * ---------------------- + */ + +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; + //Navbar + .navbar { + .transition(margin-left @transition-speed @transition-fn); + margin-bottom: 0; + margin-left: @sidebar-width; + border: none; + min-height: @navbar-height; + border-radius: 0; + .layout-top-nav & { + margin-left: 0; + } + } + //Navbar search text input + #navbar-search-input.form-control { + background: rgba(255, 255, 255, .2); + border-color: transparent; + &:focus, + &:active { + border-color: rgba(0, 0, 0, .1); + background: rgba(255, 255, 255, .9); + } + &::-moz-placeholder { + color: #ccc; + opacity: 1; + } + &:-ms-input-placeholder { + color: #ccc; + } + &::-webkit-input-placeholder { + color: #ccc; + } + } + //Navbar Right Menu + .navbar-custom-menu, + .navbar-right { + float: right; + @media (max-width: @screen-sm-max) { + a { + color: inherit; + background: transparent; + } + } + } + .navbar-right { + @media (max-width: @screen-header-collapse) { + float: none; + .navbar-collapse & { + margin: 7.5px -15px; + } + + > li { + color: inherit; + border: 0; + } + } + } + //Navbar toggle button + .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: @navbar-padding-vertical @navbar-padding-horizontal; + //Add the fontawesome bars icon + font-family: fontAwesome; + &:before { + content: "\f0c9"; + } + &:hover { + color: #fff; + } + &:focus, + &:active { + background: transparent; + } + } + .sidebar-toggle .icon-bar { + display: none; + } + //Navbar User Menu + .navbar .nav > li.user > a { + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + + //Labels in navbar + .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; + } + + //Logo bar + .logo { + .transition(width @transition-speed @transition-fn); + display: block; + float: left; + height: @navbar-height; + font-size: 20px; + line-height: 50px; + text-align: center; + width: @sidebar-width; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; + //Add support to sidebar mini by allowing the user to create + //2 logo designs. mini and lg + .logo-lg { + //should be visibile when sidebar isn't collapsed + display: block; + } + .logo-mini { + display: none; + } + } + //Navbar Brand. Alternative logo with layout-top-nav + .navbar-brand { + color: #fff; + } +} + +// Content Header +.content-header { + position: relative; + padding: 15px 15px 0 15px; + // Header Text + > h1 { + margin: 0; + font-size: 24px; + > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; + } + } + + > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + .border-radius(2px); + > li > a { + color: #444; + text-decoration: none; + display: inline-block; + > .fa, > .glyphicon, > .ion { + margin-right: 5px; + } + } + > li + li:before { + content: '>\00a0'; + } + } + + @media (max-width: @screen-sm-max) { + > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: @gray-lte; + padding-left: 10px; + li:before { + color: darken(@gray-lte, 20%); + } + } + } +} + +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: @navbar-padding-vertical @navbar-padding-horizontal; +} + +//Control navbar scaffolding on x-small screens +@media (max-width: @screen-sm-max) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + + //Dont't let links get full width + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} + +// Collapse header +@media (max-width: @screen-header-collapse) { + .main-header { + position: relative; + .logo, + .navbar { + width: 100%; + float: none; + } + .navbar { + margin: 0; + } + .navbar-custom-menu { + float: right; + } + } +} + +.navbar-collapse.pull-left { + @media (max-width: @screen-sm-max) { + float: none !important; + + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/info-box.less b/hera-admin/src/main/resources/static/adminlte/build/less/info-box.less new file mode 100755 index 00000000..f8df3a8b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/info-box.less @@ -0,0 +1,75 @@ +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: @box-boxshadow; + .border-radius(2px); + margin-bottom: 15px; + small { + font-size: 14px; + } + .progress { + background: rgba(0, 0, 0, .2); + margin: 5px -10px 5px -10px; + height: 2px; + &, + & .progress-bar { + .border-radius(0); + } + .progress-bar { + background: #fff; + } + } +} + +.info-box-icon { + .border-radius(2px; 0; 2px; 0); + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0, 0, 0, 0.2); + > img { + max-width: 100%; + } +} + +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} + +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} + +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.info-box-text { + text-transform: uppercase; +} + +.info-box-more { + display: block; +} + +.progress-description { + margin: 0; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/invoice.less b/hera-admin/src/main/resources/static/adminlte/build/less/invoice.less new file mode 100755 index 00000000..3d2fcf8d --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/invoice.less @@ -0,0 +1,16 @@ +/* + * Page: Invoice + * ------------- + */ + +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} + +.invoice-title { + margin-top: 0; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/labels.less b/hera-admin/src/main/resources/static/adminlte/build/less/labels.less new file mode 100755 index 00000000..f0dd59af --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/labels.less @@ -0,0 +1,28 @@ +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: @gray-lte; + color: #444; +} + +.label-danger { + &:extend(.bg-red); +} + +.label-info { + &:extend(.bg-aqua); +} + +.label-warning { + &:extend(.bg-yellow); +} + +.label-primary { + &:extend(.bg-light-blue); +} + +.label-success { + &:extend(.bg-green); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/lockscreen.less b/hera-admin/src/main/resources/static/adminlte/build/less/lockscreen.less new file mode 100755 index 00000000..bdffbe62 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/lockscreen.less @@ -0,0 +1,73 @@ +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE TAG */ +.lockscreen { + background: @gray-lte; +} + +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; + a { + color: #444; + } +} + +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} + +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} + +/* Will contain the image and the sign in form */ +.lockscreen-item { + .border-radius(4px); + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} + +/* User image */ +.lockscreen-image { + .border-radius(50%); + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; + > img { + .border-radius(50%); + width: 70px; + height: 70px; + } +} + +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; + .form-control { + border: 0; + } + .btn { + background-color: #fff; + border: 0; + padding: 0 10px; + } +} + +.lockscreen-footer { + margin-top: 10px; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/login_and_register.less b/hera-admin/src/main/resources/static/adminlte/build/less/login_and_register.less new file mode 100755 index 00000000..9d6969e1 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/login_and_register.less @@ -0,0 +1,52 @@ +/* + * Page: Login & Register + * ---------------------- + */ + +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; + a { + color: #444; + } +} + +.login-page, +.register-page { + background: @gray-lte; +} + +.login-box, +.register-box { + width: 360px; + margin: 7% auto; + @media (max-width: @screen-sm) { + width: 90%; + margin-top: 20px; + } +} + +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; + .form-control-feedback { + color: #777; + } +} + +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} + +.social-auth-links { + margin: 10px 0; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/mailbox.less b/hera-admin/src/main/resources/static/adminlte/build/less/mailbox.less new file mode 100755 index 00000000..8e7a429f --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/mailbox.less @@ -0,0 +1,88 @@ +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages { + > .table { + margin: 0; + } +} + +.mailbox-controls { + padding: 5px; + &.with-border { + border-bottom: 1px solid @box-border-color; + } +} + +.mailbox-read-info { + border-bottom: 1px solid @box-border-color; + padding: 10px; + h3 { + font-size: 20px; + margin: 0; + } + h5 { + margin: 0; + padding: 5px 0 0 0; + } +} + +.mailbox-read-time { + color: #999; + font-size: 13px; +} + +.mailbox-read-message { + padding: 10px; +} + +.mailbox-attachments { + &:extend(.list-unstyled); + li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; + } +} + +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} + +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} + +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} + +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} + +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; + &.has-img { + padding: 0; + > img { + max-width: 100%; + height: auto; + } + } +} + +.mailbox-attachment-close { + &:extend(.close); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/miscellaneous.less b/hera-admin/src/main/resources/static/adminlte/build/less/miscellaneous.less new file mode 100755 index 00000000..e819c79b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/miscellaneous.less @@ -0,0 +1,606 @@ +/* + * General: Miscellaneous + * ---------------------- + */ +// 10px padding and margins +.pad { + padding: 10px; +} + +.margin { + margin: 10px; +} + +.margin-bottom { + margin-bottom: 20px; +} + +.margin-bottom-none { + margin-bottom: 0; +} + +.margin-r-5 { + margin-right: 5px; +} + +// Display inline +.inline { + display: inline; +} + +// Description Blocks +.description-block { + display: block; + margin: 10px 0; + text-align: center; + &.margin-bottom { + margin-bottom: 25px; + } + > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; + } + > .description-text { + text-transform: uppercase; + } +} + +// Background colors +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange, +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active { + color: #fff !important; +} + +.bg-gray { + color: #000; + background-color: @gray-lte !important; +} + +.bg-gray-light { + background-color: #f7f7f7; +} + +.bg-black { + background-color: @black !important; +} + +.bg-red { + background-color: @red !important; +} + +.bg-yellow { + background-color: @yellow !important; +} + +.bg-aqua { + background-color: @aqua !important; +} + +.bg-blue { + background-color: @blue !important; +} + +.bg-light-blue { + background-color: @light-blue !important; +} + +.bg-green { + background-color: @green !important; +} + +.bg-navy { + background-color: @navy !important; +} + +.bg-teal { + background-color: @teal !important; +} + +.bg-olive { + background-color: @olive !important; +} + +.bg-lime { + background-color: @lime !important; +} + +.bg-orange { + background-color: @orange !important; +} + +.bg-fuchsia { + background-color: @fuchsia !important; +} + +.bg-purple { + background-color: @purple !important; +} + +.bg-maroon { + background-color: @maroon !important; +} + +//Set of Active Background Colors +.bg-gray-active { + color: #000; + background-color: darken(@gray-lte, 10%) !important; +} + +.bg-black-active { + background-color: darken(@black, 10%) !important; +} + +.bg-red-active { + background-color: darken(@red , 6%) !important; +} + +.bg-yellow-active { + background-color: darken(@yellow , 6%) !important; +} + +.bg-aqua-active { + background-color: darken(@aqua , 6%) !important; +} + +.bg-blue-active { + background-color: darken(@blue , 10%) !important; +} + +.bg-light-blue-active { + background-color: darken(@light-blue , 6%) !important; +} + +.bg-green-active { + background-color: darken(@green , 5%) !important; +} + +.bg-navy-active { + background-color: darken(@navy , 2%) !important; +} + +.bg-teal-active { + background-color: darken(@teal , 5%) !important; +} + +.bg-olive-active { + background-color: darken(@olive , 5%) !important; +} + +.bg-lime-active { + background-color: darken(@lime , 5%) !important; +} + +.bg-orange-active { + background-color: darken(@orange , 5%) !important; +} + +.bg-fuchsia-active { + background-color: darken(@fuchsia , 5%) !important; +} + +.bg-purple-active { + background-color: darken(@purple , 5%) !important; +} + +.bg-maroon-active { + background-color: darken(@maroon , 3%) !important; +} + +//Disabled! +[class^="bg-"].disabled { + .opacity(.65); +} + +// Text colors +.text-red { + color: @red !important; +} + +.text-yellow { + color: @yellow !important; +} + +.text-aqua { + color: @aqua !important; +} + +.text-blue { + color: @blue !important; +} + +.text-black { + color: @black !important; +} + +.text-light-blue { + color: @light-blue !important; +} + +.text-green { + color: @green !important; +} + +.text-gray { + color: @gray-lte !important; +} + +.text-navy { + color: @navy !important; +} + +.text-teal { + color: @teal !important; +} + +.text-olive { + color: @olive !important; +} + +.text-lime { + color: @lime !important; +} + +.text-orange { + color: @orange !important; +} + +.text-fuchsia { + color: @fuchsia !important; +} + +.text-purple { + color: @purple !important; +} + +.text-maroon { + color: @maroon !important; +} + +.link-muted { + color: darken(@gray-lte, 30%); + &:hover, + &:focus { + color: darken(@gray-lte, 40%); + } +} + +.link-black { + color: #666; + &:hover, + &:focus { + color: #999; + } +} + +// Hide elements by display none only +.hide { + display: none !important; +} + +// Remove borders +.no-border { + border: 0 !important; +} + +// Remove padding +.no-padding { + padding: 0 !important; +} + +// Remove margins +.no-margin { + margin: 0 !important; +} + +// Remove box shadow +.no-shadow { + box-shadow: none !important; +} + +// Unstyled List +.list-unstyled { + list-style: none; + margin: 0; + padding: 0; +} + +.list-group-unbordered { + > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; + } +} + +// Remove border radius +.flat { + .border-radius(0) !important; +} + +.text-bold { + &, &.table td, &.table th { + font-weight: 700; + } +} + +.text-sm { + font-size: 12px; +} + +// _fix for sparkline tooltip +.jqstooltip { + padding: 5px !important; + width: auto !important; + height: auto !important; +} + +// Gradient Background colors +.bg-teal-gradient { + .gradient(@teal; @teal; lighten(@teal, 16%)) !important; + color: #fff; +} + +.bg-light-blue-gradient { + .gradient(@light-blue; @light-blue; lighten(@light-blue, 12%)) !important; + color: #fff; +} + +.bg-blue-gradient { + .gradient(@blue; @blue; lighten(@blue, 7%)) !important; + color: #fff; +} + +.bg-aqua-gradient { + .gradient(@aqua; @aqua; lighten(@aqua, 7%)) !important; + color: #fff; +} + +.bg-yellow-gradient { + .gradient(@yellow; @yellow; lighten(@yellow, 16%)) !important; + color: #fff; +} + +.bg-purple-gradient { + .gradient(@purple; @purple; lighten(@purple, 16%)) !important; + color: #fff; +} + +.bg-green-gradient { + .gradient(@green; @green; lighten(@green, 7%)) !important; + color: #fff; +} + +.bg-red-gradient { + .gradient(@red; @red; lighten(@red, 10%)) !important; + color: #fff; +} + +.bg-black-gradient { + .gradient(@black; @black; lighten(@black, 10%)) !important; + color: #fff; +} + +.bg-maroon-gradient { + .gradient(@maroon; @maroon; lighten(@maroon, 10%)) !important; + color: #fff; +} + +//Description Block Extension +.description-block { + .description-icon { + font-size: 16px; + } +} + +//Remove top padding +.no-pad-top { + padding-top: 0; +} + +//Make position static +.position-static { + position: static !important; +} + +//List utility classes +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} + +.list-seperator { + height: 1px; + background: @box-border-color; + margin: 15px 0 9px 0; +} + +.list-link { + > a { + padding: 4px; + color: #777; + &:hover { + color: #222; + } + } +} + +//Light font weight +.font-light { + font-weight: 300; +} + +//User block +.user-block { + .clearfix(); + img { + width: 40px; + height: 40px; + float: left; + } + .username, + .description, + .comment { + display: block; + margin-left: 50px; + } + .username { + font-size: 16px; + font-weight: 600; + } + .description { + color: #999; + font-size: 13px; + } + &.user-block-sm { + img { + &:extend(.img-sm); + } + .username, + .description, + .comment { + margin-left: 40px; + } + .username { + font-size: 14px; + } + } +} + +//Image sizes +.img-sm, +.img-md, +.img-lg { + float: left; +} + +.img-sm { + width: 30px !important; + height: 30px !important; + + .img-push { + margin-left: 40px; + } +} + +.img-md { + width: 60px; + height: 60px; + + .img-push { + margin-left: 70px; + } +} + +.img-lg { + width: 100px; + height: 100px; + + .img-push { + margin-left: 110px; + } +} + +// Image bordered +.img-bordered { + border: 3px solid @gray-lte; + padding: 3px; +} + +.img-bordered-sm { + border: 2px solid @gray-lte; + padding: 2px; +} + +//General attachemnt block +.attachment-block { + border: 1px solid @box-border-color; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; + + .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; + } + .attachment-pushed { + margin-left: 110px; + } + .attachment-heading { + margin: 0; + } + .attachment-text { + color: #555; + } +} + +.connectedSortable { + min-height: 100px; +} + +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} + +.full-opacity-hover { + .opacity(.65); + &:hover { + .opacity(1); + } +} + +// Charts +.chart { + position: relative; + overflow: hidden; + width: 100%; + svg, + canvas { + width: 100% !important; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/mixins.less b/hera-admin/src/main/resources/static/adminlte/build/less/mixins.less new file mode 100755 index 00000000..749bc55a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/mixins.less @@ -0,0 +1,312 @@ +//AdminLTE mixins +//=============== + +//Changes the color and the hovering properties of the navbar +.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) { + background-color: @color; + //Navbar links + .nav > li > a { + color: @font-color; + } + + .nav > li > a:hover, + .nav > li > a:active, + .nav > li > a:focus, + .nav .open > a, + .nav .open > a:hover, + .nav .open > a:focus, + .nav > .active > a { + background: @hover-bg; + color: @hover-color; + } + + //Add color to the sidebar toggle button + .sidebar-toggle { + color: @font-color; + &:hover { + color: @hover-color; + background: @hover-bg; + } + } +} + +//Logo color variation +.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) { + background-color: @bg-color; + color: @color; + border-bottom: @border-bottom-width solid @border-bottom-color; + + &:hover { + background-color: darken(@bg-color, 1%); + } +} + +//Box solid color variantion creator +.box-solid-variant(@color; @text-color: #fff) { + border: 1px solid @color; + > .box-header { + color: @text-color; + background: @color; + background-color: @color; + a, + .btn { + color: @text-color; + } + } +} + +//Direct Chat Variant +.direct-chat-variant(@bg-color; @color: #fff) { + .right > .direct-chat-text { + background: @bg-color; + border-color: @bg-color; + color: @color; + &:after, + &:before { + border-left-color: @bg-color; + } + } +} + +//border radius creator +.border-radius(@radius) { + border-radius: @radius; +} + +//Different radius each side +.border-radius(@top-left, @top-right, @bottom-left, @bottom-right) +{ + border-top-left-radius: @top-left; + border-top-right-radius: @top-right; + border-bottom-right-radius: @bottom-right; + border-bottom-left-radius: @bottom-left; +} + +//Gradient background +.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) { + background: @color; + background: -webkit-gradient(linear, + left bottom, + left top, + color-stop(0, @start), + color-stop(1, @stop)); + background: -ms-linear-gradient(bottom, + @start, + @stop); + background: -moz-linear-gradient(center bottom, + @start 0%, + @stop 100%); + background: -o-linear-gradient(@stop, + @start); + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@stop,@start)); +} + +//Added 2.1.0 +//Skins Mixins + +//Dark Sidebar Mixin +.skin-dark-sidebar(@link-hover-border-color) { + // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color) + .wrapper, + .main-sidebar, + .left-side { + background-color: @sidebar-dark-bg; + } + //User Panel (resides in the sidebar) + .user-panel { + > .info, > .info > a { + color: #fff; + } + } + //Sidebar Menu. First level links + .sidebar-menu > li { + //Section Headning + &.header { + color: lighten(@sidebar-dark-bg, 20%); + background: darken(@sidebar-dark-bg, 4%); + } + //links + > a { + border-left: 3px solid transparent; + } + //Hover and active states + &:hover > a, + &.active > a, + &.menu-open > a { + color: @sidebar-dark-hover-color; + background: @sidebar-dark-hover-bg; + } + &.active > a { + border-left-color: @link-hover-border-color; + } + //First Level Submenu + > .treeview-menu { + margin: 0 1px; + background: @sidebar-dark-submenu-bg; + } + } + //All links within the sidebar menu + .sidebar a { + color: @sidebar-dark-color; + &:hover { + text-decoration: none; + } + } + //All submenus + .sidebar-menu .treeview-menu { + > li { + > a { + color: @sidebar-dark-submenu-color; + } + &.active > a, > a:hover { + color: @sidebar-dark-submenu-hover-color; + } + } + } + //The sidebar search form + .sidebar-form { + .border-radius(3px); + border: 1px solid lighten(@sidebar-dark-bg, 10%); + margin: 10px 10px; + input[type="text"], .btn { + box-shadow: none; + background-color: lighten(@sidebar-dark-bg, 10%); + border: 1px solid transparent; + height: 35px; + //.transition(all @transition-speed @transition-fn); + } + input[type="text"] { + color: #666; + .border-radius(2px, 0, 2px, 0); + &:focus, + &:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; + } + &:focus + .input-group-btn .btn { + border-left-color: #fff; + + } + } + .btn { + color: #999; + .border-radius(0, 2px, 0, 2px); + } + } +} + +//Light Sidebar Mixin +.skin-light-sidebar(@icon-active-color) { + // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color) + .wrapper, + .main-sidebar, + .left-side { + background-color: @sidebar-light-bg; + } + .content-wrapper, + .main-footer { + //border-left: 1px solid @gray-lte; + } + .main-sidebar { + border-right: 1px solid @gray-lte; + } + //User Panel (resides in the sidebar) + .user-panel { + > .info, > .info > a { + color: @sidebar-light-color; + } + } + //Sidebar Menu. First level links + .sidebar-menu > li { + .transition(border-left-color .3s ease); + //border-left: 3px solid transparent; + //Section Headning + &.header { + color: lighten(@sidebar-light-color, 25%); + background: @sidebar-light-bg; + } + //links + > a { + border-left: 3px solid transparent; + font-weight: 600; + } + //Hover and active states + &:hover > a, + &.active > a { + color: @sidebar-light-hover-color; + background: @sidebar-light-hover-bg; + } + &:hover > a { + + } + &.active { + border-left-color: @icon-active-color; + > a { + font-weight: 600; + } + } + //First Level Submenu + > .treeview-menu { + background: @sidebar-light-submenu-bg; + } + } + //All links within the sidebar menu + .sidebar a { + color: @sidebar-light-color; + &:hover { + text-decoration: none; + } + } + //All submenus + .sidebar-menu .treeview-menu { + > li { + > a { + color: @sidebar-light-submenu-color; + } + &.active > a, + > a:hover { + color: @sidebar-light-submenu-hover-color; + } + &.active > a { + font-weight: 600; + } + } + } + //The sidebar search form + .sidebar-form { + .border-radius(3px); + border: 1px solid @gray-lte; //darken(@sidebar-light-bg, 5%); + margin: 10px 10px; + input[type="text"], + .btn { + box-shadow: none; + background-color: #fff; //darken(@sidebar-light-bg, 3%); + border: 1px solid transparent; + height: 35px; + //.transition(all @transition-speed @transition-fn); + } + input[type="text"] { + color: #666; + .border-radius(2px, 0, 2px, 0); + &:focus, + &:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; + } + &:focus + .input-group-btn .btn { + border-left-color: #fff; + } + } + .btn { + color: #999; + .border-radius(0, 2px, 0, 2px); + } + } + @media (min-width: @screen-sm-min) { + &.sidebar-mini.sidebar-collapse { + .sidebar-menu > li > .treeview-menu { + border-left: 1px solid @gray-lte; + } + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/modal.less b/hera-admin/src/main/resources/static/adminlte/build/less/modal.less new file mode 100755 index 00000000..f42db1cc --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/modal.less @@ -0,0 +1,80 @@ +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0, 0, 0, .3); +} + +.modal-content { + .border-radius(0); + .box-shadow(0 2px 3px rgba(0, 0, 0, .125)); + border: 0; + @media (min-width: @screen-sm-min) { + .box-shadow(0 2px 3px rgba(0, 0, 0, .125)); + } +} + +.modal-header { + border-bottom-color: @box-border-color; +} + +.modal-footer { + border-top-color: @box-border-color; +} + +//Modal variants +.modal-primary { + .modal-body { + &:extend(.bg-light-blue); + } + .modal-header, + .modal-footer { + &:extend(.bg-light-blue-active); + border-color: darken(@light-blue, 10%); + } +} + +.modal-warning { + .modal-body { + &:extend(.bg-yellow); + } + .modal-header, + .modal-footer { + &:extend(.bg-yellow-active); + border-color: darken(@yellow, 10%); + } +} + +.modal-info { + .modal-body { + &:extend(.bg-aqua); + } + .modal-header, + .modal-footer { + &:extend(.bg-aqua-active); + border-color: darken(@aqua, 10%); + } +} + +.modal-success { + .modal-body { + &:extend(.bg-green); + } + .modal-header, + .modal-footer { + &:extend(.bg-green-active); + border-color: darken(@green, 10%); + } +} + +.modal-danger { + .modal-body { + &:extend(.bg-red); + } + .modal-header, + .modal-footer { + &:extend(.bg-red-active); + border-color: darken(@red, 10%); + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/navs.less b/hera-admin/src/main/resources/static/adminlte/build/less/navs.less new file mode 100755 index 00000000..17da7353 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/navs.less @@ -0,0 +1,232 @@ +/* + * Component: Nav + * -------------- + */ + +.nav { + > li > a:hover, + > li > a:active, + > li > a:focus { + color: #444; + background: #f7f7f7; + } +} + +/* NAV PILLS */ +.nav-pills { + > li > a { + .border-radius(0); + border-top: 3px solid transparent; + color: #444; + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + > li.active > a, + > li.active > a:hover, + > li.active > a:focus { + border-top-color: @light-blue; + } + > li.active > a { + font-weight: 600; + } +} + +/* NAV STACKED */ +.nav-stacked { + > li > a { + .border-radius(0); + border-top: 0; + border-left: 3px solid transparent; + color: #444; + } + > li.active > a, + > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: @light-blue; + } + + > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; + } +} + +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: @box-boxshadow; + border-radius: @box-border-radius; + > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + + .border-top-radius(@box-border-radius); + > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + + &.disabled > a { + color: #777; + } + + > a { + color: #444; + .border-radius(0); + &.text-muted { + color: #999; + } + &, + &:hover { + background: transparent; + margin: 0; + } + &:hover { + color: #999; + } + } + &:not(.active) { + > a:hover, + > a:focus, + > a:active { + border-color: transparent; + } + } + margin-right: 5px; + } + + > li.active { + border-top-color: @light-blue; + & > a, + &:hover > a { + background-color: #fff; + color: #444; + } + > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; + } + + } + + > li:first-of-type { + margin-left: 0; + &.active { + > a { + border-left-color: transparent; + } + } + } + + //Pulled to the right + &.pull-right { + float: none !important; + > li { + float: right; + } + > li:first-of-type { + margin-right: 0; + > a { + border-left-width: 1px; + } + &.active { + > a { + border-left-color: #f4f4f4; + border-right-color: transparent; + } + } + } + } + + > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + } + + > .tab-content { + background: #fff; + padding: 10px; + .border-bottom-radius(@box-border-radius); + } + + .dropdown.open > a { + &:active, + &:focus { + background: transparent; + color: #999; + } + } + // Tab color variations + &.tab-primary { + > .nav-tabs { + > li.active { + border-top-color: @light-blue; + } + } + } + &.tab-info { + > .nav-tabs { + > li.active { + border-top-color: @aqua; + } + } + } + &.tab-danger { + > .nav-tabs { + > li.active { + border-top-color: @red; + } + } + } + &.tab-warning { + > .nav-tabs { + > li.active { + border-top-color: @yellow; + } + } + } + &.tab-success { + > .nav-tabs { + > li.active { + border-top-color: @green; + } + } + } + &.tab-default { + > .nav-tabs { + > li.active { + border-top-color: @gray-lte; + } + } + } +} + +/* PAGINATION */ +.pagination { + > li > a { + background: #fafafa; + color: #666; + } + &.pagination-flat { + > li > a { + .border-radius(0) !important; + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/plugins.less b/hera-admin/src/main/resources/static/adminlte/build/less/plugins.less new file mode 100755 index 00000000..666a165a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/plugins.less @@ -0,0 +1,4 @@ +// Customized third-party plugins +@import "bootstrap-social.less"; +@import "fullcalendar.less"; +@import "select2.less"; \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/print.less b/hera-admin/src/main/resources/static/adminlte/build/less/print.less new file mode 100755 index 00000000..52b14f20 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/print.less @@ -0,0 +1,54 @@ +/* + * Misc: print + * ----------- + */ +@media print { + //Add to elements that you do not want to show when printing + .no-print { + display: none !important; + } + + //Elements that we want to hide when printing + .main-sidebar, + .left-side, + .main-header, + .content-header { + &:extend(.no-print); + } + + //This is the only element that should appear, so let's remove the margins + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0 !important; + min-height: 0 !important; + .translate(0, 0) !important; + } + + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0 !important; + } + + //Invoice printing + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + + .invoice-col { + float: left; + width: 33.3333333%; + } + + //Make sure table content displays properly + .table-responsive { + overflow: auto; + > .table tr th, + > .table tr td { + white-space: normal !important; + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/products.less b/hera-admin/src/main/resources/static/adminlte/build/less/products.less new file mode 100755 index 00000000..49f30a6b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/products.less @@ -0,0 +1,45 @@ +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; + > .item { + .border-radius(@box-border-radius); + .box-shadow(@box-boxshadow); + .clearfix(); + padding: 10px 0; + background: #fff; + } + .product-img { + float: left; + img { + width: 50px; + height: 50px; + } + } + .product-info { + margin-left: 60px; + } + .product-title { + font-weight: 600; + } + .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} + +.product-list-in-box > .item { + .box-shadow(none); + .border-radius(0); + border-bottom: 1px solid @box-border-color; + &:last-of-type { + border-bottom-width: 0; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/profile.less b/hera-admin/src/main/resources/static/adminlte/build/less/profile.less new file mode 100755 index 00000000..8bc48139 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/profile.less @@ -0,0 +1,31 @@ +/* + * Page: Profile + * ------------- + */ + +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid @gray-lte; +} + +.profile-username { + font-size: 21px; + margin-top: 5px; +} + +.post { + border-bottom: 1px solid @gray-lte; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; + &:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; + } + .user-block { + margin-bottom: 15px; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/progress-bars.less b/hera-admin/src/main/resources/static/adminlte/build/less/progress-bars.less new file mode 100755 index 00000000..423edc44 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/progress-bars.less @@ -0,0 +1,111 @@ +/* + * Component: Progress Bar + * ----------------------- + */ + +//General CSS +.progress, +.progress > .progress-bar { + .box-shadow(none); + &, .progress-bar { + .border-radius(@progress-bar-border-radius); + } +} + +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; + &, .progress-bar { + .border-radius(@progress-bar-sm-border-radius); + } +} + +.progress.xs, +.progress-xs { + height: 7px; + &, .progress-bar { + .border-radius(@progress-bar-xs-border-radius); + } +} + +.progress.xxs, +.progress-xxs { + height: 3px; + &, .progress-bar { + .border-radius(@progress-bar-xs-border-radius); + } +} + +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; + > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; + } + + //Sizes + &.sm, + &.progress-sm { + width: 20px; + } + + &.xs, + &.progress-xs { + width: 10px; + } + &.xxs, + &.progress-xxs { + width: 3px; + } +} + +//Progress Groups +.progress-group { + .progress-text { + font-weight: 600; + } + .progress-number { + float: right; + } +} + +/* Remove margins from progress bars when put in a table */ +.table { + tr > td .progress { + margin: 0; + } +} + +// Variations +// ------------------------- +.progress-bar-light-blue, +.progress-bar-primary { + .progress-bar-variant(@light-blue); +} + +.progress-bar-green, +.progress-bar-success { + .progress-bar-variant(@green); +} + +.progress-bar-aqua, +.progress-bar-info { + .progress-bar-variant(@aqua); +} + +.progress-bar-yellow, +.progress-bar-warning { + .progress-bar-variant(@yellow); +} + +.progress-bar-red, +.progress-bar-danger { + .progress-bar-variant(@red); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/select2.less b/hera-admin/src/main/resources/static/adminlte/build/less/select2.less new file mode 100755 index 00000000..09706ff0 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/select2.less @@ -0,0 +1,123 @@ +/* + * Plugin: Select2 + * --------------- + */ + +// Import variables and mixins as a reference for separate plugins version +@import (reference) "../bootstrap-less/mixins"; +@import (reference) "../bootstrap-less/variables"; +@import (reference) "variables"; +@import (reference) "mixins"; + +//Signle select +.select2-container--default, +.select2-selection { + &.select2-container--focus, + &:focus, + &:active { + outline: none; + } + .select2-selection--single { + border: 1px solid @gray-lte; + border-radius: @input-radius; + padding: 6px 12px; + height: 34px; + } +} + +.select2-container--default.select2-container--open { + border-color: @light-blue; +} + +.select2-dropdown { + border: 1px solid @gray-lte; + border-radius: @input-radius; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: @light-blue; + color: white; +} + +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} + +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} + +.select2-dropdown, +.select2-search--inline { + .select2-search__field { + border: 1px solid @gray-lte; + &:focus { + outline: none; + border: 1px solid @light-blue; + } + } +} + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; + &, + &:hover { + color: #444; + } +} + +//Multiple select +.select2-container--default { + .select2-selection--multiple { + border: 1px solid @gray-lte; + border-radius: @input-radius; + &:focus { + border-color: @light-blue; + } + } + &.select2-container--focus .select2-selection--multiple { + border-color: @gray-lte; + } +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: @light-blue; + border-color: darken(@light-blue, 5%); + padding: 1px 10px; + color: #fff; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255, 255, 255, .7); + &:hover { + color: #fff; + } +} + +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/sidebar-mini.less b/hera-admin/src/main/resources/static/adminlte/build/less/sidebar-mini.less new file mode 100755 index 00000000..8e25d77e --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/sidebar-mini.less @@ -0,0 +1,165 @@ +/* + * Component: Sidebar Mini + */ + +//Add sidebar-mini class to the body tag to activate this feature +.sidebar-mini { + //Sidebar mini should work only on devices larger than @screen-sm + @media (min-width: @screen-sm) { + //When the sidebar is collapsed... + &.sidebar-collapse { + + //Apply the new margining to the main content and footer + .content-wrapper, + .right-side, + .main-footer { + margin-left: 50px !important; + z-index: 840; + } + + //Modify the sidebar to shrink instead of disappearing + .main-sidebar { + //Don't go away! Just shrink + .translate(0, 0); + width: 50px !important; + z-index: 850; + } + + .sidebar-menu { + > li { + position: relative; + > a { + margin-right: 0; + } + > a > span { + border-top-right-radius: 4px; + } + + &:not(.treeview) { + > a > span { + border-bottom-right-radius: 4px; + } + } + + > .treeview-menu { + // Add some padding to the treeview menu + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + } + } + + //Make the sidebar links, menus, labels, badges + //and angle icons disappear + .main-sidebar .user-panel > .info, + .sidebar-form, + .sidebar-menu > li > a > span, + .sidebar-menu > li > .treeview-menu, + .sidebar-menu > li > a > .pull-right, + .sidebar-menu li.header { + display: none !important; + -webkit-transform: translateZ(0); + } + + .main-header { + //Let's make the logo also shrink and the mini logo to appear + .logo { + width: 50px; + > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + > .logo-lg { + display: none; + } + } + + //Since the logo got smaller, we need to fix the navbar's position + .navbar { + margin-left: 50px; + } + } + } + } +} + +// Show menu items on hover +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse { + .sidebar-menu > li:hover { + > a { + //overflow: visible; + } + > a > span:not(.pull-right), //:not(.pull-right-container), + > .treeview-menu { + display: block !important; + position: absolute; + width: @sidebar-width - 50; + left: 50px; + } + + //position the header & treeview menus + > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; + } + > a > .pull-right-container { + //display: block!important; + position: relative !important; + float: right; + width: auto !important; + left: 200px - 20px !important; + top: -22px !important; + z-index: 900; + > .label:not(:first-of-type) { + display: none; + } + } + > .treeview-menu { + top: 44px; + margin-left: 0; + } + } +} + +.sidebar-expanded-on-hover { + .main-footer, + .content-wrapper { + margin-left: 50px; + } + .main-sidebar { + box-shadow: @sidebar-expanded-shadow; + } +} + +//A fix for text overflow while transitioning from sidebar mini to full sidebar +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} + +.sidebar-menu:hover { + overflow: visible; +} + +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} + +.sidebar-menu li > a { + position: relative; + > .pull-right-container { + position: absolute; + right: 10px; + top: 50%; + margin-top: -7px; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/sidebar.less b/hera-admin/src/main/resources/static/adminlte/build/less/sidebar.less new file mode 100755 index 00000000..59d1cae4 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/sidebar.less @@ -0,0 +1,140 @@ +/* + * Component: Sidebar + * ------------------ + */ +//Main Sidebar +// ``` .left-side has been deprecated as of 2.0.0 in favor of .main-sidebar ``` + +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: @sidebar-width; + z-index: 810; + //Using disposable variable to join statements with a comma + @transition-rule: @transition-speed @transition-fn, + width @transition-speed @transition-fn; + .transition-transform(@transition-rule); + @media (max-width: @screen-header-collapse) { + padding-top: 100px; + } + @media (max-width: @screen-xs-max) { + .translate(-@sidebar-width, 0); + } + .sidebar-collapse & { + @media (min-width: @screen-sm) { + .translate(-@sidebar-width, 0); + } + } + .sidebar-open & { + @media (max-width: @screen-xs-max) { + .translate(0, 0); + } + } +} + +.sidebar { + padding-bottom: 10px; +} + +// remove border from form +.sidebar-form { + input:focus { + border-color: transparent; + } +} + +//Sidebar user panel +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; + .clearfix(); + > .image > img { + width: 100%; + max-width: 45px; + height: auto; + } + > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; + > p { + font-weight: 600; + margin-bottom: 9px; + } + > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; + > .fa, + > .ion, + > .glyphicon { + margin-right: 3px; + } + } + } +} + +// Sidebar menu +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; + //First Level + > li { + position: relative; + margin: 0; + padding: 0; + > a { + padding: 12px 5px 12px 15px; + display: block; + > .fa, + > .glyphicon, + > .ion { + width: 20px; + } + } + .label, + .badge { + margin-right: 5px; + } + .badge { + margin-top: 3px; + } + } + li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; + } + li > a > .fa-angle-left, + li > a > .pull-right-container > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + .transition(transform .5s ease); + } + li > a > .fa-angle-left { + position: absolute; + top: 50%; + right: 10px; + margin-top: -8px; + } + + .menu-open { + > a > .fa-angle-left, + > a > .pull-right-container > .fa-angle-left { + .rotate(-90deg); + } + } + .active > .treeview-menu { + display: block; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/_all-skins.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/_all-skins.less new file mode 100755 index 00000000..ec07547f --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/_all-skins.less @@ -0,0 +1,13 @@ +//All skins in one file +@import "skin-blue.less"; +@import "skin-blue-light.less"; +@import "skin-black.less"; +@import "skin-black-light.less"; +@import "skin-green.less"; +@import "skin-green-light.less"; +@import "skin-red.less"; +@import "skin-red-light.less"; +@import "skin-yellow.less"; +@import "skin-yellow-light.less"; +@import "skin-purple.less"; +@import "skin-purple-light.less"; diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-black-light.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-black-light.less new file mode 100755 index 00000000..a076e977 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-black-light.less @@ -0,0 +1,65 @@ +/* + * Skin: Black + * ----------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +/* skin-black navbar */ +.skin-black-light { + //Navbar & Logo + .main-header { + //.box-shadow(0px 1px 1px rgba(0, 0, 0, 0.05)); + border-bottom: 1px solid @gray-lte; + .navbar-toggle { + color: #333; + } + .navbar-brand { + color: #333; + border-right: 1px solid @gray-lte; + } + .navbar { + .navbar-variant(#fff; #333; #999; #fff); + > .sidebar-toggle { + color: #333; + border-right: 1px solid @gray-lte; + } + .navbar-nav { + > li > a { + border-right: 1px solid @gray-lte; + } + } + .navbar-custom-menu .navbar-nav, + .navbar-right { + > li { + > a { + border-left: 1px solid @gray-lte; + border-right-width: 0; + } + } + } + } + > .logo { + .logo-variant(#fff; #333); + border-right: 1px solid @gray-lte; + @media (max-width: @screen-header-collapse) { + .logo-variant(#222; #fff); + border-right: none; + } + } + + li.user-header { + background-color: #222; + } + } + + //Content Header + .content-header { + background: transparent; + box-shadow: none; + } + //Create the sidebar skin + .skin-light-sidebar(#fff); +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-black.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-black.less new file mode 100755 index 00000000..643e8eeb --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-black.less @@ -0,0 +1,74 @@ +/* + * Skin: Black + * ----------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +/* skin-black navbar */ +.skin-black { + //Navbar & Logo + .main-header { + .box-shadow(0px 1px 1px rgba(0, 0, 0, 0.05)); + .navbar-toggle { + color: #333; + } + .navbar-brand { + color: #333; + border-right: 1px solid #eee; + } + .navbar { + .navbar-variant(#fff; #333; #999; #fff); + > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; + } + .navbar-nav { + > li > a { + border-right: 1px solid #eee; + } + } + .navbar-custom-menu .navbar-nav, + .navbar-right { + > li { + > a { + border-left: 1px solid #eee; + border-right-width: 0; + } + } + } + } + > .logo { + .logo-variant(#fff; #333); + border-right: 1px solid #eee; + @media (max-width: @screen-header-collapse) { + .logo-variant(#222; #fff); + border-right: none; + } + } + + li.user-header { + background-color: #222; + } + } + + //Content Header + .content-header { + background: transparent; + box-shadow: none; + } + //Create the sidebar skin + .skin-dark-sidebar(#fff); + + .pace { + .pace-progress { + background: #222; + } + .pace-activity { + border-top-color: #222; + border-left-color: #222; + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-blue-light.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-blue-light.less new file mode 100755 index 00000000..0abeca41 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-blue-light.less @@ -0,0 +1,61 @@ +/* + * Skin: Blue + * ---------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-blue-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@light-blue; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@light-blue, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@light-blue, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@light-blue); + } + + li.user-header { + background-color: @light-blue; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@light-blue); + .main-footer { + border-top-color: @gray-lte; + } +} + +.skin-blue.layout-top-nav .main-header > .logo { + .logo-variant(@light-blue); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-blue.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-blue.less new file mode 100755 index 00000000..63fb32ff --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-blue.less @@ -0,0 +1,58 @@ +/* + * Skin: Blue + * ---------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-blue { + //Navbar + .main-header { + .navbar { + .navbar-variant(@light-blue; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@light-blue, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@light-blue, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@light-blue, 5%)); + } + + li.user-header { + background-color: @light-blue; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@light-blue); +} + +.skin-blue.layout-top-nav .main-header > .logo { + .logo-variant(@light-blue); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-green-light.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-green-light.less new file mode 100755 index 00000000..2e483849 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-green-light.less @@ -0,0 +1,55 @@ +/* + * Skin: Green + * ----------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-green-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@green; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@green, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@green, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@green); + } + + li.user-header { + background-color: @green; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@green); + +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-green.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-green.less new file mode 100755 index 00000000..a729b706 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-green.less @@ -0,0 +1,55 @@ +/* + * Skin: Green + * ----------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-green { + //Navbar + .main-header { + .navbar { + .navbar-variant(@green; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@green, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@green, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@green, 5%)); + } + + li.user-header { + background-color: @green; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@green); + +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-purple-light.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-purple-light.less new file mode 100755 index 00000000..42d3fe05 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-purple-light.less @@ -0,0 +1,54 @@ +/* + * Skin: Purple + * ------------ + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-purple-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@purple; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@purple, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@purple, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@purple); + } + + li.user-header { + background-color: @purple; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@purple); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-purple.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-purple.less new file mode 100755 index 00000000..53a38fa4 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-purple.less @@ -0,0 +1,54 @@ +/* + * Skin: Purple + * ------------ + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-purple { + //Navbar + .main-header { + .navbar { + .navbar-variant(@purple; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@purple, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@purple, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@purple, 5%)); + } + + li.user-header { + background-color: @purple; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@purple); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-red-light.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-red-light.less new file mode 100755 index 00000000..792390bc --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-red-light.less @@ -0,0 +1,54 @@ +/* + * Skin: Red + * --------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-red-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@red; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@red, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@red, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@red); + } + + li.user-header { + background-color: @red; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@red); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-red.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-red.less new file mode 100755 index 00000000..6ca253d6 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-red.less @@ -0,0 +1,54 @@ +/* + * Skin: Red + * --------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-red { + //Navbar + .main-header { + .navbar { + .navbar-variant(@red; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@red, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@red, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@red, 5%)); + } + + li.user-header { + background-color: @red; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@red); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-yellow-light.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-yellow-light.less new file mode 100755 index 00000000..02e46509 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-yellow-light.less @@ -0,0 +1,54 @@ +/* + * Skin: Yellow + * ------------ + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-yellow-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@yellow; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@yellow, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@yellow, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@yellow); + } + + li.user-header { + background-color: @yellow; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@yellow); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-yellow.less b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-yellow.less new file mode 100755 index 00000000..821723d8 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/skins/skin-yellow.less @@ -0,0 +1,54 @@ +/* + * Skin: Yellow + * ------------ + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-yellow { + //Navbar + .main-header { + .navbar { + .navbar-variant(@yellow; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@yellow, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@yellow, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@yellow, 5%)); + } + + li.user-header { + background-color: @yellow; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@yellow); +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/small-box.less b/hera-admin/src/main/resources/static/adminlte/build/less/small-box.less new file mode 100755 index 00000000..8ad7cc79 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/small-box.less @@ -0,0 +1,89 @@ +/* + * Component: Small Box + * -------------------- + */ + +.small-box { + .border-radius(2px); + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: @box-boxshadow; + // content wrapper + > .inner { + padding: 10px; + } + + > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; + &:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); + } + } + + h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; + + } + + p { + font-size: 15px; + > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; + } + } + + h3, p { + z-index: 5; + } + + // the icon + .icon { + .transition(all @transition-speed linear); + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); + } + + // Small box hover state + &:hover { + text-decoration: none; + color: #f9f9f9; + // Animate icons on small box hover + .icon { + font-size: 95px; + } + } +} + +@media (max-width: @screen-xs-max) { + // No need for icons on very small devices + .small-box { + text-align: center; + .icon { + display: none; + } + p { + font-size: 12px; + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/social-widgets.less b/hera-admin/src/main/resources/static/adminlte/build/less/social-widgets.less new file mode 100755 index 00000000..e2861a39 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/social-widgets.less @@ -0,0 +1,78 @@ +/* + * Component: Social Widgets + * ------------------------- + */ +//General widget style +.box-widget { + border: none; + position: relative; +} + +//User Widget Style 1 +.widget-user { + //User name container + .widget-user-header { + padding: 20px; + height: 120px; + .border-top-radius(@box-border-radius); + } + //User name + .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + } + //User single line description + .widget-user-desc { + margin-top: 0; + } + //User image container + .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; + > img { + width: 90px; + height: auto; + border: 3px solid #fff; + } + } + .box-footer { + padding-top: 30px; + } +} + +//User Widget Style 2 +.widget-user-2 { + //User name container + .widget-user-header { + padding: 20px; + .border-top-radius(@box-border-radius); + } + //User name + .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + } + //User single line description + .widget-user-desc { + margin-top: 0; + } + .widget-user-username, + .widget-user-desc { + margin-left: 75px; + } + //User image container + .widget-user-image { + > img { + width: 65px; + height: auto; + float: left; + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/table.less b/hera-admin/src/main/resources/static/adminlte/build/less/table.less new file mode 100755 index 00000000..4aa06a4c --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/table.less @@ -0,0 +1,71 @@ +/* + * Component: Table + * ---------------- + */ + +.table { + //Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border-top: 1px solid @box-border-color; + } + } + } + //thead cells + > thead > tr > th { + border-bottom: 2px solid @box-border-color; + } + //progress bars in tables + tr td .progress { + margin-top: 5px; + } +} + +//Bordered Table +.table-bordered { + border: 1px solid @box-border-color; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 1px solid @box-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + +.table.no-border { + &, + td, + th { + border: 0; + } +} + +/* .text-center in tables */ +table.text-center { + &, td, th { + text-align: center; + } +} + +.table.align { + th { + text-align: left; + } + td { + text-align: right; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/timeline.less b/hera-admin/src/main/resources/static/adminlte/build/less/timeline.less new file mode 100755 index 00000000..235e7e57 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/timeline.less @@ -0,0 +1,110 @@ +/* + * Component: Timeline + * ------------------- + */ + +.timeline { + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; + + // The line + &:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + .border-radius(2px); + } + + > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; + .clearfix(); + + // The content + > .timeline-item { + .box-shadow(@box-boxshadow); + .border-radius(@box-border-radius); + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; + + // The time and header + > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; + } + > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid @box-border-color; + padding: 10px; + font-size: 16px; + line-height: 1.1; + > a { + font-weight: 600; + } + } + // Item body and footer + > .timeline-body, > .timeline-footer { + padding: 10px; + } + + } + + // The icons + > .fa, + > .glyphicon, + > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: @gray-lte; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; + } + } + + // Time label + > .time-label { + > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + + .border-radius(4px); + } + } +} + +.timeline-inverse { + > li { + > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + .box-shadow(none); + > .timeline-header { + border-bottom-color: #ddd; + } + } + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/treeview.less b/hera-admin/src/main/resources/static/adminlte/build/less/treeview.less new file mode 100755 index 00000000..664f8165 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/treeview.less @@ -0,0 +1,30 @@ +// Tree view menu +.treeview-menu { + display: none; + list-style: none; + padding: 0; + margin: 0; + padding-left: 5px; + .treeview-menu { + padding-left: 20px; + } + > li { + margin: 0; + > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; + > .fa, + > .glyphicon, + > .ion { + width: 20px; + } + > .pull-right-container > .fa-angle-left, + > .pull-right-container > .fa-angle-down, + > .fa-angle-left, + > .fa-angle-down { + width: auto; + } + } + } +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/users-list.less b/hera-admin/src/main/resources/static/adminlte/build/less/users-list.less new file mode 100755 index 00000000..c5ef2a58 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/users-list.less @@ -0,0 +1,42 @@ +/* + * Component: Users List + * --------------------- + */ +.users-list { + &:extend(.list-unstyled); + > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; + img { + .border-radius(50%); + max-width: 100%; + height: auto; + } + > a:hover { + &, + .users-list-name { + color: #999; + } + } + } +} + +.users-list-name, +.users-list-date { + display: block; +} + +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.users-list-date { + color: #999; + font-size: 12px; +} diff --git a/hera-admin/src/main/resources/static/adminlte/build/less/variables.less b/hera-admin/src/main/resources/static/adminlte/build/less/variables.less new file mode 100755 index 00000000..d1cd4586 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/less/variables.less @@ -0,0 +1,125 @@ +// AdminLTE 2 Variables.less +// ========================= + +// PATHS +// -------------------------------------------------------- + +@boxed-layout-bg-image-path: "../img/boxed-bg.jpg"; + +// COLORS +// -------------------------------------------------------- +// Primary +@light-blue: #3c8dbc; +// Danger +@red: #dd4b39; +// Success +@green: #00a65a; +// Info +@aqua: #00c0ef; +// Warning +@yellow: #f39c12; +@blue: #0073b7; +@navy: #001F3F; +@teal: #39CCCC; +@olive: #3D9970; +@lime: #01FF70; +@orange: #FF851B; +@fuchsia: #F012BE; +@purple: #605ca8; +@maroon: #D81B60; +@black: #111; +@gray-lte: #d2d6de; + +// LAYOUT +// -------------------------------------------------------- + +// Side bar and logo width +@sidebar-width: 230px; +// Boxed layout maximum width +@boxed-layout-max-width: 1024px; +// When the logo should go to the top of the screen +@screen-header-collapse: @screen-xs-max; + +// Link colors (Aka: tags) +@link-color: @light-blue; +@link-hover-color: lighten(@link-color, 15%); + +// Body background (Affects main content background only) +@body-bg: #ecf0f5; + +// SIDEBAR SKINS +// -------------------------------------------------------- + +// Dark sidebar +@sidebar-dark-bg: #222d32; +@sidebar-dark-hover-bg: darken(@sidebar-dark-bg, 2%); +@sidebar-dark-color: lighten(@sidebar-dark-bg, 60%); +@sidebar-dark-hover-color: #fff; +@sidebar-dark-submenu-bg: lighten(@sidebar-dark-bg, 5%); +@sidebar-dark-submenu-color: lighten(@sidebar-dark-submenu-bg, 40%); +@sidebar-dark-submenu-hover-color: #fff; + +// Light sidebar +@sidebar-light-bg: #f9fafc; +@sidebar-light-hover-bg: lighten(#f0f0f1, 1.5%); +@sidebar-light-color: #444; +@sidebar-light-hover-color: #000; +@sidebar-light-submenu-bg: @sidebar-light-hover-bg; +@sidebar-light-submenu-color: #777; +@sidebar-light-submenu-hover-color: #000; + +// sidebar-expanded-on-hover +@sidebar-expanded-shadow: 3px 0 8px rgba(0,0,0,.125); + +// CONTROL SIDEBAR +// -------------------------------------------------------- +@control-sidebar-width: @sidebar-width; + +// BOXES +// -------------------------------------------------------- +@box-border-color: #f4f4f4; +@box-border-radius: 3px; +@box-footer-bg: #fff; +@box-boxshadow: 0 1px 1px rgba(0, 0, 0, .1); +@box-padding: 10px; + +// Box variants +@box-default-border-top-color: #d2d6de; + +// BUTTONS +// -------------------------------------------------------- +@btn-boxshadow: none; + +// PROGRESS BARS +// -------------------------------------------------------- +@progress-bar-border-radius: 1px; +@progress-bar-sm-border-radius: 1px; +@progress-bar-xs-border-radius: 1px; + +// FORMS +// -------------------------------------------------------- +@input-radius: 0; + +// BUTTONS +// -------------------------------------------------------- + +// Border radius for non flat buttons +@btn-border-radius: 3px; + +// DIRECT CHAT +// -------------------------------------------------------- +@direct-chat-height: 250px; +@direct-chat-default-msg-bg: @gray-lte; +@direct-chat-default-font-color: #444; +@direct-chat-default-msg-border-color: @gray-lte; + +// CHAT WIDGET +// -------------------------------------------------------- +@attachment-border-radius: 3px; + +// TRANSITIONS SETTINGS +// -------------------------------------------------------- + +// Transition global options +@transition-speed: .3s; +@transition-fn: ease-in-out; diff --git a/hera-admin/src/main/resources/static/adminlte/build/scss/_bootstrap_variables.scss b/hera-admin/src/main/resources/static/adminlte/build/scss/_bootstrap_variables.scss new file mode 100755 index 00000000..36dc429c --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/scss/_bootstrap_variables.scss @@ -0,0 +1,961 @@ +// Variables +// +// Copy settings from this file into the provided `_custom.scss` to override +// the Bootstrap defaults without modifying key, versioned files. + + +// Table of Contents +// +// Colors +// Options +// Spacing +// Body +// Links +// Grid breakpoints +// Grid containers +// Grid columns +// Fonts +// Components +// Tables +// Buttons +// Forms +// Dropdowns +// Z-index master list +// Navbar +// Navs +// Pagination +// Jumbotron +// Form states and alerts +// Cards +// Tooltips +// Popovers +// Badges +// Modals +// Alerts +// Progress bars +// List group +// Image thumbnails +// Figures +// Breadcrumbs +// Carousel +// Close +// Code + +@mixin _assert-ascending($map, $map-name) { + $prev-key: null; + $prev-num: null; + @each $key, $num in $map { + @if $prev-num == null { + // Do nothing + } @else if not comparable($prev-num, $num) { + @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } @else if $prev-num >= $num { + @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } + $prev-key: $key; + $prev-num: $num; + } +} + +// Replace `$search` with `$replace` in `$string` +// @author Hugo Giraudel +// @param {String} $string - Initial string +// @param {String} $search - Substring to replace +// @param {String} $replace ('') - New value +// @return {String} - Updated string +@function str-replace($string, $search, $replace: "") { + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); + } + + @return $string; +} + +@mixin _assert-starts-at-zero($map) { + $values: map-values($map); + $first-value: nth($values, 1); + @if $first-value != 0 { + @warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}."; + } +} + + +// General variable structure +// +// Variable format should follow the `$component-modifier-state-property` order. + + +// Colors +// +// Grayscale and brand colors for use across Bootstrap. + +// Start with assigning color names to specific hex values. +$white: #fff !default; +$black: #000 !default; +$red: #d9534f !default; +$orange: #f0ad4e !default; +$yellow: #ffd500 !default; +$green: #5cb85c !default; +$blue: #0275d8 !default; +$teal: #5bc0de !default; +$pink: #ff5b77 !default; +$purple: #613d7c !default; + +// Create grayscale +$gray-dark: #292b2c !default; +$gray: #464a4c !default; +$gray-light: #636c72 !default; +$gray-lighter: #eceeef !default; +$gray-lightest: #f7f7f9 !default; + +// Reassign color vars to semantic color scheme +$brand-primary: $blue !default; +$brand-success: $green !default; +$brand-info: $teal !default; +$brand-warning: $orange !default; +$brand-danger: $red !default; +$brand-inverse: $gray-dark !default; + + +// Options +// +// Quickly modify global styling by enabling or disabling optional features. + +$enable-rounded: true !default; +$enable-shadows: false !default; +$enable-gradients: false !default; +$enable-transitions: true !default; +$enable-hover-media-query: false !default; +$enable-grid-classes: true !default; +$enable-print-styles: true !default; + + +// Spacing +// +// Control the default styling of most Bootstrap elements by modifying these +// variables. Mostly focused on spacing. +// You can add more entries to the $spacers map, should you need more variation. + +$spacer: 1rem !default; +$spacer-x: $spacer !default; +$spacer-y: $spacer !default; +$spacers: ( + 0: ( + x: 0, + y: 0 + ), + 1: ( + x: ($spacer-x * .25), + y: ($spacer-y * .25) + ), + 2: ( + x: ($spacer-x * .5), + y: ($spacer-y * .5) + ), + 3: ( + x: $spacer-x, + y: $spacer-y + ), + 4: ( + x: ($spacer-x * 1.5), + y: ($spacer-y * 1.5) + ), + 5: ( + x: ($spacer-x * 3), + y: ($spacer-y * 3) + ) +) !default; +$border-width: 1px !default; + +// This variable affects the `.h-*` and `.w-*` classes. +$sizes: ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100% +) !default; + +// Body +// +// Settings for the `` element. + +$body-bg: $white !default; +$body-color: $gray-dark !default; +$inverse-bg: $gray-dark !default; +$inverse-color: $gray-lighter !default; + + +// Links +// +// Style anchor elements. + +$link-color: $brand-primary !default; +$link-decoration: none !default; +$link-hover-color: darken($link-color, 15%) !default; +$link-hover-decoration: underline !default; + + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px +) !default; +@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); +@include _assert-starts-at-zero($grid-breakpoints); + + +// Grid containers +// +// Define the maximum width of `.container` for different screen sizes. + +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1140px +) !default; +@include _assert-ascending($container-max-widths, "$container-max-widths"); + + +// Grid columns +// +// Set the number of columns and specify the width of the gutters. + +$grid-columns: 12 !default; +$grid-gutter-width-base: 30px !default; +$grid-gutter-widths: ( + xs: $grid-gutter-width-base, + sm: $grid-gutter-width-base, + md: $grid-gutter-width-base, + lg: $grid-gutter-width-base, + xl: $grid-gutter-width-base +) !default; + +// Fonts +// +// Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +$font-family-monospace: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; +$font-family-base: $font-family-sans-serif !default; + +$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` +$font-size-lg: 1.25rem !default; +$font-size-sm: .875rem !default; +$font-size-xs: .75rem !default; + +$font-weight-normal: normal !default; +$font-weight-bold: bold !default; + +$font-weight-base: $font-weight-normal !default; +$line-height-base: 1.5 !default; + +$font-size-h1: 2.5rem !default; +$font-size-h2: 2rem !default; +$font-size-h3: 1.75rem !default; +$font-size-h4: 1.5rem !default; +$font-size-h5: 1.25rem !default; +$font-size-h6: 1rem !default; + +$headings-margin-bottom: ($spacer / 2) !default; +$headings-font-family: inherit !default; +$headings-font-weight: 500 !default; +$headings-line-height: 1.1 !default; +$headings-color: inherit !default; + +$display1-size: 6rem !default; +$display2-size: 5.5rem !default; +$display3-size: 4.5rem !default; +$display4-size: 3.5rem !default; + +$display1-weight: 300 !default; +$display2-weight: 300 !default; +$display3-weight: 300 !default; +$display4-weight: 300 !default; +$display-line-height: $headings-line-height !default; + +$lead-font-size: 1.25rem !default; +$lead-font-weight: 300 !default; + +$small-font-size: 80% !default; + +$text-muted: $gray-light !default; + +$abbr-border-color: $gray-light !default; + +$blockquote-small-color: $gray-light !default; +$blockquote-font-size: ($font-size-base * 1.25) !default; +$blockquote-border-color: $gray-lighter !default; +$blockquote-border-width: .25rem !default; + +$hr-border-color: rgba($black,.1) !default; +$hr-border-width: $border-width !default; + +$mark-padding: .2em !default; + +$dt-font-weight: $font-weight-bold !default; + +$kbd-box-shadow: inset 0 -.1rem 0 rgba($black,.25) !default; +$nested-kbd-font-weight: $font-weight-bold !default; + +$list-inline-padding: 5px !default; + + +// Components +// +// Define common padding and border radius sizes and more. + +$line-height-lg: (4 / 3) !default; +$line-height-sm: 1.5 !default; + +$border-radius: .25rem !default; +$border-radius-lg: .3rem !default; +$border-radius-sm: .2rem !default; + +$component-active-color: $white !default; +$component-active-bg: $brand-primary !default; + +$caret-width: .3em !default; + +$transition-base: all .2s ease-in-out !default; +$transition-fade: opacity .15s linear !default; +$transition-collapse: height .35s ease !default; + + +// Tables +// +// Customizes the `.table` component with basic values, each used across all table variations. + +$table-cell-padding: .75rem !default; +$table-sm-cell-padding: .3rem !default; + +$table-bg: transparent !default; + +$table-inverse-bg: $gray-dark !default; +$table-inverse-color: $body-bg !default; + +$table-bg-accent: rgba($black,.05) !default; +$table-bg-hover: rgba($black,.075) !default; +$table-bg-active: $table-bg-hover !default; + +$table-head-bg: $gray-lighter !default; +$table-head-color: $gray !default; + +$table-border-width: $border-width !default; +$table-border-color: $gray-lighter !default; + + +// Buttons +// +// For each of Bootstrap's buttons, define text, background and border color. + +$btn-padding-x: 1rem !default; +$btn-padding-y: .5rem !default; +$btn-line-height: 1.25 !default; +$btn-font-weight: $font-weight-normal !default; +$btn-box-shadow: inset 0 1px 0 rgba($white,.15), 0 1px 1px rgba($black,.075) !default; +$btn-focus-box-shadow: 0 0 0 2px rgba($brand-primary, .25) !default; +$btn-active-box-shadow: inset 0 3px 5px rgba($black,.125) !default; + +$btn-primary-color: $white !default; +$btn-primary-bg: $brand-primary !default; +$btn-primary-border: $btn-primary-bg !default; + +$btn-secondary-color: $gray-dark !default; +$btn-secondary-bg: $white !default; +$btn-secondary-border: #ccc !default; + +$btn-info-color: $white !default; +$btn-info-bg: $brand-info !default; +$btn-info-border: $btn-info-bg !default; + +$btn-success-color: $white !default; +$btn-success-bg: $brand-success !default; +$btn-success-border: $btn-success-bg !default; + +$btn-warning-color: $white !default; +$btn-warning-bg: $brand-warning !default; +$btn-warning-border: $btn-warning-bg !default; + +$btn-danger-color: $white !default; +$btn-danger-bg: $brand-danger !default; +$btn-danger-border: $btn-danger-bg !default; + +$btn-link-disabled-color: $gray-light !default; + +$btn-padding-x-sm: .5rem !default; +$btn-padding-y-sm: .25rem !default; + +$btn-padding-x-lg: 1.5rem !default; +$btn-padding-y-lg: .75rem !default; + +$btn-block-spacing-y: .5rem !default; +$btn-toolbar-margin: .5rem !default; + +// Allows for customizing button radius independently from global border radius +$btn-border-radius: $border-radius !default; +$btn-border-radius-lg: $border-radius-lg !default; +$btn-border-radius-sm: $border-radius-sm !default; + +$btn-transition: all .2s ease-in-out !default; + + +// Forms + +$input-padding-x: .75rem !default; +$input-padding-y: .5rem !default; +$input-line-height: 1.25 !default; + +$input-bg: $white !default; +$input-bg-disabled: $gray-lighter !default; + +$input-color: $gray !default; +$input-border-color: rgba($black,.15) !default; +$input-btn-border-width: $border-width !default; // For form controls and buttons +$input-box-shadow: inset 0 1px 1px rgba($black,.075) !default; + +$input-border-radius: $border-radius !default; +$input-border-radius-lg: $border-radius-lg !default; +$input-border-radius-sm: $border-radius-sm !default; + +$input-bg-focus: $input-bg !default; +$input-border-focus: lighten($brand-primary, 25%) !default; +$input-box-shadow-focus: $input-box-shadow, rgba($input-border-focus, .6) !default; +$input-color-focus: $input-color !default; + +$input-color-placeholder: $gray-light !default; + +$input-padding-x-sm: .5rem !default; +$input-padding-y-sm: .25rem !default; + +$input-padding-x-lg: 1.5rem !default; +$input-padding-y-lg: .75rem !default; + +$input-height: (($font-size-base * $input-line-height) + ($input-padding-y * 2)) !default; +$input-height-lg: (($font-size-lg * $line-height-lg) + ($input-padding-y-lg * 2)) !default; +$input-height-sm: (($font-size-sm * $line-height-sm) + ($input-padding-y-sm * 2)) !default; + +$input-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s !default; + +$form-text-margin-top: .25rem !default; +$form-feedback-margin-top: $form-text-margin-top !default; + +$form-check-margin-bottom: .5rem !default; +$form-check-input-gutter: 1.25rem !default; +$form-check-input-margin-y: .25rem !default; +$form-check-input-margin-x: .25rem !default; + +$form-check-inline-margin-x: .75rem !default; + +$form-group-margin-bottom: $spacer-y !default; + +$input-group-addon-bg: $gray-lighter !default; +$input-group-addon-border-color: $input-border-color !default; + +$cursor-disabled: not-allowed !default; + +$custom-control-gutter: 1.5rem !default; +$custom-control-spacer-x: 1rem !default; +$custom-control-spacer-y: .25rem !default; + +$custom-control-indicator-size: 1rem !default; +$custom-control-indicator-margin-y: (($line-height-base * 1rem) - $custom-control-indicator-size) / -2 !default; +$custom-control-indicator-bg: #ddd !default; +$custom-control-indicator-bg-size: 50% 50% !default; +$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black,.1) !default; + +$custom-control-disabled-cursor: $cursor-disabled !default; +$custom-control-disabled-indicator-bg: $gray-lighter !default; +$custom-control-disabled-description-color: $gray-light !default; + +$custom-control-checked-indicator-color: $white !default; +$custom-control-checked-indicator-bg: $brand-primary !default; +$custom-control-checked-indicator-box-shadow: none !default; + +$custom-control-focus-indicator-box-shadow: 0 0 0 1px $body-bg, 0 0 0 3px $brand-primary !default; + +$custom-control-active-indicator-color: $white !default; +$custom-control-active-indicator-bg: lighten($brand-primary, 35%) !default; +$custom-control-active-indicator-box-shadow: none !default; + +$custom-checkbox-radius: $border-radius !default; +$custom-checkbox-checked-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-checked-indicator-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default; + +$custom-checkbox-indeterminate-bg: $brand-primary !default; +$custom-checkbox-indeterminate-indicator-color: $custom-control-checked-indicator-color !default; +$custom-checkbox-indeterminate-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indeterminate-indicator-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default; +$custom-checkbox-indeterminate-box-shadow: none !default; + +$custom-radio-radius: 50% !default; +$custom-radio-checked-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-checked-indicator-color}'/%3E%3C/svg%3E"), "#", "%23") !default; + +$custom-select-padding-x: .75rem !default; +$custom-select-padding-y: .375rem !default; +$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator +$custom-select-line-height: $input-line-height !default; +$custom-select-color: $input-color !default; +$custom-select-disabled-color: $gray-light !default; +$custom-select-bg: $white !default; +$custom-select-disabled-bg: $gray-lighter !default; +$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions +$custom-select-indicator-color: #333 !default; +$custom-select-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E"), "#", "%23") !default; +$custom-select-border-width: $input-btn-border-width !default; +$custom-select-border-color: $input-border-color !default; +$custom-select-border-radius: $border-radius !default; + +$custom-select-focus-border-color: lighten($brand-primary, 25%) !default; +$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default; + +$custom-select-sm-padding-y: .2rem !default; +$custom-select-sm-font-size: 75% !default; + +$custom-file-height: 2.5rem !default; +$custom-file-width: 14rem !default; +$custom-file-focus-box-shadow: 0 0 0 .075rem $white, 0 0 0 .2rem $brand-primary !default; + +$custom-file-padding-x: .5rem !default; +$custom-file-padding-y: 1rem !default; +$custom-file-line-height: 1.5 !default; +$custom-file-color: $gray !default; +$custom-file-bg: $white !default; +$custom-file-border-width: $border-width !default; +$custom-file-border-color: $input-border-color !default; +$custom-file-border-radius: $border-radius !default; +$custom-file-box-shadow: inset 0 .2rem .4rem rgba($black,.05) !default; +$custom-file-button-color: $custom-file-color !default; +$custom-file-button-bg: $gray-lighter !default; +$custom-file-text: ( + placeholder: ( + en: "Choose file..." + ), + button-label: ( + en: "Browse" + ) +) !default; + + +// Form validation icons +$form-icon-success-color: $brand-success !default; +$form-icon-success: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-success-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"), "#", "%23") !default; + +$form-icon-warning-color: $brand-warning !default; +$form-icon-warning: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-warning-color}' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E"), "#", "%23") !default; + +$form-icon-danger-color: $brand-danger !default; +$form-icon-danger: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-icon-danger-color}' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E"), "#", "%23") !default; + + +// Dropdowns +// +// Dropdown menu container and contents. + +$dropdown-min-width: 10rem !default; +$dropdown-padding-y: .5rem !default; +$dropdown-margin-top: .125rem !default; +$dropdown-bg: $white !default; +$dropdown-border-color: rgba($black,.15) !default; +$dropdown-border-width: $border-width !default; +$dropdown-divider-bg: $gray-lighter !default; +$dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175) !default; + +$dropdown-link-color: $gray-dark !default; +$dropdown-link-hover-color: darken($gray-dark, 5%) !default; +$dropdown-link-hover-bg: $gray-lightest !default; + +$dropdown-link-active-color: $component-active-color !default; +$dropdown-link-active-bg: $component-active-bg !default; + +$dropdown-link-disabled-color: $gray-light !default; + +$dropdown-item-padding-x: 1.5rem !default; + +$dropdown-header-color: $gray-light !default; + + +// Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. + +$zindex-dropdown-backdrop: 990 !default; +$zindex-navbar: 1000 !default; +$zindex-dropdown: 1000 !default; +$zindex-fixed: 1030 !default; +$zindex-sticky: 1030 !default; +$zindex-modal-backdrop: 1040 !default; +$zindex-modal: 1050 !default; +$zindex-popover: 1060 !default; +$zindex-tooltip: 1070 !default; + + +// Navbar + +$navbar-border-radius: $border-radius !default; +$navbar-padding-x: $spacer !default; +$navbar-padding-y: ($spacer / 2) !default; + +$navbar-brand-padding-y: .25rem !default; + +$navbar-toggler-padding-x: .75rem !default; +$navbar-toggler-padding-y: .25rem !default; +$navbar-toggler-font-size: $font-size-lg !default; +$navbar-toggler-border-radius: $btn-border-radius !default; + +$navbar-inverse-color: rgba($white,.5) !default; +$navbar-inverse-hover-color: rgba($white,.75) !default; +$navbar-inverse-active-color: rgba($white,1) !default; +$navbar-inverse-disabled-color: rgba($white,.25) !default; +$navbar-inverse-toggler-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-inverse-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"), "#", "%23") !default; +$navbar-inverse-toggler-border: rgba($white,.1) !default; + +$navbar-light-color: rgba($black,.5) !default; +$navbar-light-hover-color: rgba($black,.7) !default; +$navbar-light-active-color: rgba($black,.9) !default; +$navbar-light-disabled-color: rgba($black,.3) !default; +$navbar-light-toggler-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"), "#", "%23") !default; +$navbar-light-toggler-border: rgba($black,.1) !default; + +// Navs + +$nav-item-margin: .2rem !default; +$nav-item-inline-spacer: 1rem !default; +$nav-link-padding: .5em 1em !default; +$nav-link-hover-bg: $gray-lighter !default; +$nav-disabled-link-color: $gray-light !default; + +$nav-tabs-border-color: #ddd !default; +$nav-tabs-border-width: $border-width !default; +$nav-tabs-border-radius: $border-radius !default; +$nav-tabs-link-hover-border-color: $gray-lighter !default; +$nav-tabs-active-link-hover-color: $gray !default; +$nav-tabs-active-link-hover-bg: $body-bg !default; +$nav-tabs-active-link-hover-border-color: #ddd !default; +$nav-tabs-justified-link-border-color: #ddd !default; +$nav-tabs-justified-active-link-border-color: $body-bg !default; + +$nav-pills-border-radius: $border-radius !default; +$nav-pills-active-link-color: $component-active-color !default; +$nav-pills-active-link-bg: $component-active-bg !default; + + +// Pagination + +$pagination-padding-x: .75rem !default; +$pagination-padding-y: .5rem !default; +$pagination-padding-x-sm: .5rem !default; +$pagination-padding-y-sm: .25rem !default; +$pagination-padding-x-lg: 1.5rem !default; +$pagination-padding-y-lg: .75rem !default; +$pagination-line-height: 1.25 !default; + +$pagination-color: $link-color !default; +$pagination-bg: $white !default; +$pagination-border-width: $border-width !default; +$pagination-border-color: #ddd !default; + +$pagination-hover-color: $link-hover-color !default; +$pagination-hover-bg: $gray-lighter !default; +$pagination-hover-border: #ddd !default; + +$pagination-active-color: $white !default; +$pagination-active-bg: $brand-primary !default; +$pagination-active-border: $brand-primary !default; + +$pagination-disabled-color: $gray-light !default; +$pagination-disabled-bg: $white !default; +$pagination-disabled-border: #ddd !default; + + +// Jumbotron + +$jumbotron-padding: 2rem !default; +$jumbotron-bg: $gray-lighter !default; + + +// Form states and alerts +// +// Define colors for form feedback states and, by default, alerts. + +$state-success-text: #3c763d !default; +$state-success-bg: #dff0d8 !default; +$state-success-border: darken($state-success-bg, 5%) !default; + +$state-info-text: #31708f !default; +$state-info-bg: #d9edf7 !default; +$state-info-border: darken($state-info-bg, 7%) !default; + +$state-warning-text: #8a6d3b !default; +$state-warning-bg: #fcf8e3 !default; +$mark-bg: $state-warning-bg !default; +$state-warning-border: darken($state-warning-bg, 5%) !default; + +$state-danger-text: #a94442 !default; +$state-danger-bg: #f2dede !default; +$state-danger-border: darken($state-danger-bg, 5%) !default; + + +// Cards + +$card-spacer-x: 1.25rem !default; +$card-spacer-y: .75rem !default; +$card-border-width: 1px !default; +$card-border-radius: $border-radius !default; +$card-border-color: rgba($black,.125) !default; +$card-border-radius-inner: calc(#{$card-border-radius} - #{$card-border-width}) !default; +$card-cap-bg: $gray-lightest !default; +$card-bg: $white !default; + +$card-link-hover-color: $white !default; + +$card-img-overlay-padding: 1.25rem !default; + +$card-deck-margin: ($grid-gutter-width-base / 2) !default; + +$card-columns-count: 3 !default; +$card-columns-gap: 1.25rem !default; +$card-columns-margin: $card-spacer-y !default; + + +// Tooltips + +$tooltip-max-width: 200px !default; +$tooltip-color: $white !default; +$tooltip-bg: $black !default; +$tooltip-opacity: .9 !default; +$tooltip-padding-y: 3px !default; +$tooltip-padding-x: 8px !default; +$tooltip-margin: 3px !default; + +$tooltip-arrow-width: 5px !default; +$tooltip-arrow-color: $tooltip-bg !default; + + +// Popovers + +$popover-inner-padding: 1px !default; +$popover-bg: $white !default; +$popover-max-width: 276px !default; +$popover-border-width: $border-width !default; +$popover-border-color: rgba($black,.2) !default; +$popover-box-shadow: 0 5px 10px rgba($black,.2) !default; + +$popover-title-bg: darken($popover-bg, 3%) !default; +$popover-title-padding-x: 14px !default; +$popover-title-padding-y: 8px !default; + +$popover-content-padding-x: 14px !default; +$popover-content-padding-y: 9px !default; + +$popover-arrow-width: 10px !default; +$popover-arrow-color: $popover-bg !default; + +$popover-arrow-outer-width: ($popover-arrow-width + 1px) !default; +$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default; + + +// Badges + +$badge-default-bg: $gray-light !default; +$badge-primary-bg: $brand-primary !default; +$badge-success-bg: $brand-success !default; +$badge-info-bg: $brand-info !default; +$badge-warning-bg: $brand-warning !default; +$badge-danger-bg: $brand-danger !default; + +$badge-color: $white !default; +$badge-link-hover-color: $white !default; +$badge-font-size: 75% !default; +$badge-font-weight: $font-weight-bold !default; +$badge-padding-x: .4em !default; +$badge-padding-y: .25em !default; + +$badge-pill-padding-x: .6em !default; +// Use a higher than normal value to ensure completely rounded edges when +// customizing padding or font-size on labels. +$badge-pill-border-radius: 10rem !default; + + +// Modals + +// Padding applied to the modal body +$modal-inner-padding: 15px !default; + +$modal-dialog-margin: 10px !default; +$modal-dialog-sm-up-margin-y: 30px !default; + +$modal-title-line-height: $line-height-base !default; + +$modal-content-bg: $white !default; +$modal-content-border-color: rgba($black,.2) !default; +$modal-content-border-width: $border-width !default; +$modal-content-xs-box-shadow: 0 3px 9px rgba($black,.5) !default; +$modal-content-sm-up-box-shadow: 0 5px 15px rgba($black,.5) !default; + +$modal-backdrop-bg: $black !default; +$modal-backdrop-opacity: .5 !default; +$modal-header-border-color: $gray-lighter !default; +$modal-footer-border-color: $modal-header-border-color !default; +$modal-header-border-width: $modal-content-border-width !default; +$modal-footer-border-width: $modal-header-border-width !default; +$modal-header-padding: 15px !default; + +$modal-lg: 800px !default; +$modal-md: 500px !default; +$modal-sm: 300px !default; + +$modal-transition: transform .3s ease-out !default; + + +// Alerts +// +// Define alert colors, border radius, and padding. + +$alert-padding-x: 1.25rem !default; +$alert-padding-y: .75rem !default; +$alert-margin-bottom: $spacer-y !default; +$alert-border-radius: $border-radius !default; +$alert-link-font-weight: $font-weight-bold !default; +$alert-border-width: $border-width !default; + +$alert-success-bg: $state-success-bg !default; +$alert-success-text: $state-success-text !default; +$alert-success-border: $state-success-border !default; + +$alert-info-bg: $state-info-bg !default; +$alert-info-text: $state-info-text !default; +$alert-info-border: $state-info-border !default; + +$alert-warning-bg: $state-warning-bg !default; +$alert-warning-text: $state-warning-text !default; +$alert-warning-border: $state-warning-border !default; + +$alert-danger-bg: $state-danger-bg !default; +$alert-danger-text: $state-danger-text !default; +$alert-danger-border: $state-danger-border !default; + + +// Progress bars + +$progress-height: 1rem !default; +$progress-font-size: .75rem !default; +$progress-bg: $gray-lighter !default; +$progress-border-radius: $border-radius !default; +$progress-box-shadow: inset 0 .1rem .1rem rgba($black,.1) !default; +$progress-bar-color: $white !default; +$progress-bar-bg: $brand-primary !default; +$progress-bar-animation-timing: 1s linear infinite !default; + +// List group + +$list-group-color: $body-color !default; +$list-group-bg: $white !default; +$list-group-border-color: rgba($black,.125) !default; +$list-group-border-width: $border-width !default; +$list-group-border-radius: $border-radius !default; + +$list-group-item-padding-x: 1.25rem !default; +$list-group-item-padding-y: .75rem !default; + +$list-group-hover-bg: $gray-lightest !default; +$list-group-active-color: $component-active-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border: $list-group-active-bg !default; +$list-group-active-text-color: lighten($list-group-active-bg, 50%) !default; + +$list-group-disabled-color: $gray-light !default; +$list-group-disabled-bg: $list-group-bg !default; +$list-group-disabled-text-color: $list-group-disabled-color !default; + +$list-group-link-color: $gray !default; +$list-group-link-heading-color: $gray-dark !default; +$list-group-link-hover-color: $list-group-link-color !default; + +$list-group-link-active-color: $list-group-color !default; +$list-group-link-active-bg: $gray-lighter !default; + + +// Image thumbnails + +$thumbnail-padding: .25rem !default; +$thumbnail-bg: $body-bg !default; +$thumbnail-border-width: $border-width !default; +$thumbnail-border-color: #ddd !default; +$thumbnail-border-radius: $border-radius !default; +$thumbnail-box-shadow: 0 1px 2px rgba($black,.075) !default; +$thumbnail-transition: all .2s ease-in-out !default; + + +// Figures + +$figure-caption-font-size: 90% !default; +$figure-caption-color: $gray-light !default; + + +// Breadcrumbs + +$breadcrumb-padding-y: .75rem !default; +$breadcrumb-padding-x: 1rem !default; +$breadcrumb-item-padding: .5rem !default; + +$breadcrumb-bg: $gray-lighter !default; +$breadcrumb-divider-color: $gray-light !default; +$breadcrumb-active-color: $gray-light !default; +$breadcrumb-divider: "/" !default; + + +// Carousel + +$carousel-control-color: $white !default; +$carousel-control-width: 15% !default; +$carousel-control-opacity: .5 !default; + +$carousel-indicator-width: 30px !default; +$carousel-indicator-height: 3px !default; +$carousel-indicator-spacer: 3px !default; +$carousel-indicator-active-bg: $white !default; + +$carousel-caption-width: 70% !default; +$carousel-caption-color: $white !default; + +$carousel-control-icon-width: 20px !default; + +$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default; +$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default; + +$carousel-transition: transform .6s ease-in-out !default; + + +// Close + +$close-font-size: $font-size-base * 1.5 !default; +$close-font-weight: $font-weight-bold !default; +$close-color: $black !default; +$close-text-shadow: 0 1px 0 $white !default; + + +// Code + +$code-font-size: 90% !default; +$code-padding-x: .4rem !default; +$code-padding-y: .2rem !default; +$code-color: #bd4147 !default; +$code-bg: $gray-lightest !default; + +$kbd-color: $white !default; +$kbd-bg: $gray-dark !default; + +$pre-bg: $gray-lightest !default; +$pre-color: $gray-dark !default; +$pre-border-color: #ccc !default; +$pre-scrollable-max-height: 340px !default; diff --git a/hera-admin/src/main/resources/static/adminlte/build/scss/_bootstrap_variables_old2.scss b/hera-admin/src/main/resources/static/adminlte/build/scss/_bootstrap_variables_old2.scss new file mode 100755 index 00000000..0c7d6d61 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/scss/_bootstrap_variables_old2.scss @@ -0,0 +1,843 @@ +// Variables +// +// Copy settings from this file into the provided `_custom.scss` to override +// the Bootstrap defaults without modifying key, versioned files. + + +// Table of Contents +// +// Colors +// Options +// Spacing +// Body +// Links +// Grid breakpoints +// Grid containers +// Grid columns +// Fonts +// Components + +@mixin _assert-ascending($map, $map-name) { + $prev-key: null; + $prev-num: null; + @each $key, $num in $map { + @if $prev-num == null { + // Do nothing + } @else if not comparable($prev-num, $num) { + @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } @else if $prev-num >= $num { + @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } + $prev-key: $key; + $prev-num: $num; + } +} + +// General variable structure +// +// Variable format should follow the `$component-modifier-state-property` order. + + +// Colors +// +// Grayscale and brand colors for use across Bootstrap. + +$gray-dark: #373a3c !default; +$gray: #55595c !default; +$gray-light: #818a91 !default; +$gray-lighter: #eceeef !default; +$gray-lightest: #f7f7f9 !default; + +$brand-primary: #3c8dbc !default; +$brand-success: #00a65a !default; +$brand-info: #00c0ef !default; +$brand-warning: #f39c12 !default; +$brand-danger: #dd4b39 !default; +$brand-inverse: $gray-dark !default; + + +// Options +// +// Quickly modify global styling by enabling or disabling optional features. + +$enable-flex: false !default; +$enable-rounded: true !default; +$enable-shadows: true !default; +$enable-gradients: false !default; +$enable-transitions: true !default; +$enable-hover-media-query: false !default; +$enable-grid-classes: true !default; +$enable-print-styles: true !default; + + +// Spacing +// +// Control the default styling of most Bootstrap elements by modifying these +// variables. Mostly focused on spacing. +// You can add more entries to the $spacers map, should you need more variation. + +$spacer: 1rem !default; +$spacer-x: $spacer !default; +$spacer-y: $spacer !default; +$spacers: ( + 0: ( + x: 0, + y: 0 + ), + 1: ( + x: $spacer-x, + y: $spacer-y + ), + 2: ( + x: ($spacer-x * 1.5), + y: ($spacer-y * 1.5) + ), + 3: ( + x: ($spacer-x * 3), + y: ($spacer-y * 3) + ) +) !default; +$border-width: 1px !default; + + +// Body +// +// Settings for the `` element. + +$body-bg: #fff !default; +$body-color: $gray !default; + + +// Links +// +// Style anchor elements. + +$link-color: $brand-primary !default; +$link-decoration: none !default; +$link-hover-color: darken($link-color, 15%) !default; +$link-hover-decoration: underline !default; + + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px +) !default; +@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); + + +// Grid containers +// +// Define the maximum width of `.container` for different screen sizes. + +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1140px +) !default; +@include _assert-ascending($container-max-widths, "$container-max-widths"); + + +// Grid columns +// +// Set the number of columns and specify the width of the gutters. + +$grid-columns: 12 !default; +$grid-gutter-width-base: 30px !default; +$grid-gutter-widths: ( + xs: $grid-gutter-width-base, + sm: $grid-gutter-width-base, + md: $grid-gutter-width-base, + lg: $grid-gutter-width-base, + xl: $grid-gutter-width-base +) !default; + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +$font-family-monospace: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; +$font-family-base: $font-family-sans-serif !default; + +// Pixel value used to responsively scale all typography. Applied to the `` element. +$font-size-root: 16px !default; + +$font-size-base: 1rem !default; +$font-size-lg: 1.25rem !default; +$font-size-sm: .875rem !default; +$font-size-xs: .75rem !default; + +$line-height-base: 1.5 !default; + +$font-size-h1: 2.5rem !default; +$font-size-h2: 2rem !default; +$font-size-h3: 1.75rem !default; +$font-size-h4: 1.5rem !default; +$font-size-h5: 1.25rem !default; +$font-size-h6: 1rem !default; + +$display1-size: 6rem !default; +$display2-size: 5.5rem !default; +$display3-size: 4.5rem !default; +$display4-size: 3.5rem !default; + +$display1-weight: 300 !default; +$display2-weight: 300 !default; +$display3-weight: 300 !default; +$display4-weight: 300 !default; + +$headings-margin-bottom: ($spacer / 2) !default; +$headings-font-family: inherit !default; +$headings-font-weight: 500 !default; +$headings-line-height: 1.1 !default; +$headings-color: inherit !default; + +$lead-font-size: 1.25rem !default; +$lead-font-weight: 300 !default; + +$text-muted: $gray-light !default; + +$abbr-border-color: $gray-light !default; + +$blockquote-small-color: $gray-light !default; +$blockquote-font-size: ($font-size-base * 1.25) !default; +$blockquote-border-color: $gray-lighter !default; +$blockquote-border-width: .25rem !default; + +$hr-border-color: rgba(0,0,0,.1) !default; +$hr-border-width: $border-width !default; + +$mark-padding: .2em !default; + +$dt-font-weight: bold !default; + +$kbd-box-shadow: inset 0 -.1rem 0 rgba(0,0,0,.25) !default; +$nested-kbd-font-weight: bold !default; + +$list-inline-padding: 5px !default; + + +// Components +// +// Define common padding and border radius sizes and more. + +$line-height-lg: (4 / 3) !default; +$line-height-sm: 1.5 !default; + +$border-radius: .25rem !default; +$border-radius-lg: .3rem !default; +$border-radius-sm: .2rem !default; + +$component-active-color: #fff !default; +$component-active-bg: $brand-primary !default; + +$caret-width: .3em !default; +$caret-width-lg: $caret-width !default; + + +// Tables +// +// Customizes the `.table` component with basic values, each used across all table variations. + +$table-cell-padding: .75rem !default; +$table-sm-cell-padding: .3rem !default; + +$table-bg: transparent !default; +$table-bg-accent: rgba(0,0,0,.05) !default; +$table-bg-hover: rgba(0,0,0,.075) !default; +$table-bg-active: $table-bg-hover !default; + +$table-border-width: $border-width !default; +$table-border-color: $gray-lighter !default; + + +// Buttons +// +// For each of Bootstrap's buttons, define text, background and border color. + +$btn-padding-x: 1rem !default; +$btn-padding-y: .5rem !default; +$btn-line-height: 1.25 !default; +$btn-font-weight: normal !default; +$btn-box-shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075) !default; +$btn-active-box-shadow: inset 0 3px 5px rgba(0,0,0,.125) !default; + +$btn-primary-color: #fff !default; +$btn-primary-bg: $brand-primary !default; +$btn-primary-border: $btn-primary-bg !default; + +$btn-secondary-color: $gray-dark !default; +$btn-secondary-bg: #fff !default; +$btn-secondary-border: #ccc !default; + +$btn-info-color: #fff !default; +$btn-info-bg: $brand-info !default; +$btn-info-border: $btn-info-bg !default; + +$btn-success-color: #fff !default; +$btn-success-bg: $brand-success !default; +$btn-success-border: $btn-success-bg !default; + +$btn-warning-color: #fff !default; +$btn-warning-bg: $brand-warning !default; +$btn-warning-border: $btn-warning-bg !default; + +$btn-danger-color: #fff !default; +$btn-danger-bg: $brand-danger !default; +$btn-danger-border: $btn-danger-bg !default; + +$btn-link-disabled-color: $gray-light !default; + +$btn-padding-x-sm: .5rem !default; +$btn-padding-y-sm: .25rem !default; + +$btn-padding-x-lg: 1.5rem !default; +$btn-padding-y-lg: .75rem !default; + +$btn-block-spacing-y: .5rem !default; +$btn-toolbar-margin: .5rem !default; + +// Allows for customizing button radius independently from global border radius +$btn-border-radius: $border-radius !default; +$btn-border-radius-lg: $border-radius-lg !default; +$btn-border-radius-sm: $border-radius-sm !default; + + +// Forms + +$input-padding-x: .75rem !default; +$input-padding-y: .5rem !default; +$input-line-height: 1.25 !default; + +$input-bg: #fff !default; +$input-bg-disabled: $gray-lighter !default; + +$input-color: $gray !default; +$input-border-color: rgba(0,0,0,.15) !default; +$input-btn-border-width: $border-width !default; // For form controls and buttons +$input-box-shadow: inset 0 1px 1px rgba(0,0,0,.075) !default; + +$input-border-radius: $border-radius !default; +$input-border-radius-lg: $border-radius-lg !default; +$input-border-radius-sm: $border-radius-sm !default; + +$input-bg-focus: $input-bg !default; +$input-border-focus: #66afe9 !default; +$input-box-shadow-focus: $input-box-shadow, 0 0 8px rgba(102,175,233,.6) !default; +$input-color-focus: $input-color !default; + +$input-color-placeholder: #999 !default; + +$input-padding-x-sm: .5rem !default; +$input-padding-y-sm: .25rem !default; + +$input-padding-x-lg: 1.5rem !default; +$input-padding-y-lg: .75rem !default; + +$input-height: (($font-size-base * $line-height-base) + ($input-padding-y * 2)) !default; +$input-height-lg: (($font-size-lg * $line-height-lg) + ($input-padding-y-lg * 2)) !default; +$input-height-sm: (($font-size-sm * $line-height-sm) + ($input-padding-y-sm * 2)) !default; + +$form-group-margin-bottom: $spacer-y !default; + +$input-group-addon-bg: $gray-lighter !default; +$input-group-addon-border-color: $input-border-color !default; + +$cursor-disabled: not-allowed !default; + +$custom-control-gutter: 1.5rem !default; +$custom-control-spacer-x: 1rem !default; +$custom-control-spacer-y: .25rem !default; + +$custom-control-indicator-size: 1rem !default; +$custom-control-indicator-bg: #ddd !default; +$custom-control-indicator-bg-size: 50% 50% !default; +$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba(0,0,0,.1) !default; + +$custom-control-disabled-cursor: $cursor-disabled !default; +$custom-control-disabled-indicator-bg: #eee !default; +$custom-control-disabled-description-color: #767676 !default; + +$custom-control-checked-indicator-color: #fff !default; +$custom-control-checked-indicator-bg: #0074d9 !default; +$custom-control-checked-indicator-box-shadow: none !default; + +$custom-control-focus-indicator-box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9 !default; + +$custom-control-active-indicator-color: #fff !default; +$custom-control-active-indicator-bg: #84c6ff !default; +$custom-control-active-indicator-box-shadow: none !default; + +$custom-checkbox-radius: $border-radius !default; +$custom-checkbox-checked-icon: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-checked-indicator-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") !default; + +$custom-checkbox-indeterminate-bg: #0074d9 !default; +$custom-checkbox-indeterminate-indicator-color: $custom-control-checked-indicator-color !default; +$custom-checkbox-indeterminate-icon: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indeterminate-indicator-color}' d='M0 2h4'/%3E%3C/svg%3E") !default; +$custom-checkbox-indeterminate-box-shadow: none !default; + +$custom-radio-radius: 50% !default; +$custom-radio-checked-icon: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-checked-indicator-color}'/%3E%3C/svg%3E") !default; + +$custom-select-padding-x: .75rem !default; +$custom-select-padding-y: .375rem !default; +$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator +$custom-select-color: $input-color !default; +$custom-select-disabled-color: $gray-light !default; +$custom-select-bg: #fff !default; +$custom-select-disabled-bg: $gray-lighter !default; +$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions +$custom-select-indicator-color: #333 !default; +$custom-select-indicator: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") !default; +$custom-select-border-width: $input-btn-border-width !default; +$custom-select-border-color: $input-border-color !default; +$custom-select-border-radius: $border-radius !default; + +$custom-select-focus-border-color: #51a7e8 !default; +$custom-select-focus-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .075), 0 0 5px rgba(81, 167, 232, .5) !default; + +$custom-select-sm-padding-y: .2rem !default; +$custom-select-sm-font-size: 75% !default; + +$custom-file-height: 2.5rem !default; +$custom-file-width: 14rem !default; +$custom-file-focus-box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9 !default; + +$custom-file-padding-x: .5rem !default; +$custom-file-padding-y: 1rem !default; +$custom-file-line-height: 1.5 !default; +$custom-file-color: #555 !default; +$custom-file-bg: #fff !default; +$custom-file-border-width: $border-width !default; +$custom-file-border-color: #ddd !default; +$custom-file-border-radius: $border-radius !default; +$custom-file-box-shadow: inset 0 .2rem .4rem rgba(0,0,0,.05) !default; +$custom-file-button-color: $custom-file-color !default; +$custom-file-button-bg: #eee !default; +$custom-file-text: ( + placeholder: ( + en: "Choose file..." + ), + button-label: ( + en: "Browse" + ) +) !default; + + +// Form validation icons +$form-icon-success-color: $brand-success !default; +$form-icon-success: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-success-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") !default; + +$form-icon-warning-color: $brand-warning !default; +$form-icon-warning: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-warning-color}' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E") !default; + +$form-icon-danger-color: $brand-danger !default; +$form-icon-danger: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-icon-danger-color}' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E") !default; + + +// Dropdowns +// +// Dropdown menu container and contents. + +$dropdown-min-width: 10rem !default; +$dropdown-padding-y: .5rem !default; +$dropdown-margin-top: .125rem !default; +$dropdown-bg: #fff !default; +$dropdown-border-color: rgba(0,0,0,.15) !default; +$dropdown-border-width: $border-width !default; +$dropdown-divider-bg: #e5e5e5 !default; +$dropdown-box-shadow: 0 .5rem 1rem rgba(0,0,0,.175) !default; + +$dropdown-link-color: $gray-dark !default; +$dropdown-link-hover-color: darken($gray-dark, 5%) !default; +$dropdown-link-hover-bg: #f5f5f5 !default; + +$dropdown-link-active-color: $component-active-color !default; +$dropdown-link-active-bg: $component-active-bg !default; + +$dropdown-link-disabled-color: $gray-light !default; + +$dropdown-item-padding-x: 1rem !default; + +$dropdown-header-color: $gray-light !default; + + +// Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. + +$zindex-dropdown-backdrop: 990 !default; +$zindex-navbar: 1000 !default; +$zindex-dropdown: 1000 !default; +$zindex-popover: 1060 !default; +$zindex-tooltip: 1070 !default; +$zindex-navbar-fixed: 1030 !default; +$zindex-navbar-sticky: 1030 !default; +$zindex-modal-bg: 1040 !default; +$zindex-modal: 1050 !default; + + +// Navbar + +$navbar-border-radius: $border-radius !default; +$navbar-padding-x: $spacer !default; +$navbar-padding-y: ($spacer / 2) !default; +$navbar-brand-padding-y: .25rem !default; + +$navbar-dark-color: rgba(255,255,255,1) !default; +$navbar-dark-hover-color: rgba(255,255,255,1) !default; +$navbar-dark-active-color: rgba(255,255,255,1) !default; +$navbar-dark-disabled-color: rgba(255,255,255,.25) !default; +$navbar-dark-toggler-bg: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E") !default; + +$navbar-light-color: rgba(0,0,0,.3) !default; +$navbar-light-hover-color: rgba(0,0,0,.6) !default; +$navbar-light-active-color: rgba(0,0,0,.8) !default; +$navbar-light-disabled-color: rgba(0,0,0,.15) !default; +$navbar-light-toggler-bg: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E") !default; + + +// Navs + +$nav-item-margin: .2rem !default; +$nav-item-inline-spacer: 1rem !default; +$nav-link-padding: .5em 1em !default; +$nav-link-hover-bg: $gray-lighter !default; +$nav-disabled-link-color: $gray-light !default; +$nav-disabled-link-hover-color: $gray-light !default; +$nav-disabled-link-hover-bg: transparent !default; + +$nav-tabs-border-color: #ddd !default; +$nav-tabs-border-width: $border-width !default; +$nav-tabs-border-radius: $border-radius !default; +$nav-tabs-link-hover-border-color: $gray-lighter !default; +$nav-tabs-active-link-hover-color: $gray !default; +$nav-tabs-active-link-hover-bg: transparent !default; +$nav-tabs-active-link-hover-border-color: #ddd !default; +$nav-tabs-justified-link-border-color: #ddd !default; +$nav-tabs-justified-active-link-border-color: $body-bg !default; + +$nav-pills-border-radius: $border-radius !default; +$nav-pills-active-link-color: $component-active-color !default; +$nav-pills-active-link-bg: $component-active-bg !default; + + +// Pagination + +$pagination-padding-x: .75rem !default; +$pagination-padding-y: .5rem !default; +$pagination-padding-x-sm: .75rem !default; +$pagination-padding-y-sm: .275rem !default; +$pagination-padding-x-lg: 1.5rem !default; +$pagination-padding-y-lg: .75rem !default; + + +$pagination-color: $link-color !default; +$pagination-bg: #fff !default; +$pagination-border-width: $border-width !default; +$pagination-border-color: #ddd !default; + +$pagination-hover-color: $link-hover-color !default; +$pagination-hover-bg: $gray-lighter !default; +$pagination-hover-border: #ddd !default; + +$pagination-active-color: #fff !default; +$pagination-active-bg: $brand-primary !default; +$pagination-active-border: $brand-primary !default; + +$pagination-disabled-color: $gray-light !default; +$pagination-disabled-bg: #fff !default; +$pagination-disabled-border: #ddd !default; + + +// Jumbotron + +$jumbotron-padding: 2rem !default; +$jumbotron-bg: $gray-lighter !default; + + +// Form states and alerts +// +// Define colors for form feedback states and, by default, alerts. + +$state-success-text: #3c763d !default; +$state-success-bg: #dff0d8 !default; +$state-success-border: darken($state-success-bg, 5%) !default; + +$state-info-text: #31708f !default; +$state-info-bg: #d9edf7 !default; +$state-info-border: darken($state-info-bg, 7%) !default; + +$state-warning-text: #8a6d3b !default; +$state-warning-bg: #fcf8e3 !default; +$mark-bg: $state-warning-bg !default; +$state-warning-border: darken($state-warning-bg, 5%) !default; + +$state-danger-text: #a94442 !default; +$state-danger-bg: #f2dede !default; +$state-danger-border: darken($state-danger-bg, 5%) !default; + + +// Cards +$card-spacer-x: 1.25rem !default; +$card-spacer-y: .75rem !default; +$card-border-width: 1px !default; +$card-border-radius: $border-radius !default; +$card-border-color: rgba(0,0,0,.125) !default; +$card-border-radius-inner: calc(#{$card-border-radius} - #{$card-border-width}) !default; +$card-cap-bg: #f5f5f5 !default; +$card-bg: #fff !default; + +$card-link-hover-color: #fff !default; + +$card-img-overlay-padding: 1.25rem !default; + +$card-deck-margin: .625rem !default; + +$card-columns-sm-up-column-gap: 1.25rem !default; + + +// Tooltips + +$tooltip-max-width: 200px !default; +$tooltip-color: #fff !default; +$tooltip-bg: #000 !default; +$tooltip-opacity: .9 !default; +$tooltip-padding-y: 3px !default; +$tooltip-padding-x: 8px !default; +$tooltip-margin: 3px !default; + +$tooltip-arrow-width: 5px !default; +$tooltip-arrow-color: $tooltip-bg !default; + + +// Popovers + +$popover-inner-padding: 1px !default; +$popover-bg: #fff !default; +$popover-max-width: 276px !default; +$popover-border-width: $border-width !default; +$popover-border-color: rgba(0,0,0,.2) !default; +$popover-box-shadow: 0 5px 10px rgba(0,0,0,.2) !default; + +$popover-title-bg: darken($popover-bg, 3%) !default; +$popover-title-padding-x: 14px !default; +$popover-title-padding-y: 8px !default; + +$popover-content-padding-x: 14px !default; +$popover-content-padding-y: 9px !default; + +$popover-arrow-width: 10px !default; +$popover-arrow-color: $popover-bg !default; + +$popover-arrow-outer-width: ($popover-arrow-width + 1px) !default; +$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default; + + +// Tags + +$tag-default-bg: $gray-light !default; +$tag-primary-bg: $brand-primary !default; +$tag-success-bg: $brand-success !default; +$tag-info-bg: $brand-info !default; +$tag-warning-bg: $brand-warning !default; +$tag-danger-bg: $brand-danger !default; + +$tag-color: #fff !default; +$tag-link-hover-color: #fff !default; +$tag-font-size: 75% !default; +$tag-font-weight: bold !default; +$tag-padding-x: .4em !default; +$tag-padding-y: .25em !default; + +$tag-pill-padding-x: .6em !default; +// Use a higher than normal value to ensure completely rounded edges when +// customizing padding or font-size on labels. +$tag-pill-border-radius: 10rem !default; + +// Modals + +// Padding applied to the modal body +$modal-inner-padding: 15px !default; + +$modal-dialog-margin: 10px !default; +$modal-dialog-sm-up-margin-y: 30px !default; + +$modal-title-padding: 15px !default; +$modal-title-line-height: $line-height-base !default; + +$modal-content-bg: #fff !default; +$modal-content-border-color: rgba(0,0,0,.2) !default; +$modal-content-border-width: $border-width !default; +$modal-content-xs-box-shadow: 0 3px 9px rgba(0,0,0,.5) !default; +$modal-content-sm-up-box-shadow: 0 5px 15px rgba(0,0,0,.5) !default; + +$modal-backdrop-bg: #000 !default; +$modal-backdrop-opacity: .5 !default; +$modal-header-border-color: #e5e5e5 !default; +$modal-footer-border-color: $modal-header-border-color !default; +$modal-header-border-width: $modal-content-border-width !default; +$modal-footer-border-width: $modal-header-border-width !default; + +$modal-lg: 900px !default; +$modal-md: 600px !default; +$modal-sm: 300px !default; + + +// Alerts +// +// Define alert colors, border radius, and padding. + +$alert-padding: 1rem !default; +$alert-border-radius: $border-radius !default; +$alert-link-font-weight: bold !default; +$alert-border-width: $border-width !default; + +$alert-success-bg: $state-success-bg !default; +$alert-success-text: $state-success-text !default; +$alert-success-border: $state-success-border !default; + +$alert-info-bg: $state-info-bg !default; +$alert-info-text: $state-info-text !default; +$alert-info-border: $state-info-border !default; + +$alert-warning-bg: $state-warning-bg !default; +$alert-warning-text: $state-warning-text !default; +$alert-warning-border: $state-warning-border !default; + +$alert-danger-bg: $state-danger-bg !default; +$alert-danger-text: $state-danger-text !default; +$alert-danger-border: $state-danger-border !default; + + +// Progress bars + +$progress-bg: #eee !default; +$progress-bar-color: #0074d9 !default; +$progress-border-radius: $border-radius !default; +$progress-box-shadow: none !default; + +$progress-bar-bg: $brand-primary !default; +$progress-bar-success-bg: $brand-success !default; +$progress-bar-warning-bg: $brand-warning !default; +$progress-bar-danger-bg: $brand-danger !default; +$progress-bar-info-bg: $brand-info !default; + + +// List group + +$list-group-bg: #fff !default; +$list-group-border-color: #ddd !default; +$list-group-border-width: $border-width !default; +$list-group-border-radius: $border-radius !default; + +$list-group-hover-bg: #f5f5f5 !default; +$list-group-active-color: $component-active-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border: $list-group-active-bg !default; +$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default; + +$list-group-disabled-color: $gray-light !default; +$list-group-disabled-bg: $gray-lighter !default; +$list-group-disabled-text-color: $list-group-disabled-color !default; + +$list-group-link-color: #555 !default; +$list-group-link-hover-color: $list-group-link-color !default; +$list-group-link-heading-color: #333 !default; + +$list-group-item-padding-x: 1.25rem !default; +$list-group-item-padding-y: .75rem !default; +$list-group-item-heading-margin-bottom: 5px !default; + + +// Image thumbnails + +$thumbnail-padding: .25rem !default; +$thumbnail-bg: $body-bg !default; +$thumbnail-border-width: $border-width !default; +$thumbnail-border-color: #ddd !default; +$thumbnail-border-radius: $border-radius !default; +$thumbnail-box-shadow: 0 1px 2px rgba(0,0,0,.075) !default; + + +// Figures + +$figure-caption-font-size: 90% !default; + + +// Breadcrumbs + +$breadcrumb-padding-y: .75rem !default; +$breadcrumb-padding-x: 1rem !default; +$breadcrumb-item-padding: .5rem !default; + +$breadcrumb-bg: $gray-lighter !default; +$breadcrumb-divider-color: $gray-light !default; +$breadcrumb-active-color: $gray-light !default; +$breadcrumb-divider: "/" !default; + + +// Media objects + +$media-margin-top: 15px !default; +$media-heading-margin-bottom: 5px !default; +$media-alignment-padding-x: 10px !default; + + +// Carousel + +$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default; + +$carousel-control-color: #fff !default; +$carousel-control-width: 15% !default; +$carousel-control-sm-up-size: 30px !default; +$carousel-control-opacity: .5 !default; +$carousel-control-font-size: 20px !default; + +$carousel-indicators-width: 60% !default; + +$carousel-indicator-size: 10px !default; +$carousel-indicator-active-size: 12px !default; +$carousel-indicator-active-bg: #fff !default; +$carousel-indicator-border-color: #fff !default; + +$carousel-caption-width: 70% !default; +$carousel-caption-sm-up-width: 60% !default; +$carousel-caption-color: #fff !default; + +$carousel-icon-width: 20px !default; + + +// Close + +$close-font-weight: bold !default; +$close-color: #000 !default; +$close-text-shadow: 0 1px 0 #fff !default; + + +// Code + +$code-font-size: 90% !default; +$code-padding-x: .4rem !default; +$code-padding-y: .2rem !default; +$code-color: #bd4147 !default; +$code-bg: #f7f7f9 !default; + +$kbd-color: #fff !default; +$kbd-bg: #333 !default; + +$pre-bg: #f7f7f9 !default; +$pre-color: $gray-dark !default; +$pre-border-color: #ccc !default; +$pre-scrollable-max-height: 340px !default; diff --git a/hera-admin/src/main/resources/static/adminlte/build/scss/_header.scss b/hera-admin/src/main/resources/static/adminlte/build/scss/_header.scss new file mode 100755 index 00000000..7d84a05c --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/scss/_header.scss @@ -0,0 +1,95 @@ +/* + * Component: Main Header + * ---------------------- + */ + +.main-header { + padding: 0 16px 0 0; + .navbar-brand { + font-weight: 200; + width: $sidebar-width; + padding: $main-header-brand-padding-y $main-header-brand-padding-x; + background: darken($brand-primary, 5%); + transition: width $transition-speed $transition-fn; + overflow: hidden; + margin-right: 0; + + > .logo-mini { + display: none; + } + + @include media-breakpoint-up(md) { + .sidebar-mini.sidebar-collapse & { + width: $sidebar-mini-width; + > .logo { + display: none; + } + > .logo-mini { + display: inline; + } + } + } + + @include media-breakpoint-down(md) { + width: $sidebar-mini-width; + > .logo { + display: none; + } + > .logo-mini { + display: inline; + } + } + } + + /*.navbar-nav .nav-item { + margin: 0; + }*/ + + &.navbar-toggleable .navbar-nav .nav-link { + padding: $main-header-link-padding-y $main-header-link-padding-x; + position: relative; + } + + /*.open > .nav-link, + .nav-link:hover { + background: rgba(0, 0, 0, .1); + }*/ + + .has-img { + padding-top: $main-header-link-padding-y - 2; + padding-bottom: $main-header-link-padding-y - 2; + } + + .navbar-nav[class*="-right"] { + .dropdown-menu { + margin-top: -3px; + right: 0; + left: auto; + @media (max-width: breakpoint-max(xs)) { + left: 0; + right: auto; + } + } + } + +} + +// Add shadow to the navbar if wanted +.navbar-shadow { + @include box-shadow(0 3px 3px rgba(0, 0, 0, 0.1)); +} + +// Add this class to images within a nav-link +.navbar-img { + height: $main-header-height / 2; + width: auto; +} + +// Navbar tags (used as badges in nav-link) +.navbar-tag { + position: absolute; + top: 9px; + right: 5px; + font-size: $font-size-xs - .1; + padding: 2px 4px; +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/build/scss/_variables.scss b/hera-admin/src/main/resources/static/adminlte/build/scss/_variables.scss new file mode 100755 index 00000000..d360f9eb --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/build/scss/_variables.scss @@ -0,0 +1,129 @@ +// AdminLTE 3 Variables.less +// ========================= + +// PATHS +// -------------------------------------------------------- +$path-to-bootstrap-sass: "../../bower_components/bootstrap/scss" !default; +$boxed-layout-bg-image-path: "../img/boxed-bg.jpg" !default; + +// COLORS +// -------------------------------------------------------- +/* +$blue: #0073b7 !default; +$black: #111 !default; +$orange: #FF851B !default; +*/ +$fuchsia: #F012BE !default; +$purple: #605ca8 !default; +$maroon: #D81B60 !default; +$teal: #39CCCC !default; +$olive: #3D9970 !default; +$lime: #01FF70 !default; +$navy: #001F3F !default; +$gray-x-light: #d2d6de !default; + +// TEXT +// -------------------------------------------------------- +$font-size-root: 16px !default; + +// LAYOUT +// -------------------------------------------------------- + +// Side bar and logo width +$sidebar-width: 230px !default; +// Boxed layout maximum width +$boxed-layout-max-width: 1250px !default; +// When to show the smaller logo +$screen-header-collapse: map-get($grid-breakpoints, md) !default; + +// Link colors (aka: tags) +$link-color: $brand-primary !default; +$link-hover-color: lighten($link-color, 15%) !default; + +// Body background (Affects main content background only) +$main-bg: $gray-lighter !default; + +// MAIN HEADER +// -------------------------------------------------------- +$main-header-link-padding-y: 15px !default; +$main-header-link-padding-x: 15px !default; +$main-header-brand-padding-y: 12px !default; +$main-header-brand-padding-x: $main-header-brand-padding-y !default; +$main-header-height: (($font-size-root * $line-height-base) + ($main-header-link-padding-y * 2)) !default; + +// MAIN FOOTER +// -------------------------------------------------------- +$main-footer-padding: 15px !default; +$main-footer-border-top-width: 2px !default; +$main-footer-border-top: $main-footer-border-top-width solid darken($main-bg, 10%) !default; +$main-footer-height: (($font-size-root * $line-height-base) + ($main-footer-padding * 2)) + $main-footer-border-top-width !default; + +// SIDEBAR SKINS +// -------------------------------------------------------- + +// Dark sidebar +$sidebar-dark-bg: #2c333c !default;//#222d32 !default; +$sidebar-dark-hover-bg: darken($sidebar-dark-bg, 4%) !default; +$sidebar-dark-color: #C2C7D0!default;//lighten($sidebar-dark-bg, 60%) !default; +$sidebar-dark-hover-color: #fff !default; +$sidebar-dark-submenu-bg: lighten($sidebar-dark-bg, 5%) !default; +$sidebar-dark-submenu-color: #C2C7D0!default;//lighten($sidebar-dark-submenu-bg, 40%) !default; +$sidebar-dark-submenu-hover-color: #fff !default; + +// Light sidebar +$sidebar-light-bg: #f9fafc !default; +$sidebar-light-hover-bg: lighten(#f0f0f1, 1.5%) !default; +$sidebar-light-color: #444 !default; +$sidebar-light-hover-color: #000 !default; +$sidebar-light-submenu-bg: $sidebar-light-hover-bg !default; +$sidebar-light-submenu-color: #777 !default; +$sidebar-light-submenu-hover-color: #000 !default; + +// SIDEBAR MINI +// -------------------------------------------------------- +$sidebar-mini-width: 55px !default; + +// CONTROL SIDEBAR +// -------------------------------------------------------- +$control-sidebar-width: $sidebar-width !default; + +// BOXES +// -------------------------------------------------------- +$box-border-color: #f4f4f4 !default; +$box-border-radius: 3px !default; +$box-footer-bg: #fff !default; +$box-boxshadow: 0 1px 1px rgba(0, 0, 0, 0.125) !default; +$box-padding: 10px !default; + +// Box variants +$box-default-border-top-color: $gray-x-light !default;// #d2d6de !default; + +// BUTTONS +// -------------------------------------------------------- +$btn-boxshadow: none !default; + +// PROGRESS BARS +// -------------------------------------------------------- +$progress-bar-border-radius: 1px !default; +$progress-bar-sm-border-radius: 1px !default; +$progress-bar-xs-border-radius: 1px !default; + + + +// DIRECT CHAT +// -------------------------------------------------------- +$direct-chat-height: 250px !default; +$direct-chat-default-msg-bg: $gray-x-light !default; +$direct-chat-default-font-color: #444 !default; +$direct-chat-default-msg-border-color: $gray-x-light !default; + +// CHAT WIDGET +// -------------------------------------------------------- +$attachment-border-radius: 3px !default; + +// TRANSITIONS SETTINGS +// -------------------------------------------------------- + +// Transition global options +$transition-speed: 0.3s !default; +$transition-fn: ease-in-out !default; \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.css b/hera-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.css new file mode 100755 index 00000000..de1a0d2f --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.css @@ -0,0 +1,4964 @@ +/*! + * AdminLTE v2.3.12 + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information + */ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + height: 100%; +} +.layout-boxed html, +.layout-boxed body { + height: 100%; +} +body { + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} +/* Layout */ +.wrapper { + height: 100%; + position: relative; + overflow-x: hidden; + overflow-y: auto; +} +.wrapper:before, +.wrapper:after { + content: " "; + display: table; +} +.wrapper:after { + clear: both; +} +.layout-boxed .wrapper { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); + position: relative; +} +.layout-boxed { + background: url('../img/boxed-bg.jpg') repeat fixed; +} +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; + margin-left: 230px; + z-index: 820; +} +.layout-top-nav .content-wrapper, +.layout-top-nav .right-side, +.layout-top-nav .main-footer { + margin-left: 0; +} +@media (max-width: 767px) { + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0; + } +} +@media (min-width: 768px) { + .sidebar-collapse .content-wrapper, + .sidebar-collapse .right-side, + .sidebar-collapse .main-footer { + margin-left: 0; + } +} +@media (max-width: 767px) { + .sidebar-open .content-wrapper, + .sidebar-open .right-side, + .sidebar-open .main-footer { + -webkit-transform: translate(230px, 0); + -ms-transform: translate(230px, 0); + -o-transform: translate(230px, 0); + transform: translate(230px, 0); + } +} +.content-wrapper, +.right-side { + min-height: 100%; + background-color: #ecf0f5; + z-index: 800; +} +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid #d2d6de; +} +/* Fixed layout */ +.fixed .main-header, +.fixed .main-sidebar, +.fixed .left-side { + position: fixed; +} +.fixed .main-header { + top: 0; + right: 0; + left: 0; +} +.fixed .content-wrapper, +.fixed .right-side { + padding-top: 50px; +} +@media (max-width: 767px) { + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 100px; + } +} +.fixed.layout-boxed .wrapper { + max-width: 100%; +} +.fixed .wrapper { + overflow: hidden; +} +.hold-transition .content-wrapper, +.hold-transition .right-side, +.hold-transition .main-footer, +.hold-transition .main-sidebar, +.hold-transition .left-side, +.hold-transition .main-header .navbar, +.hold-transition .main-header .logo, +.hold-transition .menu-open .fa-angle-left { + /* Fix for IE */ + -webkit-transition: none; + -o-transition: none; + transition: none; +} +/* Content */ +.content { + min-height: 250px; + padding: 15px; + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: 'Source Sans Pro', sans-serif; +} +/* General Links */ +a { + color: #3c8dbc; +} +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: #72afd2; +} +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; +} +.page-header > small { + color: #666; + display: block; + margin-top: 5px; +} +/* + * Component: Main Header + * ---------------------- + */ +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; +} +.main-header .navbar { + -webkit-transition: margin-left 0.3s ease-in-out; + -o-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; + margin-bottom: 0; + margin-left: 230px; + border: none; + min-height: 50px; + border-radius: 0; +} +.layout-top-nav .main-header .navbar { + margin-left: 0; +} +.main-header #navbar-search-input.form-control { + background: rgba(255, 255, 255, 0.2); + border-color: transparent; +} +.main-header #navbar-search-input.form-control:focus, +.main-header #navbar-search-input.form-control:active { + border-color: rgba(0, 0, 0, 0.1); + background: rgba(255, 255, 255, 0.9); +} +.main-header #navbar-search-input.form-control::-moz-placeholder { + color: #ccc; + opacity: 1; +} +.main-header #navbar-search-input.form-control:-ms-input-placeholder { + color: #ccc; +} +.main-header #navbar-search-input.form-control::-webkit-input-placeholder { + color: #ccc; +} +.main-header .navbar-custom-menu, +.main-header .navbar-right { + float: right; +} +@media (max-width: 991px) { + .main-header .navbar-custom-menu a, + .main-header .navbar-right a { + color: inherit; + background: transparent; + } +} +@media (max-width: 767px) { + .main-header .navbar-right { + float: none; + } + .navbar-collapse .main-header .navbar-right { + margin: 7.5px -15px; + } + .main-header .navbar-right > li { + color: inherit; + border: 0; + } +} +.main-header .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: 15px 15px; + font-family: fontAwesome; +} +.main-header .sidebar-toggle:before { + content: "\f0c9"; +} +.main-header .sidebar-toggle:hover { + color: #fff; +} +.main-header .sidebar-toggle:focus, +.main-header .sidebar-toggle:active { + background: transparent; +} +.main-header .sidebar-toggle .icon-bar { + display: none; +} +.main-header .navbar .nav > li.user > a > .fa, +.main-header .navbar .nav > li.user > a > .glyphicon, +.main-header .navbar .nav > li.user > a > .ion { + margin-right: 5px; +} +.main-header .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; +} +.main-header .logo { + -webkit-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + display: block; + float: left; + height: 50px; + font-size: 20px; + line-height: 50px; + text-align: center; + width: 230px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; +} +.main-header .logo .logo-lg { + display: block; +} +.main-header .logo .logo-mini { + display: none; +} +.main-header .navbar-brand { + color: #fff; +} +.content-header { + position: relative; + padding: 15px 15px 0 15px; +} +.content-header > h1 { + margin: 0; + font-size: 24px; +} +.content-header > h1 > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; +} +.content-header > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + border-radius: 2px; +} +.content-header > .breadcrumb > li > a { + color: #444; + text-decoration: none; + display: inline-block; +} +.content-header > .breadcrumb > li > a > .fa, +.content-header > .breadcrumb > li > a > .glyphicon, +.content-header > .breadcrumb > li > a > .ion { + margin-right: 5px; +} +.content-header > .breadcrumb > li + li:before { + content: '>\00a0'; +} +@media (max-width: 991px) { + .content-header > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: #d2d6de; + padding-left: 10px; + } + .content-header > .breadcrumb li:before { + color: #97a0b3; + } +} +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: 15px 15px; +} +@media (max-width: 991px) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} +@media (max-width: 767px) { + .main-header { + position: relative; + } + .main-header .logo, + .main-header .navbar { + width: 100%; + float: none; + } + .main-header .navbar { + margin: 0; + } + .main-header .navbar-custom-menu { + float: right; + } +} +@media (max-width: 991px) { + .navbar-collapse.pull-left { + float: none !important; + } + .navbar-collapse.pull-left + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } +} +/* + * Component: Sidebar + * ------------------ + */ +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: 230px; + z-index: 810; + -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + padding-top: 100px; + } +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (min-width: 768px) { + .sidebar-collapse .main-sidebar, + .sidebar-collapse .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (max-width: 767px) { + .sidebar-open .main-sidebar, + .sidebar-open .left-side { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + } +} +.sidebar { + padding-bottom: 10px; +} +.sidebar-form input:focus { + border-color: transparent; +} +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; +} +.user-panel:before, +.user-panel:after { + content: " "; + display: table; +} +.user-panel:after { + clear: both; +} +.user-panel > .image > img { + width: 100%; + max-width: 45px; + height: auto; +} +.user-panel > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; +} +.user-panel > .info > p { + font-weight: 600; + margin-bottom: 9px; +} +.user-panel > .info > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; +} +.user-panel > .info > a > .fa, +.user-panel > .info > a > .ion, +.user-panel > .info > a > .glyphicon { + margin-right: 3px; +} +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; +} +.sidebar-menu > li { + position: relative; + margin: 0; + padding: 0; +} +.sidebar-menu > li > a { + padding: 12px 5px 12px 15px; + display: block; +} +.sidebar-menu > li > a > .fa, +.sidebar-menu > li > a > .glyphicon, +.sidebar-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu > li .label, +.sidebar-menu > li .badge { + margin-right: 5px; +} +.sidebar-menu > li .badge { + margin-top: 3px; +} +.sidebar-menu li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; +} +.sidebar-menu li > a > .fa-angle-left, +.sidebar-menu li > a > .pull-right-container > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + -webkit-transition: transform 0.5s ease; + -o-transition: transform 0.5s ease; + transition: transform 0.5s ease; +} +.sidebar-menu li > a > .fa-angle-left { + position: absolute; + top: 50%; + right: 10px; + margin-top: -8px; +} +.sidebar-menu .menu-open > a > .fa-angle-left, +.sidebar-menu .menu-open > a > .pull-right-container > .fa-angle-left { + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.sidebar-menu .active > .treeview-menu { + display: block; +} +/* + * Component: Sidebar Mini + */ +@media (min-width: 768px) { + .sidebar-mini.sidebar-collapse .content-wrapper, + .sidebar-mini.sidebar-collapse .right-side, + .sidebar-mini.sidebar-collapse .main-footer { + margin-left: 50px !important; + z-index: 840; + } + .sidebar-mini.sidebar-collapse .main-sidebar { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + width: 50px !important; + z-index: 850; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li { + position: relative; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { + margin-right: 0; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { + border-top-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, + .sidebar-mini.sidebar-collapse .sidebar-form, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, + .sidebar-mini.sidebar-collapse .sidebar-menu li.header { + display: none !important; + -webkit-transform: translateZ(0); + } + .sidebar-mini.sidebar-collapse .main-header .logo { + width: 50px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { + display: none; + } + .sidebar-mini.sidebar-collapse .main-header .navbar { + margin-left: 50px; + } +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + display: block !important; + position: absolute; + width: 180px; + left: 50px; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container { + position: relative !important; + float: right; + width: auto !important; + left: 180px !important; + top: -22px !important; + z-index: 900; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container > .label:not(:first-of-type) { + display: none; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + top: 44px; + margin-left: 0; +} +.sidebar-expanded-on-hover .main-footer, +.sidebar-expanded-on-hover .content-wrapper { + margin-left: 50px; +} +.sidebar-expanded-on-hover .main-sidebar { + box-shadow: 3px 0 8px rgba(0, 0, 0, 0.125); +} +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} +.sidebar-menu:hover { + overflow: visible; +} +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} +.sidebar-menu li > a { + position: relative; +} +.sidebar-menu li > a > .pull-right-container { + position: absolute; + right: 10px; + top: 50%; + margin-top: -7px; +} +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -230px; + width: 230px; + -webkit-transition: right 0.3s ease-in-out; + -o-transition: right 0.3s ease-in-out; + transition: right 0.3s ease-in-out; +} +.control-sidebar { + position: absolute; + padding-top: 50px; + z-index: 1010; +} +@media (max-width: 768px) { + .control-sidebar { + padding-top: 100px; + } +} +.control-sidebar > .tab-content { + padding: 10px 15px; +} +.control-sidebar.control-sidebar-open, +.control-sidebar.control-sidebar-open + .control-sidebar-bg { + right: 0; +} +.control-sidebar-open .control-sidebar-bg, +.control-sidebar-open .control-sidebar { + right: 0; +} +@media (min-width: 768px) { + .control-sidebar-open .content-wrapper, + .control-sidebar-open .right-side, + .control-sidebar-open .main-footer { + margin-right: 230px; + } +} +.fixed .control-sidebar { + position: fixed; + height: 100%; + overflow-y: auto; + padding-bottom: 50px; +} +.nav-tabs.control-sidebar-tabs > li:first-of-type > a, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { + border-left-width: 0; +} +.nav-tabs.control-sidebar-tabs > li > a { + border-radius: 0; +} +.nav-tabs.control-sidebar-tabs > li > a, +.nav-tabs.control-sidebar-tabs > li > a:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; +} +.nav-tabs.control-sidebar-tabs > li > a .icon { + font-size: 16px; +} +.nav-tabs.control-sidebar-tabs > li.active > a, +.nav-tabs.control-sidebar-tabs > li.active > a:hover, +.nav-tabs.control-sidebar-tabs > li.active > a:focus, +.nav-tabs.control-sidebar-tabs > li.active > a:active { + border-top: none; + border-right: none; + border-bottom: none; +} +@media (max-width: 768px) { + .nav-tabs.control-sidebar-tabs { + display: table; + } + .nav-tabs.control-sidebar-tabs > li { + display: table-cell; + } +} +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; +} +.control-sidebar-menu > li > a { + display: block; + padding: 10px 15px; +} +.control-sidebar-menu > li > a:before, +.control-sidebar-menu > li > a:after { + content: " "; + display: table; +} +.control-sidebar-menu > li > a:after { + clear: both; +} +.control-sidebar-menu > li > a > .control-sidebar-subheading { + margin-top: 0; +} +.control-sidebar-menu .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; +} +.control-sidebar-menu .menu-info { + margin-left: 45px; + margin-top: 3px; +} +.control-sidebar-menu .menu-info > .control-sidebar-subheading { + margin: 0; +} +.control-sidebar-menu .menu-info > p { + margin: 0; + font-size: 11px; +} +.control-sidebar-menu .progress { + margin: 0; +} +.control-sidebar-dark { + color: #b8c7ce; +} +.control-sidebar-dark, +.control-sidebar-dark + .control-sidebar-bg { + background: #222d32; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs { + border-bottom: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { + background: #181f23; + color: #b8c7ce; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #141a1d; + border-bottom-color: #141a1d; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { + background: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { + color: #fff; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #222d32; + color: #fff; +} +.control-sidebar-dark .control-sidebar-heading, +.control-sidebar-dark .control-sidebar-subheading { + color: #fff; +} +.control-sidebar-dark .control-sidebar-menu > li > a:hover { + background: #1e282c; +} +.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { + color: #b8c7ce; +} +.control-sidebar-light { + color: #5e5e5e; +} +.control-sidebar-light, +.control-sidebar-light + .control-sidebar-bg { + background: #f9fafc; + border-left: 1px solid #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs { + border-bottom: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { + background: #e8ecf4; + color: #444444; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #d2d6de; + border-bottom-color: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { + background: #eff1f7; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #f9fafc; + color: #111; +} +.control-sidebar-light .control-sidebar-heading, +.control-sidebar-light .control-sidebar-subheading { + color: #111; +} +.control-sidebar-light .control-sidebar-menu { + margin-left: -14px; +} +.control-sidebar-light .control-sidebar-menu > li > a:hover { + background: #f4f4f5; +} +.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { + color: #5e5e5e; +} +/* + * Component: Dropdown menus + * ------------------------- + */ +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; +} +.dropdown-menu > li > a { + color: #777; +} +.dropdown-menu > li > a > .glyphicon, +.dropdown-menu > li > a > .fa, +.dropdown-menu > li > a > .ion { + margin-right: 10px; +} +.dropdown-menu > li > a:hover { + background-color: #e1e3e9; + color: #333; +} +.dropdown-menu > .divider { + background-color: #eee; +} +.navbar-nav > .notifications-menu > .dropdown-menu, +.navbar-nav > .messages-menu > .dropdown-menu, +.navbar-nav > .tasks-menu > .dropdown-menu { + width: 280px; + padding: 0 0 0 0; + margin: 0; + top: 100%; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li, +.navbar-nav > .messages-menu > .dropdown-menu > li, +.navbar-nav > .tasks-menu > .dropdown-menu > li { + position: relative; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.header, +.navbar-nav > .messages-menu > .dropdown-menu > li.header, +.navbar-nav > .tasks-menu > .dropdown-menu > li.header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444 !important; + text-align: center; +} +@media (max-width: 991px) { + .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + background: #fff !important; + color: #444 !important; + } +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { + text-decoration: none; + font-weight: normal; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + display: block; + white-space: nowrap; + /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { + background: #f4f4f4; + text-decoration: none; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + padding: 10px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { + width: 20px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { + margin: 0; + padding: 10px 10px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + content: " "; + display: table; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + clear: both; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + padding: 10px; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { + padding: 0; + margin: 0; +} +.navbar-nav > .user-menu > .dropdown-menu { + border-top-right-radius: 0; + border-top-left-radius: 0; + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; +} +.navbar-nav > .user-menu > .dropdown-menu, +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header { + height: 175px; + padding: 10px; + text-align: center; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + margin-top: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { + display: block; + font-size: 12px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body a { + color: #444 !important; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-body a { + background: #fff !important; + color: #444 !important; + } +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer { + background-color: #f9f9f9; + padding: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { + color: #666666; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { + background-color: #f9f9f9; + } +} +.navbar-nav > .user-menu .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; +} +@media (max-width: 767px) { + .navbar-nav > .user-menu .user-image { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } +} +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + -webkit-animation: flipInX 0.7s both; + -o-animation: flipInX 0.7s both; + animation: flipInX 0.7s both; +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + transform: perspective(400px); + } +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + -webkit-transform: perspective(400px); + } +} +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav > li { + position: relative; +} +.navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 0; + left: auto; +} +@media (max-width: 991px) { + .navbar-custom-menu > .navbar-nav { + float: right; + } + .navbar-custom-menu > .navbar-nav > li { + position: static; + } + .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } +} +/* + * Component: Form + * --------------- + */ +.form-control { + border-radius: 0; + box-shadow: none; + border-color: #d2d6de; +} +.form-control:focus { + border-color: #3c8dbc; + box-shadow: none; +} +.form-control::-moz-placeholder, +.form-control:-ms-input-placeholder, +.form-control::-webkit-input-placeholder { + color: #bbb; + opacity: 1; +} +.form-control:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-group.has-success label { + color: #00a65a; +} +.form-group.has-success .form-control, +.form-group.has-success .input-group-addon { + border-color: #00a65a; + box-shadow: none; +} +.form-group.has-success .help-block { + color: #00a65a; +} +.form-group.has-warning label { + color: #f39c12; +} +.form-group.has-warning .form-control, +.form-group.has-warning .input-group-addon { + border-color: #f39c12; + box-shadow: none; +} +.form-group.has-warning .help-block { + color: #f39c12; +} +.form-group.has-error label { + color: #dd4b39; +} +.form-group.has-error .form-control, +.form-group.has-error .input-group-addon { + border-color: #dd4b39; + box-shadow: none; +} +.form-group.has-error .help-block { + color: #dd4b39; +} +/* Input group */ +.input-group .input-group-addon { + border-radius: 0; + border-color: #d2d6de; + background-color: #fff; +} +/* button groups */ +.btn-group-vertical .btn.btn-flat:first-of-type, +.btn-group-vertical .btn.btn-flat:last-of-type { + border-radius: 0; +} +.icheck > label { + padding-left: 0; +} +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: 34px; +} +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: 46px; +} +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: 30px; +} +/* + * Component: Progress Bar + * ----------------------- + */ +.progress, +.progress > .progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +.progress, +.progress > .progress-bar, +.progress .progress-bar, +.progress > .progress-bar .progress-bar { + border-radius: 1px; +} +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; +} +.progress.sm, +.progress-sm, +.progress.sm .progress-bar, +.progress-sm .progress-bar { + border-radius: 1px; +} +.progress.xs, +.progress-xs { + height: 7px; +} +.progress.xs, +.progress-xs, +.progress.xs .progress-bar, +.progress-xs .progress-bar { + border-radius: 1px; +} +.progress.xxs, +.progress-xxs { + height: 3px; +} +.progress.xxs, +.progress-xxs, +.progress.xxs .progress-bar, +.progress-xxs .progress-bar { + border-radius: 1px; +} +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; +} +.progress.vertical > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; +} +.progress.vertical.sm, +.progress.vertical.progress-sm { + width: 20px; +} +.progress.vertical.xs, +.progress.vertical.progress-xs { + width: 10px; +} +.progress.vertical.xxs, +.progress.vertical.progress-xxs { + width: 3px; +} +.progress-group .progress-text { + font-weight: 600; +} +.progress-group .progress-number { + float: right; +} +/* Remove margins from progress bars when put in a table */ +.table tr > td .progress { + margin: 0; +} +.progress-bar-light-blue, +.progress-bar-primary { + background-color: #3c8dbc; +} +.progress-striped .progress-bar-light-blue, +.progress-striped .progress-bar-primary { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-green, +.progress-bar-success { + background-color: #00a65a; +} +.progress-striped .progress-bar-green, +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-aqua, +.progress-bar-info { + background-color: #00c0ef; +} +.progress-striped .progress-bar-aqua, +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-yellow, +.progress-bar-warning { + background-color: #f39c12; +} +.progress-striped .progress-bar-yellow, +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-red, +.progress-bar-danger { + background-color: #dd4b39; +} +.progress-striped .progress-bar-red, +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +/* + * Component: Small Box + * -------------------- + */ +.small-box { + border-radius: 2px; + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.small-box > .inner { + padding: 10px; +} +.small-box > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; +} +.small-box > .small-box-footer:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); +} +.small-box h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; +} +.small-box p { + font-size: 15px; +} +.small-box p > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; +} +.small-box h3, +.small-box p { + z-index: 5; +} +.small-box .icon { + -webkit-transition: all 0.3s linear; + -o-transition: all 0.3s linear; + transition: all 0.3s linear; + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); +} +.small-box:hover { + text-decoration: none; + color: #f9f9f9; +} +.small-box:hover .icon { + font-size: 95px; +} +@media (max-width: 767px) { + .small-box { + text-align: center; + } + .small-box .icon { + display: none; + } + .small-box p { + font-size: 12px; + } +} +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + border-radius: 3px; + background: #ffffff; + border-top: 3px solid #d2d6de; + margin-bottom: 20px; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.box.box-primary { + border-top-color: #3c8dbc; +} +.box.box-info { + border-top-color: #00c0ef; +} +.box.box-danger { + border-top-color: #dd4b39; +} +.box.box-warning { + border-top-color: #f39c12; +} +.box.box-success { + border-top-color: #00a65a; +} +.box.box-default { + border-top-color: #d2d6de; +} +.box.collapsed-box .box-body, +.box.collapsed-box .box-footer { + display: none; +} +.box .nav-stacked > li { + border-bottom: 1px solid #f4f4f4; + margin: 0; +} +.box .nav-stacked > li:last-of-type { + border-bottom: none; +} +.box.height-control .box-body { + max-height: 300px; + overflow: auto; +} +.box .border-right { + border-right: 1px solid #f4f4f4; +} +.box .border-left { + border-left: 1px solid #f4f4f4; +} +.box.box-solid { + border-top: 0; +} +.box.box-solid > .box-header .btn.btn-default { + background: transparent; +} +.box.box-solid > .box-header .btn:hover, +.box.box-solid > .box-header a:hover { + background: rgba(0, 0, 0, 0.1); +} +.box.box-solid.box-default { + border: 1px solid #d2d6de; +} +.box.box-solid.box-default > .box-header { + color: #444444; + background: #d2d6de; + background-color: #d2d6de; +} +.box.box-solid.box-default > .box-header a, +.box.box-solid.box-default > .box-header .btn { + color: #444444; +} +.box.box-solid.box-primary { + border: 1px solid #3c8dbc; +} +.box.box-solid.box-primary > .box-header { + color: #ffffff; + background: #3c8dbc; + background-color: #3c8dbc; +} +.box.box-solid.box-primary > .box-header a, +.box.box-solid.box-primary > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-info { + border: 1px solid #00c0ef; +} +.box.box-solid.box-info > .box-header { + color: #ffffff; + background: #00c0ef; + background-color: #00c0ef; +} +.box.box-solid.box-info > .box-header a, +.box.box-solid.box-info > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-danger { + border: 1px solid #dd4b39; +} +.box.box-solid.box-danger > .box-header { + color: #ffffff; + background: #dd4b39; + background-color: #dd4b39; +} +.box.box-solid.box-danger > .box-header a, +.box.box-solid.box-danger > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-warning { + border: 1px solid #f39c12; +} +.box.box-solid.box-warning > .box-header { + color: #ffffff; + background: #f39c12; + background-color: #f39c12; +} +.box.box-solid.box-warning > .box-header a, +.box.box-solid.box-warning > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-success { + border: 1px solid #00a65a; +} +.box.box-solid.box-success > .box-header { + color: #ffffff; + background: #00a65a; + background-color: #00a65a; +} +.box.box-solid.box-success > .box-header a, +.box.box-solid.box-success > .box-header .btn { + color: #ffffff; +} +.box.box-solid > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; +} +.box.box-solid[class*='bg'] > .box-header { + color: #fff; +} +.box .box-group > .box { + margin-bottom: 5px; +} +.box .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; +} +.box > .overlay, +.overlay-wrapper > .overlay, +.box > .loading-img, +.overlay-wrapper > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.box .overlay, +.overlay-wrapper .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + border-radius: 3px; +} +.box .overlay > .fa, +.overlay-wrapper .overlay > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; +} +.box .overlay.dark, +.overlay-wrapper .overlay.dark { + background: rgba(0, 0, 0, 0.5); +} +.box-header:before, +.box-body:before, +.box-footer:before, +.box-header:after, +.box-body:after, +.box-footer:after { + content: " "; + display: table; +} +.box-header:after, +.box-body:after, +.box-footer:after { + clear: both; +} +.box-header { + color: #444; + display: block; + padding: 10px; + position: relative; +} +.box-header.with-border { + border-bottom: 1px solid #f4f4f4; +} +.collapsed-box .box-header.with-border { + border-bottom: none; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion, +.box-header .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion { + margin-right: 5px; +} +.box-header > .box-tools { + position: absolute; + right: 10px; + top: 5px; +} +.box-header > .box-tools [data-toggle="tooltip"] { + position: relative; +} +.box-header > .box-tools.pull-right .dropdown-menu { + right: 0; + left: auto; +} +.box-header > .box-tools .dropdown-menu > li > a { + color: #444!important; +} +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: #97a0b3; +} +.open .btn-box-tool, +.btn-box-tool:hover { + color: #606c84; +} +.btn-box-tool.btn:active { + box-shadow: none; +} +.box-body { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + padding: 10px; +} +.no-header .box-body { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.box-body > .table { + margin-bottom: 0; +} +.box-body .fc { + margin-top: 5px; +} +.box-body .full-width-chart { + margin: -19px; +} +.box-body.no-padding .full-width-chart { + margin: -9px; +} +.box-body .box-pane { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; +} +.box-body .box-pane-right { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 0; +} +.box-footer { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-top: 1px solid #f4f4f4; + padding: 10px; + background-color: #ffffff; +} +.chart-legend { + margin: 10px 0; +} +@media (max-width: 991px) { + .chart-legend > li { + float: left; + margin-right: 10px; + } +} +.box-comments { + background: #f7f7f7; +} +.box-comments .box-comment { + padding: 8px 0; + border-bottom: 1px solid #eee; +} +.box-comments .box-comment:before, +.box-comments .box-comment:after { + content: " "; + display: table; +} +.box-comments .box-comment:after { + clear: both; +} +.box-comments .box-comment:last-of-type { + border-bottom: 0; +} +.box-comments .box-comment:first-of-type { + padding-top: 0; +} +.box-comments .box-comment img { + float: left; +} +.box-comments .comment-text { + margin-left: 40px; + color: #555; +} +.box-comments .username { + color: #444; + display: block; + font-weight: 600; +} +.box-comments .text-muted { + font-weight: 400; + font-size: 12px; +} +/* Widget: TODO LIST */ +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; +} +.todo-list > li { + border-radius: 2px; + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; +} +.todo-list > li:last-of-type { + margin-bottom: 0; +} +.todo-list > li > input[type='checkbox'] { + margin: 0 10px 0 5px; +} +.todo-list > li .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; +} +.todo-list > li .label { + margin-left: 10px; + font-size: 9px; +} +.todo-list > li .tools { + display: none; + float: right; + color: #dd4b39; +} +.todo-list > li .tools > .fa, +.todo-list > li .tools > .glyphicon, +.todo-list > li .tools > .ion { + margin-right: 5px; + cursor: pointer; +} +.todo-list > li:hover .tools { + display: inline-block; +} +.todo-list > li.done { + color: #999; +} +.todo-list > li.done .text { + text-decoration: line-through; + font-weight: 500; +} +.todo-list > li.done .label { + background: #d2d6de !important; +} +.todo-list .danger { + border-left-color: #dd4b39; +} +.todo-list .warning { + border-left-color: #f39c12; +} +.todo-list .info { + border-left-color: #00c0ef; +} +.todo-list .success { + border-left-color: #00a65a; +} +.todo-list .primary { + border-left-color: #3c8dbc; +} +.todo-list .handle { + display: inline-block; + cursor: move; + margin: 0 5px; +} +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; +} +.chat .item { + margin-bottom: 10px; +} +.chat .item:before, +.chat .item:after { + content: " "; + display: table; +} +.chat .item:after { + clear: both; +} +.chat .item > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + border-radius: 50%; +} +.chat .item > .online { + border: 2px solid #00a65a; +} +.chat .item > .offline { + border: 2px solid #dd4b39; +} +.chat .item > .message { + margin-left: 55px; + margin-top: -40px; +} +.chat .item > .message > .name { + display: block; + font-weight: 600; +} +.chat .item > .attachment { + border-radius: 3px; + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; +} +.chat .item > .attachment > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; +} +.chat .item > .attachment > p, +.chat .item > .attachment > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; +} +.chat .item > .attachment:before, +.chat .item > .attachment:after { + content: " "; + display: table; +} +.chat .item > .attachment:after { + clear: both; +} +.box-input { + max-width: 200px; +} +.modal .panel-body { + color: #444; +} +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 2px; + margin-bottom: 15px; +} +.info-box small { + font-size: 14px; +} +.info-box .progress { + background: rgba(0, 0, 0, 0.2); + margin: 5px -10px 5px -10px; + height: 2px; +} +.info-box .progress, +.info-box .progress .progress-bar { + border-radius: 0; +} +.info-box .progress .progress-bar { + background: #fff; +} +.info-box-icon { + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0, 0, 0, 0.2); +} +.info-box-icon > img { + max-width: 100%; +} +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.info-box-text { + text-transform: uppercase; +} +.info-box-more { + display: block; +} +.progress-description { + margin: 0; +} +/* + * Component: Timeline + * ------------------- + */ +.timeline { + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; +} +.timeline:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + border-radius: 2px; +} +.timeline > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; +} +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} +.timeline > li:after { + clear: both; +} +.timeline > li > .timeline-item { + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; +} +.timeline > li > .timeline-item > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; +} +.timeline > li > .timeline-item > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid #f4f4f4; + padding: 10px; + font-size: 16px; + line-height: 1.1; +} +.timeline > li > .timeline-item > .timeline-header > a { + font-weight: 600; +} +.timeline > li > .timeline-item > .timeline-body, +.timeline > li > .timeline-item > .timeline-footer { + padding: 10px; +} +.timeline > li > .fa, +.timeline > li > .glyphicon, +.timeline > li > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: #d2d6de; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; +} +.timeline > .time-label > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + border-radius: 4px; +} +.timeline-inverse > li > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + -webkit-box-shadow: none; + box-shadow: none; +} +.timeline-inverse > li > .timeline-item > .timeline-header { + border-bottom-color: #ddd; +} +/* + * Component: Button + * ----------------- + */ +.btn { + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid transparent; +} +.btn.uppercase { + text-transform: uppercase; +} +.btn.btn-flat { + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; +} +.btn:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn:focus { + outline: none; +} +.btn.btn-file { + position: relative; + overflow: hidden; +} +.btn.btn-file > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + opacity: 0; + filter: alpha(opacity=0); + outline: none; + background: white; + cursor: inherit; + display: block; +} +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; +} +.btn-default:hover, +.btn-default:active, +.btn-default.hover { + background-color: #e7e7e7; +} +.btn-primary { + background-color: #3c8dbc; + border-color: #367fa9; +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.hover { + background-color: #367fa9; +} +.btn-success { + background-color: #00a65a; + border-color: #008d4c; +} +.btn-success:hover, +.btn-success:active, +.btn-success.hover { + background-color: #008d4c; +} +.btn-info { + background-color: #00c0ef; + border-color: #00acd6; +} +.btn-info:hover, +.btn-info:active, +.btn-info.hover { + background-color: #00acd6; +} +.btn-danger { + background-color: #dd4b39; + border-color: #d73925; +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.hover { + background-color: #d73925; +} +.btn-warning { + background-color: #f39c12; + border-color: #e08e0b; +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.hover { + background-color: #e08e0b; +} +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; +} +.btn-outline:hover, +.btn-outline:focus, +.btn-outline:active { + color: rgba(255, 255, 255, 0.7); + border-color: rgba(255, 255, 255, 0.7); +} +.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn[class*='bg-']:hover { + -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); + box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); +} +.btn-app { + border-radius: 3px; + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; +} +.btn-app > .fa, +.btn-app > .glyphicon, +.btn-app > .ion { + font-size: 20px; + display: block; +} +.btn-app:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; +} +.btn-app:active, +.btn-app:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-app > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; +} +/* + * Component: Callout + * ------------------ + */ +.callout { + border-radius: 3px; + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; +} +.callout a { + color: #fff; + text-decoration: underline; +} +.callout a:hover { + color: #eee; +} +.callout h4 { + margin-top: 0; + font-weight: 600; +} +.callout p:last-child { + margin-bottom: 0; +} +.callout code, +.callout .highlight { + background-color: #fff; +} +.callout.callout-danger { + border-color: #c23321; +} +.callout.callout-warning { + border-color: #c87f0a; +} +.callout.callout-info { + border-color: #0097bc; +} +.callout.callout-success { + border-color: #00733e; +} +/* + * Component: alert + * ---------------- + */ +.alert { + border-radius: 3px; +} +.alert h4 { + font-weight: 600; +} +.alert .icon { + margin-right: 10px; +} +.alert .close { + color: #000; + opacity: 0.2; + filter: alpha(opacity=20); +} +.alert .close:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.alert a { + color: #fff; + text-decoration: underline; +} +.alert-success { + border-color: #008d4c; +} +.alert-danger, +.alert-error { + border-color: #d73925; +} +.alert-warning { + border-color: #e08e0b; +} +.alert-info { + border-color: #00acd6; +} +/* + * Component: Nav + * -------------- + */ +.nav > li > a:hover, +.nav > li > a:active, +.nav > li > a:focus { + color: #444; + background: #f7f7f7; +} +/* NAV PILLS */ +.nav-pills > li > a { + border-radius: 0; + border-top: 3px solid transparent; + color: #444; +} +.nav-pills > li > a > .fa, +.nav-pills > li > a > .glyphicon, +.nav-pills > li > a > .ion { + margin-right: 5px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + border-top-color: #3c8dbc; +} +.nav-pills > li.active > a { + font-weight: 600; +} +/* NAV STACKED */ +.nav-stacked > li > a { + border-radius: 0; + border-top: 0; + border-left: 3px solid transparent; + color: #444; +} +.nav-stacked > li.active > a, +.nav-stacked > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: #3c8dbc; +} +.nav-stacked > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; +} +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; +} +.nav-tabs-custom > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.nav-tabs-custom > .nav-tabs > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + margin-right: 5px; +} +.nav-tabs-custom > .nav-tabs > li.disabled > a { + color: #777; +} +.nav-tabs-custom > .nav-tabs > li > a { + color: #444; + border-radius: 0; +} +.nav-tabs-custom > .nav-tabs > li > a.text-muted { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li > a, +.nav-tabs-custom > .nav-tabs > li > a:hover { + background: transparent; + margin: 0; +} +.nav-tabs-custom > .nav-tabs > li > a:hover { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { + border-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.active { + border-top-color: #3c8dbc; +} +.nav-tabs-custom > .nav-tabs > li.active > a, +.nav-tabs-custom > .nav-tabs > li.active:hover > a { + background-color: #fff; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.active > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type { + margin-left: 0; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { + border-left-color: transparent; +} +.nav-tabs-custom > .nav-tabs.pull-right { + float: none !important; +} +.nav-tabs-custom > .nav-tabs.pull-right > li { + float: right; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { + margin-right: 0; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { + border-left-width: 1px; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { + border-left-color: #f4f4f4; + border-right-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.header > .fa, +.nav-tabs-custom > .nav-tabs > li.header > .glyphicon, +.nav-tabs-custom > .nav-tabs > li.header > .ion { + margin-right: 5px; +} +.nav-tabs-custom > .tab-content { + background: #fff; + padding: 10px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.nav-tabs-custom .dropdown.open > a:active, +.nav-tabs-custom .dropdown.open > a:focus { + background: transparent; + color: #999; +} +.nav-tabs-custom.tab-primary > .nav-tabs > li.active { + border-top-color: #3c8dbc; +} +.nav-tabs-custom.tab-info > .nav-tabs > li.active { + border-top-color: #00c0ef; +} +.nav-tabs-custom.tab-danger > .nav-tabs > li.active { + border-top-color: #dd4b39; +} +.nav-tabs-custom.tab-warning > .nav-tabs > li.active { + border-top-color: #f39c12; +} +.nav-tabs-custom.tab-success > .nav-tabs > li.active { + border-top-color: #00a65a; +} +.nav-tabs-custom.tab-default > .nav-tabs > li.active { + border-top-color: #d2d6de; +} +/* PAGINATION */ +.pagination > li > a { + background: #fafafa; + color: #666; +} +.pagination.pagination-flat > li > a { + border-radius: 0 !important; +} +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; +} +.products-list > .item { + border-radius: 3px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + padding: 10px 0; + background: #fff; +} +.products-list > .item:before, +.products-list > .item:after { + content: " "; + display: table; +} +.products-list > .item:after { + clear: both; +} +.products-list .product-img { + float: left; +} +.products-list .product-img img { + width: 50px; + height: 50px; +} +.products-list .product-info { + margin-left: 60px; +} +.products-list .product-title { + font-weight: 600; +} +.products-list .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.product-list-in-box > .item { + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; + border-bottom: 1px solid #f4f4f4; +} +.product-list-in-box > .item:last-of-type { + border-bottom-width: 0; +} +/* + * Component: Table + * ---------------- + */ +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + border-top: 1px solid #f4f4f4; +} +.table > thead > tr > th { + border-bottom: 2px solid #f4f4f4; +} +.table tr td .progress { + margin-top: 5px; +} +.table-bordered { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table.no-border, +.table.no-border td, +.table.no-border th { + border: 0; +} +/* .text-center in tables */ +table.text-center, +table.text-center td, +table.text-center th { + text-align: center; +} +.table.align th { + text-align: left; +} +.table.align td { + text-align: right; +} +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: #d2d6de; + color: #444; +} +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat .box-body { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + position: relative; + overflow-x: hidden; + padding: 0; +} +.direct-chat.chat-pane-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-messages { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} +.direct-chat-msg, +.direct-chat-text { + display: block; +} +.direct-chat-msg { + margin-bottom: 10px; +} +.direct-chat-msg:before, +.direct-chat-msg:after { + content: " "; + display: table; +} +.direct-chat-msg:after { + clear: both; +} +.direct-chat-messages, +.direct-chat-contacts { + -webkit-transition: -webkit-transform 0.5s ease-in-out; + -moz-transition: -moz-transform 0.5s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out; + transition: transform 0.5s ease-in-out; +} +.direct-chat-text { + border-radius: 5px; + position: relative; + padding: 5px 10px; + background: #d2d6de; + border: 1px solid #d2d6de; + margin: 5px 0 0 50px; + color: #444444; +} +.direct-chat-text:after, +.direct-chat-text:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: #d2d6de; + content: ' '; + height: 0; + width: 0; + pointer-events: none; +} +.direct-chat-text:after { + border-width: 5px; + margin-top: -5px; +} +.direct-chat-text:before { + border-width: 6px; + margin-top: -6px; +} +.right .direct-chat-text { + margin-right: 50px; + margin-left: 0; +} +.right .direct-chat-text:after, +.right .direct-chat-text:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: #d2d6de; +} +.direct-chat-img { + border-radius: 50%; + float: left; + width: 40px; + height: 40px; +} +.right .direct-chat-img { + float: right; +} +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} +.direct-chat-name { + font-weight: 600; +} +.direct-chat-timestamp { + color: #999; +} +.direct-chat-contacts-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-contacts { + -webkit-transform: translate(101%, 0); + -ms-transform: translate(101%, 0); + -o-transform: translate(101%, 0); + transform: translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} +.contacts-list > li { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 10px; + margin: 0; +} +.contacts-list > li:before, +.contacts-list > li:after { + content: " "; + display: table; +} +.contacts-list > li:after { + clear: both; +} +.contacts-list > li:last-of-type { + border-bottom: none; +} +.contacts-list-img { + border-radius: 50%; + width: 40px; + float: left; +} +.contacts-list-info { + margin-left: 45px; + color: #fff; +} +.contacts-list-name, +.contacts-list-status { + display: block; +} +.contacts-list-name { + font-weight: 600; +} +.contacts-list-status { + font-size: 12px; +} +.contacts-list-date { + color: #aaa; + font-weight: normal; +} +.contacts-list-msg { + color: #999; +} +.direct-chat-danger .right > .direct-chat-text { + background: #dd4b39; + border-color: #dd4b39; + color: #ffffff; +} +.direct-chat-danger .right > .direct-chat-text:after, +.direct-chat-danger .right > .direct-chat-text:before { + border-left-color: #dd4b39; +} +.direct-chat-primary .right > .direct-chat-text { + background: #3c8dbc; + border-color: #3c8dbc; + color: #ffffff; +} +.direct-chat-primary .right > .direct-chat-text:after, +.direct-chat-primary .right > .direct-chat-text:before { + border-left-color: #3c8dbc; +} +.direct-chat-warning .right > .direct-chat-text { + background: #f39c12; + border-color: #f39c12; + color: #ffffff; +} +.direct-chat-warning .right > .direct-chat-text:after, +.direct-chat-warning .right > .direct-chat-text:before { + border-left-color: #f39c12; +} +.direct-chat-info .right > .direct-chat-text { + background: #00c0ef; + border-color: #00c0ef; + color: #ffffff; +} +.direct-chat-info .right > .direct-chat-text:after, +.direct-chat-info .right > .direct-chat-text:before { + border-left-color: #00c0ef; +} +.direct-chat-success .right > .direct-chat-text { + background: #00a65a; + border-color: #00a65a; + color: #ffffff; +} +.direct-chat-success .right > .direct-chat-text:after, +.direct-chat-success .right > .direct-chat-text:before { + border-left-color: #00a65a; +} +/* + * Component: Users List + * --------------------- + */ +.users-list > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; +} +.users-list > li img { + border-radius: 50%; + max-width: 100%; + height: auto; +} +.users-list > li > a:hover, +.users-list > li > a:hover .users-list-name { + color: #999; +} +.users-list-name, +.users-list-date { + display: block; +} +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.users-list-date { + color: #999; + font-size: 12px; +} +/* + * Component: Carousel + * ------------------- + */ +.carousel-control.left, +.carousel-control.right { + background-image: none; +} +.carousel-control > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; +} +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0, 0, 0, 0.3); +} +.modal-content { + border-radius: 0; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + border: 0; +} +@media (min-width: 768px) { + .modal-content { + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + } +} +.modal-header { + border-bottom-color: #f4f4f4; +} +.modal-footer { + border-top-color: #f4f4f4; +} +.modal-primary .modal-header, +.modal-primary .modal-footer { + border-color: #307095; +} +.modal-warning .modal-header, +.modal-warning .modal-footer { + border-color: #c87f0a; +} +.modal-info .modal-header, +.modal-info .modal-footer { + border-color: #0097bc; +} +.modal-success .modal-header, +.modal-success .modal-footer { + border-color: #00733e; +} +.modal-danger .modal-header, +.modal-danger .modal-footer { + border-color: #c23321; +} +/* + * Component: Social Widgets + * ------------------------- + */ +.box-widget { + border: none; + position: relative; +} +.widget-user .widget-user-header { + padding: 20px; + height: 120px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} +.widget-user .widget-user-desc { + margin-top: 0; +} +.widget-user .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; +} +.widget-user .widget-user-image > img { + width: 90px; + height: auto; + border: 3px solid #fff; +} +.widget-user .box-footer { + padding-top: 30px; +} +.widget-user-2 .widget-user-header { + padding: 20px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user-2 .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; +} +.widget-user-2 .widget-user-desc { + margin-top: 0; +} +.widget-user-2 .widget-user-username, +.widget-user-2 .widget-user-desc { + margin-left: 75px; +} +.widget-user-2 .widget-user-image > img { + width: 65px; + height: auto; + float: left; +} +.treeview-menu { + display: none; + list-style: none; + padding: 0; + margin: 0; + padding-left: 5px; +} +.treeview-menu .treeview-menu { + padding-left: 20px; +} +.treeview-menu > li { + margin: 0; +} +.treeview-menu > li > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; +} +.treeview-menu > li > a > .fa, +.treeview-menu > li > a > .glyphicon, +.treeview-menu > li > a > .ion { + width: 20px; +} +.treeview-menu > li > a > .pull-right-container > .fa-angle-left, +.treeview-menu > li > a > .pull-right-container > .fa-angle-down, +.treeview-menu > li > a > .fa-angle-left, +.treeview-menu > li > a > .fa-angle-down { + width: auto; +} +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages > .table { + margin: 0; +} +.mailbox-controls { + padding: 5px; +} +.mailbox-controls.with-border { + border-bottom: 1px solid #f4f4f4; +} +.mailbox-read-info { + border-bottom: 1px solid #f4f4f4; + padding: 10px; +} +.mailbox-read-info h3 { + font-size: 20px; + margin: 0; +} +.mailbox-read-info h5 { + margin: 0; + padding: 5px 0 0 0; +} +.mailbox-read-time { + color: #999; + font-size: 13px; +} +.mailbox-read-message { + padding: 10px; +} +.mailbox-attachments li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; +} +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; +} +.mailbox-attachment-icon.has-img { + padding: 0; +} +.mailbox-attachment-icon.has-img > img { + max-width: 100%; + height: auto; +} +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE TAG */ +.lockscreen { + background: #d2d6de; +} +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.lockscreen-logo a { + color: #444; +} +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} +/* Will contain the image and the sign in form */ +.lockscreen-item { + border-radius: 4px; + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} +/* User image */ +.lockscreen-image { + border-radius: 50%; + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; +} +.lockscreen-image > img { + border-radius: 50%; + width: 70px; + height: 70px; +} +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; +} +.lockscreen-credentials .form-control { + border: 0; +} +.lockscreen-credentials .btn { + background-color: #fff; + border: 0; + padding: 0 10px; +} +.lockscreen-footer { + margin-top: 10px; +} +/* + * Page: Login & Register + * ---------------------- + */ +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.login-logo a, +.register-logo a { + color: #444; +} +.login-page, +.register-page { + background: #d2d6de; +} +.login-box, +.register-box { + width: 360px; + margin: 7% auto; +} +@media (max-width: 768px) { + .login-box, + .register-box { + width: 90%; + margin-top: 20px; + } +} +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; +} +.login-box-body .form-control-feedback, +.register-box-body .form-control-feedback { + color: #777; +} +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} +.social-auth-links { + margin: 10px 0; +} +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; +} +@media (max-width: 991px) { + .error-page { + width: 100%; + } +} +.error-page > .headline { + float: left; + font-size: 100px; + font-weight: 300; +} +@media (max-width: 991px) { + .error-page > .headline { + float: none; + text-align: center; + } +} +.error-page > .error-content { + margin-left: 190px; + display: block; +} +@media (max-width: 991px) { + .error-page > .error-content { + margin-left: 0; + } +} +.error-page > .error-content > h3 { + font-weight: 300; + font-size: 25px; +} +@media (max-width: 991px) { + .error-page > .error-content > h3 { + text-align: center; + } +} +/* + * Page: Invoice + * ------------- + */ +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} +.invoice-title { + margin-top: 0; +} +/* + * Page: Profile + * ------------- + */ +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid #d2d6de; +} +.profile-username { + font-size: 21px; + margin-top: 5px; +} +.post { + border-bottom: 1px solid #d2d6de; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; +} +.post:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; +} +.post .user-block { + margin-bottom: 15px; +} +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ +.btn-social { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.btn-social > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social.btn-lg { + padding-left: 61px; +} +.btn-social.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social.btn-sm { + padding-left: 38px; +} +.btn-social.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social.btn-xs { + padding-left: 30px; +} +.btn-social.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + height: 34px; + width: 34px; + padding: 0; +} +.btn-social-icon > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social-icon.btn-lg { + padding-left: 61px; +} +.btn-social-icon.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social-icon.btn-sm { + padding-left: 38px; +} +.btn-social-icon.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social-icon.btn-xs { + padding-left: 30px; +} +.btn-social-icon.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon > :first-child { + border: none; + text-align: center; + width: 100%; +} +.btn-social-icon.btn-lg { + height: 45px; + width: 45px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-sm { + height: 30px; + width: 30px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-xs { + height: 22px; + width: 22px; + padding-left: 0; + padding-right: 0; +} +.btn-adn { + color: #ffffff; + background-color: #d87a68; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:focus, +.btn-adn.focus { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:hover { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + background-image: none; +} +.btn-adn .badge { + color: #d87a68; + background-color: #ffffff; +} +.btn-bitbucket { + color: #ffffff; + background-color: #205081; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:focus, +.btn-bitbucket.focus { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:hover { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + background-image: none; +} +.btn-bitbucket .badge { + color: #205081; + background-color: #ffffff; +} +.btn-dropbox { + color: #ffffff; + background-color: #1087dd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:focus, +.btn-dropbox.focus { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:hover { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + background-image: none; +} +.btn-dropbox .badge { + color: #1087dd; + background-color: #ffffff; +} +.btn-facebook { + color: #ffffff; + background-color: #3b5998; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:focus, +.btn-facebook.focus { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:hover { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + background-image: none; +} +.btn-facebook .badge { + color: #3b5998; + background-color: #ffffff; +} +.btn-flickr { + color: #ffffff; + background-color: #ff0084; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:focus, +.btn-flickr.focus { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:hover { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + background-image: none; +} +.btn-flickr .badge { + color: #ff0084; + background-color: #ffffff; +} +.btn-foursquare { + color: #ffffff; + background-color: #f94877; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:focus, +.btn-foursquare.focus { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:hover { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + background-image: none; +} +.btn-foursquare .badge { + color: #f94877; + background-color: #ffffff; +} +.btn-github { + color: #ffffff; + background-color: #444444; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:focus, +.btn-github.focus { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:hover { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + background-image: none; +} +.btn-github .badge { + color: #444444; + background-color: #ffffff; +} +.btn-google { + color: #ffffff; + background-color: #dd4b39; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:focus, +.btn-google.focus { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:hover { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + background-image: none; +} +.btn-google .badge { + color: #dd4b39; + background-color: #ffffff; +} +.btn-instagram { + color: #ffffff; + background-color: #3f729b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:focus, +.btn-instagram.focus { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:hover { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + background-image: none; +} +.btn-instagram .badge { + color: #3f729b; + background-color: #ffffff; +} +.btn-linkedin { + color: #ffffff; + background-color: #007bb6; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:focus, +.btn-linkedin.focus { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:hover { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + background-image: none; +} +.btn-linkedin .badge { + color: #007bb6; + background-color: #ffffff; +} +.btn-microsoft { + color: #ffffff; + background-color: #2672ec; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:focus, +.btn-microsoft.focus { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:hover { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + background-image: none; +} +.btn-microsoft .badge { + color: #2672ec; + background-color: #ffffff; +} +.btn-openid { + color: #ffffff; + background-color: #f7931e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:focus, +.btn-openid.focus { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:hover { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + background-image: none; +} +.btn-openid .badge { + color: #f7931e; + background-color: #ffffff; +} +.btn-pinterest { + color: #ffffff; + background-color: #cb2027; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:focus, +.btn-pinterest.focus { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:hover { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + background-image: none; +} +.btn-pinterest .badge { + color: #cb2027; + background-color: #ffffff; +} +.btn-reddit { + color: #000000; + background-color: #eff7ff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:focus, +.btn-reddit.focus { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:hover { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + background-image: none; +} +.btn-reddit .badge { + color: #eff7ff; + background-color: #000000; +} +.btn-soundcloud { + color: #ffffff; + background-color: #ff5500; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:focus, +.btn-soundcloud.focus { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:hover { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + background-image: none; +} +.btn-soundcloud .badge { + color: #ff5500; + background-color: #ffffff; +} +.btn-tumblr { + color: #ffffff; + background-color: #2c4762; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:focus, +.btn-tumblr.focus { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:hover { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + background-image: none; +} +.btn-tumblr .badge { + color: #2c4762; + background-color: #ffffff; +} +.btn-twitter { + color: #ffffff; + background-color: #55acee; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:focus, +.btn-twitter.focus { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:hover { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + background-image: none; +} +.btn-twitter .badge { + color: #55acee; + background-color: #ffffff; +} +.btn-vimeo { + color: #ffffff; + background-color: #1ab7ea; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:focus, +.btn-vimeo.focus { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:hover { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + background-image: none; +} +.btn-vimeo .badge { + color: #1ab7ea; + background-color: #ffffff; +} +.btn-vk { + color: #ffffff; + background-color: #587ea3; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:focus, +.btn-vk.focus { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:hover { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + background-image: none; +} +.btn-vk .badge { + color: #587ea3; + background-color: #ffffff; +} +.btn-yahoo { + color: #ffffff; + background-color: #720e9e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:focus, +.btn-yahoo.focus { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:hover { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + background-image: none; +} +.btn-yahoo .badge { + color: #720e9e; + background-color: #ffffff; +} +/* + * Plugin: Full Calendar + * --------------------- + */ +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; +} +.fc-button:hover, +.fc-button:active, +.fc-button.hover { + background-color: #e9e9e9; +} +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} +.fc-header-right { + padding-right: 10px; +} +.fc-header-left { + padding-left: 10px; +} +.fc-widget-header { + background: #fafafa; +} +.fc-grid { + width: 100%; + border: 0; +} +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} +.fc-toolbar { + padding: 10px; + margin: 0; +} +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; +} +.fc-color-picker > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; +} +.fc-color-picker > li .fa { + -webkit-transition: -webkit-transform linear 0.3s; + -moz-transition: -moz-transform linear 0.3s; + -o-transition: -o-transform linear 0.3s; + transition: transform linear 0.3s; +} +.fc-color-picker > li .fa:hover { + -webkit-transform: rotate(30deg); + -ms-transform: rotate(30deg); + -o-transform: rotate(30deg); + transform: rotate(30deg); +} +#add-new-event { + -webkit-transition: all linear 0.3s; + -o-transition: all linear 0.3s; + transition: all linear 0.3s; +} +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + cursor: move; +} +.external-event:hover { + box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); +} +/* + * Plugin: Select2 + * --------------- + */ +.select2-container--default.select2-container--focus, +.select2-selection.select2-container--focus, +.select2-container--default:focus, +.select2-selection:focus, +.select2-container--default:active, +.select2-selection:active { + outline: none; +} +.select2-container--default .select2-selection--single, +.select2-selection .select2-selection--single { + border: 1px solid #d2d6de; + border-radius: 0; + padding: 6px 12px; + height: 34px; +} +.select2-container--default.select2-container--open { + border-color: #3c8dbc; +} +.select2-dropdown { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #3c8dbc; + color: white; +} +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} +.select2-dropdown .select2-search__field, +.select2-search--inline .select2-search__field { + border: 1px solid #d2d6de; +} +.select2-dropdown .select2-search__field:focus, +.select2-search--inline .select2-search__field:focus { + outline: none; + border: 1px solid #3c8dbc; +} +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} +.select2-container--default .select2-results__option[aria-selected=true], +.select2-container--default .select2-results__option[aria-selected=true]:hover { + color: #444; +} +.select2-container--default .select2-selection--multiple { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-selection--multiple:focus { + border-color: #3c8dbc; +} +.select2-container--default.select2-container--focus .select2-selection--multiple { + border-color: #d2d6de; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #3c8dbc; + border-color: #367fa9; + padding: 1px 10px; + color: #fff; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255, 255, 255, 0.7); +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #fff; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} +/* + * General: Miscellaneous + * ---------------------- + */ +.pad { + padding: 10px; +} +.margin { + margin: 10px; +} +.margin-bottom { + margin-bottom: 20px; +} +.margin-bottom-none { + margin-bottom: 0; +} +.margin-r-5 { + margin-right: 5px; +} +.inline { + display: inline; +} +.description-block { + display: block; + margin: 10px 0; + text-align: center; +} +.description-block.margin-bottom { + margin-bottom: 25px; +} +.description-block > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; +} +.description-block > .description-text { + text-transform: uppercase; +} +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange, +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active, +.callout.callout-danger, +.callout.callout-warning, +.callout.callout-info, +.callout.callout-success, +.alert-success, +.alert-danger, +.alert-error, +.alert-warning, +.alert-info, +.label-danger, +.label-info, +.label-warning, +.label-primary, +.label-success, +.modal-primary .modal-body, +.modal-primary .modal-header, +.modal-primary .modal-footer, +.modal-warning .modal-body, +.modal-warning .modal-header, +.modal-warning .modal-footer, +.modal-info .modal-body, +.modal-info .modal-header, +.modal-info .modal-footer, +.modal-success .modal-body, +.modal-success .modal-header, +.modal-success .modal-footer, +.modal-danger .modal-body, +.modal-danger .modal-header, +.modal-danger .modal-footer { + color: #fff !important; +} +.bg-gray { + color: #000; + background-color: #d2d6de !important; +} +.bg-gray-light { + background-color: #f7f7f7; +} +.bg-black { + background-color: #111111 !important; +} +.bg-red, +.callout.callout-danger, +.alert-danger, +.alert-error, +.label-danger, +.modal-danger .modal-body { + background-color: #dd4b39 !important; +} +.bg-yellow, +.callout.callout-warning, +.alert-warning, +.label-warning, +.modal-warning .modal-body { + background-color: #f39c12 !important; +} +.bg-aqua, +.callout.callout-info, +.alert-info, +.label-info, +.modal-info .modal-body { + background-color: #00c0ef !important; +} +.bg-blue { + background-color: #0073b7 !important; +} +.bg-light-blue, +.label-primary, +.modal-primary .modal-body { + background-color: #3c8dbc !important; +} +.bg-green, +.callout.callout-success, +.alert-success, +.label-success, +.modal-success .modal-body { + background-color: #00a65a !important; +} +.bg-navy { + background-color: #001f3f !important; +} +.bg-teal { + background-color: #39cccc !important; +} +.bg-olive { + background-color: #3d9970 !important; +} +.bg-lime { + background-color: #01ff70 !important; +} +.bg-orange { + background-color: #ff851b !important; +} +.bg-fuchsia { + background-color: #f012be !important; +} +.bg-purple { + background-color: #605ca8 !important; +} +.bg-maroon { + background-color: #d81b60 !important; +} +.bg-gray-active { + color: #000; + background-color: #b5bbc8 !important; +} +.bg-black-active { + background-color: #000000 !important; +} +.bg-red-active, +.modal-danger .modal-header, +.modal-danger .modal-footer { + background-color: #d33724 !important; +} +.bg-yellow-active, +.modal-warning .modal-header, +.modal-warning .modal-footer { + background-color: #db8b0b !important; +} +.bg-aqua-active, +.modal-info .modal-header, +.modal-info .modal-footer { + background-color: #00a7d0 !important; +} +.bg-blue-active { + background-color: #005384 !important; +} +.bg-light-blue-active, +.modal-primary .modal-header, +.modal-primary .modal-footer { + background-color: #357ca5 !important; +} +.bg-green-active, +.modal-success .modal-header, +.modal-success .modal-footer { + background-color: #008d4c !important; +} +.bg-navy-active { + background-color: #001a35 !important; +} +.bg-teal-active { + background-color: #30bbbb !important; +} +.bg-olive-active { + background-color: #368763 !important; +} +.bg-lime-active { + background-color: #00e765 !important; +} +.bg-orange-active { + background-color: #ff7701 !important; +} +.bg-fuchsia-active { + background-color: #db0ead !important; +} +.bg-purple-active { + background-color: #555299 !important; +} +.bg-maroon-active { + background-color: #ca195a !important; +} +[class^="bg-"].disabled { + opacity: 0.65; + filter: alpha(opacity=65); +} +.text-red { + color: #dd4b39 !important; +} +.text-yellow { + color: #f39c12 !important; +} +.text-aqua { + color: #00c0ef !important; +} +.text-blue { + color: #0073b7 !important; +} +.text-black { + color: #111111 !important; +} +.text-light-blue { + color: #3c8dbc !important; +} +.text-green { + color: #00a65a !important; +} +.text-gray { + color: #d2d6de !important; +} +.text-navy { + color: #001f3f !important; +} +.text-teal { + color: #39cccc !important; +} +.text-olive { + color: #3d9970 !important; +} +.text-lime { + color: #01ff70 !important; +} +.text-orange { + color: #ff851b !important; +} +.text-fuchsia { + color: #f012be !important; +} +.text-purple { + color: #605ca8 !important; +} +.text-maroon { + color: #d81b60 !important; +} +.link-muted { + color: #7a869d; +} +.link-muted:hover, +.link-muted:focus { + color: #606c84; +} +.link-black { + color: #666; +} +.link-black:hover, +.link-black:focus { + color: #999; +} +.hide { + display: none !important; +} +.no-border { + border: 0 !important; +} +.no-padding { + padding: 0 !important; +} +.no-margin { + margin: 0 !important; +} +.no-shadow { + box-shadow: none !important; +} +.list-unstyled, +.chart-legend, +.contacts-list, +.users-list, +.mailbox-attachments { + list-style: none; + margin: 0; + padding: 0; +} +.list-group-unbordered > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} +.flat { + border-radius: 0 !important; +} +.text-bold, +.text-bold.table td, +.text-bold.table th { + font-weight: 700; +} +.text-sm { + font-size: 12px; +} +.jqstooltip { + padding: 5px !important; + width: auto !important; + height: auto !important; +} +.bg-teal-gradient { + background: #39cccc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important; + background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important; + background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important; + background: -o-linear-gradient(#7adddd, #39cccc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important; + color: #fff; +} +.bg-light-blue-gradient { + background: #3c8dbc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important; + background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important; + background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important; + background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; + color: #fff; +} +.bg-blue-gradient { + background: #0073b7 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important; + background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important; + background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important; + background: -o-linear-gradient(#0089db, #0073b7) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; + color: #fff; +} +.bg-aqua-gradient { + background: #00c0ef !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important; + background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important; + background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important; + background: -o-linear-gradient(#14d1ff, #00c0ef) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; + color: #fff; +} +.bg-yellow-gradient { + background: #f39c12 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important; + background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important; + background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important; + background: -o-linear-gradient(#f7bc60, #f39c12) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; + color: #fff; +} +.bg-purple-gradient { + background: #605ca8 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important; + background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important; + background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important; + background: -o-linear-gradient(#9491c4, #605ca8) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; + color: #fff; +} +.bg-green-gradient { + background: #00a65a !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important; + background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important; + background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important; + background: -o-linear-gradient(#00ca6d, #00a65a) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; + color: #fff; +} +.bg-red-gradient { + background: #dd4b39 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important; + background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important; + background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important; + background: -o-linear-gradient(#e47365, #dd4b39) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; + color: #fff; +} +.bg-black-gradient { + background: #111111 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important; + background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important; + background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important; + background: -o-linear-gradient(#2b2b2b, #111111) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important; + color: #fff; +} +.bg-maroon-gradient { + background: #d81b60 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important; + background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important; + background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important; + background: -o-linear-gradient(#e73f7c, #d81b60) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important; + color: #fff; +} +.description-block .description-icon { + font-size: 16px; +} +.no-pad-top { + padding-top: 0; +} +.position-static { + position: static !important; +} +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} +.list-seperator { + height: 1px; + background: #f4f4f4; + margin: 15px 0 9px 0; +} +.list-link > a { + padding: 4px; + color: #777; +} +.list-link > a:hover { + color: #222; +} +.font-light { + font-weight: 300; +} +.user-block:before, +.user-block:after { + content: " "; + display: table; +} +.user-block:after { + clear: both; +} +.user-block img { + width: 40px; + height: 40px; + float: left; +} +.user-block .username, +.user-block .description, +.user-block .comment { + display: block; + margin-left: 50px; +} +.user-block .username { + font-size: 16px; + font-weight: 600; +} +.user-block .description { + color: #999; + font-size: 13px; +} +.user-block.user-block-sm .username, +.user-block.user-block-sm .description, +.user-block.user-block-sm .comment { + margin-left: 40px; +} +.user-block.user-block-sm .username { + font-size: 14px; +} +.img-sm, +.img-md, +.img-lg, +.box-comments .box-comment img, +.user-block.user-block-sm img { + float: left; +} +.img-sm, +.box-comments .box-comment img, +.user-block.user-block-sm img { + width: 30px !important; + height: 30px !important; +} +.img-sm + .img-push { + margin-left: 40px; +} +.img-md { + width: 60px; + height: 60px; +} +.img-md + .img-push { + margin-left: 70px; +} +.img-lg { + width: 100px; + height: 100px; +} +.img-lg + .img-push { + margin-left: 110px; +} +.img-bordered { + border: 3px solid #d2d6de; + padding: 3px; +} +.img-bordered-sm { + border: 2px solid #d2d6de; + padding: 2px; +} +.attachment-block { + border: 1px solid #f4f4f4; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; +} +.attachment-block .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; +} +.attachment-block .attachment-pushed { + margin-left: 110px; +} +.attachment-block .attachment-heading { + margin: 0; +} +.attachment-block .attachment-text { + color: #555; +} +.connectedSortable { + min-height: 100px; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} +.full-opacity-hover { + opacity: 0.65; + filter: alpha(opacity=65); +} +.full-opacity-hover:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.chart { + position: relative; + overflow: hidden; + width: 100%; +} +.chart svg, +.chart canvas { + width: 100% !important; +} +/* + * Misc: print + * ----------- + */ +@media print { + .no-print, + .main-sidebar, + .left-side, + .main-header, + .content-header { + display: none !important; + } + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0 !important; + min-height: 0 !important; + -webkit-transform: translate(0, 0) !important; + -ms-transform: translate(0, 0) !important; + -o-transform: translate(0, 0) !important; + transform: translate(0, 0) !important; + } + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0 !important; + } + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + .invoice-col { + float: left; + width: 33.3333333%; + } + .table-responsive { + overflow: auto; + } + .table-responsive > .table tr th, + .table-responsive > .table tr td { + white-space: normal !important; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.min.css new file mode 100755 index 00000000..3e1e6b13 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.min.css @@ -0,0 +1,7 @@ +/*! + * AdminLTE v2.3.12 + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information + */html,body{height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative;overflow-x:hidden;overflow-y:auto}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .right-side,.hold-transition .main-footer,.hold-transition .main-sidebar,.hold-transition .left-side,.hold-transition .main-header .navbar,.hold-transition .main-header .logo,.hold-transition .menu-open .fa-angle-left{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none !important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px !important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px !important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none !important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block !important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative !important;float:right;width:auto !important;left:180px !important;top:-22px !important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-expanded-on-hover .main-footer,.sidebar-expanded-on-hover .content-wrapper{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{box-shadow:3px 0 8px rgba(0,0,0,0.125)}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444 !important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff !important;color:#444 !important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none !important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.pull-right-container>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.fa-angle-down{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{box-shadow:none !important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px !important;width:auto !important;height:auto !important}.bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static !important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px !important;height:30px !important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100% !important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none !important}.content-wrapper,.right-side,.main-footer{margin-left:0 !important;min-height:0 !important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0 !important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal !important}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/adminlte.css.map b/hera-admin/src/main/resources/static/adminlte/dist/css/adminlte.css.map new file mode 100755 index 00000000..ca4bb3b9 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/adminlte.css.map @@ -0,0 +1,140 @@ +{ + "version": 3, + "file": "adminlte.css", + "sources": [ + "../../build/scss/AdminLTE.scss", + "../../build/scss/_bootstrap_variables.scss", + "../../bower_components/bootstrap/scss/bootstrap.scss", + "../../bower_components/bootstrap/scss/_variables.scss", + "../../bower_components/bootstrap/scss/_mixins.scss", + "../../bower_components/bootstrap/scss/mixins/_breakpoints.scss", + "../../bower_components/bootstrap/scss/mixins/_hover.scss", + "../../bower_components/bootstrap/scss/mixins/_image.scss", + "../../bower_components/bootstrap/scss/mixins/_badge.scss", + "../../bower_components/bootstrap/scss/mixins/_resize.scss", + "../../bower_components/bootstrap/scss/mixins/_screen-reader.scss", + "../../bower_components/bootstrap/scss/mixins/_size.scss", + "../../bower_components/bootstrap/scss/mixins/_reset-text.scss", + "../../bower_components/bootstrap/scss/mixins/_text-emphasis.scss", + "../../bower_components/bootstrap/scss/mixins/_text-hide.scss", + "../../bower_components/bootstrap/scss/mixins/_text-truncate.scss", + "../../bower_components/bootstrap/scss/mixins/_transforms.scss", + "../../bower_components/bootstrap/scss/mixins/_visibility.scss", + "../../bower_components/bootstrap/scss/mixins/_alert.scss", + "../../bower_components/bootstrap/scss/mixins/_buttons.scss", + "../../bower_components/bootstrap/scss/mixins/_cards.scss", + "../../bower_components/bootstrap/scss/mixins/_pagination.scss", + "../../bower_components/bootstrap/scss/mixins/_lists.scss", + "../../bower_components/bootstrap/scss/mixins/_list-group.scss", + "../../bower_components/bootstrap/scss/mixins/_nav-divider.scss", + "../../bower_components/bootstrap/scss/mixins/_forms.scss", + "../../bower_components/bootstrap/scss/mixins/_table-row.scss", + "../../bower_components/bootstrap/scss/mixins/_background-variant.scss", + "../../bower_components/bootstrap/scss/mixins/_border-radius.scss", + "../../bower_components/bootstrap/scss/mixins/_gradients.scss", + "../../bower_components/bootstrap/scss/mixins/_clearfix.scss", + "../../bower_components/bootstrap/scss/mixins/_grid-framework.scss", + "../../bower_components/bootstrap/scss/mixins/_grid.scss", + "../../bower_components/bootstrap/scss/mixins/_float.scss", + "../../bower_components/bootstrap/scss/_custom.scss", + "../../bower_components/bootstrap/scss/_normalize.scss", + "../../bower_components/bootstrap/scss/_print.scss", + "../../bower_components/bootstrap/scss/_reboot.scss", + "../../bower_components/bootstrap/scss/_type.scss", + "../../bower_components/bootstrap/scss/_images.scss", + "../../bower_components/bootstrap/scss/_code.scss", + "../../bower_components/bootstrap/scss/_grid.scss", + "../../bower_components/bootstrap/scss/_tables.scss", + "../../bower_components/bootstrap/scss/_forms.scss", + "../../bower_components/bootstrap/scss/_buttons.scss", + "../../bower_components/bootstrap/scss/_transitions.scss", + "../../bower_components/bootstrap/scss/_dropdown.scss", + "../../bower_components/bootstrap/scss/_button-group.scss", + "../../bower_components/bootstrap/scss/_input-group.scss", + "../../bower_components/bootstrap/scss/_custom-forms.scss", + "../../bower_components/bootstrap/scss/_nav.scss", + "../../bower_components/bootstrap/scss/_navbar.scss", + "../../bower_components/bootstrap/scss/_card.scss", + "../../bower_components/bootstrap/scss/_breadcrumb.scss", + "../../bower_components/bootstrap/scss/_pagination.scss", + "../../bower_components/bootstrap/scss/_badge.scss", + "../../bower_components/bootstrap/scss/_jumbotron.scss", + "../../bower_components/bootstrap/scss/_alert.scss", + "../../bower_components/bootstrap/scss/_progress.scss", + "../../bower_components/bootstrap/scss/_media.scss", + "../../bower_components/bootstrap/scss/_list-group.scss", + "../../bower_components/bootstrap/scss/_responsive-embed.scss", + "../../bower_components/bootstrap/scss/_close.scss", + "../../bower_components/bootstrap/scss/_modal.scss", + "../../bower_components/bootstrap/scss/_tooltip.scss", + "../../bower_components/bootstrap/scss/_popover.scss", + "../../bower_components/bootstrap/scss/_carousel.scss", + "../../bower_components/bootstrap/scss/_utilities.scss", + "../../bower_components/bootstrap/scss/utilities/_align.scss", + "../../bower_components/bootstrap/scss/utilities/_background.scss", + "../../bower_components/bootstrap/scss/utilities/_borders.scss", + "../../bower_components/bootstrap/scss/utilities/_clearfix.scss", + "../../bower_components/bootstrap/scss/utilities/_display.scss", + "../../bower_components/bootstrap/scss/utilities/_flex.scss", + "../../bower_components/bootstrap/scss/utilities/_float.scss", + "../../bower_components/bootstrap/scss/utilities/_position.scss", + "../../bower_components/bootstrap/scss/utilities/_screenreaders.scss", + "../../bower_components/bootstrap/scss/utilities/_sizing.scss", + "../../bower_components/bootstrap/scss/utilities/_spacing.scss", + "../../bower_components/bootstrap/scss/utilities/_text.scss", + "../../bower_components/bootstrap/scss/utilities/_visibility.scss", + "../../build/scss/_variables.scss", + "../../build/scss/_mixins.scss", + "../../build/scss/_layout.scss", + "../../build/scss/_header.scss", + "../../build/scss/_sidebar.scss", + "../../build/scss/_sidebar-mini.scss", + "../../build/scss/_control-sidebar.scss", + "../../build/scss/_dropdown.scss", + "../../build/scss/_forms.scss", + "../../build/scss/_progress-bars.scss", + "../../build/scss/_small-box.scss", + "../../build/scss/_boxes.scss", + "../../build/scss/_info-box.scss", + "../../build/scss/_timeline.scss", + "../../build/scss/_buttons.scss", + "../../build/scss/_callout.scss", + "../../build/scss/_alerts.scss", + "../../build/scss/_navs.scss", + "../../build/scss/_products.scss", + "../../build/scss/_table.scss", + "../../build/scss/_labels.scss", + "../../build/scss/_direct-chat.scss", + "../../build/scss/_users-list.scss", + "../../build/scss/_site-search.scss", + "../../build/scss/_carousel.scss", + "../../build/scss/_modal.scss", + "../../build/scss/_social-widgets.scss", + "../../build/scss/_mailbox.scss", + "../../build/scss/_lockscreen.scss", + "../../build/scss/_login_and_register.scss", + "../../build/scss/_404_500_errors.scss", + "../../build/scss/_invoice.scss", + "../../build/scss/_profile.scss", + "../../build/scss/_bootstrap-social.scss", + "../../build/scss/_fullcalendar.scss", + "../../build/scss/_select2.scss", + "../../build/scss/_miscellaneous.scss", + "../../build/scss/_print.scss", + "../../build/scss/skins/_all-skins.scss", + "../../build/scss/skins/skin-blue.scss", + "../../build/scss/skins/skin-blue-light.scss", + "../../build/scss/skins/skin-black.scss", + "../../build/scss/skins/skin-black-light.scss", + "../../build/scss/skins/skin-green.scss", + "../../build/scss/skins/skin-green-light.scss", + "../../build/scss/skins/skin-red.scss", + "../../build/scss/skins/skin-red-light.scss", + "../../build/scss/skins/skin-yellow.scss", + "../../build/scss/skins/skin-yellow-light.scss", + "../../build/scss/skins/skin-purple.scss", + "../../build/scss/skins/skin-purple-light.scss" + ], + "mappings": "AAAA;;;;;GAKG;AELH;;;;;GAKG;AiCLH,4EAA4E;AAY5E,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,UAAW;EACxB,WAAW,EAAE,IAAK;EAClB,oBAAoB,EAAE,IAAK;EAC3B,wBAAwB,EAAE,IAAK;CAChC;;AASD,AAAA,IAAI,CAAC;EACH,MAAM,EAAE,CAAE;CACX;;AAMD,AAAA,OAAO;AACP,AAAA,KAAK;AACL,AAAA,MAAM;AACN,AAAA,MAAM;AACN,AAAA,GAAG;AACH,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,KAAM;CAChB;;AAOD,AAAA,EAAE,CAAC;EACD,SAAS,EAAE,GAAI;EACf,MAAM,EAAE,QAAS;CAClB;;AAUD,AAAA,UAAU;AACV,AAAA,MAAM;AACN,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,KAAM;CAChB;;AAMD,AAAA,MAAM,CAAC;EACL,MAAM,EAAE,QAAS;CAClB;;AAOD,AAAA,EAAE,CAAC;EACD,UAAU,EAAE,WAAY;EACxB,MAAM,EAAE,CAAE;EACV,QAAQ,EAAE,OAAQ;CACnB;;AAOD,AAAA,GAAG,CAAC;EACF,WAAW,EAAE,oBAAqB;EAClC,SAAS,EAAE,GAAI;CAChB;;AAUD,AAAA,CAAC,CAAC;EACA,gBAAgB,EAAE,WAAY;EAC9B,4BAA4B,EAAE,OAAQ;CACvC;;AAOD,AAAC,CAAA,AAAA,OAAO;AACR,AAAC,CAAA,AAAA,MAAM,CAAC;EACN,aAAa,EAAE,CAAE;CAClB;;AAOD,AAAU,IAAN,CAAA,AAAA,KAAC,AAAA,EAAO;EACV,aAAa,EAAE,IAAK;EACpB,eAAe,EAAE,SAAU;EAC3B,eAAe,EAAE,gBAAiB;CACnC;;AAMD,AAAA,CAAC;AACD,AAAA,MAAM,CAAC;EACL,WAAW,EAAE,OAAQ;CACtB;;AAMD,AAAA,CAAC;AACD,AAAA,MAAM,CAAC;EACL,WAAW,EAAE,MAAO;CACrB;;AAOD,AAAA,IAAI;AACJ,AAAA,GAAG;AACH,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,oBAAqB;EAClC,SAAS,EAAE,GAAI;CAChB;;AAMD,AAAA,GAAG,CAAC;EACF,UAAU,EAAE,MAAO;CACpB;;AAMD,AAAA,IAAI,CAAC;EACH,gBAAgB,EAAE,IAAK;EACvB,KAAK,EAAE,IAAK;CACb;;AAMD,AAAA,KAAK,CAAC;EACJ,SAAS,EAAE,GAAI;CAChB;;AAOD,AAAA,GAAG;AACH,AAAA,GAAG,CAAC;EACF,SAAS,EAAE,GAAI;EACf,WAAW,EAAE,CAAE;EACf,QAAQ,EAAE,QAAS;EACnB,cAAc,EAAE,QAAS;CAC1B;;AAED,AAAA,GAAG,CAAC;EACF,MAAM,EAAE,OAAQ;CACjB;;AAED,AAAA,GAAG,CAAC;EACF,GAAG,EAAE,MAAO;CACb;;AASD,AAAA,KAAK;AACL,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,YAAa;CACvB;;AAMD,AAAoB,KAAf,AAAA,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,GAAW;EACpB,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,CAAE;CACX;;AAMD,AAAA,GAAG,CAAC;EACF,YAAY,EAAE,IAAK;CACpB;;AAMD,AAAa,GAAV,AAAA,IAAK,CAAA,AAAA,KAAK,EAAE;EACb,QAAQ,EAAE,MAAO;CAClB;;AAUD,AAAA,MAAM;AACN,AAAA,KAAK;AACL,AAAA,QAAQ;AACR,AAAA,MAAM;AACN,AAAA,QAAQ,CAAC;EACP,WAAW,EAAE,UAAW;EACxB,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,IAAK;EAClB,MAAM,EAAE,CAAE;CACX;;AAOD,AAAA,MAAM;AACN,AAAA,KAAK,CAAC;EACJ,QAAQ,EAAE,OAAQ;CACnB;;AAOD,AAAA,MAAM;AACN,AAAA,MAAM,CAAC;EACL,cAAc,EAAE,IAAK;CACtB;;AAQD,AAAA,MAAM;AACN,AAAmB,IAAf,EAAC,AAAA,IAAC,CAAK,QAAQ,AAAb;CACN,AAAA,AAAa,IAAZ,CAAK,OAAO,AAAZ;CACD,AAAA,AAAc,IAAb,CAAK,QAAQ,AAAb,EAAe;EACd,kBAAkB,EAAE,MAAO;CAC5B;;AAMD,AAAM,MAAA,AAAA,kBAAkB;CACxB,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,kBAAkB;CACjC,AAAA,AAAc,IAAb,CAAK,OAAO,AAAZ,CAAa,kBAAkB;CAChC,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,kBAAkB,CAAC;EAChC,YAAY,EAAE,IAAK;EACnB,OAAO,EAAE,CAAE;CACZ;;AAMD,AAAM,MAAA,AAAA,eAAe;CACrB,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,eAAe;CAC9B,AAAA,AAAc,IAAb,CAAK,OAAO,AAAZ,CAAa,eAAe;CAC7B,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,eAAe,CAAC;EAC7B,OAAO,EAAE,qBAAsB;CAChC;;AAMD,AAAA,QAAQ,CAAC;EACP,MAAM,EAAE,iBAAkB;EAC1B,MAAM,EAAE,KAAM;EACd,OAAO,EAAE,qBAAsB;CAChC;;AASD,AAAA,MAAM,CAAC;EACL,UAAU,EAAE,UAAW;EACvB,KAAK,EAAE,OAAQ;EACf,OAAO,EAAE,KAAM;EACf,SAAS,EAAE,IAAK;EAChB,OAAO,EAAE,CAAE;EACX,WAAW,EAAE,MAAO;CACrB;;AAOD,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,YAAa;EACtB,cAAc,EAAE,QAAS;CAC1B;;AAMD,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,IAAK;CAChB;;CAOD,AAAA,AAAgB,IAAf,CAAK,UAAU,AAAf;CACD,AAAA,AAAa,IAAZ,CAAK,OAAO,AAAZ,EAAc;EACb,UAAU,EAAE,UAAW;EACvB,OAAO,EAAE,CAAE;CACZ;;CAMD,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,2BAA2B;CAC1C,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,2BAA2B,CAAC;EACzC,MAAM,EAAE,IAAK;CACd;;CAOD,AAAA,AAAc,IAAb,CAAK,QAAQ,AAAb,EAAe;EACd,kBAAkB,EAAE,SAAU;EAC9B,cAAc,EAAE,IAAK;CACtB;;CAMD,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,8BAA8B;CAC7C,AAAA,AAAe,IAAd,CAAK,QAAQ,AAAb,CAAc,2BAA2B,CAAC;EACzC,kBAAkB,EAAE,IAAK;CAC1B;;AAOD,AAAA,4BAA4B,CAAC;EAC3B,kBAAkB,EAAE,MAAO;EAC3B,IAAI,EAAE,OAAQ;CACf;;AAUD,AAAA,OAAO;AACP,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,KAAM;CAChB;;AAMD,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,SAAU;CACpB;;AASD,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,YAAa;CACvB;;AAMD,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,IAAK;CACf;;CASD,AAAA,AAAO,MAAN,AAAA,EAAQ;EACP,OAAO,EAAE,IAAK;CACf;;ACjcC,MAAM,CAAN,KAAK;EACH,AAAA,CAAC;EACD,AAAC,CAAA,AAAA,QAAQ;EACT,AAAC,CAAA,AAAA,OAAO;EACR,AAAC,CAAA,AAAA,cAAc;EACf,AAAG,GAAA,AAAA,cAAc;EACjB,AAAU,UAAA,AAAA,cAAc;EACxB,AAAE,EAAA,AAAA,cAAc;EAChB,AAAC,CAAA,AAAA,YAAY;EACb,AAAG,GAAA,AAAA,YAAY;EACf,AAAU,UAAA,AAAA,YAAY;EACtB,AAAE,EAAA,AAAA,YAAY,CAAC;IAIb,WAAW,EAAE,eAAgB;IAE7B,UAAU,EAAE,eAAgB;GAC7B;EAED,AAAA,CAAC;EACD,AAAC,CAAA,AAAA,QAAQ,CAAC;IACR,eAAe,EAAE,SAAU;GAC5B;EAOD,AAAW,IAAP,CAAA,AAAA,KAAC,AAAA,CAAM,OAAO,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC,WAAI,CAAQ,GAAG;GAC9B;EAaD,AAAA,GAAG,CAAC;IACF,WAAW,EAAE,mBAAoB;GAClC;EACD,AAAA,GAAG;EACH,AAAA,UAAU,CAAC;IACT,MAAM,EnC4GG,GAAG,CmC5GU,KAAK,CAAC,IAAI;IAChC,iBAAiB,EAAE,KAAM;GAC1B;EAOD,AAAA,KAAK,CAAC;IACJ,OAAO,EAAE,kBAAmB;GAC7B;EAED,AAAA,EAAE;EACF,AAAA,GAAG,CAAC;IACF,iBAAiB,EAAE,KAAM;GAC1B;EAED,AAAA,CAAC;EACD,AAAA,EAAE;EACF,AAAA,EAAE,CAAC;IACD,OAAO,EAAE,CAAE;IACX,MAAM,EAAE,CAAE;GACX;EAED,AAAA,EAAE;EACF,AAAA,EAAE,CAAC;IACD,gBAAgB,EAAE,KAAM;GACzB;EAKD,AAAA,OAAO,CAAC;IACN,OAAO,EAAE,IAAK;GACf;EACD,AAAA,MAAM,CAAC;IACL,MAAM,EnCuEG,GAAG,CmCvEU,KAAK,CAAC,IAAI;GACjC;EAED,AAAA,MAAM,CAAC;IACL,eAAe,EAAE,mBAAoB;GAMtC;EAPD,AAGE,MAHI,CAGJ,EAAE;EAHJ,AAIE,MAJI,CAIJ,EAAE,CAAC;IACD,gBAAgB,EAAE,eAAgB;GACnC;EAEH,AACE,eADa,CACb,EAAE;EADJ,AAEE,eAFa,CAEb,EAAE,CAAC;IACD,MAAM,EAAE,yBAA0B;GACnC;;;AC5FP,AAAA,IAAI,CAAC;EACH,UAAU,EAAE,UAAW;CACxB;;AAED,AAAA,CAAC;AACD,AAAC,CAAA,AAAA,QAAQ;AACT,AAAC,CAAA,AAAA,OAAO,CAAC;EACP,UAAU,EAAE,OAAQ;CACrB;;AAmBC,aAAa;EAAG,KAAK,EAAE,YAAa;;;AAQtC,AAAA,IAAI,CAAC;EAYH,kBAAkB,EAAE,SAAU;EAG9B,2BAA2B,EAAE,WAAI;CAClC;;AAED,AAAA,IAAI,CAAC;EACH,WAAW,EpC2KY,aAAC,EAAc,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU;EoC1K5H,SAAS,EpC+KM,IAAI;EoC9KnB,WAAW,EpCmLQ,MAAM;EoClLzB,WAAW,EpCsLM,GAAG;EoCpLpB,KAAK,EpC0BqB,OAAO;EoCxBjC,gBAAgB,EpCYT,IAAI;CoCXZ;;CAOD,AAAA,AAAe,QAAd,CAAS,IAAI,AAAb,CAAc,MAAM,CAAC;EACpB,OAAO,EAAE,eAAgB;CAC1B;;AAWD,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,CAAC;EACrB,UAAU,EAAE,CAAE;EACd,aAAa,EAAE,KAAM;CACtB;;AAMD,AAAA,CAAC,CAAC;EACA,UAAU,EAAE,CAAE;EACd,aAAa,EAAE,IAAK;CACrB;;AAGD,AAAU,IAAN,CAAA,AAAA,KAAC,AAAA;AAEL,AAAwB,IAApB,CAAA,AAAA,mBAAC,AAAA,EAAqB;EACxB,MAAM,EAAE,IAAK;CACd;;AAED,AAAA,OAAO,CAAC;EACN,aAAa,EAAE,IAAK;EACpB,UAAU,EAAE,MAAO;EACnB,WAAW,EAAE,OAAQ;CACtB;;AAED,AAAA,EAAE;AACF,AAAA,EAAE;AACF,AAAA,EAAE,CAAC;EACD,UAAU,EAAE,CAAE;EACd,aAAa,EAAE,IAAK;CACrB;;AAED,AAAG,EAAD,CAAC,EAAE;AACL,AAAG,EAAD,CAAC,EAAE;AACL,AAAG,EAAD,CAAC,EAAE;AACL,AAAG,EAAD,CAAC,EAAE,CAAC;EACJ,aAAa,EAAE,CAAE;CAClB;;AAED,AAAA,EAAE,CAAC;EACD,WAAW,EpCgHM,IAAI;CoC/GtB;;AAED,AAAA,EAAE,CAAC;EACD,aAAa,EAAE,KAAM;EACrB,WAAW,EAAE,CAAE;CAChB;;AAED,AAAA,UAAU,CAAC;EACT,MAAM,EAAE,QAAS;CAClB;;AAOD,AAAA,CAAC,CAAC;EACA,KAAK,EpC/DE,OAAO;EoCgEd,eAAe,EpC8BO,IAAI;CoCxB3B;;AARD,AAAA,CAAC,A/B9II,MAAM,E+B8IX,AAAA,CAAC,A/B7II,MAAM,CAAC;E+BkJR,KAAK,EpC4Be,OAAM;EoC3B1B,eAAe,EpC4BK,SAAS;CK7K5B;;A+B2JL,AAA4B,CAA3B,AAAA,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,GAAW;EAC5B,KAAK,EAAE,OAAQ;EACf,eAAe,EAAE,IAAK;CAUvB;;AAZD,AAA4B,CAA3B,AAAA,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,E/B9Jd,MAAM,E+B8JX,AAA4B,CAA3B,AAAA,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,E/B7Jd,MAAM,CAAC;E+BkKR,KAAK,EAAE,OAAQ;EACf,eAAe,EAAE,IAAK;C/BjKrB;;A+B2JL,AAA4B,CAA3B,AAAA,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,EAShB,MAAM,CAAC;EACN,OAAO,EAAE,CAAE;CACZ;;AAQH,AAAA,GAAG,CAAC;EAEF,UAAU,EAAE,CAAE;EAEd,aAAa,EAAE,IAAK;EAEpB,QAAQ,EAAE,IAAK;CAChB;;AAOD,AAAA,MAAM,CAAC;EAGL,MAAM,EAAE,QAAS;CAClB;;AAOD,AAAA,GAAG,CAAC;EAGF,cAAc,EAAE,MAAO;CAGxB;;CASD,AAAA,AAAc,IAAb,CAAK,QAAQ,AAAb,EAAe;EACd,MAAM,EAAE,OAAQ;CACjB;;AAaD,AAAA,CAAC;AACD,AAAA,IAAI;AACJ,AAAA,MAAM;CACN,AAAA,AAAc,IAAb,CAAK,QAAQ,AAAb;AACD,AAAA,KAAK;AACL,AAAA,KAAK;AACL,AAAA,MAAM;AACN,AAAA,OAAO;AACP,AAAA,QAAQ,CAAC;EACP,YAAY,EAAE,YAAa;CAC5B;;AAOD,AAAA,KAAK,CAAC;EAEJ,eAAe,EAAE,QAAS;EAE1B,gBAAgB,EpCoEc,WAAW;CoCnE1C;;AAED,AAAA,OAAO,CAAC;EACN,WAAW,EpC6DmB,OAAM;EoC5DpC,cAAc,EpC4DgB,OAAM;EoC3DpC,KAAK,EpC3KqB,OAAO;EoC4KjC,UAAU,EAAE,IAAK;EACjB,YAAY,EAAE,MAAO;CACtB;;AAED,AAAA,EAAE,CAAC;EAED,UAAU,EAAE,IAAK;CAClB;;AAOD,AAAA,KAAK,CAAC;EAEJ,OAAO,EAAE,YAAa;EACtB,aAAa,EAAE,KAAM;CACtB;;AAMD,AAAM,MAAA,AAAA,MAAM,CAAC;EACX,OAAO,EAAE,UAAW;EACpB,OAAO,EAAE,iCAAkC;CAC5C;;AAED,AAAA,KAAK;AACL,AAAA,MAAM;AACN,AAAA,MAAM;AACN,AAAA,QAAQ,CAAC;EAGP,WAAW,EAAE,OAAQ;CACtB;;AAED,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAKH,SAAS;AAJZ,AAAqB,KAAhB,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,CAIH,SAAS,CAAC;EACT,MAAM,EpC4IuB,WAAW;CoC3IzC;;AAIH,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX;AACN,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX;AACN,AAA2B,KAAtB,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB;AACN,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAc;EAMlB,kBAAkB,EAAE,OAAQ;CAC7B;;AAED,AAAA,QAAQ,CAAC;EAEP,MAAM,EAAE,QAAS;CAClB;;AAED,AAAA,QAAQ,CAAC;EAMP,SAAS,EAAE,CAAE;EAEb,OAAO,EAAE,CAAE;EACX,MAAM,EAAE,CAAE;EACV,MAAM,EAAE,CAAE;CACX;;AAED,AAAA,MAAM,CAAC;EAEL,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,CAAE;EACX,aAAa,EAAE,KAAM;EACrB,SAAS,EAAE,MAAO;EAClB,WAAW,EAAE,OAAQ;CACtB;;AAED,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EAKnB,kBAAkB,EAAE,IAAK;CAC1B;;AAGD,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,YAAa;CAIvB;;CAGD,AAAA,AAAO,MAAN,AAAA,EAAQ;EACP,OAAO,EAAE,eAAgB;CAC1B;;AChYD,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE;AACtB,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,CAAC;EAC3B,aAAa,ErCuQW,MAAO;EqCtQ/B,WAAW,ErCuQY,OAAO;EqCtQ9B,WAAW,ErCuQY,GAAG;EqCtQ1B,WAAW,ErCuQY,GAAG;EqCtQ1B,KAAK,ErCuQkB,OAAO;CqCtQ/B;;AAED,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,ErCyPJ,MAAM;CqCzPiB;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,ErCyPJ,IAAI;CqCzPmB;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,ErCyPJ,OAAO;CqCzPgB;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,ErCyPJ,MAAM;CqCzPiB;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,ErCyPJ,OAAO;CqCzPgB;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,ErCyPJ,IAAI;CqCzPmB;;AAEtC,AAAA,KAAK,CAAC;EACJ,SAAS,ErCyQQ,OAAO;EqCxQxB,WAAW,ErCyQM,GAAG;CqCxQrB;;AAGD,AAAA,UAAU,CAAC;EACT,SAAS,ErCwPK,IAAI;EqCvPlB,WAAW,ErC4PS,GAAG;EqC3PvB,WAAW,ErCmPY,GAAG;CqClP3B;;AACD,AAAA,UAAU,CAAC;EACT,SAAS,ErCoPK,MAAM;EqCnPpB,WAAW,ErCwPS,GAAG;EqCvPvB,WAAW,ErC8OY,GAAG;CqC7O3B;;AACD,AAAA,UAAU,CAAC;EACT,SAAS,ErCgPK,MAAM;EqC/OpB,WAAW,ErCoPS,GAAG;EqCnPvB,WAAW,ErCyOY,GAAG;CqCxO3B;;AACD,AAAA,UAAU,CAAC;EACT,SAAS,ErC4OK,MAAM;EqC3OpB,WAAW,ErCgPS,GAAG;EqC/OvB,WAAW,ErCoOY,GAAG;CqCnO3B;;AAOD,AAAA,EAAE,CAAC;EACD,UAAU,ErCuFD,IAAI;EqCtFb,aAAa,ErCsFJ,IAAI;EqCrFb,MAAM,EAAE,CAAE;EACV,UAAU,ErCiHG,GAAG,CqCjHa,KAAK,CrCuC3B,kBAAI;CqCtCZ;;AAOD,AAAA,KAAK;AACL,AAAA,MAAM,CAAC;EACL,SAAS,ErC+NO,GAAG;EqC9NnB,WAAW,ErC6LQ,MAAM;CqC5L1B;;AAED,AAAA,IAAI;AACJ,AAAA,KAAK,CAAC;EACJ,OAAO,ErCuOM,KAAI;EqCtOjB,gBAAgB,ErCinBe,OAAO;CqChnBvC;;AAOD,AAAA,cAAc,EsD4Md,AtD5MA,asD4Ma,EU7Jb,AhE/CA,cgE+Cc,EC5Hd,AjE6EA,WiE7EW,EKmCX,AtE0CA,oBsE1CoB,CtE0CL;EhB7Eb,YAAY,EAAE,CAAE;EAChB,UAAU,EAAE,IAAK;CgB8ElB;;AAGD,AAAA,YAAY,CAAC;EhBlFX,YAAY,EAAE,CAAE;EAChB,UAAU,EAAE,IAAK;CgBmFlB;;AACD,AAAA,iBAAiB,CAAC;EAChB,OAAO,EAAE,YAAa;CAKvB;;AAND,AAAA,iBAAiB,AAGd,IAAK,CAAA,AAAA,WAAW,EAAE;EACjB,YAAY,ErCyNM,GAAG;CqCxNtB;;AASH,AAAA,WAAW,CAAC;EACV,SAAS,EAAE,GAAI;EACf,cAAc,EAAE,SAAU;CAC3B;;AAGD,AAAA,WAAW,CAAC;EACV,OAAO,EAAG,MAAO,CrC8BR,IAAI;EqC7Bb,aAAa,ErC6BJ,IAAI;EqC5Bb,SAAS,ErCwLgB,OAAe;EqCvLxC,WAAW,ErCyLa,OAAM,CqCzLQ,KAAK,CrCJjB,OAAO;CqCKlC;;AAED,AAAA,kBAAkB,CAAC;EACjB,OAAO,EAAE,KAAM;EACf,SAAS,EAAE,GAAI;EACf,KAAK,ErCXqB,OAAO;CqCgBlC;;AARD,AAAA,kBAAkB,AAKf,QAAQ,CAAC;EACR,OAAO,EAAE,aAAc;CACxB;;AAIH,AAAA,mBAAmB,CAAC;EAClB,aAAa,ErCYJ,IAAI;EqCXb,YAAY,EAAE,CAAE;EAChB,UAAU,EAAE,KAAM;EAClB,YAAY,ErCuKY,OAAM,CqCvKS,KAAK,CrCtBlB,OAAO;EqCuBjC,WAAW,EAAE,CAAE;CAChB;;AAED,AAAoB,mBAAD,CAAC,kBAAkB,AACnC,QAAQ,CAAC;EACR,OAAO,EAAE,EAAG;CACb;;AAHH,AAAoB,mBAAD,CAAC,kBAAkB,AAInC,OAAO,CAAC;EACP,OAAO,EAAE,aAAc;CACxB;;ACtIH,AAAA,UAAU,CAAC;EhCIT,SAAS,EAAE,IAAK;EAGhB,MAAM,EAAE,IAAK;CgCLd;;AAID,AAAA,cAAc,CAAC;EACb,OAAO,EtC22BqB,OAAM;EsC12BlC,gBAAgB,EtC+ET,IAAI;EsC9EX,MAAM,EtCyJO,GAAG,CsCzJgB,KAAK,CtC42BT,IAAI;E2Bx3B9B,aAAa,E3B4TQ,OAAM;EGjTzB,UAAU,EHg3Bc,GAAG,CAAC,IAAG,CAAC,WAAW;EMp3B/C,SAAS,EAAE,IAAK;EAGhB,MAAM,EAAE,IAAK;CgCSd;;AAMD,AAAA,OAAO,CAAC;EAEN,OAAO,EAAE,YAAa;CACvB;;AAED,AAAA,WAAW,CAAC;EACV,aAAa,EAAG,MAAS;EACzB,WAAW,EAAE,CAAE;CAChB;;AAED,AAAA,eAAe,CAAC;EACd,SAAS,EtC41BgB,GAAG;EsC31B5B,KAAK,EtCmEqB,OAAO;CsClElC;;ACzCD,AAAA,IAAI;AACJ,AAAA,GAAG;AACH,AAAA,GAAG;AACH,AAAA,IAAI,CAAC;EACH,WAAW,EvCmPY,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS;CuClP5F;;AAGD,AAAA,IAAI,CAAC;EACH,OAAO,EvC46BqB,MAAK,CADL,MAAK;EuC16BjC,SAAS,EvCy6BmB,GAAG;EuCx6B/B,KAAK,EvC26BuB,OAAO;EuC16BnC,gBAAgB,EvCiGU,OAAO;E2B1G/B,aAAa,E3B4TQ,OAAM;CuC1S9B;;AALC,AARF,CAQG,GARH,IAAI,CAQI;EACJ,OAAO,EAAE,CAAE;EACX,KAAK,EAAE,OAAQ;EACf,gBAAgB,EAAE,OAAQ;CAC3B;;AAIH,AAAA,GAAG,CAAC;EACF,OAAO,EvC45BqB,MAAK,CADL,MAAK;EuC15BjC,SAAS,EvCy5BmB,GAAG;EuCx5B/B,KAAK,EvCkEE,IAAI;EuCjEX,gBAAgB,EvC6EU,OAAO;E2BtG/B,aAAa,E3B8TQ,MAAK;CuC3R7B;;AAdD,AAQE,GARC,CAQD,GAAG,CAAC;EACF,OAAO,EAAE,CAAE;EACX,SAAS,EAAE,IAAK;EAChB,WAAW,EvC6NI,IAAI;CuC3NpB;;AAIH,AAAA,GAAG,CAAC;EACF,OAAO,EAAE,KAAM;EACf,UAAU,EAAE,CAAE;EACd,aAAa,EAAE,IAAK;EACpB,SAAS,EvCs4BmB,GAAG;EuCr4B/B,KAAK,EvC2DqB,OAAO;CuCjDlC;;AAfD,AAQE,GARC,CAQD,IAAI,CAAC;EACH,OAAO,EAAE,CAAE;EACX,SAAS,EAAE,OAAQ;EACnB,KAAK,EAAE,OAAQ;EACf,gBAAgB,EAAE,WAAY;EAC9B,aAAa,EAAE,CAAE;CAClB;;AAIH,AAAA,eAAe,CAAC;EACd,UAAU,EvCm4BkB,KAAK;EuCl4BjC,UAAU,EAAE,MAAO;CACpB;;AC1DC,AAAA,UAAU,CAAC;ETAX,QAAQ,EAAE,QAAS;EACnB,WAAW,EAAE,IAAK;EAClB,YAAY,EAAE,IAAK;EAKf,aAAa,EAAG,IAAO;EACvB,YAAY,EAAI,IAAO;CSL1B;;ApCgDC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCnDnB,AAAA,UAAU,CAAC;ITOP,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSL1B;;;ApCgDC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCnDnB,AAAA,UAAU,CAAC;ITOP,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSL1B;;;ApCgDC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCnDnB,AAAA,UAAU,CAAC;ITOP,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSL1B;;;ApCgDC,MAAM,EAAL,SAAS,EAAE,MAAM;EoCnDpB,AAAA,UAAU,CAAC;ITOP,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSL1B;;;ApCgDC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCnDnB,AAAA,UAAU,CAAC;ITkBP,KAAK,E/BqML,KAAK;I+BpML,SAAS,EAAE,IAAK;GShBnB;;;ApCgDC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCnDnB,AAAA,UAAU,CAAC;ITkBP,KAAK,E/BsML,KAAK;I+BrML,SAAS,EAAE,IAAK;GShBnB;;;ApCgDC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCnDnB,AAAA,UAAU,CAAC;ITkBP,KAAK,E/BuML,KAAK;I+BtML,SAAS,EAAE,IAAK;GShBnB;;;ApCgDC,MAAM,EAAL,SAAS,EAAE,MAAM;EoCnDpB,AAAA,UAAU,CAAC;ITkBP,KAAK,E/BwML,MAAM;I+BvMN,SAAS,EAAE,IAAK;GShBnB;;;AASD,AAAA,gBAAgB,CAAC;ETZjB,QAAQ,EAAE,QAAS;EACnB,WAAW,EAAE,IAAK;EAClB,YAAY,EAAE,IAAK;EAKf,aAAa,EAAG,IAAO;EACvB,YAAY,EAAI,IAAO;CSM1B;;ApCqCC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCvCnB,AAAA,gBAAgB,CAAC;ITLb,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSM1B;;;ApCqCC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCvCnB,AAAA,gBAAgB,CAAC;ITLb,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSM1B;;;ApCqCC,MAAM,EAAL,SAAS,EAAE,KAAK;EoCvCnB,AAAA,gBAAgB,CAAC;ITLb,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSM1B;;;ApCqCC,MAAM,EAAL,SAAS,EAAE,MAAM;EoCvCpB,AAAA,gBAAgB,CAAC;ITLb,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GSM1B;;;AAQD,AAAA,IAAI,CAAC;ETaL,OAAO,EAAE,IAAK;EACd,SAAS,EAAE,IAAK;EAKZ,YAAY,EAAG,KAAO;EACtB,WAAW,EAAI,KAAO;CSlBzB;;ApC2BC,MAAM,EAAL,SAAS,EAAE,KAAK;EoC7BnB,AAAA,IAAI,CAAC;ITmBD,YAAY,EAAG,KAAO;IACtB,WAAW,EAAI,KAAO;GSlBzB;;;ApC2BC,MAAM,EAAL,SAAS,EAAE,KAAK;EoC7BnB,AAAA,IAAI,CAAC;ITmBD,YAAY,EAAG,KAAO;IACtB,WAAW,EAAI,KAAO;GSlBzB;;;ApC2BC,MAAM,EAAL,SAAS,EAAE,KAAK;EoC7BnB,AAAA,IAAI,CAAC;ITmBD,YAAY,EAAG,KAAO;IACtB,WAAW,EAAI,KAAO;GSlBzB;;;ApC2BC,MAAM,EAAL,SAAS,EAAE,MAAM;EoC7BpB,AAAA,IAAI,CAAC;ITmBD,YAAY,EAAG,KAAO;IACtB,WAAW,EAAI,KAAO;GSlBzB;;;AAID,AAAA,WAAW,CAAC;EACV,YAAY,EAAE,CAAE;EAChB,WAAW,EAAE,CAAE;CAOhB;;AATD,AAII,WAJO,GAIP,IAAI;AAJR,AAKkB,WALP,IAKP,AAAA,KAAC,EAAO,MAAM,AAAb,EAAe;EAChB,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,CAAE;CACjB;;AVrBC,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAIT,AAjBF,IAiBM,EAJF,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,CAjBI;EACX,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,GAAI;ECuBd,aAAa,EAAG,IAAO;EACvB,YAAY,EAAI,IAAO;CDrB1B;;A1B2CC,MAAM,EAAL,SAAS,EAAE,KAAK;E0BpCf,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAIT,AAjBF,IAiBM,EAJF,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,CAjBI;IC0BT,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GDrB1B;;;A1B2CC,MAAM,EAAL,SAAS,EAAE,KAAK;E0BpCf,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAIT,AAjBF,IAiBM,EAJF,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,CAjBI;IC0BT,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GDrB1B;;;A1B2CC,MAAM,EAAL,SAAS,EAAE,KAAK;E0BpCf,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAIT,AAjBF,IAiBM,EAJF,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,CAjBI;IC0BT,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GDrB1B;;;A1B2CC,MAAM,EAAL,SAAS,EAAE,MAAM;E0BpChB,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,MAaU,EAAN,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAAP,AAbJ,OAaW,EAIT,AAjBF,IAiBM,EAJF,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,EAJL,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,SAaa,EAAT,AAbJ,UAac,EAAV,AAbJ,UAac,EAAV,AAbJ,UAac,EAIZ,AAjBF,OAiBS,CAjBI;IC0BT,aAAa,EAAG,IAAO;IACvB,YAAY,EAAI,IAAO;GDrB1B;;;AAiBG,AAAA,IAAI,CAAJ;EACE,UAAU,EAAE,CAAE;EACd,SAAS,EAAE,CAAE;EACb,SAAS,EAAE,IAAK;CACjB;;AACD,AAAA,SAAS,CAAT;EACE,IAAI,EAAE,QAAS;EACf,KAAK,EAAE,IAAK;CACb;;AAGC,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAU;EAKpB,SAAS,EAAE,SAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;EAKpB,SAAS,EAAE,UAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;EAKpB,SAAS,EAAE,GAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;EAKpB,SAAS,EAAE,UAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;EAKpB,SAAS,EAAE,UAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;EAKpB,SAAS,EAAE,GAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;EAKpB,SAAS,EAAE,UAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;EAKpB,SAAS,EAAE,UAAU;CDhCd;;AAFD,AAAA,MAAM,CAAN;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;EAKpB,SAAS,EAAE,GAAU;CDhCd;;AAFD,AAAA,OAAO,CAAP;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;EAKpB,SAAS,EAAE,UAAU;CDhCd;;AAFD,AAAA,OAAO,CAAP;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;EAKpB,SAAS,EAAE,UAAU;CDhCd;;AAFD,AAAA,OAAO,CAAP;EC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAU;EAKpB,SAAS,EAAE,IAAU;CDhCd;;AAKC,AAAA,OAAO,CAAP;ECuCR,KAAK,EAA8C,IAAI;CDrC9C;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,SAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,UAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,GAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,UAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,UAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,GAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,UAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,UAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECuCR,KAAK,EAAgB,GAAU;CDrCtB;;AAFD,AAAA,QAAQ,CAAR;ECuCR,KAAK,EAAgB,UAAU;CDrCtB;;AAFD,AAAA,QAAQ,CAAR;ECuCR,KAAK,EAAgB,UAAU;CDrCtB;;AAFD,AAAA,QAAQ,CAAR;ECuCR,KAAK,EAAgB,IAAU;CDrCtB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAA8C,IAAI;CDjC7C;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,SAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,UAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,GAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,UAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,UAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,GAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,UAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,UAAU;CDjCrB;;AAFD,AAAA,OAAO,CAAP;ECmCR,IAAI,EAAgB,GAAU;CDjCrB;;AAFD,AAAA,QAAQ,CAAR;ECmCR,IAAI,EAAgB,UAAU;CDjCrB;;AAFD,AAAA,QAAQ,CAAR;ECmCR,IAAI,EAAgB,UAAU;CDjCrB;;AAFD,AAAA,QAAQ,CAAR;ECmCR,IAAI,EAAgB,IAAU;CDjCrB;;AAOD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,SAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,UAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,GAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,UAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,UAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,GAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,UAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,UAAU;CDpBd;;AAFD,AAAA,SAAS,CAAT;ECsBR,WAAW,EAAE,GAAU;CDpBd;;AAFD,AAAA,UAAU,CAAV;ECsBR,WAAW,EAAE,UAAU;CDpBd;;AAFD,AAAA,UAAU,CAAV;ECsBR,WAAW,EAAE,UAAU;CDpBd;;A1BHP,MAAM,EAAL,SAAS,EAAE,KAAK;E0B1Bf,AAAA,OAAO,CAAP;IACE,UAAU,EAAE,CAAE;IACd,SAAS,EAAE,CAAE;IACb,SAAS,EAAE,IAAK;GACjB;EACD,AAAA,YAAY,CAAZ;IACE,IAAI,EAAE,QAAS;IACf,KAAK,EAAE,IAAK;GACb;EAGC,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAU;IAKpB,SAAS,EAAE,SAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAU;IAKpB,SAAS,EAAE,IAAU;GDhCd;EAKC,AAAA,UAAU,CAAV;ICuCR,KAAK,EAA8C,IAAI;GDrC9C;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,SAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,IAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAA8C,IAAI;GDjC7C;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,SAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,IAAU;GDjCrB;EAOD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,EAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,SAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;;;A1BHP,MAAM,EAAL,SAAS,EAAE,KAAK;E0B1Bf,AAAA,OAAO,CAAP;IACE,UAAU,EAAE,CAAE;IACd,SAAS,EAAE,CAAE;IACb,SAAS,EAAE,IAAK;GACjB;EACD,AAAA,YAAY,CAAZ;IACE,IAAI,EAAE,QAAS;IACf,KAAK,EAAE,IAAK;GACb;EAGC,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAU;IAKpB,SAAS,EAAE,SAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAU;IAKpB,SAAS,EAAE,IAAU;GDhCd;EAKC,AAAA,UAAU,CAAV;ICuCR,KAAK,EAA8C,IAAI;GDrC9C;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,SAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,IAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAA8C,IAAI;GDjC7C;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,SAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,IAAU;GDjCrB;EAOD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,EAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,SAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;;;A1BHP,MAAM,EAAL,SAAS,EAAE,KAAK;E0B1Bf,AAAA,OAAO,CAAP;IACE,UAAU,EAAE,CAAE;IACd,SAAS,EAAE,CAAE;IACb,SAAS,EAAE,IAAK;GACjB;EACD,AAAA,YAAY,CAAZ;IACE,IAAI,EAAE,QAAS;IACf,KAAK,EAAE,IAAK;GACb;EAGC,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAU;IAKpB,SAAS,EAAE,SAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAU;IAKpB,SAAS,EAAE,IAAU;GDhCd;EAKC,AAAA,UAAU,CAAV;ICuCR,KAAK,EAA8C,IAAI;GDrC9C;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,SAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,IAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAA8C,IAAI;GDjC7C;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,SAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,IAAU;GDjCrB;EAOD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,EAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,SAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;;;A1BHP,MAAM,EAAL,SAAS,EAAE,MAAM;E0B1BhB,AAAA,OAAO,CAAP;IACE,UAAU,EAAE,CAAE;IACd,SAAS,EAAE,CAAE;IACb,SAAS,EAAE,IAAK;GACjB;EACD,AAAA,YAAY,CAAZ;IACE,IAAI,EAAE,QAAS;IACf,KAAK,EAAE,IAAK;GACb;EAGC,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAU;IAKpB,SAAS,EAAE,SAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,SAAS,CAAT;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAU;IAKpB,SAAS,EAAE,GAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAKpB,SAAS,EAAE,UAAU;GDhCd;EAFD,AAAA,UAAU,CAAV;IC6BN,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAU;IAKpB,SAAS,EAAE,IAAU;GDhCd;EAKC,AAAA,UAAU,CAAV;ICuCR,KAAK,EAA8C,IAAI;GDrC9C;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,SAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICuCR,KAAK,EAAgB,GAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,UAAU;GDrCtB;EAFD,AAAA,WAAW,CAAX;ICuCR,KAAK,EAAgB,IAAU;GDrCtB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAA8C,IAAI;GDjC7C;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,SAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,UAAU,CAAV;ICmCR,IAAI,EAAgB,GAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,UAAU;GDjCrB;EAFD,AAAA,WAAW,CAAX;ICmCR,IAAI,EAAgB,IAAU;GDjCrB;EAOD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,EAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,SAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,YAAY,CAAZ;ICsBR,WAAW,EAAE,GAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;EAFD,AAAA,aAAa,CAAb;ICsBR,WAAW,EAAE,UAAU;GDpBd;;;AWvDX,AAAA,MAAM,CAAC;EACL,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;EAChB,aAAa,EzCqIJ,IAAI;CyChHd;;AAxBD,AAKE,MALI,CAKJ,EAAE;AALJ,AAME,MANI,CAMJ,EAAE,CAAC;EACD,OAAO,EzCuUqB,OAAM;EyCtUlC,cAAc,EAAE,GAAI;EACpB,UAAU,EzC4JC,GAAG,CyC5JkB,KAAK,CzCgGb,OAAO;CyC/FhC;;AAVH,AAYQ,MAZF,CAYJ,KAAK,CAAC,EAAE,CAAC;EACP,cAAc,EAAE,MAAO;EACvB,aAAa,EAAG,GAAC,CAAwB,KAAK,CzC2FtB,OAAO;CyC1FhC;;AAfH,AAiBU,MAjBJ,CAiBJ,KAAK,GAAG,KAAK,CAAC;EACZ,UAAU,EAAG,GAAC,CAAwB,KAAK,CzCuFnB,OAAO;CyCtFhC;;AAnBH,AAqBE,MArBI,CAqBJ,MAAM,CAAC;EACL,gBAAgB,EzCoEX,IAAI;CyCnEV;;AAQH,AACE,SADO,CACP,EAAE;AADJ,AAEE,SAFO,CAEP,EAAE,CAAC;EACD,OAAO,EzC6SqB,MAAK;CyC5SlC;;AAQH,AAAA,eAAe,CAAC;EACd,MAAM,EzCyHO,GAAG,CyCzHY,KAAK,CzC6DP,OAAO;CyChDlC;;AAdD,AAGE,eAHa,CAGb,EAAE;AAHJ,AAIE,eAJa,CAIb,EAAE,CAAC;EACD,MAAM,EzCqHK,GAAG,CyCrHc,KAAK,CzCyDT,OAAO;CyCxDhC;;AANH,AASI,eATW,CAQb,KAAK,CACH,EAAE;AATN,AAUI,eAVW,CAQb,KAAK,CAEH,EAAE,CAAC;EACD,mBAAmB,EAAG,GAAC;CACxB;;AASL,AAC0B,cADZ,CACZ,KAAK,CAAC,EAAE,AAAA,YAAa,CAAA,AAAA,GAAG,EAAE;EACxB,gBAAgB,EzCyBX,mBAAI;CyCxBV;;AAQH,AACQ,YADI,CACV,KAAK,CAAC,EAAE,ApCtEL,MAAM,CAAC;EoCwEN,gBAAgB,EzCab,oBAAI;CKrFY;;AoBLvB,AAAA,aAAa;AAAb,AAEI,aAFS,GAET,EAAE;AAFN,AAGI,aAHS,GAGT,EAAE,CAAC;EACH,gBAAgB,EzBsFb,oBAAI;CyBrFR;;AAKH,AAGE,YAHU,CAGV,aAAa,ApBRZ,MAAM,CAAC;EoBUJ,gBAAgB,EAJD,oBAAM;CpBNJ;;AoBKvB,AAOQ,YAPI,CAGV,aAAa,ApBRZ,MAAM,GoBYD,EAAE;AAPV,AAQQ,YARI,CAGV,aAAa,ApBRZ,MAAM,GoBaD,EAAE,CAAC;EACH,gBAAgB,EARH,oBAAM;CASpB;;AApBP,AAAA,cAAc;AAAd,AAEI,cAFU,GAEV,EAAE;AAFN,AAGI,cAHU,GAGV,EAAE,CAAC;EACH,gBAAgB,EzByqBW,OAAO;CyBxqBnC;;AAKH,AAGE,YAHU,CAGV,cAAc,ApBRb,MAAM,CAAC;EoBUJ,gBAAgB,EAJD,OAAM;CpBNJ;;AoBKvB,AAOQ,YAPI,CAGV,cAAc,ApBRb,MAAM,GoBYD,EAAE;AAPV,AAQQ,YARI,CAGV,cAAc,ApBRb,MAAM,GoBaD,EAAE,CAAC;EACH,gBAAgB,EARH,OAAM;CASpB;;AApBP,AAAA,WAAW;AAAX,AAEI,WAFO,GAEP,EAAE;AAFN,AAGI,WAHO,GAGP,EAAE,CAAC;EACH,gBAAgB,EzB6qBW,OAAO;CyB5qBnC;;AAKH,AAGE,YAHU,CAGV,WAAW,ApBRV,MAAM,CAAC;EoBUJ,gBAAgB,EAJD,OAAM;CpBNJ;;AoBKvB,AAOQ,YAPI,CAGV,WAAW,ApBRV,MAAM,GoBYD,EAAE;AAPV,AAQQ,YARI,CAGV,WAAW,ApBRV,MAAM,GoBaD,EAAE,CAAC;EACH,gBAAgB,EARH,OAAM;CASpB;;AApBP,AAAA,cAAc;AAAd,AAEI,cAFU,GAEV,EAAE;AAFN,AAGI,cAHU,GAGV,EAAE,CAAC;EACH,gBAAgB,EzBirBW,OAAO;CyBhrBnC;;AAKH,AAGE,YAHU,CAGV,cAAc,ApBRb,MAAM,CAAC;EoBUJ,gBAAgB,EAJD,OAAM;CpBNJ;;AoBKvB,AAOQ,YAPI,CAGV,cAAc,ApBRb,MAAM,GoBYD,EAAE;AAPV,AAQQ,YARI,CAGV,cAAc,ApBRb,MAAM,GoBaD,EAAE,CAAC;EACH,gBAAgB,EARH,OAAM;CASpB;;AApBP,AAAA,aAAa;AAAb,AAEI,aAFS,GAET,EAAE;AAFN,AAGI,aAHS,GAGT,EAAE,CAAC;EACH,gBAAgB,EzBsrBW,OAAO;CyBrrBnC;;AAKH,AAGE,YAHU,CAGV,aAAa,ApBRZ,MAAM,CAAC;EoBUJ,gBAAgB,EAJD,OAAM;CpBNJ;;AoBKvB,AAOQ,YAPI,CAGV,aAAa,ApBRZ,MAAM,GoBYD,EAAE;AAPV,AAQQ,YARI,CAGV,aAAa,ApBRZ,MAAM,GoBaD,EAAE,CAAC;EACH,gBAAgB,EARH,OAAM;CASpB;;AgBgFT,AACE,cADY,CACZ,EAAE,CAAC;EACD,KAAK,EzCbA,IAAI;EyCcT,gBAAgB,EzCFQ,OAAO;CyCGhC;;AAGH,AACE,cADY,CACZ,EAAE,CAAC;EACD,KAAK,EzCPmB,OAAO;EyCQ/B,gBAAgB,EzCNQ,OAAO;CyCOhC;;AAGH,AAAA,cAAc,CAAC;EACb,KAAK,EzC1BE,IAAI;EyC2BX,gBAAgB,EzCfU,OAAO;CyC0BlC;;AAbD,AAIE,cAJY,CAIZ,EAAE;AAJJ,AAKE,cALY,CAKZ,EAAE;AALJ,AAMQ,cANM,CAMZ,KAAK,CAAC,EAAE,CAAC;EACP,YAAY,EzChCP,IAAI;CyCiCV;;AARH,AAAA,cAAc,AAUX,eAAe,CAAC;EACf,MAAM,EAAE,CAAE;CACX;;AAWH,AAAA,iBAAiB,CAAC;EAChB,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,IAAK;EACjB,kBAAkB,EAAE,wBAAyB;CAM9C;;AAVD,AAAA,iBAAiB,AAOd,eAAe,CAAC;EACf,MAAM,EAAE,CAAE;CACX;;ACjJH,AAAA,aAAa,CAAC;EACZ,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EAGZ,OAAO,E1CoZwB,MAAK,CADL,OAAM;E0ClZrC,SAAS,E1C+OM,IAAI;E0C9OnB,WAAW,E1CmZoB,IAAI;E0ClZnC,KAAK,E1C6FqB,OAAO;E0C5FjC,gBAAgB,E1C+ET,IAAI;E0C7EX,gBAAgB,EAAE,IAAK;EACvB,eAAe,EAAE,WAAY;EAC7B,MAAM,E1CsJO,GAAG,C0CtJgB,KAAK,C1C4E9B,mBAAI;E0CvET,aAAa,E1CwSQ,OAAM;EGjTzB,UAAU,EHgbiB,YAAY,CAAC,WAAW,CAAC,KAAI,EAAE,UAAU,CAAC,WAAW,CAAC,KAAI;C0C/X1F;;AA1DD,AAAA,aAAa,AA4BV,YAAY,CAAC;EACZ,gBAAgB,EAAE,WAAY;EAC9B,MAAM,EAAE,CAAE;CACX;;AA/BH,AAAA,aAAa,AlBuCV,MAAM,CAAC;EACN,KAAK,ExB6DmB,OAAO;EwB5D/B,gBAAgB,ExB+CX,IAAI;EwB9CT,YAAY,ExB+XiB,OAAO;EwB9XpC,OAAO,EAAE,IAAK;CAEf;;AkB7CH,AAAA,aAAa,AAqCV,aAAa,CAAC;EACb,KAAK,E1CgEmB,OAAO;E0C9D/B,OAAO,EAAE,CAAE;CACZ;;AAzCH,AAAA,aAAa,AAgDV,SAAS,EAhDZ,AAAA,aAAa,CAiDV,AAAA,QAAC,AAAA,EAAU;EACV,gBAAgB,E1CqDQ,OAAO;E0CnD/B,OAAO,EAAE,CAAE;CACZ;;AArDH,AAAA,aAAa,AAuDV,SAAS,CAAC;EACT,MAAM,E1CkZuB,WAAW;C0CjZzC;;AAGH,AAAM,MAAA,AAAA,aAAa,AAChB,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,GAAW;EAE5B,MAAM,EAAE,mBAAI;CACb;;AAJH,AAAM,MAAA,AAAA,aAAa,AAMhB,MAAM,AAAA,WAAW,CAAC;EAMjB,KAAK,E1C6BmB,OAAO;E0C5B/B,gBAAgB,E1CeX,IAAI;C0CdV;;AAIH,AAAA,kBAAkB;AAClB,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,KAAM;CAChB;;AASD,AAAA,eAAe,CAAC;EACd,WAAW,EAAE,sBAAI;EACjB,cAAc,EAAE,sBAAI;EACpB,aAAa,EAAE,CAAE;CAClB;;AAED,AAAA,kBAAkB,CAAC;EACjB,WAAW,EAAE,uBAAI;EACjB,cAAc,EAAE,uBAAI;EACpB,SAAS,E1CmJM,OAAO;C0ClJvB;;AAED,AAAA,kBAAkB,CAAC;EACjB,WAAW,EAAE,uBAAI;EACjB,cAAc,EAAE,uBAAI;EACpB,SAAS,E1C8IM,QAAO;C0C7IvB;;AASD,AAAA,gBAAgB,CAAC;EACf,WAAW,E1CqSoB,MAAK;E0CpSpC,cAAc,E1CoSiB,MAAK;E0CnSpC,aAAa,EAAE,CAAE;EACjB,SAAS,E1C8HM,IAAI;C0C7HpB;;AAQD,AAAA,oBAAoB,CAAC;EACnB,WAAW,E1CwRoB,MAAK;E0CvRpC,cAAc,E1CuRiB,MAAK;E0CtRpC,aAAa,EAAE,CAAE;EACjB,WAAW,E1CsRoB,IAAI;E0CrRnC,MAAM,EAAE,iBAAkB;EAC1B,YAAY,E1C6BC,GAAG,C0C7BsB,CAAC;CAOxC;;AAbD,AAAA,oBAAoB,AAQjB,gBAAgB,EKrFnB,AL6EA,eK7Ee,GL6Ef,oBAAoB,AK7EF,aAAa;AAC/B,AL4EA,eK5Ee,GL4Ef,oBAAoB,AK5EF,kBAAkB;AACpC,AL2EA,eK3Ee,GAAG,gBAAgB,GL2ElC,oBAAoB,AK3EiB,IAAI,EL2EzC,AAAA,oBAAoB,AASjB,gBAAgB,EK3FnB,ALkFA,eKlFe,GLkFf,oBAAoB,AKlFF,aAAa;AAC/B,ALiFA,eKjFe,GLiFf,oBAAoB,AKjFF,kBAAkB;AACpC,ALgFA,eKhFe,GAAG,gBAAgB,GLgFlC,oBAAoB,AKhFiB,IAAI,CLyFrB;EAChB,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,CAAE;CACjB;;AAYH,AAAA,gBAAgB,EKrGhB,ALqGA,eKrGe,GAAG,aAAa;AAC/B,ALoGA,eKpGe,GAAG,kBAAkB;AACpC,ALmGA,eKnGe,GAAG,gBAAgB,GAAG,IAAI,CLmGxB;EACf,OAAO,E1CuRwB,OAAM,CADN,MAAK;E0CrRpC,SAAS,E1C6FM,QAAO;E2BzPpB,aAAa,E3B8TQ,MAAK;C0ChK7B;;AAED,AAAM,MAAA,AAAA,gBAAgB,AACnB,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,IK5GrB,AL2GA,eK3Ge,GL2Gf,MAAM,AK3GY,aAAa,AL4G5B,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA;AK3GrB,AL0GA,eK1Ge,GL0Gf,MAAM,AK1GY,kBAAkB,AL2GjC,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA;AK1GrB,ALyGA,eKzGe,GAAG,gBAAgB,GLyGlC,MAAM,AKzG+B,IAAI,AL0GtC,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,GAAW;EAC5B,MAAM,E1CuRyB,SAAa;C0CtR7C;;AAGH,AAAA,gBAAgB,EKtHhB,ALsHA,eKtHe,GAAG,aAAa;AAC/B,ALqHA,eKrHe,GAAG,kBAAkB;AACpC,ALoHA,eKpHe,GAAG,gBAAgB,GAAG,IAAI,CLoHxB;EACf,OAAO,E1C8QwB,OAAM,CADN,MAAM;E0C5QrC,SAAS,E1CgFM,OAAO;E2BxPpB,aAAa,E3B6TQ,MAAK;C0CnJ7B;;AAED,AAAM,MAAA,AAAA,gBAAgB,AACnB,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,IK7HrB,AL4HA,eK5He,GL4Hf,MAAM,AK5HY,aAAa,AL6H5B,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA;AK5HrB,AL2HA,eK3He,GL2Hf,MAAM,AK3HY,kBAAkB,AL4HjC,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA;AK3HrB,AL0HA,eK1He,GAAG,gBAAgB,GL0HlC,MAAM,AK1H+B,IAAI,AL2HtC,IAAK,EAAA,AAAA,AAAK,IAAJ,AAAA,EAAM,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,GAAW;EAC5B,MAAM,E1C0QyB,WAAa;C0CzQ7C;;AASH,AAAA,WAAW,CAAC;EACV,aAAa,E1CjDJ,IAAI;C0CkDd;;AAED,AAAA,UAAU,CAAC;EACT,OAAO,EAAE,KAAM;EACf,UAAU,E1C+Pe,OAAM;C0C9PhC;;AAOD,AAAA,WAAW,CAAC;EACV,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,KAAM;EACf,aAAa,E1CuPa,MAAK;C0C/OhC;;AAXD,AAMI,WANO,AAKR,SAAS,CACR,iBAAiB,CAAC;EAChB,KAAK,E1CrGiB,OAAO;E0CsG7B,MAAM,E1C8PqB,WAAW;C0C7PvC;;AAIL,AAAA,iBAAiB,CAAC;EAChB,YAAY,E1C6Oc,OAAO;E0C5OjC,aAAa,EAAE,CAAE;EACjB,MAAM,EAAE,OAAQ;CACjB;;AAED,AAAA,iBAAiB,CAAC;EAChB,QAAQ,EAAE,QAAS;EACnB,UAAU,E1CuOgB,OAAM;E0CtOhC,WAAW,E1CqOe,QAAO;C0ChOlC;;AARD,AAAA,iBAAiB,AAKd,WAAW,CAAC;EACX,QAAQ,EAAE,MAAO;CAClB;;AAIH,AAAA,kBAAkB,CAAC;EACjB,OAAO,EAAE,YAAa;CASvB;;AAVD,AAGE,kBAHgB,CAGhB,iBAAiB,CAAC;EAChB,cAAc,EAAE,MAAO;CACxB;;AALH,AAOI,kBAPc,GAOd,kBAAkB,CAAC;EACnB,WAAW,E1CyNc,OAAM;C0CxNhC;;AAQH,AAAA,sBAAsB,CAAC;EACrB,UAAU,E1CuMe,OAAM;C0CtMhC;;AAED,AAAA,qBAAqB;AACrB,AAAA,qBAAqB;AACrB,AAAA,oBAAoB,CAAC;EACnB,aAAa,EAAG,OAAgB;EAChC,iBAAiB,EAAE,SAAU;EAC7B,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAE,SAAa;EAChD,eAAe,EAAG,QAAa,CAAO,QAAa;CACpD;;AAGD,AlBhQE,YkBgQU,ClBhQV,sBAAsB;AkBgQxB,AlB/PE,YkB+PU,ClB/PV,mBAAmB;AkB+PrB,AlB9PE,YkB8PU,ClB9PV,eAAe;AkB8PjB,AlB7PE,YkB6PU,ClB7PV,iBAAiB;AkB6PnB,AlB5PE,YkB4PU,ClB5PV,eAAe,CAAC;EACd,KAAK,ExBuFA,OAAO;CwBtFb;;AkB0PH,AlBvPE,YkBuPU,ClBvPV,aAAa,CAAC;EACZ,YAAY,ExBkFP,OAAO;CwB7Eb;;AkBiPH,AlB9OE,YkB8OU,ClB9OV,kBAAkB,CAAC;EACjB,KAAK,ExByEA,OAAO;EwBxEZ,YAAY,ExBwEP,OAAO;EwBvEZ,gBAAgB,EAAE,OAAO;CAC1B;;AkB0OH,AAGE,YAHU,CAGV,qBAAqB,CAAC;EACpB,gBAAgB,E1CtMR,uPAAS;C0CuMlB;;AAGH,AlBxQE,YkBwQU,ClBxQV,sBAAsB;AkBwQxB,AlBvQE,YkBuQU,ClBvQV,mBAAmB;AkBuQrB,AlBtQE,YkBsQU,ClBtQV,eAAe;AkBsQjB,AlBrQE,YkBqQU,ClBrQV,iBAAiB;AkBqQnB,AlBpQE,YkBoQU,ClBpQV,eAAe,CAAC;EACd,KAAK,ExBqFA,OAAO;CwBpFb;;AkBkQH,AlB/PE,YkB+PU,ClB/PV,aAAa,CAAC;EACZ,YAAY,ExBgFP,OAAO;CwB3Eb;;AkByPH,AlBtPE,YkBsPU,ClBtPV,kBAAkB,CAAC;EACjB,KAAK,ExBuEA,OAAO;EwBtEZ,YAAY,ExBsEP,OAAO;EwBrEZ,gBAAgB,EAAE,KAAO;CAC1B;;AkBkPH,AAGE,YAHU,CAGV,qBAAqB,CAAC;EACpB,gBAAgB,E1C9MR,gUAAS;C0C+MlB;;AAGH,AlBhRE,WkBgRS,ClBhRT,sBAAsB;AkBgRxB,AlB/QE,WkB+QS,ClB/QT,mBAAmB;AkB+QrB,AlB9QE,WkB8QS,ClB9QT,eAAe;AkB8QjB,AlB7QE,WkB6QS,ClB7QT,iBAAiB;AkB6QnB,AlB5QE,WkB4QS,ClB5QT,eAAe,CAAC;EACd,KAAK,ExBoFA,OAAO;CwBnFb;;AkB0QH,AlBvQE,WkBuQS,ClBvQT,aAAa,CAAC;EACZ,YAAY,ExB+EP,OAAO;CwB1Eb;;AkBiQH,AlB9PE,WkB8PS,ClB9PT,kBAAkB,CAAC;EACjB,KAAK,ExBsEA,OAAO;EwBrEZ,YAAY,ExBqEP,OAAO;EwBpEZ,gBAAgB,EAAE,OAAO;CAC1B;;AkB0PH,AAGE,WAHS,CAGT,oBAAoB,CAAC;EACnB,gBAAgB,E1CtNR,iSAAS;C0CuNlB;;AAaH,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,IAAK;EACd,SAAS,EAAE,QAAS;EACpB,WAAW,EAAE,MAAO;CAuFrB;;AA1FD,AAQE,YARU,CAQV,WAAW,CAAC;EACV,KAAK,EAAE,IAAK;CACb;;AtC3PC,MAAM,EAAL,SAAS,EAAE,KAAK;EsCiPrB,AAcI,YAdQ,CAcR,KAAK,CAAC;IACJ,OAAO,EAAE,IAAK;IACd,WAAW,EAAE,MAAO;IACpB,eAAe,EAAE,MAAO;IACxB,aAAa,EAAE,CAAE;GAClB;EAnBL,AAsBI,YAtBQ,CAsBR,WAAW,CAAC;IACV,OAAO,EAAE,IAAK;IACd,IAAI,EAAE,QAAS;IACf,SAAS,EAAE,QAAS;IACpB,WAAW,EAAE,MAAO;IACpB,aAAa,EAAE,CAAE;GAClB;EA5BL,AA+BI,YA/BQ,CA+BR,aAAa,CAAC;IACZ,OAAO,EAAE,YAAa;IACtB,KAAK,EAAE,IAAK;IACZ,cAAc,EAAE,MAAO;GACxB;EAnCL,AAsCI,YAtCQ,CAsCR,oBAAoB,CAAC;IACnB,OAAO,EAAE,YAAa;GACvB;EAxCL,AA0CI,YA1CQ,CA0CR,YAAY,CAAC;IACX,KAAK,EAAE,IAAK;GACb;EA5CL,AA8CI,YA9CQ,CA8CR,mBAAmB,CAAC;IAClB,aAAa,EAAE,CAAE;IACjB,cAAc,EAAE,MAAO;GACxB;EAjDL,AAqDI,YArDQ,CAqDR,WAAW,CAAC;IACV,OAAO,EAAE,IAAK;IACd,WAAW,EAAE,MAAO;IACpB,eAAe,EAAE,MAAO;IACxB,KAAK,EAAE,IAAK;IACZ,UAAU,EAAE,CAAE;IACd,aAAa,EAAE,CAAE;GAClB;EA5DL,AA6DI,YA7DQ,CA6DR,iBAAiB,CAAC;IAChB,YAAY,EAAE,CAAE;GACjB;EA/DL,AAgEI,YAhEQ,CAgER,iBAAiB,CAAC;IAChB,QAAQ,EAAE,QAAS;IACnB,UAAU,EAAE,CAAE;IACd,YAAY,E1C2FU,OAAM;I0C1F5B,WAAW,EAAE,CAAE;GAChB;EArEL,AAwEI,YAxEQ,CAwER,eAAe,CAAC;IACd,OAAO,EAAE,IAAK;IACd,WAAW,EAAE,MAAO;IACpB,eAAe,EAAE,MAAO;IACxB,YAAY,EAAE,CAAE;GACjB;EA7EL,AA8EI,YA9EQ,CA8ER,yBAAyB,CAAC;IACxB,QAAQ,EAAE,MAAO;IACjB,OAAO,EAAE,YAAa;IACtB,YAAY,E1C6EU,OAAM;I0C5E5B,cAAc,EAAE,WAAY;GAC7B;EAnFL,AAsFkB,YAtFN,CAsFR,aAAa,CAAC,sBAAsB,CAAC;IACnC,GAAG,EAAE,CAAE;GACR;;;AC3XL,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,YAAa;EACtB,WAAW,E3CwPQ,MAAM;E2CvPzB,WAAW,E3CkWoB,IAAI;E2CjWnC,UAAU,EAAE,MAAO;EACnB,WAAW,EAAE,MAAO;EACpB,cAAc,EAAE,MAAO;EACvB,WAAW,EAAE,IAAK;EAClB,MAAM,E3C2JO,GAAG,C2C3JgB,KAAK,CAAC,WAAW;EzBoEjD,OAAO,ElBwRwB,MAAK,CADL,IAAI;EkBtRnC,SAAS,ElBwKM,IAAI;E2BvPjB,aAAa,E3B4TQ,OAAM;EGjTzB,UAAU,EH0YiB,GAAG,CAAC,IAAG,CAAC,WAAW;C2ChXnD;;AAnCD,AAAA,IAAI,AtCcC,MAAM,EsCdX,AAAA,IAAI,AtCeC,MAAM,CAAC;EsCDR,eAAe,EAAE,IAAK;CtCGrB;;AsCjBL,AAAA,IAAI,AAgBD,MAAM,EAhBT,AAAA,IAAI,AAiBD,MAAM,CAAC;EACN,OAAO,EAAE,CAAE;EACX,UAAU,E3CqVmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CA1QjC,uBAAO;C2C1Eb;;AApBH,AAAA,IAAI,AAuBD,SAAS,EAvBZ,AAAA,IAAI,AAwBD,SAAS,CAAC;EACT,MAAM,E3CibuB,WAAW;E2ChbxC,OAAO,EAAE,GAAI;CAEd;;AA5BH,AAAA,IAAI,AA8BD,OAAO,EA9BV,AAAA,IAAI,AA+BD,OAAO,CAAC;EACP,gBAAgB,EAAE,IAAK;CAExB;;AAIH,AAAK,CAAJ,AAAA,IAAI,AAAA,SAAS;AACd,AAAoB,QAAZ,CAAA,AAAA,QAAC,AAAA,EAAU,CAAC,AAAA,IAAI,CAAC;EACvB,cAAc,EAAE,IAAK;CACtB;;AAOD,AAAA,YAAY,CAAC;EzB7CX,KAAK,ElBqFE,IAAI;EkBpFX,gBAAgB,ElB0FT,OAAO;EkBzFd,YAAY,ElByFL,OAAO;C2C5Cf;;AAFD,AAAA,YAAY,AtC5CP,MAAM,CAAC;EaMR,KAAK,ElB8EA,IAAI;EkB7ET,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,OAAM;CbGC;;AsC4CzB,AAAA,YAAY,AzBlCT,MAAM,EyBkCT,AAAA,YAAY,AzBjCT,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClB0ElB,sBAAO;CkBxEb;;AyB0BH,AAAA,YAAY,AzBvBT,SAAS,EyBuBZ,AAAA,YAAY,AzBtBT,SAAS,CAAC;EACT,gBAAgB,ElBmEX,OAAO;EkBlEZ,YAAY,ElBkEP,OAAO;CkBjEb;;AyBmBH,AAAA,YAAY,AzBjBT,OAAO,EyBiBV,AAAA,YAAY,AzBhBT,OAAO;AACR,AyBeF,KzBfO,GyBeP,YAAY,AzBfD,gBAAgB,CAAC;EACxB,KAAK,ElBsDA,IAAI;EkBrDT,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,OAAM;CAsCrB;;AyBYH,AAAA,cAAc,CAAC;EzBhDb,KAAK,ElBiGqB,OAAO;EkBhGjC,gBAAgB,ElBoFT,IAAI;EkBnFX,YAAY,ElB4WmB,IAAI;C2C5TpC;;AAFD,AAAA,cAAc,AtC/CT,MAAM,CAAC;EaMR,KAAK,ElB0FmB,OAAO;EkBzF/B,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,OAAM;CbGC;;AsC+CzB,AAAA,cAAc,AzBrCX,MAAM,EyBqCT,AAAA,cAAc,AzBpCX,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClB6VM,wBAAI;CkB3VlC;;AyB6BH,AAAA,cAAc,AzB1BX,SAAS,EyB0BZ,AAAA,cAAc,AzBzBX,SAAS,CAAC;EACT,gBAAgB,ElB6DX,IAAI;EkB5DT,YAAY,ElBqViB,IAAI;CkBpVlC;;AyBsBH,AAAA,cAAc,AzBpBX,OAAO,EyBoBV,AAAA,cAAc,AzBnBX,OAAO;AACR,AyBkBF,KzBlBO,GyBkBP,cAAc,AzBlBH,gBAAgB,CAAC;EACxB,KAAK,ElBkEmB,OAAO;EkBjE/B,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,OAAM;CAsCrB;;AyBeH,AAAA,SAAS,CAAC;EzBnDR,KAAK,ElBqFE,IAAI;EkBpFX,gBAAgB,ElB2FT,OAAO;EkB1Fd,YAAY,ElB0FL,OAAO;C2CvCf;;AAFD,AAAA,SAAS,AtClDJ,MAAM,CAAC;EaMR,KAAK,ElB8EA,IAAI;EkB7ET,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,OAAM;CbGC;;AsCkDzB,AAAA,SAAS,AzBxCN,MAAM,EyBwCT,AAAA,SAAS,AzBvCN,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClB2ElB,uBAAO;CkBzEb;;AyBgCH,AAAA,SAAS,AzB7BN,SAAS,EyB6BZ,AAAA,SAAS,AzB5BN,SAAS,CAAC;EACT,gBAAgB,ElBoEX,OAAO;EkBnEZ,YAAY,ElBmEP,OAAO;CkBlEb;;AyByBH,AAAA,SAAS,AzBvBN,OAAO,EyBuBV,AAAA,SAAS,AzBtBN,OAAO;AACR,AyBqBF,KzBrBO,GyBqBP,SAAS,AzBrBE,gBAAgB,CAAC;EACxB,KAAK,ElBsDA,IAAI;EkBrDT,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,OAAM;CAsCrB;;AyBkBH,AAAA,YAAY,CAAC;EzBtDX,KAAK,ElBqFE,IAAI;EkBpFX,gBAAgB,ElByFT,OAAO;EkBxFd,YAAY,ElBwFL,OAAO;C2ClCf;;AAFD,AAAA,YAAY,AtCrDP,MAAM,CAAC;EaMR,KAAK,ElB8EA,IAAI;EkB7ET,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,OAAM;CbGC;;AsCqDzB,AAAA,YAAY,AzB3CT,MAAM,EyB2CT,AAAA,YAAY,AzB1CT,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClByElB,sBAAO;CkBvEb;;AyBmCH,AAAA,YAAY,AzBhCT,SAAS,EyBgCZ,AAAA,YAAY,AzB/BT,SAAS,CAAC;EACT,gBAAgB,ElBkEX,OAAO;EkBjEZ,YAAY,ElBiEP,OAAO;CkBhEb;;AyB4BH,AAAA,YAAY,AzB1BT,OAAO,EyB0BV,AAAA,YAAY,AzBzBT,OAAO;AACR,AyBwBF,KzBxBO,GyBwBP,YAAY,AzBxBD,gBAAgB,CAAC;EACxB,KAAK,ElBsDA,IAAI;EkBrDT,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,OAAM;CAsCrB;;AyBqBH,AAAA,YAAY,CAAC;EzBzDX,KAAK,ElBqFE,IAAI;EkBpFX,gBAAgB,ElBuFT,OAAO;EkBtFd,YAAY,ElBsFL,OAAO;C2C7Bf;;AAFD,AAAA,YAAY,AtCxDP,MAAM,CAAC;EaMR,KAAK,ElB8EA,IAAI;EkB7ET,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,OAAM;CbGC;;AsCwDzB,AAAA,YAAY,AzB9CT,MAAM,EyB8CT,AAAA,YAAY,AzB7CT,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClBuElB,uBAAO;CkBrEb;;AyBsCH,AAAA,YAAY,AzBnCT,SAAS,EyBmCZ,AAAA,YAAY,AzBlCT,SAAS,CAAC;EACT,gBAAgB,ElBgEX,OAAO;EkB/DZ,YAAY,ElB+DP,OAAO;CkB9Db;;AyB+BH,AAAA,YAAY,AzB7BT,OAAO,EyB6BV,AAAA,YAAY,AzB5BT,OAAO;AACR,AyB2BF,KzB3BO,GyB2BP,YAAY,AzB3BD,gBAAgB,CAAC;EACxB,KAAK,ElBsDA,IAAI;EkBrDT,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,OAAM;CAsCrB;;AyBwBH,AAAA,WAAW,CAAC;EzB5DV,KAAK,ElBqFE,IAAI;EkBpFX,gBAAgB,ElBsFT,OAAO;EkBrFd,YAAY,ElBqFL,OAAO;C2CzBf;;AAFD,AAAA,WAAW,AtC3DN,MAAM,CAAC;EaMR,KAAK,ElB8EA,IAAI;EkB7ET,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,OAAM;CbGC;;AsC2DzB,AAAA,WAAW,AzBjDR,MAAM,EyBiDT,AAAA,WAAW,AzBhDR,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClBsElB,sBAAO;CkBpEb;;AyByCH,AAAA,WAAW,AzBtCR,SAAS,EyBsCZ,AAAA,WAAW,AzBrCR,SAAS,CAAC;EACT,gBAAgB,ElB+DX,OAAO;EkB9DZ,YAAY,ElB8DP,OAAO;CkB7Db;;AyBkCH,AAAA,WAAW,AzBhCR,OAAO,EyBgCV,AAAA,WAAW,AzB/BR,OAAO;AACR,AyB8BF,KzB9BO,GyB8BP,WAAW,AzB9BA,gBAAgB,CAAC;EACxB,KAAK,ElBsDA,IAAI;EkBrDT,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,OAAM;CAsCrB;;AyB6BH,AAAA,oBAAoB,CAAC;EzBzBnB,KAAK,ElBmDE,OAAO;EkBlDd,gBAAgB,EAAE,IAAK;EACvB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,ElBgDL,OAAO;C2CxBf;;AAFD,AAAA,oBAAoB,AtChEf,MAAM,CAAC;Ea6CR,KAAK,EAP2C,IAAI;EAQpD,gBAAgB,ElB4CX,OAAO;EkB3CZ,YAAY,ElB2CP,OAAO;CK1FS;;AsCgEzB,AAAA,oBAAoB,AzBdjB,MAAM,EyBcT,AAAA,oBAAoB,AzBbjB,MAAM,CAAC;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClBsChB,sBAAO;CkBrCb;;AyBWH,AAAA,oBAAoB,AzBTjB,SAAS,EyBSZ,AAAA,oBAAoB,AzBRjB,SAAS,CAAC;EACT,KAAK,ElBiCA,OAAO;EkBhCZ,gBAAgB,EAAE,WAAY;CAC/B;;AyBKH,AAAA,oBAAoB,AzBHjB,OAAO,EyBGV,AAAA,oBAAoB,AzBFjB,OAAO;AACR,AyBCF,KzBDO,GyBCP,oBAAoB,AzBDT,gBAAgB,CAAC;EACxB,KAAK,EA1B2C,IAAI;EA2BpD,gBAAgB,ElByBX,OAAO;EkBxBZ,YAAY,ElBwBP,OAAO;CkBvBb;;AyBAH,AAAA,sBAAsB,CAAC;EzB5BrB,KAAK,ElBsU0B,IAAI;EkBrUnC,gBAAgB,EAAE,IAAK;EACvB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,ElBmUmB,IAAI;C2CxSpC;;AAFD,AAAA,sBAAsB,AtCnEjB,MAAM,CAAC;Ea6CR,KAAK,EAP2C,IAAI;EAQpD,gBAAgB,ElB+Ta,IAAI;EkB9TjC,YAAY,ElB8TiB,IAAI;CK7WZ;;AsCmEzB,AAAA,sBAAsB,AzBjBnB,MAAM,EyBiBT,AAAA,sBAAsB,AzBhBnB,MAAM,CAAC;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClByTQ,wBAAI;CkBxTlC;;AyBcH,AAAA,sBAAsB,AzBZnB,SAAS,EyBYZ,AAAA,sBAAsB,AzBXnB,SAAS,CAAC;EACT,KAAK,ElBoTwB,IAAI;EkBnTjC,gBAAgB,EAAE,WAAY;CAC/B;;AyBQH,AAAA,sBAAsB,AzBNnB,OAAO,EyBMV,AAAA,sBAAsB,AzBLnB,OAAO;AACR,AyBIF,KzBJO,GyBIP,sBAAsB,AzBJX,gBAAgB,CAAC;EACxB,KAAK,EA1B2C,IAAI;EA2BpD,gBAAgB,ElB4Sa,IAAI;EkB3SjC,YAAY,ElB2SiB,IAAI;CkB1SlC;;AyBGH,AAAA,iBAAiB,CAAC;EzB/BhB,KAAK,ElBoDE,OAAO;EkBnDd,gBAAgB,EAAE,IAAK;EACvB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,ElBiDL,OAAO;C2CnBf;;AAFD,AAAA,iBAAiB,AtCtEZ,MAAM,CAAC;Ea6CR,KAAK,EAP2C,IAAI;EAQpD,gBAAgB,ElB6CX,OAAO;EkB5CZ,YAAY,ElB4CP,OAAO;CK3FS;;AsCsEzB,AAAA,iBAAiB,AzBpBd,MAAM,EyBoBT,AAAA,iBAAiB,AzBnBd,MAAM,CAAC;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClBuChB,uBAAO;CkBtCb;;AyBiBH,AAAA,iBAAiB,AzBfd,SAAS,EyBeZ,AAAA,iBAAiB,AzBdd,SAAS,CAAC;EACT,KAAK,ElBkCA,OAAO;EkBjCZ,gBAAgB,EAAE,WAAY;CAC/B;;AyBWH,AAAA,iBAAiB,AzBTd,OAAO,EyBSV,AAAA,iBAAiB,AzBRd,OAAO;AACR,AyBOF,KzBPO,GyBOP,iBAAiB,AzBPN,gBAAgB,CAAC;EACxB,KAAK,EA1B2C,IAAI;EA2BpD,gBAAgB,ElB0BX,OAAO;EkBzBZ,YAAY,ElByBP,OAAO;CkBxBb;;AyBMH,AAAA,oBAAoB,CAAC;EzBlCnB,KAAK,ElBkDE,OAAO;EkBjDd,gBAAgB,EAAE,IAAK;EACvB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,ElB+CL,OAAO;C2Cdf;;AAFD,AAAA,oBAAoB,AtCzEf,MAAM,CAAC;Ea6CR,KAAK,EAP2C,IAAI;EAQpD,gBAAgB,ElB2CX,OAAO;EkB1CZ,YAAY,ElB0CP,OAAO;CKzFS;;AsCyEzB,AAAA,oBAAoB,AzBvBjB,MAAM,EyBuBT,AAAA,oBAAoB,AzBtBjB,MAAM,CAAC;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClBqChB,sBAAO;CkBpCb;;AyBoBH,AAAA,oBAAoB,AzBlBjB,SAAS,EyBkBZ,AAAA,oBAAoB,AzBjBjB,SAAS,CAAC;EACT,KAAK,ElBgCA,OAAO;EkB/BZ,gBAAgB,EAAE,WAAY;CAC/B;;AyBcH,AAAA,oBAAoB,AzBZjB,OAAO,EyBYV,AAAA,oBAAoB,AzBXjB,OAAO;AACR,AyBUF,KzBVO,GyBUP,oBAAoB,AzBVT,gBAAgB,CAAC;EACxB,KAAK,EA1B2C,IAAI;EA2BpD,gBAAgB,ElBwBX,OAAO;EkBvBZ,YAAY,ElBuBP,OAAO;CkBtBb;;AyBSH,AAAA,oBAAoB,CAAC;EzBrCnB,KAAK,ElBgDE,OAAO;EkB/Cd,gBAAgB,EAAE,IAAK;EACvB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,ElB6CL,OAAO;C2CTf;;AAFD,AAAA,oBAAoB,AtC5Ef,MAAM,CAAC;Ea6CR,KAAK,EAP2C,IAAI;EAQpD,gBAAgB,ElByCX,OAAO;EkBxCZ,YAAY,ElBwCP,OAAO;CKvFS;;AsC4EzB,AAAA,oBAAoB,AzB1BjB,MAAM,EyB0BT,AAAA,oBAAoB,AzBzBjB,MAAM,CAAC;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClBmChB,uBAAO;CkBlCb;;AyBuBH,AAAA,oBAAoB,AzBrBjB,SAAS,EyBqBZ,AAAA,oBAAoB,AzBpBjB,SAAS,CAAC;EACT,KAAK,ElB8BA,OAAO;EkB7BZ,gBAAgB,EAAE,WAAY;CAC/B;;AyBiBH,AAAA,oBAAoB,AzBfjB,OAAO,EyBeV,AAAA,oBAAoB,AzBdjB,OAAO;AACR,AyBaF,KzBbO,GyBaP,oBAAoB,AzBbT,gBAAgB,CAAC;EACxB,KAAK,EA1B2C,IAAI;EA2BpD,gBAAgB,ElBsBX,OAAO;EkBrBZ,YAAY,ElBqBP,OAAO;CkBpBb;;AyBYH,AAAA,mBAAmB,CAAC;EzBxClB,KAAK,ElB+CE,OAAO;EkB9Cd,gBAAgB,EAAE,IAAK;EACvB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,ElB4CL,OAAO;C2CLf;;AAFD,AAAA,mBAAmB,AtC/Ed,MAAM,CAAC;Ea6CR,KAAK,EAP2C,IAAI;EAQpD,gBAAgB,ElBwCX,OAAO;EkBvCZ,YAAY,ElBuCP,OAAO;CKtFS;;AsC+EzB,AAAA,mBAAmB,AzB7BhB,MAAM,EyB6BT,AAAA,mBAAmB,AzB5BhB,MAAM,CAAC;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,ClBkChB,sBAAO;CkBjCb;;AyB0BH,AAAA,mBAAmB,AzBxBhB,SAAS,EyBwBZ,AAAA,mBAAmB,AzBvBhB,SAAS,CAAC;EACT,KAAK,ElB6BA,OAAO;EkB5BZ,gBAAgB,EAAE,WAAY;CAC/B;;AyBoBH,AAAA,mBAAmB,AzBlBhB,OAAO,EyBkBV,AAAA,mBAAmB,AzBjBhB,OAAO;AACR,AyBgBF,KzBhBO,GyBgBP,mBAAmB,AzBhBR,gBAAgB,CAAC;EACxB,KAAK,EA1B2C,IAAI;EA2BpD,gBAAgB,ElBqBX,OAAO;EkBpBZ,YAAY,ElBoBP,OAAO;CkBnBb;;AyBsBH,AAAA,SAAS,CAAC;EACR,WAAW,E3C4JQ,MAAM;E2C3JzB,KAAK,E3CDE,OAAO;E2CEd,aAAa,EAAE,CAAE;CA6BlB;;AAhCD,AAAA,SAAS,EAAT,AAAA,SAAS,AAMN,OAAO,EANV,AAAA,SAAS,AAON,OAAO,EAPV,AAAA,SAAS,AAQN,SAAS,CAAC;EACT,gBAAgB,EAAE,WAAY;CAE/B;;AAXH,AAAA,SAAS,EAAT,AAAA,SAAS,AAaN,MAAM,EAbT,AAAA,SAAS,AAcN,OAAO,CAAC;EACP,YAAY,EAAE,WAAY;CAC3B;;AAhBH,AAAA,SAAS,AtCzFJ,MAAM,CAAC;EsC2GR,YAAY,EAAE,WAAY;CtC3GL;;AsCyFzB,AAAA,SAAS,AtC/EJ,MAAM,EsC+EX,AAAA,SAAS,AtC9EJ,MAAM,CAAC;EsCmGR,KAAK,E3C2Ee,OAAM;E2C1E1B,eAAe,E3C2EK,SAAS;E2C1E7B,gBAAgB,EAAE,WAAY;CtCnG7B;;AsC4EL,AAAA,SAAS,AAyBN,SAAS,CAAC;EACT,KAAK,E3CjBmB,OAAO;C2CsBhC;;AA/BH,AAAA,SAAS,AAyBN,SAAS,AtCxGP,MAAM,EsC+EX,AAAA,SAAS,AAyBN,SAAS,AtCvGP,MAAM,CAAC;EsC2GN,eAAe,EAAE,IAAK;CtCzGvB;;AsCmHL,AAAA,OAAO,EG/CP,AH+CA,aG/Ca,GAAG,IAAI,CH+CZ;EzBxDN,OAAO,ElB6TwB,OAAM,CADN,MAAM;EkB3TrC,SAAS,ElByKM,OAAO;E2BxPpB,aAAa,E3B6TQ,MAAK;C2CpL7B;;AACD,AAAA,OAAO,EGpDP,AHoDA,aGpDa,GAAG,IAAI,CHoDZ;EzB5DN,OAAO,ElB0TwB,OAAM,CADN,MAAK;EkBxTpC,SAAS,ElB0KM,QAAO;E2BzPpB,aAAa,E3B8TQ,MAAK;C2CjL7B;;AAOD,AAAA,UAAU,CAAC;EACT,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;CACb;;AAGD,AAAa,UAAH,GAAG,UAAU,CAAC;EACtB,UAAU,E3CkPqB,MAAK;C2CjPrC;;AAGD,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAGH,UAAU;AAFb,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAEH,UAAU;AADb,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CACH,UAAU,CAAC;EACV,KAAK,EAAE,IAAK;CACb;;ACxKH,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,CAAE;EzCcP,UAAU,EH2TS,OAAO,CAAC,KAAI,CAAC,MAAM;C4CnU3C;;AAPD,AAAA,KAAK,AAIF,KAAK,CAAC;EACL,OAAO,EAAE,CAAE;CACZ;;AAGH,AAAA,SAAS,CAAC;EACR,OAAO,EAAE,IAAK;CAIf;;AALD,AAAA,SAAS,AAEN,KAAK,CAAC;EACL,OAAO,EAAE,KAAM;CAChB;;AAGH,AAAA,EAAE,AACC,SAAS,AAAA,KAAK,CAAC;EACd,OAAO,EAAE,SAAU;CACpB;;AAGH,AAAA,KAAK,AACF,SAAS,AAAA,KAAK,CAAC;EACd,OAAO,EAAE,eAAgB;CAC1B;;AAGH,AAAA,WAAW,CAAC;EACV,QAAQ,EAAE,QAAS;EACnB,MAAM,EAAE,CAAE;EACV,QAAQ,EAAE,MAAO;EzChBb,UAAU,EH4TS,MAAM,CAAC,KAAI,CAAC,IAAI;C4C1SxC;;AChCD,AAAA,OAAO;AACP,AAAA,SAAS,CAAC;EACR,QAAQ,EAAE,QAAS;CACpB;;AAED,AAAA,gBAAgB,AAEb,OAAO,CAAC;EACP,OAAO,EAAE,YAAa;EACtB,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,WAAW,E7C2TU,KAAI;E6C1TzB,cAAc,EAAE,MAAO;EACvB,OAAO,EAAE,EAAG;EACZ,UAAU,E7CwTW,KAAI,C6CxTA,KAAK;EAC9B,YAAY,E7CuTS,KAAI,C6CvTE,KAAK,CAAC,WAAW;EAC5C,WAAW,E7CsTU,KAAI,C6CtTC,KAAK,CAAC,WAAW;CAC5C;;AAZH,AAAA,gBAAgB,AAeb,MAAM,CAAC;EACN,OAAO,EAAE,CAAE;CACZ;;AAGH,AACE,OADK,CACL,gBAAgB,AACb,OAAO,CAAC;EACP,UAAU,EAAE,CAAE;EACd,aAAa,E7CySM,KAAI,C6CzSK,KAAK;CAClC;;AAKL,AAAA,cAAc,CAAC;EACb,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,IAAK;EACV,IAAI,EAAE,CAAE;EACR,OAAO,E7CwiBmB,IAAI;E6CviB9B,OAAO,EAAE,IAAK;EACd,KAAK,EAAE,IAAK;EACZ,SAAS,E7CugBsB,KAAK;E6CtgBpC,OAAO,E7CugBwB,MAAK,C6CvgBP,CAAC;EAC9B,MAAM,E7CugByB,QAAO,C6CvgBT,CAAC,CAAC,CAAC;EAChC,SAAS,E7C6MM,IAAI;E6C5MnB,KAAK,E7C2DqB,OAAO;E6C1DjC,UAAU,EAAE,IAAK;EACjB,UAAU,EAAE,IAAK;EACjB,gBAAgB,E7C4CT,IAAI;E6C3CX,eAAe,EAAE,WAAY;EAC7B,MAAM,E7CqHO,GAAG,C6CrHe,KAAK,C7C2C7B,mBAAI;E2B3FT,aAAa,E3B4TQ,OAAM;C6CzQ9B;;AAGD,AAAA,iBAAiB,CAAC;EtBrDhB,MAAM,EAAE,GAAI;EACZ,MAAM,EAAG,MAAS,CAAM,CAAC;EACzB,QAAQ,EAAE,MAAO;EACjB,gBAAgB,EvBqGU,OAAO;C6CjDlC;;AAKD,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,GAAG,C7CggBmB,MAAM;E6C/frC,KAAK,EAAE,IAAK;EACZ,WAAW,E7C0LQ,MAAM;E6CzLzB,KAAK,E7CmCqB,OAAO;E6ClCjC,UAAU,EAAE,OAAQ;EACpB,WAAW,EAAE,MAAO;EACpB,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;CAyBX;;AAnCD,AAAA,cAAc,AxC7CT,MAAM,EwC6CX,AAAA,cAAc,AxC5CT,MAAM,CAAC;EwCyDR,KAAK,E7C8ewB,OAAM;E6C7enC,eAAe,EAAE,IAAK;EACtB,gBAAgB,E7C8BQ,OAAO;CKvF9B;;AwC0CL,AAAA,cAAc,AAkBX,OAAO,EAlBV,AAAA,cAAc,AAmBX,OAAO,CAAC;EACP,KAAK,E7CSA,IAAI;E6CRT,eAAe,EAAE,IAAK;EACtB,gBAAgB,E7CaX,OAAO;C6CZb;;AAvBH,AAAA,cAAc,AAyBX,SAAS,EAzBZ,AAAA,cAAc,AA0BX,SAAS,CAAC;EACT,KAAK,E7CgBmB,OAAO;E6Cf/B,MAAM,E7CmXuB,WAAW;E6ClXxC,gBAAgB,EAAE,WAAY;CAK/B;;AAIH,AAEI,KAFC,GAED,cAAc,CAAC;EACf,OAAO,EAAE,KAAM;CAChB;;AAJH,AAOI,KAPC,GAOD,CAAC,CAAC;EACF,OAAO,EAAE,CAAE;CACZ;;AAOH,AAAA,oBAAoB,CAAC;EACnB,KAAK,EAAE,CAAE;EACT,IAAI,EAAE,IAAK;CACZ;;AAED,AAAA,mBAAmB,CAAC;EAClB,KAAK,EAAE,IAAK;EACZ,IAAI,EAAE,CAAE;CACT;;AAGD,AAAA,gBAAgB,CAAC;EACf,OAAO,EAAE,KAAM;EACf,OAAO,E7C+awB,MAAK,CAiBL,MAAM;E6C/brC,aAAa,EAAE,CAAE;EACjB,SAAS,E7CuHM,QAAO;E6CtHtB,KAAK,E7C3BqB,OAAO;E6C4BjC,WAAW,EAAE,MAAO;CACrB;;AAGD,AAAA,kBAAkB,CAAC;EACjB,QAAQ,EAAE,KAAM;EAChB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,CAAE;EACR,OAAO,E7C4bmB,GAAG;C6C3b9B;;AAMD,AAEE,OAFK,CAEL,cAAc,CAAC;EACb,GAAG,EAAE,IAAK;EACV,MAAM,EAAE,IAAK;EACb,aAAa,E7CsZgB,QAAO;C6CrZrC;;AC5JH,AAAA,UAAU;AACV,AAAA,mBAAmB,CAAC;EAClB,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,WAAY;EACrB,cAAc,EAAE,MAAO;CAyBxB;;AA7BD,AAMI,UANM,GAMN,IAAI;AALR,AAKI,mBALe,GAKf,IAAI,CAAC;EACL,QAAQ,EAAE,QAAS;EACnB,IAAI,EAAE,QAAS;CAYhB;;AApBH,AAMI,UANM,GAMN,IAAI,AzCCH,MAAM;AyCNX,AAKI,mBALe,GAKf,IAAI,AzCCH,MAAM,CAAC;EyCMN,OAAO,EAAE,CAAE;CzCNQ;;AyCPzB,AAMI,UANM,GAMN,IAAI,AASH,MAAM,EAfX,AAMI,UANM,GAMN,IAAI,AAUH,OAAO,EAhBZ,AAMI,UANM,GAMN,IAAI,AAWH,OAAO;AAhBZ,AAKI,mBALe,GAKf,IAAI,AASH,MAAM;AAdX,AAKI,mBALe,GAKf,IAAI,AAUH,OAAO;AAfZ,AAKI,mBALe,GAKf,IAAI,AAWH,OAAO,CAAC;EACP,OAAO,EAAE,CAAE;CACZ;;AAnBL,AAuBS,UAvBC,CAuBR,IAAI,GAAG,IAAI;AAvBb,AAwBS,UAxBC,CAwBR,IAAI,GAAG,UAAU;AAxBnB,AAyBe,UAzBL,CAyBR,UAAU,GAAG,IAAI;AAzBnB,AA0Be,UA1BL,CA0BR,UAAU,GAAG,UAAU;AAzBzB,AAsBS,mBAtBU,CAsBjB,IAAI,GAAG,IAAI;AAtBb,AAuBS,mBAvBU,CAuBjB,IAAI,GAAG,UAAU;AAvBnB,AAwBe,mBAxBI,CAwBjB,UAAU,GAAG,IAAI;AAxBnB,AAyBe,mBAzBI,CAyBjB,UAAU,GAAG,UAAU,CAAC;EACtB,WAAW,E9C2IA,IAAG;C8C1If;;AAIH,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,IAAK;EACd,eAAe,EAAE,UAAW;CAK7B;;AAPD,AAIE,YAJU,CAIV,YAAY,CAAC;EACX,KAAK,EAAE,IAAK;CACb;;AAGH,AAAyE,UAA/D,GAAG,IAAI,AAAA,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,CAAC,IAAK,CAAA,AAAA,gBAAgB,EAAE;EACzE,aAAa,EAAE,CAAE;CAClB;;AAGD,AAAiB,UAAP,GAAG,IAAI,AAAA,YAAY,CAAC;EAC5B,WAAW,EAAE,CAAE;CAKhB;;AAND,AAAiB,UAAP,GAAG,IAAI,AAAA,YAAY,AAG1B,IAAK,CAAA,AAAA,WAAW,CAAC,IAAK,CAAA,AAAA,gBAAgB,EAAE;EnBnCvC,0BAA0B,EmBoCG,CAAC;EnBnC9B,uBAAuB,EmBmCM,CAAC;CAC/B;;AAGH,AAA6C,UAAnC,GAAG,IAAI,AAAA,WAAW,AAAA,IAAK,CAAA,AAAA,YAAY;AAC7C,AAA8C,UAApC,GAAG,gBAAgB,AAAA,IAAK,CAAA,AAAA,YAAY,EAAE;EnB3B5C,yBAAyB,EmB4BC,CAAC;EnB3B3B,sBAAsB,EmB2BI,CAAC;CAC9B;;AAGD,AAAa,UAAH,GAAG,UAAU,CAAC;EACtB,KAAK,EAAE,IAAK;CACb;;AACD,AAA6D,UAAnD,GAAG,UAAU,AAAA,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,IAAI,IAAI,CAAC;EAChE,aAAa,EAAE,CAAE;CAClB;;AACD,AACQ,UADE,GAAG,UAAU,AAAA,YAAY,AAAA,IAAK,CAAA,AAAA,WAAW,IAC/C,IAAI,AAAA,WAAW;AADnB,AAEI,UAFM,GAAG,UAAU,AAAA,YAAY,AAAA,IAAK,CAAA,AAAA,WAAW,IAE/C,gBAAgB,CAAC;EnBtDjB,0BAA0B,EmBuDG,CAAC;EnBtD9B,uBAAuB,EmBsDM,CAAC;CAC/B;;AAEH,AAA2D,UAAjD,GAAG,UAAU,AAAA,WAAW,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,IAAI,AAAA,YAAY,CAAC;EnB5CpE,yBAAyB,EmB6CC,CAAC;EnB5C3B,sBAAsB,EmB4CI,CAAC;CAC9B;;AAGD,AAA2B,UAAjB,CAAC,gBAAgB,AAAA,OAAO;AAClC,AAAgB,UAAN,AAAA,KAAK,CAAC,gBAAgB,CAAC;EAC/B,OAAO,EAAE,CAAE;CACZ;;AAeD,AAAO,IAAH,GAAG,sBAAsB,CAAC;EAC5B,aAAa,EAAE,OAAc;EAC7B,YAAY,EAAE,OAAc;CAK7B;;AAPD,AAAO,IAAH,GAAG,sBAAsB,AAI1B,OAAO,CAAC;EACP,WAAW,EAAE,CAAE;CAChB;;AAGH,AAAU,OAAH,GAAG,sBAAsB,EAjBhC,AAiBU,aAjBG,GAAG,IAAI,GAiBV,sBAAsB,CAAC;EAC/B,aAAa,EAAE,QAAiB;EAChC,YAAY,EAAE,QAAiB;CAChC;;AAED,AAAU,OAAH,GAAG,sBAAsB,EArBhC,AAqBU,aArBG,GAAG,IAAI,GAqBV,sBAAsB,CAAC;EAC/B,aAAa,EAAE,QAAiB;EAChC,YAAY,EAAE,QAAiB;CAChC;;AAmBD,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,WAAY;EACrB,cAAc,EAAE,MAAO;EACvB,WAAW,EAAE,UAAW;EACxB,eAAe,EAAE,MAAO;CAczB;;AAlBD,AAME,mBANiB,CAMjB,IAAI;AANN,AAOE,mBAPiB,CAOjB,UAAU,CAAC;EACT,KAAK,EAAE,IAAK;CACb;;AATH,AAWW,mBAXQ,GAWf,IAAI,GAAG,IAAI;AAXf,AAYW,mBAZQ,GAYf,IAAI,GAAG,UAAU;AAZrB,AAaiB,mBAbE,GAaf,UAAU,GAAG,IAAI;AAbrB,AAciB,mBAdE,GAcf,UAAU,GAAG,UAAU,CAAC;EACxB,UAAU,E9CoBC,IAAG;E8CnBd,WAAW,EAAE,CAAE;CAChB;;AAGH,AAAsB,mBAAH,GAAG,IAAI,AACvB,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,EAAE;EACnC,aAAa,EAAE,CAAE;CAClB;;AAHH,AAAsB,mBAAH,GAAG,IAAI,AAIvB,YAAY,AAAA,IAAK,CAAA,AAAA,WAAW,EAAE;EnBtI7B,0BAA0B,EmBuII,CAAC;EnBtI/B,yBAAyB,EmBsIK,CAAC;CAChC;;AANH,AAAsB,mBAAH,GAAG,IAAI,AAOvB,WAAW,AAAA,IAAK,CAAA,AAAA,YAAY,EAAE;EnBvJ7B,uBAAuB,EmBwJI,CAAC;EnBvJ5B,sBAAsB,EmBuJK,CAAC;CAC7B;;AAEH,AAAsE,mBAAnD,GAAG,UAAU,AAAA,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,IAAI,IAAI,CAAC;EACzE,aAAa,EAAE,CAAE;CAClB;;AACD,AACQ,mBADW,GAAG,UAAU,AAAA,YAAY,AAAA,IAAK,CAAA,AAAA,WAAW,IACxD,IAAI,AAAA,WAAW;AADnB,AAEI,mBAFe,GAAG,UAAU,AAAA,YAAY,AAAA,IAAK,CAAA,AAAA,WAAW,IAExD,gBAAgB,CAAC;EnBlJjB,0BAA0B,EmBmJI,CAAC;EnBlJ/B,yBAAyB,EmBkJK,CAAC;CAChC;;AAEH,AAAoE,mBAAjD,GAAG,UAAU,AAAA,WAAW,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,IAAI,AAAA,YAAY,CAAC;EnBpK7E,uBAAuB,EmBqKE,CAAC;EnBpK1B,sBAAsB,EmBoKG,CAAC;CAC7B;;CAeD,AAAA,AAGsB,WAHrB,CAAY,SAAS,AAArB,IACG,IAAI,CAEJ,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;CAHV,AAAA,AAIyB,WAJxB,CAAY,SAAS,AAArB,IACG,IAAI,CAGJ,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf;CAJV,AAAA,AAGsB,WAHrB,CAAY,SAAS,AAArB,IAEG,UAAU,GAAG,IAAI,CACjB,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;CAHV,AAAA,AAIyB,WAJxB,CAAY,SAAS,AAArB,IAEG,UAAU,GAAG,IAAI,CAEjB,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAiB;EACrB,QAAQ,EAAE,QAAS;EACnB,IAAI,EAAE,gBAAI;EACV,cAAc,EAAE,IAAK;CACtB;;ACnML,AAAA,YAAY,CAAC;EACX,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,IAAK;EACd,KAAK,EAAE,IAAK;CAkBb;;AArBD,AAKE,YALU,CAKV,aAAa,CAAC;EAGZ,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,CAAE;EACX,IAAI,EAAE,QAAS;EAGf,KAAK,EAAE,EAAG;EACV,aAAa,EAAE,CAAE;CAMlB;;AApBH,AAKE,YALU,CAKV,aAAa,A1C4CV,MAAM,E0CjDX,AAKE,YALU,CAKV,aAAa,A1C6CV,OAAO,E0ClDZ,AAKE,YALU,CAKV,aAAa,A1C8CV,MAAM,CAAC;E0CjCN,OAAO,EAAE,CAAE;C1CmCZ;;A0C9BL,AAAA,kBAAkB;AAClB,AAAA,gBAAgB;AAChB,AAAa,YAAD,CAAC,aAAa,CAAC;EAEzB,OAAO,EAAE,IAAK;EACd,cAAc,EAAE,MAAO;EACvB,eAAe,EAAE,MAAO;CAKzB;;AAXD,AAAA,kBAAkB,AAQf,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW;AAPrC,AAAA,gBAAgB,AAOb,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW;AANrC,AAAa,YAAD,CAAC,aAAa,AAMvB,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,EAAE;EpB/BnC,aAAa,EoBgCU,CAAC;CACzB;;AAGH,AAAA,kBAAkB;AAClB,AAAA,gBAAgB,CAAC;EACf,WAAW,EAAE,MAAO;EACpB,cAAc,EAAE,MAAO;CACxB;;AAwBD,AAAA,kBAAkB,CAAC;EACjB,OAAO,E/C0VwB,MAAK,CADL,OAAM;E+CxVrC,aAAa,EAAE,CAAE;EACjB,SAAS,E/CoLM,IAAI;E+CnLnB,WAAW,E/CwLQ,MAAM;E+CvLzB,WAAW,E/CuVoB,IAAI;E+CtVnC,KAAK,E/CiCqB,OAAO;E+ChCjC,UAAU,EAAE,MAAO;EACnB,gBAAgB,E/CiCU,OAAO;E+ChCjC,MAAM,E/C4FO,GAAG,C+C5FgB,KAAK,C/CkB9B,mBAAI;E2B3FT,aAAa,E3B4TQ,OAAM;C+C7N9B;;AA/BD,AAAA,kBAAkB,AAaf,gBAAgB;AAvBnB,AAUA,eAVe,GAUf,kBAAkB;AATlB,AASA,eATe,GAAG,gBAAgB,GASlC,kBAAkB,AATmB,IAAI,CAsBrB;EAChB,OAAO,E/CoWsB,OAAM,CADN,MAAK;E+ClWlC,SAAS,E/C0KI,QAAO;E2BzPpB,aAAa,E3B8TQ,MAAK;C+C7O3B;;AAjBH,AAAA,kBAAkB,AAkBf,gBAAgB;AAjCnB,AAeA,eAfe,GAef,kBAAkB;AAdlB,AAcA,eAde,GAAG,gBAAgB,GAclC,kBAAkB,AAdmB,IAAI,CAgCrB;EAChB,OAAO,E/CkWsB,OAAM,CADN,MAAM;E+ChWnC,SAAS,E/CoKI,OAAO;E2BxPpB,aAAa,E3B6TQ,MAAK;C+CvO3B;;AAtBH,AA0BoB,kBA1BF,CA0BhB,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;AA1BR,AA2BuB,kBA3BL,CA2BhB,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAiB;EACrB,UAAU,EAAE,CAAE;CACf;;AASH,AAA0C,YAA9B,CAAC,aAAa,AAAA,IAAK,CAAA,AAAA,WAAW;AAC1C,AAAkC,kBAAhB,AAAA,IAAK,CAAA,AAAA,WAAW;AAClC,AAAoC,gBAApB,AAAA,IAAK,CAAA,AAAA,WAAW,IAAI,IAAI;AACxC,AAAiD,gBAAjC,AAAA,IAAK,CAAA,AAAA,WAAW,IAAI,UAAU,GAAG,IAAI;AACrD,AAAoC,gBAApB,AAAA,IAAK,CAAA,AAAA,WAAW,IAAI,gBAAgB;AACpD,AAA+E,gBAA/D,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,IAAI,AAAA,IAAK,CAAA,AAAA,WAAW,CAAC,IAAK,CAAA,AAAA,gBAAgB;AAC/E,AAAmE,gBAAnD,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,UAAU,AAAA,IAAK,CAAA,AAAA,WAAW,IAAI,IAAI,CAAC;EpB/FpE,0BAA0B,EoBgGC,CAAC;EpB/F5B,uBAAuB,EoB+FI,CAAC;CAC/B;;AACD,AAAkC,kBAAhB,AAAA,IAAK,CAAA,AAAA,WAAW,EAAE;EAClC,YAAY,EAAE,CAAE;CACjB;;AACD,AAA2C,YAA/B,CAAC,aAAa,AAAA,IAAK,CAAA,AAAA,YAAY;AAC3C,AAAmC,kBAAjB,AAAA,IAAK,CAAA,AAAA,YAAY;AACnC,AAAqC,gBAArB,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,IAAI;AACzC,AAAkD,gBAAlC,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,UAAU,GAAG,IAAI;AACtD,AAAqC,gBAArB,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,gBAAgB;AACrD,AAAyD,gBAAzC,AAAA,IAAK,CAAA,AAAA,WAAW,IAAI,IAAI,AAAA,IAAK,CAAA,AAAA,YAAY;AACzD,AAAmE,gBAAnD,AAAA,IAAK,CAAA,AAAA,WAAW,IAAI,UAAU,AAAA,IAAK,CAAA,AAAA,YAAY,IAAI,IAAI,CAAC;EpB7FpE,yBAAyB,EoB8FC,CAAC;EpB7F3B,sBAAsB,EoB6FI,CAAC;CAC9B;;AACD,AAAmD,aAAtC,GAAG,kBAAkB,AAAA,IAAK,CAAA,AAAA,YAAY,EAAE;EACnD,WAAW,EAAE,CAAE;CAChB;;AAMD,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,QAAS;EAGnB,SAAS,EAAE,CAAE;EACb,WAAW,EAAE,MAAO;CAqCrB;;AA1CD,AASI,gBATY,GASZ,IAAI,CAAC;EACL,QAAQ,EAAE,QAAS;EAEnB,IAAI,EAAE,CAAE;CAUT;;AAtBH,AAcM,gBAdU,GASZ,IAAI,GAKF,IAAI,CAAC;EACL,WAAW,E/CmBF,IAAG;C+ClBb;;AAhBL,AASI,gBATY,GASZ,IAAI,A1C3FH,MAAM,E0CkFX,AASI,gBATY,GASZ,IAAI,A1C1FH,OAAO,E0CiFZ,AASI,gBATY,GASZ,IAAI,A1CzFH,MAAM,CAAC;E0CoGN,OAAO,EAAE,CAAE;C1ClGZ;;A0C8EL,AA0BM,gBA1BU,AAyBb,IAAK,CAAA,AAAA,WAAW,IACb,IAAI;AA1BV,AA2BM,gBA3BU,AAyBb,IAAK,CAAA,AAAA,WAAW,IAEb,UAAU,CAAC;EACX,YAAY,E/CMH,IAAG;C+CLb;;AA7BL,AAgCM,gBAhCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IACd,IAAI;AAhCV,AAiCM,gBAjCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IAEd,UAAU,CAAC;EACX,OAAO,EAAE,CAAE;EACX,WAAW,E/CDF,IAAG;C+CMb;;AAxCL,AAgCM,gBAhCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IACd,IAAI,A1ClHL,MAAM,E0CkFX,AAgCM,gBAhCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IACd,IAAI,A1CjHL,OAAO,E0CiFZ,AAgCM,gBAhCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IACd,IAAI,A1ChHL,MAAM;A0CgFX,AAiCM,gBAjCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IAEd,UAAU,A1CnHX,MAAM;A0CkFX,AAiCM,gBAjCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IAEd,UAAU,A1ClHX,OAAO;A0CiFZ,AAiCM,gBAjCU,AA+Bb,IAAK,CAAA,AAAA,YAAY,IAEd,UAAU,A1CjHX,MAAM,CAAC;E0CsHJ,OAAO,EAAE,CAAE;C1CpHd;;A2C9CL,AAAA,eAAe,CAAC;EACd,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,WAAY;EACrB,UAAU,EAAG,MAAI;EACjB,YAAY,EhDmcY,MAAM;EgDlc9B,YAAY,EhDmcY,IAAI;EgDlc5B,MAAM,EAAE,OAAQ;CACjB;;AAED,AAAA,qBAAqB,CAAC;EACpB,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,EAAG;EACZ,OAAO,EAAE,CAAE;CA8BZ;;AAjCD,AAKc,qBALO,AAKlB,QAAQ,GAAG,yBAAyB,CAAC;EACpC,KAAK,EhDoEA,IAAI;EgDnET,gBAAgB,EhDyEX,OAAO;CgDvEb;;AATH,AAWY,qBAXS,AAWlB,MAAM,GAAG,yBAAyB,CAAC;EAElC,UAAU,EhDmc8B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAtY5C,IAAI,EAsYmD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAhYhE,OAAO;CgDlEb;;AAdH,AAgBa,qBAhBQ,AAgBlB,OAAO,GAAG,yBAAyB,CAAC;EACnC,KAAK,EhDyDA,IAAI;EgDxDT,gBAAgB,EhDicyB,OAAO;CgD/bjD;;AApBH,AAuBM,qBAvBe,AAsBlB,SAAS,GACN,yBAAyB,CAAC;EAC1B,MAAM,EhDoaqB,WAAW;EgDnatC,gBAAgB,EhDgEM,OAAO;CgD/D9B;;AA1BL,AA4BM,qBA5Be,AAsBlB,SAAS,GAMN,2BAA2B,CAAC;EAC5B,KAAK,EhD2DiB,OAAO;EgD1D7B,MAAM,EhD8ZqB,WAAW;CgD7ZvC;;AAQL,AAAA,yBAAyB,CAAC;EACxB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAI,OAAiB;EACxB,IAAI,EAAE,CAAE;EACR,OAAO,EAAE,KAAM;EACf,KAAK,EhDsZ+B,IAAI;EgDrZxC,MAAM,EhDqZ8B,IAAI;EgDpZxC,cAAc,EAAE,IAAK;EACrB,WAAW,EAAE,IAAK;EAClB,gBAAgB,EhDoZoB,IAAI;EgDnZxC,iBAAiB,EAAE,SAAU;EAC7B,mBAAmB,EAAE,aAAc;EACnC,eAAe,EhDkZqB,GAAG,CAAC,GAAG;CgDhZ5C;;AAMD,AACE,gBADc,CACd,yBAAyB,CAAC;ErB5ExB,aAAa,E3B4TQ,OAAM;CgD9O5B;;AAHH,AAKkC,gBALlB,CAKd,qBAAqB,AAAA,QAAQ,GAAG,yBAAyB,CAAC;EACxD,gBAAgB,EhDhBR,wMAAS;CgDiBlB;;AAPH,AASwC,gBATxB,CASd,qBAAqB,AAAA,cAAc,GAAG,yBAAyB,CAAC;EAC9D,gBAAgB,EhDWX,OAAO;EgDVZ,gBAAgB,EhDrBR,qJAAS;CgDuBlB;;AAOH,AACE,aADW,CACX,yBAAyB,CAAC;EACxB,aAAa,EhD6YK,GAAG;CgD5YtB;;AAHH,AAKkC,aALrB,CAKX,qBAAqB,AAAA,QAAQ,GAAG,yBAAyB,CAAC;EACxD,gBAAgB,EhDpCR,kJAAS;CgDqClB;;AASH,AAAA,wBAAwB,CAAC;EACvB,OAAO,EAAE,IAAK;EACd,cAAc,EAAE,MAAO;CASxB;;AAXD,AAIE,wBAJsB,CAItB,eAAe,CAAC;EACd,aAAa,EhD4VS,OAAM;CgDvV7B;;AAVH,AAOM,wBAPkB,CAItB,eAAe,GAGX,eAAe,CAAC;EAChB,WAAW,EAAE,CAAE;CAChB;;AAWL,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,YAAa;EACtB,SAAS,EAAE,IAAK;EAEhB,MAAM,EAAE,mBAAI;EACZ,OAAO,EhD0W0B,QAAO,CgD1WL,OAAwB,ChD0W1B,QAAO,CADP,OAAM;EgDxWvC,WAAW,EhDmRoB,IAAI;EgDlRnC,KAAK,EhDnCqB,OAAO;EgDoCjC,cAAc,EAAE,MAAO;EACvB,UAAU,EhDlDH,IAAI,CAzBD,mKAAS,CgD2EoC,SAAS,CAAC,KAAK,ChDqWrC,OAAM,CgDrWyD,MAAM;EACtG,eAAe,EhD4Wa,GAAG,CAAC,IAAI;EgD3WpC,MAAM,EhDuBO,GAAG,CgDvBoB,KAAK,ChDnDlC,mBAAI;E2B3FT,aAAa,E3B4TQ,OAAM;EgD3K7B,eAAe,EAAE,IAAK;EACtB,kBAAkB,EAAE,IAAK;CA4B1B;;AA3CD,AAAA,cAAc,AAiBX,MAAM,CAAC;EACN,YAAY,EhD2WmB,OAAO;EgD1WtC,OAAO,EAAE,IAAK;CAYf;;AA/BH,AAAA,cAAc,AAiBX,MAAM,AAKJ,WAAW,CAAC;EAMX,KAAK,EhDxDiB,OAAO;EgDyD7B,gBAAgB,EhDtEb,IAAI;CgDuER;;AA9BL,AAAA,cAAc,AAiCX,SAAS,CAAC;EACT,KAAK,EhD7DmB,OAAO;EgD8D/B,MAAM,EhDsSuB,WAAW;EgDrSxC,gBAAgB,EhD9DQ,OAAO;CgD+DhC;;AArCH,AAAA,cAAc,AAwCX,YAAY,CAAC;EACZ,OAAO,EAAE,CAAE;CACZ;;AAGH,AAAA,iBAAiB,CAAC;EAChB,WAAW,EhDiUsB,QAAO;EgDhUxC,cAAc,EhDgUmB,QAAO;EgD/TxC,SAAS,EhDiVmB,GAAG;CgD3UhC;;AAOD,AAAA,YAAY,CAAC;EACX,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,YAAa;EACtB,SAAS,EAAE,IAAK;EAChB,MAAM,EhDkUuB,MAAM;EgDjUnC,aAAa,EAAE,CAAE;EACjB,MAAM,EAAE,OAAQ;CACjB;;AAED,AAAA,kBAAkB,CAAC;EACjB,SAAS,EhD6ToB,KAAK;EgD5TlC,SAAS,EAAE,IAAK;EAChB,MAAM,EhD0TuB,MAAM;EgDzTnC,MAAM,EAAE,CAAE;EACV,MAAM,EAAE,gBAAK;EACb,OAAO,EAAE,CAAE;CAKZ;;AAED,AAAA,oBAAoB,CAAC;EACnB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,IAAI,EAAE,CAAE;EACR,OAAO,EAAE,CAAE;EACX,MAAM,EhD0SuB,MAAM;EgDzSnC,OAAO,EhD6SmB,MAAK,CACL,IAAI;EgD7S9B,WAAW,EhD8Se,GAAG;EgD7S7B,KAAK,EhDxHqB,OAAO;EgDyHjC,cAAc,EAAE,IAAK;EACrB,WAAW,EAAE,IAAK;EAClB,gBAAgB,EhDxIT,IAAI;EgDyIX,MAAM,EhD9DO,GAAG,CgD8DkB,KAAK,ChDxIhC,mBAAI;E2B3FT,aAAa,E3B4TQ,OAAM;CgD1D9B;;AA5CD,AAAA,oBAAoB,AAkBf,KAAM,CAAA,AAAA,EAAE,CAAC,OAAO,CAAjB;EACE,OAAO,EhD8SL,gBAAgB;CgD7SnB;;AApBL,AAAA,oBAAoB,AAuBjB,QAAQ,CAAC;EACR,QAAQ,EAAE,QAAS;EACnB,GAAG,EhD1EQ,IAAG;EgD2Ed,KAAK,EhD3EM,IAAG;EgD4Ed,MAAM,EhD5EK,IAAG;EgD6Ed,OAAO,EAAE,CAAE;EACX,OAAO,EAAE,KAAM;EACf,MAAM,EhDkRqB,MAAM;EgDjRjC,OAAO,EhDqRiB,MAAK,CACL,IAAI;EgDrR5B,WAAW,EhDsRa,GAAG;EgDrR3B,KAAK,EhDhJmB,OAAO;EgDiJ/B,gBAAgB,EhD/IQ,OAAO;EgDgJ/B,MAAM,EhDpFK,GAAG,CgDoFoB,KAAK,ChD9JlC,mBAAI;E2B3FT,aAAa,EqB0PU,CAAC,ChDkEH,OAAM,CAAN,OAAM,CgDlEoD,CAAC;CACjF;;AArCH,AAAA,oBAAoB,AAwCf,KAAM,CAAA,AAAA,EAAE,CAAC,QAAQ,CAAlB;EACE,OAAO,EhD2RL,QAAQ;CgD1RX;;AC/PL,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,IAAK;EACd,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;EACjB,UAAU,EAAE,IAAK;CAClB;;AAED,AAAA,SAAS,CAAC;EACR,OAAO,EAAE,KAAM;EACf,OAAO,EjD0mBuB,KAAI,CAAC,GAAG;CiD/lBvC;;AAbD,AAAA,SAAS,A5CQJ,MAAM,E4CRX,AAAA,SAAS,A5CSJ,MAAM,CAAC;E4CJR,eAAe,EAAE,IAAK;C5CMrB;;A4CXL,AAAA,SAAS,AASN,SAAS,CAAC;EACT,KAAK,EjDsFmB,OAAO;EiDrF/B,MAAM,EjDybuB,WAAW;CiDxbzC;;AAQH,AAAA,SAAS,CAAC;EACR,aAAa,EjDwIA,GAAG,CiDxIsB,KAAK,CjD2lBC,IAAI;CiDzjBjD;;AAnCD,AAGE,SAHO,CAGP,SAAS,CAAC;EACR,aAAa,EjDqIF,IAAG;CiDpIf;;AALH,AAOE,SAPO,CAOP,SAAS,CAAC;EACR,MAAM,EjDiIK,GAAG,CiDjIiB,KAAK,CAAC,WAAW;EtB9BhD,uBAAuB,E3BsTF,OAAM;E2BrT3B,sBAAsB,E3BqTD,OAAM;CiD5Q5B;;AApBH,AAOE,SAPO,CAOP,SAAS,A5CnBN,MAAM,E4CYX,AAOE,SAPO,CAOP,SAAS,A5ClBN,MAAM,CAAC;E4CuBN,YAAY,EjDiEU,OAAO,CAAP,OAAO,CA+gBW,IAAI;CKrmB7C;;A4CSL,AAOE,SAPO,CAOP,SAAS,AAQN,SAAS,CAAC;EACT,KAAK,EjD4DiB,OAAO;EiD3D7B,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EAAE,WAAY;CAC3B;;AAnBL,AAsBW,SAtBF,CAsBP,SAAS,AAAA,OAAO;AAtBlB,AAuBiB,SAvBR,CAuBP,SAAS,AAAA,KAAK,CAAC,SAAS,CAAC;EACvB,KAAK,EjDmDmB,OAAO;EiDlD/B,gBAAgB,EjDqCX,IAAI;EiDpCT,YAAY,EjDwkB8B,IAAI,CAAJ,IAAI,CApiBzC,IAAI;CiDnCV;;AA3BH,AA6BE,SA7BO,CA6BP,cAAc,CAAC;EAEb,UAAU,EjD0GC,IAAG;E2B/Jd,uBAAuB,EsBuDI,CAAC;EtBtD5B,sBAAsB,EsBsDK,CAAC;CAC7B;;AAQH,AACE,UADQ,CACR,SAAS,CAAC;EtBvER,aAAa,E3B4TQ,OAAM;CiDnP5B;;AAHH,AAKW,UALD,CAKR,SAAS,AAAA,OAAO;AALlB,AAMiB,UANP,CAMR,SAAS,AAAA,KAAK,CAAC,SAAS,CAAC;EACvB,KAAK,EjDaA,IAAI;EiDZT,MAAM,EAAE,OAAQ;EAChB,gBAAgB,EjDiBX,OAAO;CiDhBb;;AAQH,AACE,SADO,CACP,SAAS,CAAC;EACR,IAAI,EAAE,QAAS;EACf,UAAU,EAAE,MAAO;CACpB;;AAGH,AACE,cADY,CACZ,SAAS,CAAC;EACR,IAAI,EAAE,QAAS;EACf,UAAU,EAAE,MAAO;CACpB;;AAQH,AACI,YADQ,GACR,SAAS,CAAC;EACV,OAAO,EAAE,IAAK;CACf;;AAHH,AAII,YAJQ,GAIR,OAAO,CAAC;EACR,OAAO,EAAE,KAAM;CAChB;;ACpGH,AAAA,OAAO,CAAC;EACN,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,IAAK;EACd,cAAc,EAAE,MAAO;EACvB,OAAO,ElDwkB4B,MAAO,CAjdjC,IAAI;CkDtHd;;AAOD,AAAA,aAAa,CAAC;EACZ,OAAO,EAAE,YAAa;EACtB,WAAW,EAAE,MAAO;EACpB,cAAc,EAAE,MAAO;EACvB,YAAY,ElD2GH,IAAI;EkD1Gb,SAAS,ElD0NM,OAAO;EkDzNtB,WAAW,EAAE,OAAQ;EACrB,WAAW,EAAE,MAAO;CAKrB;;AAZD,AAAA,aAAa,A7CTR,MAAM,E6CSX,AAAA,aAAa,A7CRR,MAAM,CAAC;E6CkBR,eAAe,EAAE,IAAK;C7ChBrB;;A6CyBL,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAK;EACd,cAAc,EAAE,MAAO;EACvB,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;EACjB,UAAU,EAAE,IAAK;CAMlB;;AAXD,AAOE,WAPS,CAOT,SAAS,CAAC;EACR,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,CAAE;CACjB;;AAQH,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,YAAa;EACtB,WAAW,EAAK,OAAQ;EACxB,cAAc,EAAE,OAAQ;CACzB;;AASD,AAAA,eAAe,CAAC;EACd,UAAU,EAAE,UAAW;EACvB,OAAO,ElDihB4B,OAAM,CADN,OAAM;EkD/gBzC,SAAS,ElD0KM,OAAO;EkDzKtB,WAAW,EAAE,CAAE;EACf,UAAU,EAAE,WAAY;EACxB,MAAM,ElDoFO,GAAG,CkDpFM,KAAK,CAAC,WAAW;EvBjFrC,aAAa,E3B4TQ,OAAM;CkDrO9B;;AAZD,AAAA,eAAe,A7C3DV,MAAM,E6C2DX,AAAA,eAAe,A7C1DV,MAAM,CAAC;E6CoER,eAAe,EAAE,IAAK;C7ClErB;;A6CwEL,AAAA,oBAAoB,CAAC;EACnB,OAAO,EAAE,YAAa;EACtB,KAAK,EAAE,KAAM;EACb,MAAM,EAAE,KAAM;EACd,cAAc,EAAE,MAAO;EACvB,OAAO,EAAE,EAAG;EACZ,UAAU,EAAE,uBAAwB;EACpC,eAAe,EAAE,SAAU;CAC5B;;AAID,AAAA,oBAAoB,CAAC;EACnB,QAAQ,EAAE,QAAS;EACnB,IAAI,ElD+BK,IAAI;CkD9Bd;;AACD,AAAA,qBAAqB,CAAC;EACpB,QAAQ,EAAE,QAAS;EACnB,KAAK,ElD2BI,IAAI;CkD1Bd;;A9C7CG,MAAM,EAAL,SAAS,EAAE,KAAK;E8CiDrB,AAQU,kBARQ,CAOV,WAAW,CACT,cAAc,CAAC;IACb,QAAQ,EAAE,MAAO;IACjB,KAAK,EAAE,IAAK;GACb;EAXX,AAcU,kBAdQ,GAcR,UAAU,CAAC;IACX,aAAa,EAAE,CAAE;IACjB,YAAY,EAAE,CAAE;GACjB;;;A9C/EL,MAAM,EAAL,SAAS,EAAE,KAAK;E8C8DrB,AAAA,kBAAkB,CAKd;IAgBI,cAAc,EAAE,GAAI;IACpB,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GA6BvB;EApDL,AAyBQ,kBAzBU,CAyBV,WAAW,CAAC;IACV,cAAc,EAAE,GAAI;GAMrB;EAhCT,AA4BU,kBA5BQ,CAyBV,WAAW,CAGT,SAAS,CAAC;IACR,aAAa,EAAE,KAAM;IACrB,YAAY,EAAE,KAAM;GACrB;EA/BX,AAmCU,kBAnCQ,GAmCR,UAAU,CAAC;IACX,OAAO,EAAE,IAAK;IACd,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GACrB;EAvCT,AA0CQ,kBA1CU,CA0CV,gBAAgB,CAAC;IACf,OAAO,EAAE,eAAgB;IACzB,KAAK,EAAE,IAAK;GACb;EA7CT,AAgDQ,kBAhDU,CAgDV,eAAe,CAAC;IACd,OAAO,EAAE,IAAK;GACf;;;A9CnGL,MAAM,EAAL,SAAS,EAAE,KAAK;E8CiDrB,AAQU,qBARQ,CAOV,WAAW,CACT,cAAc,CAAC;IACb,QAAQ,EAAE,MAAO;IACjB,KAAK,EAAE,IAAK;GACb;EAXX,AAcU,qBAdQ,GAcR,UAAU,CAAC;IACX,aAAa,EAAE,CAAE;IACjB,YAAY,EAAE,CAAE;GACjB;;;A9C/EL,MAAM,EAAL,SAAS,EAAE,KAAK;E8C8DrB,AAAA,qBAAkB,CAKd;IAgBI,cAAc,EAAE,GAAI;IACpB,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GA6BvB;EApDL,AAyBQ,qBAzBU,CAyBV,WAAW,CAAC;IACV,cAAc,EAAE,GAAI;GAMrB;EAhCT,AA4BU,qBA5BQ,CAyBV,WAAW,CAGT,SAAS,CAAC;IACR,aAAa,EAAE,KAAM;IACrB,YAAY,EAAE,KAAM;GACrB;EA/BX,AAmCU,qBAnCQ,GAmCR,UAAU,CAAC;IACX,OAAO,EAAE,IAAK;IACd,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GACrB;EAvCT,AA0CQ,qBA1CU,CA0CV,gBAAgB,CAAC;IACf,OAAO,EAAE,eAAgB;IACzB,KAAK,EAAE,IAAK;GACb;EA7CT,AAgDQ,qBAhDU,CAgDV,eAAe,CAAC;IACd,OAAO,EAAE,IAAK;GACf;;;A9CnGL,MAAM,EAAL,SAAS,EAAE,KAAK;E8CiDrB,AAQU,qBARQ,CAOV,WAAW,CACT,cAAc,CAAC;IACb,QAAQ,EAAE,MAAO;IACjB,KAAK,EAAE,IAAK;GACb;EAXX,AAcU,qBAdQ,GAcR,UAAU,CAAC;IACX,aAAa,EAAE,CAAE;IACjB,YAAY,EAAE,CAAE;GACjB;;;A9C/EL,MAAM,EAAL,SAAS,EAAE,KAAK;E8C8DrB,AAAA,qBAAkB,CAKd;IAgBI,cAAc,EAAE,GAAI;IACpB,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GA6BvB;EApDL,AAyBQ,qBAzBU,CAyBV,WAAW,CAAC;IACV,cAAc,EAAE,GAAI;GAMrB;EAhCT,AA4BU,qBA5BQ,CAyBV,WAAW,CAGT,SAAS,CAAC;IACR,aAAa,EAAE,KAAM;IACrB,YAAY,EAAE,KAAM;GACrB;EA/BX,AAmCU,qBAnCQ,GAmCR,UAAU,CAAC;IACX,OAAO,EAAE,IAAK;IACd,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GACrB;EAvCT,AA0CQ,qBA1CU,CA0CV,gBAAgB,CAAC;IACf,OAAO,EAAE,eAAgB;IACzB,KAAK,EAAE,IAAK;GACb;EA7CT,AAgDQ,qBAhDU,CAgDV,eAAe,CAAC;IACd,OAAO,EAAE,IAAK;GACf;;;A9CnGL,MAAM,EAAL,SAAS,EAAE,MAAM;E8CiDtB,AAQU,qBARQ,CAOV,WAAW,CACT,cAAc,CAAC;IACb,QAAQ,EAAE,MAAO;IACjB,KAAK,EAAE,IAAK;GACb;EAXX,AAcU,qBAdQ,GAcR,UAAU,CAAC;IACX,aAAa,EAAE,CAAE;IACjB,YAAY,EAAE,CAAE;GACjB;;;A9C/EL,MAAM,EAAL,SAAS,EAAE,MAAM;E8C8DtB,AAAA,qBAAkB,CAKd;IAgBI,cAAc,EAAE,GAAI;IACpB,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GA6BvB;EApDL,AAyBQ,qBAzBU,CAyBV,WAAW,CAAC;IACV,cAAc,EAAE,GAAI;GAMrB;EAhCT,AA4BU,qBA5BQ,CAyBV,WAAW,CAGT,SAAS,CAAC;IACR,aAAa,EAAE,KAAM;IACrB,YAAY,EAAE,KAAM;GACrB;EA/BX,AAmCU,qBAnCQ,GAmCR,UAAU,CAAC;IACX,OAAO,EAAE,IAAK;IACd,SAAS,EAAE,MAAO;IAClB,WAAW,EAAE,MAAO;GACrB;EAvCT,AA0CQ,qBA1CU,CA0CV,gBAAgB,CAAC;IACf,OAAO,EAAE,eAAgB;IACzB,KAAK,EAAE,IAAK;GACb;EA7CT,AAgDQ,qBAhDU,CAgDV,eAAe,CAAC;IACd,OAAO,EAAE,IAAK;GACf;;;AAlDT,AAAA,qBAAkB,CAKd;EAgBI,cAAc,EAAE,GAAI;EACpB,SAAS,EAAE,MAAO;EAClB,WAAW,EAAE,MAAO;CA6BvB;;AApDL,AAQU,qBARQ,CAOV,WAAW,CACT,cAAc,CAAC;EACb,QAAQ,EAAE,MAAO;EACjB,KAAK,EAAE,IAAK;CACb;;AAXX,AAcU,qBAdQ,GAcR,UAAU,CAAC;EACX,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,CAAE;CACjB;;AAjBT,AAyBQ,qBAzBU,CAyBV,WAAW,CAAC;EACV,cAAc,EAAE,GAAI;CAMrB;;AAhCT,AA4BU,qBA5BQ,CAyBV,WAAW,CAGT,SAAS,CAAC;EACR,aAAa,EAAE,KAAM;EACrB,YAAY,EAAE,KAAM;CACrB;;AA/BX,AAmCU,qBAnCQ,GAmCR,UAAU,CAAC;EACX,OAAO,EAAE,IAAK;EACd,SAAS,EAAE,MAAO;EAClB,WAAW,EAAE,MAAO;CACrB;;AAvCT,AA0CQ,qBA1CU,CA0CV,gBAAgB,CAAC;EACf,OAAO,EAAE,eAAgB;EACzB,KAAK,EAAE,IAAK;CACb;;AA7CT,AAgDQ,qBAhDU,CAgDV,eAAe,CAAC;EACd,OAAO,EAAE,IAAK;CACf;;AAYT,AACE,aADW,CACX,aAAa;AADf,AAEE,aAFW,CAEX,eAAe,CAAC;EACd,KAAK,ElDxFA,kBAAI;CkD6FV;;AARH,AACE,aADW,CACX,aAAa,A7CjKV,MAAM,E6CgKX,AACE,aADW,CACX,aAAa,A7ChKV,MAAM;A6C+JX,AAEE,aAFW,CAEX,eAAe,A7ClKZ,MAAM;A6CgKX,AAEE,aAFW,CAEX,eAAe,A7CjKZ,MAAM,CAAC;E6CqKN,KAAK,ElD3FF,kBAAI;CKxER;;A6C6JL,AAWI,aAXS,CAUX,WAAW,CACT,SAAS,CAAC;EACR,KAAK,ElDjGF,kBAAI;CkD0GR;;AArBL,AAWI,aAXS,CAUX,WAAW,CACT,SAAS,A7C3KR,MAAM,E6CgKX,AAWI,aAXS,CAUX,WAAW,CACT,SAAS,A7C1KR,MAAM,CAAC;E6C8KJ,KAAK,ElDpGJ,kBAAI;CKxER;;A6C6JL,AAWI,aAXS,CAUX,WAAW,CACT,SAAS,AAON,SAAS,CAAC;EACT,KAAK,ElDxGJ,kBAAI;CkDyGN;;AApBP,AAuBY,aAvBC,CAUX,WAAW,CAaT,KAAK,GAAG,SAAS;AAvBrB,AAwBc,aAxBD,CAUX,WAAW,CAcT,OAAO,GAAG,SAAS;AAxBvB,AAyBa,aAzBA,CAUX,WAAW,CAeT,SAAS,AAAA,KAAK;AAzBlB,AA0Ba,aA1BA,CAUX,WAAW,CAgBT,SAAS,AAAA,OAAO,CAAC;EACf,KAAK,ElDhHF,kBAAI;CkDiHR;;AA5BL,AA+BE,aA/BW,CA+BX,eAAe,CAAC;EACd,YAAY,ElDrHP,kBAAI;CkDsHV;;AAjCH,AAmCE,aAnCW,CAmCX,oBAAoB,CAAC;EACnB,gBAAgB,ElDyZkB,mPAAG;CkDxZtC;;AArCH,AAuCE,aAvCW,CAuCX,YAAY,CAAC;EACX,KAAK,ElD7HA,kBAAI;CkD8HV;;AAIH,AACE,eADa,CACb,aAAa;AADf,AAEE,eAFa,CAEb,eAAe,CAAC;EACd,KAAK,ElDtIA,KAAI;CkD2IV;;AARH,AACE,eADa,CACb,aAAa,A7C9MV,MAAM,E6C6MX,AACE,eADa,CACb,aAAa,A7C7MV,MAAM;A6C4MX,AAEE,eAFa,CAEb,eAAe,A7C/MZ,MAAM;A6C6MX,AAEE,eAFa,CAEb,eAAe,A7C9MZ,MAAM,CAAC;E6CkNN,KAAK,ElDzIF,KAAI;CKvER;;A6C0ML,AAWI,eAXW,CAUb,WAAW,CACT,SAAS,CAAC;EACR,KAAK,ElD/IF,wBAAI;CkDwJR;;AArBL,AAWI,eAXW,CAUb,WAAW,CACT,SAAS,A7CxNR,MAAM,E6C6MX,AAWI,eAXW,CAUb,WAAW,CACT,SAAS,A7CvNR,MAAM,CAAC;E6C2NJ,KAAK,ElDlJJ,yBAAI;CKvER;;A6C0ML,AAWI,eAXW,CAUb,WAAW,CACT,SAAS,AAON,SAAS,CAAC;EACT,KAAK,ElDtJJ,yBAAI;CkDuJN;;AApBP,AAuBY,eAvBG,CAUb,WAAW,CAaT,KAAK,GAAG,SAAS;AAvBrB,AAwBc,eAxBC,CAUb,WAAW,CAcT,OAAO,GAAG,SAAS;AAxBvB,AAyBa,eAzBE,CAUb,WAAW,CAeT,SAAS,AAAA,KAAK;AAzBlB,AA0Ba,eA1BE,CAUb,WAAW,CAgBT,SAAS,AAAA,OAAO,CAAC;EACf,KAAK,ElD9JF,KAAI;CkD+JR;;AA5BL,AA+BE,eA/Ba,CA+Bb,eAAe,CAAC;EACd,YAAY,ElDnKP,wBAAI;CkDoKV;;AAjCH,AAmCE,eAnCa,CAmCb,oBAAoB,CAAC;EACnB,gBAAgB,ElDqWoB,yPAAG;CkDpWxC;;AArCH,AAuCE,eAvCa,CAuCb,YAAY,CAAC;EACX,KAAK,ElD3KA,wBAAI;CkD4KV;;ACtQH,AAAA,KAAK,CAAC;EACJ,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,IAAK;EACd,cAAc,EAAE,MAAO;EACvB,gBAAgB,EnDsFT,IAAI;EmDrFX,MAAM,EnD8rBmB,GAAG,CmD9rBD,KAAK,CnDsFzB,oBAAI;E2B3FT,aAAa,E3B4TQ,OAAM;CmDrT9B;;AAED,AAAA,WAAW,CAAC;EAGV,IAAI,EAAE,QAAS;EACf,OAAO,EnDorBkB,OAAO;CmDnrBjC;;AAED,AAAA,WAAW,CAAC;EACV,aAAa,EnDirBY,OAAM;CmDhrBhC;;AAED,AAAA,cAAc,CAAC;EACb,UAAU,EAAI,SAAc;EAC5B,aAAa,EAAE,CAAE;CAClB;;AAED,AAAU,UAAA,AAAA,WAAW,CAAC;EACpB,aAAa,EAAE,CAAE;CAClB;;AAED,AAAA,UAAU,A9CvBL,MAAM,CAAC;E8CyBR,eAAe,EAAE,IAAK;C9CzBD;;A8CuBzB,AAKI,UALM,GAKN,UAAU,CAAC;EACX,WAAW,EnD8pBY,OAAO;CmD7pB/B;;AAGH,AAEoB,KAFf,GACD,WAAW,AAAA,YAAY,CACvB,gBAAgB,AAAA,YAAY,CAAC;ExBnC7B,uBAAuB,E3BsTF,OAAM;E2BrT3B,sBAAsB,E3BqTD,OAAM;CmDjR1B;;AAJL,AAQoB,KARf,GAOD,WAAW,AAAA,WAAW,CACtB,gBAAgB,AAAA,WAAW,CAAC;ExB3B5B,0BAA0B,E3BwSL,OAAM;E2BvS3B,yBAAyB,E3BuSJ,OAAM;CmD3Q1B;;AASL,AAAA,YAAY,CAAC;EACX,OAAO,EnDuoBkB,OAAM,CADN,OAAO;EmDroBhC,aAAa,EAAE,CAAE;EACjB,gBAAgB,EnD6CU,OAAO;EmD5CjC,aAAa,EnDqoBY,GAAG,CmDroBM,KAAK,CnD6BhC,oBAAI;CmDxBZ;;AATD,AAAA,YAAY,AAMT,YAAY,CAAC;ExBhEZ,aAAa,E3BssBU,mBAAI,CAAJ,mBAAI,CmDroBgD,CAAC,CAAC,CAAC;CAC/E;;AAGH,AAAA,YAAY,CAAC;EACX,OAAO,EnD4nBkB,OAAM,CADN,OAAO;EmD1nBhC,gBAAgB,EnDmCU,OAAO;EmDlCjC,UAAU,EnD2nBe,GAAG,CmD3nBG,KAAK,CnDmB7B,oBAAI;CmDdZ;;AARD,AAAA,YAAY,AAKT,WAAW,CAAC;ExB1EX,aAAa,EwB2EU,CAAC,CAAC,CAAC,CnD2nBH,mBAAI,CAAJ,mBAAI;CmD1nB5B;;AAQH,AAAA,iBAAiB,CAAC;EAChB,YAAY,EAAI,SAAc;EAC9B,aAAa,EnD4mBY,QAAM;EmD3mB/B,WAAW,EAAI,SAAc;EAC7B,aAAa,EAAE,CAAE;CAClB;;AAED,AAAA,kBAAkB,CAAC;EACjB,YAAY,EAAI,SAAc;EAC9B,WAAW,EAAI,SAAc;CAC9B;;AAOD,AAAA,aAAa,CAAC;EhCtGZ,gBAAgB,EnBiGT,OAAO;EmBhGd,YAAY,EnBgGL,OAAO;CmDOf;;AAFD,AhCnGE,agCmGW,ChCnGX,YAAY;AgCmGd,AhClGE,agCkGW,ChClGX,YAAY,CAAC;EACX,gBAAgB,EAAE,WAAY;CAC/B;;AgCmGH,AAAA,aAAa,CAAC;EhCzGZ,gBAAgB,EnBgGT,OAAO;EmB/Fd,YAAY,EnB+FL,OAAO;CmDWf;;AAFD,AhCtGE,agCsGW,ChCtGX,YAAY;AgCsGd,AhCrGE,agCqGW,ChCrGX,YAAY,CAAC;EACX,gBAAgB,EAAE,WAAY;CAC/B;;AgCsGH,AAAA,UAAU,CAAC;EhC5GT,gBAAgB,EnBkGT,OAAO;EmBjGd,YAAY,EnBiGL,OAAO;CmDYf;;AAFD,AhCzGE,UgCyGQ,ChCzGR,YAAY;AgCyGd,AhCxGE,UgCwGQ,ChCxGR,YAAY,CAAC;EACX,gBAAgB,EAAE,WAAY;CAC/B;;AgCyGH,AAAA,aAAa,CAAC;EhC/GZ,gBAAgB,EnB8FT,OAAO;EmB7Fd,YAAY,EnB6FL,OAAO;CmDmBf;;AAFD,AhC5GE,agC4GW,ChC5GX,YAAY;AgC4Gd,AhC3GE,agC2GW,ChC3GX,YAAY,CAAC;EACX,gBAAgB,EAAE,WAAY;CAC/B;;AgC4GH,AAAA,YAAY,CAAC;EhClHX,gBAAgB,EnB6FT,OAAO;EmB5Fd,YAAY,EnB4FL,OAAO;CmDuBf;;AAFD,AhC/GE,YgC+GU,ChC/GV,YAAY;AgC+Gd,AhC9GE,YgC8GU,ChC9GV,YAAY,CAAC;EACX,gBAAgB,EAAE,WAAY;CAC/B;;AgCiHH,AAAA,qBAAqB,CAAC;EhC7GpB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EnBsFL,OAAO;CmDwBf;;AACD,AAAA,uBAAuB,CAAC;EhChHtB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EnByWmB,IAAI;CmDxPpC;;AACD,AAAA,kBAAkB,CAAC;EhCnHjB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EnBuFL,OAAO;CmD6Bf;;AACD,AAAA,qBAAqB,CAAC;EhCtHpB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EnBqFL,OAAO;CmDkCf;;AACD,AAAA,qBAAqB,CAAC;EhCzHpB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EnBmFL,OAAO;CmDuCf;;AACD,AAAA,oBAAoB,CAAC;EhC5HnB,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EnBkFL,OAAO;CmD2Cf;;AAMD,AAAA,aAAa,CAAC;EhC3HZ,KAAK,EAAE,yBAAI;CgC6HZ;;AAFD,AhCzHE,agCyHW,ChCzHX,YAAY;AgCyHd,AhCxHE,agCwHW,ChCxHX,YAAY,CAAC;EACX,gBAAgB,EAAE,WAAY;EAC9B,YAAY,EAAE,wBAAI;CACnB;;AgCqHH,AhCpHE,agCoHW,ChCpHX,YAAY;AgCoHd,AhCnHE,agCmHW,ChCnHX,YAAY;AgCmHd,AhClHE,agCkHW,ChClHX,WAAW;AgCkHb,AhCjHE,agCiHW,ChCjHX,gBAAgB,CAAC;EACf,KAAK,EAAE,IAAK;CACb;;AgC+GH,AhC9GE,agC8GW,ChC9GX,UAAU;AgC8GZ,AhC7GE,agC6GW,ChC7GX,UAAU;AgC6GZ,AhC5GE,agC4GW,ChC5GX,cAAc;AgC4GhB,AhC3GmB,agC2GN,ChC3GX,gBAAgB,CAAC,kBAAkB,CAAC;EAClC,KAAK,EAAE,yBAAI;CACZ;;AgCyGH,AhCxGE,agCwGW,ChCxGX,UAAU,AdrBP,MAAM,E8C6HX,AhCxGE,agCwGW,ChCxGX,UAAU,AdpBP,MAAM,CAAC;EcsBN,KAAK,EnBmDF,IAAI;CKvER;;A8CkIL,AAAA,gBAAgB,CAAC;EACf,OAAO,EAAE,CAAE;EACX,aAAa,EAAE,CAAE;EACjB,WAAW,EAAE,CAAE;CAChB;;AAGD,AAAA,SAAS,CAAC;ExB5JN,aAAa,E3BssBU,mBAAI;CmDviB9B;;AACD,AAAA,iBAAiB,CAAC;EAChB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,CAAE;EACR,OAAO,EnDsiBkB,OAAO;CmDriBjC;;AAKD,AAAA,aAAa,CAAC;ExBtKV,uBAAuB,E3BgsBA,mBAAI;E2B/rB3B,sBAAsB,E3B+rBC,mBAAI;CmDxhB9B;;AACD,AAAA,gBAAgB,CAAC;ExB3Jb,0BAA0B,E3BkrBH,mBAAI;E2BjrB3B,yBAAyB,E3BirBF,mBAAI;CmDrhB9B;;A/C7HG,MAAM,EAAL,SAAS,EAAE,KAAK;E+CmInB,AAAA,UAAU,CAAC;IACT,OAAO,EAAE,IAAK;IACd,SAAS,EAAE,QAAS;GAarB;EAfD,AAIE,UAJQ,CAIR,KAAK,CAAC;IACJ,OAAO,EAAE,IAAK;IACd,IAAI,EAAE,KAAM;IACZ,cAAc,EAAE,MAAO;GAOxB;EAdH,AAIE,UAJQ,CAIR,KAAK,AAQF,IAAK,CAAA,AAAA,YAAY,EAAE;IAAE,WAAW,EnD2gBV,IAAuB;GmD3gBU;EAZ5D,AAIE,UAJQ,CAIR,KAAK,AASF,IAAK,CAAA,AAAA,WAAW,EAAE;IAAE,YAAY,EnD0gBV,IAAuB;GmD1gBU;;;A/ChJ1D,MAAM,EAAL,SAAS,EAAE,KAAK;E+C2JnB,AAAA,WAAW,CAAC;IACV,OAAO,EAAE,IAAK;IACd,SAAS,EAAE,QAAS;GA2CrB;EA7CD,AAIE,WAJS,CAIT,KAAK,CAAC;IACJ,IAAI,EAAE,KAAM;GAuCb;EA5CH,AAOM,WAPK,CAIT,KAAK,GAGD,KAAK,CAAC;IACN,WAAW,EAAE,CAAE;IACf,WAAW,EAAE,CAAE;GAChB;EAVL,AAIE,WAJS,CAIT,KAAK,AAUA,YAAY,CAAC;IxBhNlB,0BAA0B,EwBiNS,CAAC;IxBhNpC,uBAAuB,EwBgNY,CAAC;GAQ/B;EAvBP,AAiBQ,WAjBG,CAIT,KAAK,AAUA,YAAY,CAGX,aAAa,CAAC;IACZ,uBAAuB,EAAE,CAAE;GAC5B;EAnBT,AAoBQ,WApBG,CAIT,KAAK,AAUA,YAAY,CAMX,gBAAgB,CAAC;IACf,0BAA0B,EAAE,CAAE;GAC/B;EAtBT,AAIE,WAJS,CAIT,KAAK,AAoBA,WAAW,CAAC;IxB5MjB,yBAAyB,EwB6MS,CAAC;IxB5MnC,sBAAsB,EwB4MY,CAAC;GAQ9B;EAjCP,AA2BQ,WA3BG,CAIT,KAAK,AAoBA,WAAW,CAGV,aAAa,CAAC;IACZ,sBAAsB,EAAE,CAAE;GAC3B;EA7BT,AA8BQ,WA9BG,CAIT,KAAK,AAoBA,WAAW,CAMV,gBAAgB,CAAC;IACf,yBAAyB,EAAE,CAAE;GAC9B;EAhCT,AAIE,WAJS,CAIT,KAAK,AA+BA,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,EAAE;IACnC,aAAa,EAAE,CAAE;GAMlB;EA1CP,AAsCQ,WAtCG,CAIT,KAAK,AA+BA,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,EAGjC,aAAa;EAtCrB,AAuCQ,WAvCG,CAIT,KAAK,AA+BA,IAAK,CAAA,AAAA,YAAY,CAAC,IAAK,CAAA,AAAA,WAAW,EAIjC,gBAAgB,CAAC;IACf,aAAa,EAAE,CAAE;GAClB;;;A/CpMP,MAAM,EAAL,SAAS,EAAE,KAAK;E+CiNnB,AAAA,aAAa,CAAC;IACZ,YAAY,EnD0cY,CAAC;ImDzczB,UAAU,EnD0cc,OAAO;GmDnchC;EATD,AAIE,aAJW,CAIX,KAAK,CAAC;IACJ,OAAO,EAAE,YAAa;IACtB,KAAK,EAAE,IAAK;IACZ,aAAa,EnDsbQ,OAAM;GmDrb5B;;;ACjRL,AAAA,WAAW,CAAC;EACV,OAAO,EpDy4BuB,OAAM,CACN,IAAI;EoDz4BlC,aAAa,EpD0IJ,IAAI;EoDzIb,UAAU,EAAE,IAAK;EACjB,gBAAgB,EpDyGU,OAAO;E2BzG/B,aAAa,E3B4TQ,OAAM;CoDzT9B;;AAPD,AAAA,WAAW,AvBCR,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;AuBIH,AAAA,gBAAgB,CAAC;EACf,KAAK,EAAE,IAAK;CA2Bb;;AA5BD,AAIoB,gBAJJ,GAIZ,gBAAgB,AAAA,QAAQ,CAAC;EACzB,OAAO,EAAE,YAAa;EACtB,aAAa,EpD63Be,MAAK;EoD53BjC,YAAY,EpD43BgB,MAAK;EoD33BjC,KAAK,EpD2FmB,OAAO;EoD1F/B,OAAO,EAAE,GAAwB;CAClC;;AAVH,AAkB0B,gBAlBV,GAkBZ,gBAAgB,AAAA,MAAM,AAAA,QAAQ,CAAC;EAC/B,eAAe,EAAE,SAAU;CAC5B;;AApBH,AAqB0B,gBArBV,GAqBZ,gBAAgB,AAAA,MAAM,AAAA,QAAQ,CAAC;EAC/B,eAAe,EAAE,IAAK;CACvB;;AAvBH,AAAA,gBAAgB,AAyBb,OAAO,CAAC;EACP,KAAK,EpDyEmB,OAAO;CoDxEhC;;ACpCH,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAK;EAEd,YAAY,EAAE,CAAE;EAChB,UAAU,EAAE,IAAK;E1BAf,aAAa,E3B4TQ,OAAM;CqD1T9B;;AAED,AAEI,UAFM,AACP,YAAY,CACX,UAAU,CAAC;EACT,WAAW,EAAE,CAAE;E1BoBjB,yBAAyB,E3BiSJ,OAAM;E2BhS3B,sBAAsB,E3BgSD,OAAM;CqDnT1B;;AALL,AAQI,UARM,AAOP,WAAW,CACV,UAAU,CAAC;E1BCX,0BAA0B,E3B+SL,OAAM;E2B9S3B,uBAAuB,E3B8SF,OAAM;CqD9S1B;;AAVL,AAaW,UAbD,AAaP,OAAO,CAAC,UAAU,CAAC;EAClB,OAAO,EAAE,CAAE;EACX,KAAK,ErDuEA,IAAI;EqDtET,gBAAgB,ErD4EX,OAAO;EqD3EZ,YAAY,ErD2EP,OAAO;CqD1Eb;;AAlBH,AAoBa,UApBH,AAoBP,SAAS,CAAC,UAAU,CAAC;EACpB,KAAK,ErD+EmB,OAAO;EqD9E/B,cAAc,EAAE,IAAK;EACrB,MAAM,ErDibuB,WAAW;EqDhbxC,gBAAgB,ErD8DX,IAAI;EqD7DT,YAAY,ErDmoBuB,IAAI;CqDloBxC;;AAGH,AAAA,UAAU,CAAC;EACT,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,KAAM;EACf,OAAO,ErDsmB6B,MAAK,CADL,OAAM;EqDpmB1C,WAAW,EAAE,IAAK;EAClB,WAAW,ErDymByB,IAAI;EqDxmBxC,KAAK,ErDyDE,OAAO;EqDxDd,gBAAgB,ErDkDT,IAAI;EqDjDX,MAAM,ErD4HO,GAAG,CqD5HiB,KAAK,CrD2mBD,IAAI;CqDnmB1C;;AAhBD,AAAA,UAAU,AhDjBL,MAAM,EgDiBX,AAAA,UAAU,AhDhBL,MAAM,CAAC;EgD2BR,KAAK,ErDmJe,OAAM;EqDlJ1B,eAAe,EAAE,IAAK;EACtB,gBAAgB,ErD2DQ,OAAO;EqD1D/B,YAAY,ErDymBuB,IAAI;CKroBtC;;AgDqCL,AjCzDE,ciCyDY,CjCzDZ,UAAU,CAAC;EACT,OAAO,EpB8oB2B,OAAM,CADN,MAAM;EoB5oBxC,SAAS,EpBuPI,OAAO;CoBtPrB;;AiCsDH,AjClDM,ciCkDQ,CjCpDZ,UAAU,AACP,YAAY,CACX,UAAU,CAAC;EOqBb,yBAAyB,E3BkSJ,MAAK;E2BjS1B,sBAAsB,E3BiSD,MAAK;CoBrTvB;;AiCgDP,AjC7CM,ciC6CQ,CjCpDZ,UAAU,AAMP,WAAW,CACV,UAAU,CAAC;EOEb,0BAA0B,E3BgTL,MAAK;E2B/S1B,uBAAuB,E3B+SF,MAAK;CoBhTvB;;AiC+CP,AjC7DE,ciC6DY,CjC7DZ,UAAU,CAAC;EACT,OAAO,EpB4oB2B,OAAM,CADN,MAAK;EoB1oBvC,SAAS,EpBwPI,QAAO;CoBvPrB;;AiC0DH,AjCtDM,ciCsDQ,CjCxDZ,UAAU,AACP,YAAY,CACX,UAAU,CAAC;EOqBb,yBAAyB,E3BmSJ,MAAK;E2BlS1B,sBAAsB,E3BkSD,MAAK;CoBtTvB;;AiCoDP,AjCjDM,ciCiDQ,CjCxDZ,UAAU,AAMP,WAAW,CACV,UAAU,CAAC;EOEb,0BAA0B,E3BiTL,MAAK;E2BhT1B,uBAAuB,E3BgTF,MAAK;CoBjTvB;;AkCZP,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,YAAa;EACtB,OAAO,EtDqwBqB,MAAK,CADL,KAAI;EsDnwBhC,SAAS,EtDiwBmB,GAAG;EsDhwB/B,WAAW,EtDwPM,IAAI;EsDvPrB,WAAW,EAAE,CAAE;EACf,KAAK,EtDmFE,IAAI;EsDlFX,UAAU,EAAE,MAAO;EACnB,WAAW,EAAE,MAAO;EACpB,cAAc,EAAE,QAAS;E3BVvB,aAAa,E3B4TQ,OAAM;CsD3S9B;;AAhBD,AAAA,MAAM,AAaH,MAAM,CAAC;EACN,OAAO,EAAE,IAAK;CACf;;AAIH,AAAK,IAAD,CAAC,MAAM,CAAC;EACV,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,IAAK;CACX;;AAID,AAAC,CAAA,AAAA,MAAM,AjDXF,MAAM,EiDWX,AAAC,CAAA,AAAA,MAAM,AjDVF,MAAM,CAAC;EiDYR,KAAK,EtD6DA,IAAI;EsD5DT,eAAe,EAAE,IAAK;EACtB,MAAM,EAAE,OAAQ;CjDZf;;AiDqBL,AAAA,WAAW,CAAC;EACV,aAAa,EtDiuBe,KAAI;EsDhuBhC,YAAY,EtDguBgB,KAAI;E2B1wB9B,aAAa,E3B6wBa,KAAK;CsDjuBlC;;AAMD,AAAA,cAAc,CAAC;E/CnDb,gBAAgB,EPyGU,OAAO;CsDpDlC;;AAFD,AAAA,cAAc,C/CjDX,AAAA,IAAC,AAAA,CFeC,MAAM,EiDkCX,AAAA,cAAc,C/CjDX,AAAA,IAAC,AAAA,CFgBC,MAAM,CAAC;EEdN,gBAAgB,EAAE,OAAM;CFgBzB;;AiDmCL,AAAA,cAAc,CAAC;E/CvDb,gBAAgB,EPiGT,OAAO;CsDxCf;;AAFD,AAAA,cAAc,C/CrDX,AAAA,IAAC,AAAA,CFeC,MAAM,EiDsCX,AAAA,cAAc,C/CrDX,AAAA,IAAC,AAAA,CFgBC,MAAM,CAAC;EEdN,gBAAgB,EAAE,OAAM;CFgBzB;;AiDuCL,AAAA,cAAc,CAAC;E/C3Db,gBAAgB,EPgGT,OAAO;CsDnCf;;AAFD,AAAA,cAAc,C/CzDX,AAAA,IAAC,AAAA,CFeC,MAAM,EiD0CX,AAAA,cAAc,C/CzDX,AAAA,IAAC,AAAA,CFgBC,MAAM,CAAC;EEdN,gBAAgB,EAAE,OAAM;CFgBzB;;AiD2CL,AAAA,WAAW,CAAC;E/C/DV,gBAAgB,EPkGT,OAAO;CsDjCf;;AAFD,AAAA,WAAW,C/C7DR,AAAA,IAAC,AAAA,CFeC,MAAM,EiD8CX,AAAA,WAAW,C/C7DR,AAAA,IAAC,AAAA,CFgBC,MAAM,CAAC;EEdN,gBAAgB,EAAE,OAAM;CFgBzB;;AiD+CL,AAAA,cAAc,CAAC;E/CnEb,gBAAgB,EP8FT,OAAO;CsDzBf;;AAFD,AAAA,cAAc,C/CjEX,AAAA,IAAC,AAAA,CFeC,MAAM,EiDkDX,AAAA,cAAc,C/CjEX,AAAA,IAAC,AAAA,CFgBC,MAAM,CAAC;EEdN,gBAAgB,EAAE,OAAM;CFgBzB;;AiDmDL,AAAA,aAAa,CAAC;E/CvEZ,gBAAgB,EP6FT,OAAO;CsDpBf;;AAFD,AAAA,aAAa,C/CrEV,AAAA,IAAC,AAAA,CFeC,MAAM,EiDsDX,AAAA,aAAa,C/CrEV,AAAA,IAAC,AAAA,CFgBC,MAAM,CAAC;EEdN,gBAAgB,EAAE,OAAM;CFgBzB;;AkDvBL,AAAA,UAAU,CAAC;EACT,OAAO,EvDwqBwB,IAAI,CuDxqBN,IAAkB;EAC/C,aAAa,EvDuqBkB,IAAI;EuDtqBnC,gBAAgB,EvD0GU,OAAO;E2BzG/B,aAAa,E3B6TQ,MAAK;CuDxT7B;;AnD+CG,MAAM,EAAL,SAAS,EAAE,KAAK;EmDxDrB,AAAA,UAAU,CAAC;IAOP,OAAO,EAAG,IAAkB,CvDkqBC,IAAI;GuDhqBpC;;;AAED,AAAA,aAAa,CAAC;EACZ,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,gBAAgB,CAAC;EACf,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,CAAE;E5Bbd,aAAa,E4BcQ,CAAC;CACzB;;ACfD,AAAA,MAAM,CAAC;EACL,OAAO,ExDmzBqB,OAAM,CADN,OAAO;EwDjzBnC,aAAa,ExDsIJ,IAAI;EwDrIb,MAAM,ExDkKO,GAAG,CwDlKY,KAAK,CAAC,WAAW;E7BH3C,aAAa,E3B4TQ,OAAM;CwDvT9B;;AAGD,AAAA,cAAc,CAAC;EAEb,KAAK,EAAE,OAAQ;CAChB;;AAGD,AAAA,WAAW,CAAC;EACV,WAAW,ExD8OM,IAAI;CwD7OtB;;AAOD,AAEE,kBAFgB,CAEhB,MAAM,EAFR,AAEE,kBAFgB,CmD0DlB,yBAAyB,CnDxDhB;EACL,QAAQ,EAAE,QAAS;EACnB,GAAG,ExDyxBuB,QAAM;EwDxxBhC,KAAK,ExDuxBqB,QAAO;EwDtxBjC,OAAO,ExDuxBmB,OAAM,CADN,OAAO;EwDrxBjC,KAAK,EAAE,OAAQ;CAChB;;AAQH,AAAA,cAAc,CAAC;EvCxCb,gBAAgB,EjB+qBe,OAAO;EiB9qBtC,YAAY,EjB+qBmB,OAAM;EiB9qBrC,KAAK,EjB4qB0B,OAAO;CwDpoBvC;;AAFD,AvCpCE,cuCoCY,CvCpCZ,EAAE,CAAC;EACD,gBAAgB,EAAE,OAAM;CACzB;;AuCkCH,AvCjCE,cuCiCY,CvCjCZ,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;CACd;;AuCkCH,AAAA,WAAW,CAAC;EvC3CV,gBAAgB,EjBmrBe,OAAO;EiBlrBtC,YAAY,EjBmrBmB,OAAM;EiBlrBrC,KAAK,EjBgrB0B,OAAO;CwDroBvC;;AAFD,AvCvCE,WuCuCS,CvCvCT,EAAE,CAAC;EACD,gBAAgB,EAAE,OAAM;CACzB;;AuCqCH,AvCpCE,WuCoCS,CvCpCT,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;CACd;;AuCqCH,AAAA,cAAc,CAAC;EvC9Cb,gBAAgB,EjBurBe,OAAO;EiBtrBtC,YAAY,EjBwrBmB,OAAM;EiBvrBrC,KAAK,EjBorB0B,OAAO;CwDtoBvC;;AAFD,AvC1CE,cuC0CY,CvC1CZ,EAAE,CAAC;EACD,gBAAgB,EAAE,OAAM;CACzB;;AuCwCH,AvCvCE,cuCuCY,CvCvCZ,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;CACd;;AuCwCH,AAAA,aAAa,CAAC;EvCjDZ,gBAAgB,EjB4rBe,OAAO;EiB3rBtC,YAAY,EjB4rBmB,OAAM;EiB3rBrC,KAAK,EjByrB0B,OAAO;CwDxoBvC;;AAFD,AvC7CE,auC6CW,CvC7CX,EAAE,CAAC;EACD,gBAAgB,EAAE,OAAM;CACzB;;AuC2CH,AvC1CE,auC0CW,CvC1CX,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;CACd;;AwCXH,UAAU,CAAV,oBAAU;EACR,AAAA,IAAI;IAAG,mBAAmB,EzD+0BI,IAAI,CyD/0BW,CAAC;;EAC9C,AAAA,EAAE;IAAG,mBAAmB,EAAE,GAAI;;;;AAIhC,AAAA,SAAS,CAAC;EACR,OAAO,EAAE,IAAK;EACd,QAAQ,EAAE,MAAO;EACjB,SAAS,EzDw0BqB,OAAM;EyDv0BpC,WAAW,EzDs0BmB,IAAI;EyDr0BlC,UAAU,EAAE,MAAO;EACnB,gBAAgB,EzDgGU,OAAO;E2BzG/B,aAAa,E3B4TQ,OAAM;CyDjT9B;;AACD,AAAA,aAAa,CAAC;EACZ,MAAM,EzDg0BwB,IAAI;EyD/zBlC,KAAK,EzD4EE,IAAI;EyD3EX,gBAAgB,EzDiFT,OAAO;CyDhFf;;AAGD,AAAA,qBAAqB,CAAC;E7BYpB,gBAAgB,EAAE,mLAAe;E6BVjC,eAAe,EzDwzBe,IAAI,CAAJ,IAAI;CyDvzBnC;;AAGD,AAAA,sBAAsB,CAAC;EACrB,SAAS,EAAE,oBAAoB,CzD0zBD,EAAE,CAAC,MAAM,CAAC,QAAQ;CyDzzBjD;;AC/BD,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,IAAK;EACd,WAAW,EAAE,UAAW;CACzB;;AAED,AAAA,WAAW,CAAC;EACV,IAAI,EAAE,CAAE;CACT;;ACHD,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAK;EACd,cAAc,EAAE,MAAO;EAGvB,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;CAClB;;AAQD,AAAA,uBAAuB,CAAC;EACtB,KAAK,EAAE,IAAK;EACZ,KAAK,E3DsFqB,OAAO;E2DrFjC,UAAU,EAAE,OAAQ;CAiBrB;;AApBD,AAKE,uBALqB,CAKrB,wBAAwB,CAAC;EACvB,KAAK,E3DiFmB,OAAO;C2DhFhC;;AAPH,AAAA,uBAAuB,AtDClB,MAAM,EsDDX,AAAA,uBAAuB,AtDElB,MAAM,CAAC;EsDSR,KAAK,E3D6EmB,OAAO;E2D5E/B,eAAe,EAAE,IAAK;EACtB,gBAAgB,E3D8EQ,OAAO;CKvF9B;;AsDJL,AAAA,uBAAuB,AAgBpB,OAAO,CAAC;EACP,KAAK,E3DsEmB,OAAO;E2DrE/B,gBAAgB,E3DwEQ,OAAO;C2DvEhC;;AAQH,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,IAAK;EACd,SAAS,EAAE,QAAS;EACpB,WAAW,EAAE,MAAO;EACpB,OAAO,E3DgzBwB,OAAM,CADN,OAAO;E2D7yBtC,aAAa,E3DoHA,IAAG;E2DnHhB,gBAAgB,E3DwCT,IAAI;E2DvCX,MAAM,E3DkHO,GAAG,C2DlHiB,KAAK,C3DwC/B,oBAAI;C2DQZ;;AAzDD,AAAA,gBAAgB,AAWb,YAAY,CAAC;EhC/CZ,uBAAuB,E3BsTF,OAAM;E2BrT3B,sBAAsB,E3BqTD,OAAM;C2DrQ5B;;AAbH,AAAA,gBAAgB,AAeb,WAAW,CAAC;EACX,aAAa,EAAE,CAAE;EhCtCjB,0BAA0B,E3BwSL,OAAM;E2BvS3B,yBAAyB,E3BuSJ,OAAM;C2DhQ5B;;AAlBH,AAAA,gBAAgB,AtD1BX,MAAM,EsD0BX,AAAA,gBAAgB,AtDzBX,MAAM,CAAC;EsD8CR,eAAe,EAAE,IAAK;CtD5CrB;;AsDuBL,AAAA,gBAAgB,AAwBb,SAAS,EAxBZ,AAAA,gBAAgB,AAyBb,SAAS,CAAC;EACT,KAAK,E3DoCmB,OAAO;E2DnC/B,MAAM,E3DuYuB,WAAW;E2DtYxC,gBAAgB,E3DoBX,IAAI;C2DXV;;AArCH,AA+BI,gBA/BY,AAwBb,SAAS,CAOR,wBAAwB,EA/B5B,AA+BI,gBA/BY,AAyBb,SAAS,CAMR,wBAAwB,CAAC;EACvB,KAAK,EAAE,OAAQ;CAChB;;AAjCL,AAkCI,gBAlCY,AAwBb,SAAS,CAUR,qBAAqB,EAlCzB,AAkCI,gBAlCY,AAyBb,SAAS,CASR,qBAAqB,CAAC;EACpB,KAAK,E3D2BiB,OAAO;C2D1B9B;;AApCL,AAAA,gBAAgB,AAwCb,OAAO,CAAC;EACP,OAAO,EAAE,CAAE;EACX,KAAK,E3DMA,IAAI;E2DLT,gBAAgB,E3DWX,OAAO;E2DVZ,YAAY,E3DUP,OAAO;C2DEb;;AAxDH,AA+CI,gBA/CY,AAwCb,OAAO,CAON,wBAAwB;AA/C5B,AAgD+B,gBAhDf,AAwCb,OAAO,CAQN,wBAAwB,GAAG,KAAK;AAhDpC,AAiD+B,gBAjDf,AAwCb,OAAO,CASN,wBAAwB,GAAG,MAAM,CAAC;EAChC,KAAK,EAAE,OAAQ;CAChB;;AAnDL,AAqDI,gBArDY,AAwCb,OAAO,CAaN,qBAAqB,CAAC;EACpB,KAAK,E3DqwBsB,OAAO;C2DpwBnC;;AAUL,AACE,iBADe,CACf,gBAAgB,CAAC;EACf,YAAY,EAAE,CAAE;EAChB,WAAW,EAAE,CAAE;EACf,aAAa,EAAE,CAAE;CAClB;;AALH,AAQoB,iBARH,AAOd,YAAY,CACX,gBAAgB,AAAA,YAAY,CAAC;EAC3B,UAAU,EAAE,CAAE;CACf;;AAVL,AAcoB,iBAdH,AAad,WAAW,CACV,gBAAgB,AAAA,WAAW,CAAC;EAC1B,aAAa,EAAE,CAAE;CAClB;;ArC5HH,AAAA,wBAAwB,CAAxB;EACE,KAAK,EtB6qBwB,OAAO;EsB5qBpC,gBAAgB,EtB6qBa,OAAO;CsB5qBrC;;AAED,AAAC,CAAA,AAAA,wBAAwB;AACzB,AAAM,MAAA,AAAA,wBAAwB,CAD9B;EACE,KAAK,EtBwqBwB,OAAO;CsBxpBrC;;AAjBD,AAGE,CAHD,AAAA,wBAAwB,CAGvB,wBAAwB;AAF1B,AAEE,MAFI,AAAA,wBAAwB,CAE5B,wBAAwB,CAAC;EACvB,KAAK,EAAE,OAAQ;CAChB;;AALH,AAAC,CAAA,AAAA,wBAAwB,AjBYtB,MAAM,EiBZT,AAAC,CAAA,AAAA,wBAAwB,AjBatB,MAAM;AiBZT,AAAM,MAAA,AAAA,wBAAwB,AjBW3B,MAAM;AiBXT,AAAM,MAAA,AAAA,wBAAwB,AjBY3B,MAAM,CAAC;EiBLN,KAAK,EtBiqBsB,OAAO;EsBhqBlC,gBAAgB,EAAE,OAAM;CjBMzB;;AiBfH,AAAC,CAAA,AAAA,wBAAwB,AAYtB,OAAO;AAXV,AAAM,MAAA,AAAA,wBAAwB,AAW3B,OAAO,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,gBAAgB,EtB2pBW,OAAO;EsB1pBlC,YAAY,EtB0pBe,OAAO;CsBzpBnC;;AArBH,AAAA,qBAAqB,CAArB;EACE,KAAK,EtBirBwB,OAAO;EsBhrBpC,gBAAgB,EtBirBa,OAAO;CsBhrBrC;;AAED,AAAC,CAAA,AAAA,qBAAqB;AACtB,AAAM,MAAA,AAAA,qBAAqB,CAD3B;EACE,KAAK,EtB4qBwB,OAAO;CsB5pBrC;;AAjBD,AAGE,CAHD,AAAA,qBAAqB,CAGpB,wBAAwB;AAF1B,AAEE,MAFI,AAAA,qBAAqB,CAEzB,wBAAwB,CAAC;EACvB,KAAK,EAAE,OAAQ;CAChB;;AALH,AAAC,CAAA,AAAA,qBAAqB,AjBYnB,MAAM,EiBZT,AAAC,CAAA,AAAA,qBAAqB,AjBanB,MAAM;AiBZT,AAAM,MAAA,AAAA,qBAAqB,AjBWxB,MAAM;AiBXT,AAAM,MAAA,AAAA,qBAAqB,AjBYxB,MAAM,CAAC;EiBLN,KAAK,EtBqqBsB,OAAO;EsBpqBlC,gBAAgB,EAAE,OAAM;CjBMzB;;AiBfH,AAAC,CAAA,AAAA,qBAAqB,AAYnB,OAAO;AAXV,AAAM,MAAA,AAAA,qBAAqB,AAWxB,OAAO,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,gBAAgB,EtB+pBW,OAAO;EsB9pBlC,YAAY,EtB8pBe,OAAO;CsB7pBnC;;AArBH,AAAA,wBAAwB,CAAxB;EACE,KAAK,EtBqrBwB,OAAO;EsBprBpC,gBAAgB,EtBqrBa,OAAO;CsBprBrC;;AAED,AAAC,CAAA,AAAA,wBAAwB;AACzB,AAAM,MAAA,AAAA,wBAAwB,CAD9B;EACE,KAAK,EtBgrBwB,OAAO;CsBhqBrC;;AAjBD,AAGE,CAHD,AAAA,wBAAwB,CAGvB,wBAAwB;AAF1B,AAEE,MAFI,AAAA,wBAAwB,CAE5B,wBAAwB,CAAC;EACvB,KAAK,EAAE,OAAQ;CAChB;;AALH,AAAC,CAAA,AAAA,wBAAwB,AjBYtB,MAAM,EiBZT,AAAC,CAAA,AAAA,wBAAwB,AjBatB,MAAM;AiBZT,AAAM,MAAA,AAAA,wBAAwB,AjBW3B,MAAM;AiBXT,AAAM,MAAA,AAAA,wBAAwB,AjBY3B,MAAM,CAAC;EiBLN,KAAK,EtByqBsB,OAAO;EsBxqBlC,gBAAgB,EAAE,OAAM;CjBMzB;;AiBfH,AAAC,CAAA,AAAA,wBAAwB,AAYtB,OAAO;AAXV,AAAM,MAAA,AAAA,wBAAwB,AAW3B,OAAO,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,gBAAgB,EtBmqBW,OAAO;EsBlqBlC,YAAY,EtBkqBe,OAAO;CsBjqBnC;;AArBH,AAAA,uBAAuB,CAAvB;EACE,KAAK,EtB0rBwB,OAAO;EsBzrBpC,gBAAgB,EtB0rBa,OAAO;CsBzrBrC;;AAED,AAAC,CAAA,AAAA,uBAAuB;AACxB,AAAM,MAAA,AAAA,uBAAuB,CAD7B;EACE,KAAK,EtBqrBwB,OAAO;CsBrqBrC;;AAjBD,AAGE,CAHD,AAAA,uBAAuB,CAGtB,wBAAwB;AAF1B,AAEE,MAFI,AAAA,uBAAuB,CAE3B,wBAAwB,CAAC;EACvB,KAAK,EAAE,OAAQ;CAChB;;AALH,AAAC,CAAA,AAAA,uBAAuB,AjBYrB,MAAM,EiBZT,AAAC,CAAA,AAAA,uBAAuB,AjBarB,MAAM;AiBZT,AAAM,MAAA,AAAA,uBAAuB,AjBW1B,MAAM;AiBXT,AAAM,MAAA,AAAA,uBAAuB,AjBY1B,MAAM,CAAC;EiBLN,KAAK,EtB8qBsB,OAAO;EsB7qBlC,gBAAgB,EAAE,OAAM;CjBMzB;;AiBfH,AAAC,CAAA,AAAA,uBAAuB,AAYrB,OAAO;AAXV,AAAM,MAAA,AAAA,uBAAuB,AAW1B,OAAO,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,gBAAgB,EtBwqBW,OAAO;EsBvqBlC,YAAY,EtBuqBe,OAAO;CsBtqBnC;;AsCtBL,AAAA,iBAAiB,CAAC;EAChB,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,CAAE;EACX,QAAQ,EAAE,MAAO;CAoBlB;;AAzBD,AAAA,iBAAiB,AAOd,QAAQ,CAAC;EACR,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;CACb;;AAVH,AAYE,iBAZe,CAYf,sBAAsB;AAZxB,AAaE,iBAbe,CAaf,MAAM;AAbR,AAcE,iBAde,CAcf,KAAK;AAdP,AAeE,iBAfe,CAef,MAAM;AAfR,AAgBE,iBAhBe,CAgBf,KAAK,CAAC;EACJ,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,CAAE;EACR,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,MAAM,EAAE,CAAE;CACX;;AAGH,AAAA,uBAAuB,AACpB,QAAQ,CAAC;EACR,WAAW,EAAE,UAAU;CACxB;;AAGH,AAAA,uBAAuB,AACpB,QAAQ,CAAC;EACR,WAAW,EAAE,MAAU;CACxB;;AAGH,AAAA,sBAAsB,AACnB,QAAQ,CAAC;EACR,WAAW,EAAE,GAAU;CACxB;;AAGH,AAAA,sBAAsB,AACnB,QAAQ,CAAC;EACR,WAAW,EAAE,IAAU;CACxB;;AClDH,AAAA,MAAM,E8CqFN,A9CrFA,yB8CqFyB,C9CrFlB;EACL,KAAK,EAAE,KAAM;EACb,SAAS,E7D06BmB,MAAe;E6Dz6B3C,WAAW,E7D8PM,IAAI;E6D7PrB,WAAW,EAAE,CAAE;EACf,KAAK,E7D0FE,IAAI;E6DzFX,WAAW,E7Dy6BiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAj1B5B,IAAI;E6DvFX,OAAO,EAAE,EAAG;CAQb;;AAfD,AAAA,MAAM,AxDoBD,MAAM,EsGiEX,A9CrFA,yB8CqFyB,AtGjEpB,MAAM,EwDpBX,AAAA,MAAM,AxDqBD,MAAM,EsGgEX,A9CrFA,yB8CqFyB,AtGhEpB,MAAM,CAAC;EwDXR,KAAK,E7DqFA,IAAI;E6DpFT,eAAe,EAAE,IAAK;EACtB,MAAM,EAAE,OAAQ;EAChB,OAAO,EAAE,GAAI;CxDUZ;;AwDAL,AAAM,MAAA,AAAA,MAAM,EAAZ,AAAA,MAAM,A8C8DN,yBAAyB,C9C9DZ;EACX,OAAO,EAAE,CAAE;EACX,MAAM,EAAE,OAAQ;EAChB,UAAU,EAAE,WAAY;EACxB,MAAM,EAAE,CAAE;EACV,kBAAkB,EAAE,IAAK;CAC1B;;ACtBD,AAAA,WAAW,CAAC;EACV,QAAQ,EAAE,MAAO;CAClB;;AAGD,AAAA,MAAM,CAAC;EACL,QAAQ,EAAE,KAAM;EAChB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,CAAE;EACR,OAAO,E9DkkBmB,IAAI;E8DjkB9B,OAAO,EAAE,IAAK;EACd,QAAQ,EAAE,MAAO;EAGjB,OAAO,EAAE,CAAE;CAWZ;;AAtBD,AAiBS,MAjBH,AAiBH,KAAK,CAAC,aAAa,CAAC;E3DdjB,UAAU,EHiyBc,SAAS,CAAC,IAAG,CAAC,QAAQ;E8DjxBhD,SAAS,EAAE,kBAAS;CACrB;;AApBH,AAqBS,MArBH,AAqBH,KAAK,CAAC,aAAa,CAAC;EAAE,SAAS,EAAE,eAAS;CAAU;;AAEvD,AAAY,WAAD,CAAC,MAAM,CAAC;EACjB,UAAU,EAAE,MAAO;EACnB,UAAU,EAAE,IAAK;CAClB;;AAGD,AAAA,aAAa,CAAC;EACZ,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,MAAM,E9D6uBsB,IAAI;C8D5uBjC;;AAGD,AAAA,cAAc,CAAC;EACb,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,IAAK;EACd,cAAc,EAAE,MAAO;EACvB,gBAAgB,E9D0CT,IAAI;E8DzCX,eAAe,EAAE,WAAY;EAC7B,MAAM,E9DmHO,GAAG,C8DnHoB,KAAK,C9DyClC,kBAAI;E2B3FT,aAAa,E3B6TQ,MAAK;E8DvQ5B,OAAO,EAAE,CAAE;CACZ;;AAGD,AAAA,eAAe,CAAC;EACd,QAAQ,EAAE,KAAM;EAChB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,CAAE;EACR,OAAO,E9D+gBmB,IAAI;E8D9gB9B,gBAAgB,E9D0BT,IAAI;C8DrBZ;;AAZD,AAAA,eAAe,AAUZ,KAAK,CAAC;EAAE,OAAO,EAAE,CAAE;CAAI;;AAV1B,AAAA,eAAe,AAWZ,KAAK,CAAC;EAAE,OAAO,E9D4tBY,GAAE;C8D5tBe;;AAK/C,AAAA,aAAa,CAAC;EACZ,OAAO,EAAE,IAAK;EACd,WAAW,EAAE,MAAO;EACpB,eAAe,EAAE,aAAc;EAC/B,OAAO,E9DwtBqB,IAAI;E8DvtBhC,aAAa,E9DsFA,GAAG,C8DtF0B,KAAK,C9D0BrB,OAAO;C8DzBlC;;AAGD,AAAA,YAAY,CAAC;EACX,aAAa,EAAE,CAAE;EACjB,WAAW,E9D2KM,GAAG;C8D1KrB;;AAID,AAAA,WAAW,CAAC;EACV,QAAQ,EAAE,QAAS;EAGnB,IAAI,EAAE,QAAS;EACf,OAAO,E9DorBqB,IAAI;C8DnrBjC;;AAGD,AAAA,aAAa,CAAC;EACZ,OAAO,EAAE,IAAK;EACd,WAAW,EAAE,MAAO;EACpB,eAAe,EAAE,QAAS;EAC1B,OAAO,E9D4qBqB,IAAI;E8D3qBhC,UAAU,E9D6DG,GAAG,C8D7DuB,KAAK,C9DClB,OAAO;C8DIlC;;AAVD,AAQqB,aARR,GAQT,IAAK,CAAA,AAAA,YAAY,EAAE;EAAE,WAAW,EAAE,MAAO;CAAI;;AARjD,AASoB,aATP,GAST,IAAK,CAAA,AAAA,WAAW,EAAE;EAAE,YAAY,EAAE,MAAO;CAAI;;AAIjD,AAAA,wBAAwB,CAAC;EACvB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,OAAQ;EACb,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,QAAQ,EAAE,MAAO;CAClB;;A1DlEG,MAAM,EAAL,SAAS,EAAE,KAAK;E0DuEnB,AAAA,aAAa,CAAC;IACZ,SAAS,E9D6qBiB,KAAK;I8D5qB/B,MAAM,E9DypBoB,IAAI,C8DzpBO,IAAI;GAC1C;EAMD,AAAA,SAAS,CAAC;IAAE,SAAS,E9DsqBO,KAAK;G8DtqBG;;;A1DhFlC,MAAM,EAAL,SAAS,EAAE,KAAK;E0DoFnB,AAAA,SAAS,CAAC;IAAE,SAAS,E9DgqBO,KAAK;G8DhqBG;;;AC3ItC,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,QAAS;EACnB,OAAO,E/DmlBmB,IAAI;E+DllB9B,OAAO,EAAE,KAAM;EpDHf,WAAW,EXqPY,aAAC,EAAc,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU;EWnP5H,UAAU,EAAE,MAAO;EACnB,WAAW,EX4PQ,MAAM;EW3PzB,cAAc,EAAE,MAAO;EACvB,UAAU,EAAE,IAAK;EACjB,WAAW,EX6PM,GAAG;EW5PpB,UAAU,EAAE,IAAK;EACjB,UAAU,EAAE,KAAM;EAClB,eAAe,EAAE,IAAK;EACtB,WAAW,EAAE,IAAK;EAClB,cAAc,EAAE,IAAK;EACrB,WAAW,EAAE,MAAO;EACpB,UAAU,EAAE,MAAO;EACnB,YAAY,EAAE,MAAO;EoDPrB,SAAS,E/DqPM,QAAO;E+DnPtB,SAAS,EAAE,UAAW;EACtB,OAAO,EAAE,CAAE;CA4DZ;;AAtED,AAAA,QAAQ,AAYL,KAAK,CAAC;EAAE,OAAO,E/DitBY,GAAE;C+DjtBQ;;AAZxC,AAAA,QAAQ,AAcL,YAAY,EAdf,AAAA,QAAQ,AAeL,kCAAkC,CAAC;EAClC,OAAO,E/DktBmB,GAAG,C+DltBC,CAAC;EAC/B,UAAU,E/D+sBgB,IAAG;C+DrsB9B;;AA3BH,AAmBkB,QAnBV,AAcL,YAAY,CAKX,cAAc,AAAA,QAAQ,EAnB1B,AAmBkB,QAnBV,AAeL,kCAAkC,CAIjC,cAAc,AAAA,QAAQ,CAAC;EACrB,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,GAAI;EACV,WAAW,E/D4sBa,IAAG;E+D3sB3B,OAAO,EAAE,EAAG;EACZ,YAAY,E/D0sBY,GAAG,CAAH,GAAG,C+D1sB6B,CAAC;EACzD,gBAAgB,E/DqEb,IAAI;C+DpER;;AA1BL,AAAA,QAAQ,AA4BL,cAAc,EA5BjB,AAAA,QAAQ,AA6BL,gCAAgC,CAAC;EAChC,OAAO,EAAE,CAAC,C/DosBgB,GAAG;E+DnsB7B,WAAW,E/DisBe,GAAG;C+DvrB9B;;AAzCH,AAiCkB,QAjCV,AA4BL,cAAc,CAKb,cAAc,AAAA,QAAQ,EAjC1B,AAiCkB,QAjCV,AA6BL,gCAAgC,CAI/B,cAAc,AAAA,QAAQ,CAAC;EACrB,GAAG,EAAE,GAAI;EACT,IAAI,EAAE,CAAE;EACR,UAAU,E/D8rBc,IAAG;E+D7rB3B,OAAO,EAAE,EAAG;EACZ,YAAY,E/D4rBY,GAAG,CAAH,GAAG,CAAH,GAAG,C+D5rBkD,CAAC;EAC9E,kBAAkB,E/DuDf,IAAI;C+DtDR;;AAxCL,AAAA,QAAQ,AA0CL,eAAe,EA1ClB,AAAA,QAAQ,AA2CL,+BAA+B,CAAC;EAC/B,OAAO,E/DsrBmB,GAAG,C+DtrBC,CAAC;EAC/B,UAAU,E/DmrBgB,GAAG;C+DzqB9B;;AAvDH,AA+CkB,QA/CV,AA0CL,eAAe,CAKd,cAAc,AAAA,QAAQ,EA/C1B,AA+CkB,QA/CV,AA2CL,+BAA+B,CAI9B,cAAc,AAAA,QAAQ,CAAC;EACrB,GAAG,EAAE,CAAE;EACP,IAAI,EAAE,GAAI;EACV,WAAW,E/DgrBa,IAAG;E+D/qB3B,OAAO,EAAE,EAAG;EACZ,YAAY,EAAE,CAAC,C/D8qBS,GAAG,CAAH,GAAG;E+D7qB3B,mBAAmB,E/DyChB,IAAI;C+DxCR;;AAtDL,AAAA,QAAQ,AAwDL,aAAa,EAxDhB,AAAA,QAAQ,AAyDL,iCAAiC,CAAC;EACjC,OAAO,EAAE,CAAC,C/DwqBgB,GAAG;E+DvqB7B,WAAW,E/DqqBe,IAAG;C+D3pB9B;;AArEH,AA6DkB,QA7DV,AAwDL,aAAa,CAKZ,cAAc,AAAA,QAAQ,EA7D1B,AA6DkB,QA7DV,AAyDL,iCAAiC,CAIhC,cAAc,AAAA,QAAQ,CAAC;EACrB,GAAG,EAAE,GAAI;EACT,KAAK,EAAE,CAAE;EACT,UAAU,E/DkqBc,IAAG;E+DjqB3B,OAAO,EAAE,EAAG;EACZ,YAAY,E/DgqBY,GAAG,C+DhqBQ,CAAC,C/DgqBZ,GAAG,CAAH,GAAG;E+D/pB3B,iBAAiB,E/D2Bd,IAAI;C+D1BR;;AAKL,AAAA,cAAc,CAAC;EACb,SAAS,E/DgpBmB,KAAK;E+D/oBjC,OAAO,E/DmpBqB,GAAG,CACH,GAAG;E+DnpB/B,KAAK,E/DiBE,IAAI;E+DhBX,UAAU,EAAE,MAAO;EACnB,gBAAgB,E/DgBT,IAAI;E2B3FT,aAAa,E3B4TQ,OAAM;C+DvO9B;;AAfD,AAAA,cAAc,AAQX,QAAQ,CAAC;EACR,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,YAAY,EAAE,WAAY;EAC1B,YAAY,EAAE,KAAM;CACrB;;ACxFH,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,IAAI,EAAE,CAAE;EACR,OAAO,EhEilBmB,IAAI;EgEhlB9B,OAAO,EAAE,KAAM;EACf,SAAS,EhEquB2B,KAAK;EgEpuBzC,OAAO,EhEkuB6B,GAAG;EWxuBvC,WAAW,EXqPY,aAAC,EAAc,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU;EWnP5H,UAAU,EAAE,MAAO;EACnB,WAAW,EX4PQ,MAAM;EW3PzB,cAAc,EAAE,MAAO;EACvB,UAAU,EAAE,IAAK;EACjB,WAAW,EX6PM,GAAG;EW5PpB,UAAU,EAAE,IAAK;EACjB,UAAU,EAAE,KAAM;EAClB,eAAe,EAAE,IAAK;EACtB,WAAW,EAAE,IAAK;EAClB,cAAc,EAAE,IAAK;EACrB,WAAW,EAAE,MAAO;EACpB,UAAU,EAAE,MAAO;EACnB,YAAY,EAAE,MAAO;EqDJrB,SAAS,EhEkPM,QAAO;EgEhPtB,SAAS,EAAE,UAAW;EACtB,gBAAgB,EhEgFT,IAAI;EgE/EX,eAAe,EAAE,WAAY;EAC7B,MAAM,EhEyJO,GAAG,CgEzJc,KAAK,ChE+E5B,kBAAI;E2B3FT,aAAa,E3B6TQ,MAAK;CgEnM7B;;AA9HD,AAAA,QAAQ,AAuBL,YAAY,EAvBf,AAAA,QAAQ,AAwBL,kCAAkC,CAAC;EAClC,UAAU,EhE8tBwB,KAAI;CgE3sBvC;;AA5CH,AAAA,QAAQ,AAuBL,YAAY,AAIV,QAAQ,EA3Bb,AAAA,QAAQ,AAuBL,YAAY,AAKV,OAAO,EA5BZ,AAAA,QAAQ,AAwBL,kCAAkC,AAGhC,QAAQ,EA3Bb,AAAA,QAAQ,AAwBL,kCAAkC,AAIhC,OAAO,CAAC;EACP,IAAI,EAAE,GAAI;EACV,mBAAmB,EAAE,CAAE;CACxB;;AA/BL,AAAA,QAAQ,AAuBL,YAAY,AAUV,QAAQ,EAjCb,AAAA,QAAQ,AAwBL,kCAAkC,AAShC,QAAQ,CAAC;EACR,MAAM,EhEwtB2B,KAAoB;EgEvtBrD,WAAW,EhEutBsB,KAAoB;EgEttBrD,gBAAgB,EhEutBgB,mBAAO;CgEttBxC;;AArCL,AAAA,QAAQ,AAuBL,YAAY,AAgBV,OAAO,EAvCZ,AAAA,QAAQ,AAwBL,kCAAkC,AAehC,OAAO,CAAC;EACP,MAAM,EAAI,KAA0B;EACpC,WAAW,EhE8sBqB,KAAI;EgE7sBpC,gBAAgB,EhEoDb,IAAI;CgEnDR;;AA3CL,AAAA,QAAQ,AA8CL,cAAc,EA9CjB,AAAA,QAAQ,AA+CL,gCAAgC,CAAC;EAChC,WAAW,EhEusBuB,IAAI;CgEprBvC;;AAnEH,AAAA,QAAQ,AA8CL,cAAc,AAIZ,QAAQ,EAlDb,AAAA,QAAQ,AA8CL,cAAc,AAKZ,OAAO,EAnDZ,AAAA,QAAQ,AA+CL,gCAAgC,AAG9B,QAAQ,EAlDb,AAAA,QAAQ,AA+CL,gCAAgC,AAI9B,OAAO,CAAC;EACP,GAAG,EAAE,GAAI;EACT,iBAAiB,EAAE,CAAE;CACtB;;AAtDL,AAAA,QAAQ,AA8CL,cAAc,AAUZ,QAAQ,EAxDb,AAAA,QAAQ,AA+CL,gCAAgC,AAS9B,QAAQ,CAAC;EACR,IAAI,EhEisB6B,KAAoB;EgEhsBrD,UAAU,EhEgsBuB,KAAoB;EgE/rBrD,kBAAkB,EhEgsBc,mBAAO;CgE/rBxC;;AA5DL,AAAA,QAAQ,AA8CL,cAAc,AAgBZ,OAAO,EA9DZ,AAAA,QAAQ,AA+CL,gCAAgC,AAe9B,OAAO,CAAC;EACP,IAAI,EAAI,KAA0B;EAClC,UAAU,EAAI,KAA0B;EACxC,kBAAkB,EhE6Bf,IAAI;CgE5BR;;AAlEL,AAAA,QAAQ,AAqEL,eAAe,EArElB,AAAA,QAAQ,AAsEL,+BAA+B,CAAC;EAC/B,UAAU,EhEgrBwB,IAAI;CgEjpBvC;;AAtGH,AAAA,QAAQ,AAqEL,eAAe,AAIb,QAAQ,EAzEb,AAAA,QAAQ,AAqEL,eAAe,AAKb,OAAO,EA1EZ,AAAA,QAAQ,AAsEL,+BAA+B,AAG7B,QAAQ,EAzEb,AAAA,QAAQ,AAsEL,+BAA+B,AAI7B,OAAO,CAAC;EACP,IAAI,EAAE,GAAI;EACV,gBAAgB,EAAE,CAAE;CACrB;;AA7EL,AAAA,QAAQ,AAqEL,eAAe,AAUb,QAAQ,EA/Eb,AAAA,QAAQ,AAsEL,+BAA+B,AAS7B,QAAQ,CAAC;EACR,GAAG,EhE0qB8B,KAAoB;EgEzqBrD,WAAW,EhEyqBsB,KAAoB;EgExqBrD,mBAAmB,EhEyqBa,mBAAO;CgExqBxC;;AAnFL,AAAA,QAAQ,AAqEL,eAAe,AAgBb,OAAO,EArFZ,AAAA,QAAQ,AAsEL,+BAA+B,AAe7B,OAAO,CAAC;EACP,GAAG,EAAI,KAA0B;EACjC,WAAW,EhEgqBqB,KAAI;EgE/pBpC,mBAAmB,EhEwpBa,OAAM;CgEvpBvC;;AAzFL,AA4FkB,QA5FV,AAqEL,eAAe,CAuBd,cAAc,AAAA,QAAQ,EA5F1B,AA4FkB,QA5FV,AAsEL,+BAA+B,CAsB9B,cAAc,AAAA,QAAQ,CAAC;EACrB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,IAAI,EAAE,GAAI;EACV,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,WAAW,EAAE,KAAM;EACnB,OAAO,EAAE,EAAG;EACZ,aAAa,EAAE,GAAG,CAAC,KAAK,ChE4oBQ,OAAM;CgE3oBvC;;AArGL,AAAA,QAAQ,AAwGL,aAAa,EAxGhB,AAAA,QAAQ,AAyGL,iCAAiC,CAAC;EACjC,WAAW,EhE6oBuB,KAAI;CgE1nBvC;;AA7HH,AAAA,QAAQ,AAwGL,aAAa,AAIX,QAAQ,EA5Gb,AAAA,QAAQ,AAwGL,aAAa,AAKX,OAAO,EA7GZ,AAAA,QAAQ,AAyGL,iCAAiC,AAG/B,QAAQ,EA5Gb,AAAA,QAAQ,AAyGL,iCAAiC,AAI/B,OAAO,CAAC;EACP,GAAG,EAAE,GAAI;EACT,kBAAkB,EAAE,CAAE;CACvB;;AAhHL,AAAA,QAAQ,AAwGL,aAAa,AAUX,QAAQ,EAlHb,AAAA,QAAQ,AAyGL,iCAAiC,AAS/B,QAAQ,CAAC;EACR,KAAK,EhEuoB4B,KAAoB;EgEtoBrD,UAAU,EhEsoBuB,KAAoB;EgEroBrD,iBAAiB,EhEsoBe,mBAAO;CgEroBxC;;AAtHL,AAAA,QAAQ,AAwGL,aAAa,AAgBX,OAAO,EAxHZ,AAAA,QAAQ,AAyGL,iCAAiC,AAe/B,OAAO,CAAC;EACP,KAAK,EAAI,KAA0B;EACnC,UAAU,EAAI,KAA0B;EACxC,iBAAiB,EhE7Bd,IAAI;CgE8BR;;AAML,AAAA,cAAc,CAAC;EACb,OAAO,EhE+mB6B,GAAG,CADH,IAAI;EgE7mBxC,aAAa,EAAE,CAAE;EACjB,SAAS,EhEsHM,IAAI;EgErHnB,gBAAgB,EhE0mBoB,OAAM;EgEzmB1C,aAAa,EhEkCA,GAAG,CgElCqB,KAAK,CAAC,OAAM;ErC7H/C,uBAAuB,EqC8HH,kBAAI;ErC7HxB,sBAAsB,EqC6HF,kBAAI;CAM3B;;AAZD,AAAA,cAAc,AASX,MAAM,CAAC;EACN,OAAO,EAAE,IAAK;CACf;;AAGH,AAAA,gBAAgB,CAAC;EACf,OAAO,EhEomB6B,GAAG,CADH,IAAI;CgElmBzC;;AAOD,AAAQ,QAAA,AAAA,QAAQ;AAChB,AAAQ,QAAA,AAAA,OAAO,CAAC;EACd,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,YAAY,EAAE,WAAY;EAC1B,YAAY,EAAE,KAAM;CACrB;;AAED,AAAQ,QAAA,AAAA,QAAQ,CAAC;EACf,OAAO,EAAE,EAAG;EACZ,YAAY,EhEqlByB,IAAoB;CgEplB1D;;AACD,AAAQ,QAAA,AAAA,OAAO,CAAC;EACd,OAAO,EAAE,EAAG;EACZ,YAAY,EhE8kBwB,IAAI;CgE7kBzC;;ACzKD,AAAA,SAAS,CAAC;EACR,QAAQ,EAAE,QAAS;CACpB;;AAED,AAAA,eAAe,CAAC;EACd,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,QAAQ,EAAE,MAAO;CAClB;;AAED,AAAA,cAAc,CAAC;EACb,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,IAAK;EACd,KAAK,EAAE,IAAK;CAOb;;AlDnBC,MAAM,EAAL,oBAAC;EkDSJ,AAAA,cAAc,CAAC;I9DIT,UAAU,EHw5BgB,SAAS,CAAC,IAAG,CAAC,WAAW;IiEr5BrD,mBAAmB,EAAE,MAAO;IAC5B,WAAW,EAAE,MAAO;GAEvB;;;AlDZ0C,SAAC,EAA/B,SAAS,EAAE,oBAAW;EkDEnC,AAAA,cAAc,CAAC;I9DIT,UAAU,EHw5BgB,SAAS,CAAC,IAAG,CAAC,WAAW;IiEr5BrD,mBAAmB,EAAE,MAAO;IAC5B,WAAW,EAAE,MAAO;GAEvB;;;AAED,AAAc,cAAA,AAAA,OAAO;AACrB,AAAA,mBAAmB;AACnB,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,IAAK;CACf;;AAED,AAAA,mBAAmB;AACnB,AAAA,mBAAmB,CAAC;EAClB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;CACR;;AlD/BC,MAAM,EAAL,oBAAC;EkDmCF,AAAmB,mBAAA,AAAA,mBAAmB;EACtC,AAAmB,mBAAA,AAAA,oBAAoB,CAAC;IACtC,SAAS,EAAE,oBAAW;GACvB;EAED,AAAA,mBAAmB;EACnB,AAAO,OAAA,AAAA,oBAAoB,CAAC;IAC1B,SAAS,EAAE,uBAAW;GACvB;EAED,AAAA,mBAAmB;EACnB,AAAO,OAAA,AAAA,mBAAmB,CAAC;IACzB,SAAS,EAAE,wBAAW;GACvB;;;AlDzCwC,SAAC,EAA/B,SAAS,EAAE,oBAAW;EkD4BjC,AAAmB,mBAAA,AAAA,mBAAmB;EACtC,AAAmB,mBAAA,AAAA,oBAAoB,CAAC;IACtC,SAAS,EAAE,oBAAW;GACvB;EAED,AAAA,mBAAmB;EACnB,AAAO,OAAA,AAAA,oBAAoB,CAAC;IAC1B,SAAS,EAAE,uBAAW;GACvB;EAED,AAAA,mBAAmB;EACnB,AAAO,OAAA,AAAA,mBAAmB,CAAC;IACzB,SAAS,EAAE,wBAAW;GACvB;;;AAQH,AAAA,sBAAsB;AACtB,AAAA,sBAAsB,CAAC;EACrB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,MAAM,EAAE,CAAE;EAEV,OAAO,EAAE,IAAK;EACd,WAAW,EAAE,MAAO;EACpB,eAAe,EAAE,MAAO;EACxB,KAAK,EjEo1BuC,GAAG;EiEn1B/C,KAAK,EjE0BE,IAAI;EiEzBX,UAAU,EAAE,MAAO;EACnB,OAAO,EjEk1BqC,GAAE;CiEv0B/C;;AAvBD,AAAA,sBAAsB,A5DtCjB,MAAM,E4DsCX,AAAA,sBAAsB,A5DrCjB,MAAM;A4DsCX,AAAA,sBAAsB,A5DvCjB,MAAM;A4DuCX,AAAA,sBAAsB,A5DtCjB,MAAM,CAAC;E4DuDR,KAAK,EjEkBA,IAAI;EiEjBT,eAAe,EAAE,IAAK;EACtB,OAAO,EAAE,CAAE;EACX,OAAO,EAAE,EAAG;C5DxDX;;A4D2DL,AAAA,sBAAsB,CAAC;EACrB,IAAI,EAAE,CAAE;CACT;;AACD,AAAA,sBAAsB,CAAC;EACrB,KAAK,EAAE,CAAE;CACV;;AAGD,AAAA,2BAA2B;AAC3B,AAAA,2BAA2B,CAAC;EAC1B,OAAO,EAAE,YAAa;EACtB,KAAK,EjEq0BuC,IAAI;EiEp0BhD,MAAM,EjEo0BsC,IAAI;EiEn0BhD,UAAU,EAAE,mCAAoC;EAChD,eAAe,EAAE,SAAU;CAC5B;;AACD,AAAA,2BAA2B,CAAC;EAC1B,gBAAgB,EjE9BN,2LAAS;CiE+BpB;;AACD,AAAA,2BAA2B,CAAC;EAC1B,gBAAgB,EjEjCN,6LAAS;CiEkCpB;;AAQD,AAAA,oBAAoB,CAAC;EACnB,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,IAAK;EACb,IAAI,EAAE,CAAE;EACR,OAAO,EAAE,EAAG;EACZ,OAAO,EAAE,IAAK;EACd,eAAe,EAAE,MAAO;EACxB,YAAY,EAAE,CAAE;EAEhB,YAAY,EjE8xBgC,GAAG;EiE7xB/C,WAAW,EjE6xBiC,GAAG;EiE5xB/C,UAAU,EAAE,IAAK;CAqClB;;AAjDD,AAcE,oBAdkB,CAclB,EAAE,CAAC;EACD,QAAQ,EAAE,QAAS;EACnB,IAAI,EAAE,QAAS;EACf,SAAS,EjE0xBiC,IAAI;EiEzxB9C,MAAM,EjE0xBoC,GAAG;EiEzxB7C,YAAY,EjE0xB8B,GAAG;EiEzxB7C,WAAW,EjEyxB+B,GAAG;EiExxB7C,WAAW,EAAE,MAAO;EACpB,MAAM,EAAE,OAAQ;EAChB,gBAAgB,EjExCX,wBAAI;CiE6DV;;AA5CH,AAcE,oBAdkB,CAclB,EAAE,AAYC,QAAQ,CAAC;EACR,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,KAAM;EACX,IAAI,EAAE,CAAE;EACR,OAAO,EAAE,YAAa;EACtB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,OAAO,EAAE,EAAG;CACb;;AAlCL,AAcE,oBAdkB,CAclB,EAAE,AAqBC,OAAO,CAAC;EACP,QAAQ,EAAE,QAAS;EACnB,MAAM,EAAE,KAAM;EACd,IAAI,EAAE,CAAE;EACR,OAAO,EAAE,YAAa;EACtB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,OAAO,EAAE,EAAG;CACb;;AA3CL,AA8CE,oBA9CkB,CA8ClB,OAAO,CAAC;EACN,gBAAgB,EjEhEX,IAAI;CiEiEV;;AAQH,AAAA,iBAAiB,CAAC;EAChB,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAI,GAAI;EACb,MAAM,EAAE,IAAK;EACb,IAAI,EAAI,GAAI;EACZ,OAAO,EAAE,EAAG;EACZ,WAAW,EAAE,IAAK;EAClB,cAAc,EAAE,IAAK;EACrB,KAAK,EjEjFE,IAAI;EiEkFX,UAAU,EAAE,MAAO;CACpB;;AEjLD,AAAA,eAAe,CAAI;EAAE,cAAc,EAAE,mBAAoB;CAAI;;AAC7D,AAAA,UAAU,CAAS;EAAE,cAAc,EAAE,cAAe;CAAI;;AACxD,AAAA,aAAa,CAAM;EAAE,cAAc,EAAE,iBAAkB;CAAI;;AAC3D,AAAA,aAAa,CAAM;EAAE,cAAc,EAAE,iBAAkB;CAAI;;AAC3D,AAAA,kBAAkB,CAAC;EAAE,cAAc,EAAE,sBAAuB;CAAI;;AAChE,AAAA,eAAe,CAAI;EAAE,cAAc,EAAE,mBAAoB;CAAI;;ACD7D,AAAA,SAAS,CAAC;EACR,gBAAgB,EAAE,OAAM;CACzB;;A1CHC,AAAA,WAAW,CAAX;EACE,gBAAgB,E1BgGX,OAAO,C0BhGa,UAAU;CACpC;;AACD,AAAC,CAAA,AAAA,WAAW,ArBcT,MAAM,EqBdT,AAAC,CAAA,AAAA,WAAW,ArBeT,MAAM,CAAC;EqBbN,gBAAgB,EAAE,OAAM,CAAc,UAAU;CrBejD;;AqBpBH,AAAA,WAAW,CAAX;EACE,gBAAgB,E1B+FX,OAAO,C0B/Fa,UAAU;CACpC;;AACD,AAAC,CAAA,AAAA,WAAW,ArBcT,MAAM,EqBdT,AAAC,CAAA,AAAA,WAAW,ArBeT,MAAM,CAAC;EqBbN,gBAAgB,EAAE,OAAM,CAAc,UAAU;CrBejD;;AqBpBH,AAAA,QAAQ,CAAR;EACE,gBAAgB,E1BiGX,OAAO,C0BjGa,UAAU;CACpC;;AACD,AAAC,CAAA,AAAA,QAAQ,ArBcN,MAAM,EqBdT,AAAC,CAAA,AAAA,QAAQ,ArBeN,MAAM,CAAC;EqBbN,gBAAgB,EAAE,OAAM,CAAc,UAAU;CrBejD;;AqBpBH,AAAA,WAAW,CAAX;EACE,gBAAgB,E1B6FX,OAAO,C0B7Fa,UAAU;CACpC;;AACD,AAAC,CAAA,AAAA,WAAW,ArBcT,MAAM,EqBdT,AAAC,CAAA,AAAA,WAAW,ArBeT,MAAM,CAAC;EqBbN,gBAAgB,EAAE,OAAM,CAAc,UAAU;CrBejD;;AqBpBH,AAAA,UAAU,CAAV;EACE,gBAAgB,E1B4FX,OAAO,C0B5Fa,UAAU;CACpC;;AACD,AAAC,CAAA,AAAA,UAAU,ArBcR,MAAM,EqBdT,AAAC,CAAA,AAAA,UAAU,ArBeR,MAAM,CAAC;EqBbN,gBAAgB,EAAE,OAAM,CAAc,UAAU;CrBejD;;AqBpBH,AAAA,WAAW,CAAX;EACE,gBAAgB,E1BsGQ,OAAO,C0BtGN,UAAU;CACpC;;AACD,AAAC,CAAA,AAAA,WAAW,ArBcT,MAAM,EqBdT,AAAC,CAAA,AAAA,WAAW,ArBeT,MAAM,CAAC;EqBbN,gBAAgB,EAAE,OAAM,CAAc,UAAU;CrBejD;;AgEnBL,AAAA,SAAS,CAAQ;EAAE,MAAM,EAAE,YAAa;CAAI;;AAC5C,AAAA,aAAa,CAAI;EAAE,UAAU,EAAE,YAAa;CAAI;;AAChD,AAAA,eAAe,CAAE;EAAE,YAAY,EAAE,YAAa;CAAI;;AAClD,AAAA,gBAAgB,CAAC;EAAE,aAAa,EAAE,YAAa;CAAI;;AACnD,AAAA,cAAc,CAAG;EAAE,WAAW,EAAE,YAAa;CAAI;;AAMjD,AAAA,QAAQ,CAAC;E1CVL,aAAa,E3B4TQ,OAAM;CqEhT9B;;AACD,AAAA,YAAY,CAAC;E1CPT,uBAAuB,E3BsTF,OAAM;E2BrT3B,sBAAsB,E3BqTD,OAAM;CqE7S9B;;AACD,AAAA,cAAc,CAAC;E1CHX,0BAA0B,E3B+SL,OAAM;E2B9S3B,uBAAuB,E3B8SF,OAAM;CqE1S9B;;AACD,AAAA,eAAe,CAAC;E1CCZ,0BAA0B,E3BwSL,OAAM;E2BvS3B,yBAAyB,E3BuSJ,OAAM;CqEvS9B;;AACD,AAAA,aAAa,CAAC;E1CKV,yBAAyB,E3BiSJ,OAAM;E2BhS3B,sBAAsB,E3BgSD,OAAM;CqEpS9B;;AAED,AAAA,eAAe,CAAC;EACd,aAAa,EAAE,GAAI;CACpB;;AAED,AAAA,UAAU,CAAC;EACT,aAAa,EAAE,CAAE;CAClB;;ACpCD,AAAA,SAAS,AzCCN,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;A0CGC,AAAA,OAAO,CAAP;EAAE,OAAO,EAAE,eAAgB;CAAI;;AAC/B,AAAA,SAAS,CAAT;EAAE,OAAO,EAAE,iBAAkB;CAAI;;AACjC,AAAA,eAAe,CAAf;EAAE,OAAO,EAAE,uBAAwB;CAAI;;AACvC,AAAA,QAAQ,CAAR;EAAE,OAAO,EAAE,gBAAiB;CAAI;;AAChC,AAAA,QAAQ,CAAR;EAAE,OAAO,EAAE,gBAAiB;CAAI;;AAChC,AAAA,aAAa,CAAb;EAAE,OAAO,EAAE,qBAAsB;CAAI;;AACrC,AAAA,OAAO,CAAP;EAAE,OAAO,EAAE,eAAgB;CAAI;;AAC/B,AAAA,cAAc,CAAd;EAAE,OAAO,EAAE,sBAAuB;CAAI;;AnEyCtC,MAAM,EAAL,SAAS,EAAE,KAAK;EmEhDjB,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,YAAY,CAAZ;IAAE,OAAO,EAAE,iBAAkB;GAAI;EACjC,AAAA,kBAAkB,CAAlB;IAAE,OAAO,EAAE,uBAAwB;GAAI;EACvC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,gBAAgB,CAAhB;IAAE,OAAO,EAAE,qBAAsB;GAAI;EACrC,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,iBAAiB,CAAjB;IAAE,OAAO,EAAE,sBAAuB;GAAI;;;AnEyCtC,MAAM,EAAL,SAAS,EAAE,KAAK;EmEhDjB,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,YAAY,CAAZ;IAAE,OAAO,EAAE,iBAAkB;GAAI;EACjC,AAAA,kBAAkB,CAAlB;IAAE,OAAO,EAAE,uBAAwB;GAAI;EACvC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,gBAAgB,CAAhB;IAAE,OAAO,EAAE,qBAAsB;GAAI;EACrC,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,iBAAiB,CAAjB;IAAE,OAAO,EAAE,sBAAuB;GAAI;;;AnEyCtC,MAAM,EAAL,SAAS,EAAE,KAAK;EmEhDjB,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,YAAY,CAAZ;IAAE,OAAO,EAAE,iBAAkB;GAAI;EACjC,AAAA,kBAAkB,CAAlB;IAAE,OAAO,EAAE,uBAAwB;GAAI;EACvC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,gBAAgB,CAAhB;IAAE,OAAO,EAAE,qBAAsB;GAAI;EACrC,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,iBAAiB,CAAjB;IAAE,OAAO,EAAE,sBAAuB;GAAI;;;AnEyCtC,MAAM,EAAL,SAAS,EAAE,MAAM;EmEhDlB,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,YAAY,CAAZ;IAAE,OAAO,EAAE,iBAAkB;GAAI;EACjC,AAAA,kBAAkB,CAAlB;IAAE,OAAO,EAAE,uBAAwB;GAAI;EACvC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,WAAW,CAAX;IAAE,OAAO,EAAE,gBAAiB;GAAI;EAChC,AAAA,gBAAgB,CAAhB;IAAE,OAAO,EAAE,qBAAsB;GAAI;EACrC,AAAA,UAAU,CAAV;IAAE,OAAO,EAAE,eAAgB;GAAI;EAC/B,AAAA,iBAAiB,CAAjB;IAAE,OAAO,EAAE,sBAAuB;GAAI;;;ACPtC,AAAA,WAAW,CAAX;EAAE,KAAK,EAAE,EAAG;CAAI;;AAChB,AAAA,UAAU,CAAV;EAAE,KAAK,EAAE,CAAE;CAAI;;AACf,AAAA,eAAe,CAAf;EAAE,KAAK,EAAE,CAAE;CAAI;;AAEf,AAAA,SAAS,CAAT;EAAE,cAAc,EAAE,cAAe;CAAI;;AACrC,AAAA,YAAY,CAAZ;EAAE,cAAc,EAAE,iBAAkB;CAAI;;AACxC,AAAA,iBAAiB,CAAjB;EAAE,cAAc,EAAE,sBAAuB;CAAI;;AAC7C,AAAA,oBAAoB,CAApB;EAAE,cAAc,EAAE,yBAA0B;CAAI;;AAEhD,AAAA,UAAU,CAAV;EAAE,SAAS,EAAE,eAAgB;CAAI;;AACjC,AAAA,YAAY,CAAZ;EAAE,SAAS,EAAE,iBAAkB;CAAI;;AACnC,AAAA,kBAAkB,CAAlB;EAAE,SAAS,EAAE,uBAAwB;CAAI;;AAEzC,AAAA,sBAAsB,CAAtB;EAAE,eAAe,EAAE,qBAAsB;CAAI;;AAC7C,AAAA,oBAAoB,CAApB;EAAE,eAAe,EAAE,mBAAoB;CAAI;;AAC3C,AAAA,uBAAuB,CAAvB;EAAE,eAAe,EAAE,iBAAkB;CAAI;;AACzC,AAAA,wBAAwB,CAAxB;EAAE,eAAe,EAAE,wBAAyB;CAAI;;AAChD,AAAA,uBAAuB,CAAvB;EAAE,eAAe,EAAE,uBAAwB;CAAI;;AAE/C,AAAA,kBAAkB,CAAlB;EAAE,WAAW,EAAE,qBAAsB;CAAI;;AACzC,AAAA,gBAAgB,CAAhB;EAAE,WAAW,EAAE,mBAAoB;CAAI;;AACvC,AAAA,mBAAmB,CAAnB;EAAE,WAAW,EAAE,iBAAkB;CAAI;;AACrC,AAAA,qBAAqB,CAArB;EAAE,WAAW,EAAE,mBAAoB;CAAI;;AACvC,AAAA,oBAAoB,CAApB;EAAE,WAAW,EAAE,kBAAmB;CAAI;;AAEtC,AAAA,oBAAoB,CAApB;EAAE,aAAa,EAAE,qBAAsB;CAAI;;AAC3C,AAAA,kBAAkB,CAAlB;EAAE,aAAa,EAAE,mBAAoB;CAAI;;AACzC,AAAA,qBAAqB,CAArB;EAAE,aAAa,EAAE,iBAAkB;CAAI;;AACvC,AAAA,sBAAsB,CAAtB;EAAE,aAAa,EAAE,wBAAyB;CAAI;;AAC9C,AAAA,qBAAqB,CAArB;EAAE,aAAa,EAAE,uBAAwB;CAAI;;AAC7C,AAAA,sBAAsB,CAAtB;EAAE,aAAa,EAAE,kBAAmB;CAAI;;AAExC,AAAA,gBAAgB,CAAhB;EAAE,UAAU,EAAE,eAAgB;CAAI;;AAClC,AAAA,iBAAiB,CAAjB;EAAE,UAAU,EAAE,qBAAsB;CAAI;;AACxC,AAAA,eAAe,CAAf;EAAE,UAAU,EAAE,mBAAoB;CAAI;;AACtC,AAAA,kBAAkB,CAAlB;EAAE,UAAU,EAAE,iBAAkB;CAAI;;AACpC,AAAA,oBAAoB,CAApB;EAAE,UAAU,EAAE,mBAAoB;CAAI;;AACtC,AAAA,mBAAmB,CAAnB;EAAE,UAAU,EAAE,kBAAmB;CAAI;;ApEWrC,MAAM,EAAL,SAAS,EAAE,KAAK;EoEhDjB,AAAA,cAAc,CAAd;IAAE,KAAK,EAAE,EAAG;GAAI;EAChB,AAAA,aAAa,CAAb;IAAE,KAAK,EAAE,CAAE;GAAI;EACf,AAAA,kBAAkB,CAAlB;IAAE,KAAK,EAAE,CAAE;GAAI;EAEf,AAAA,YAAY,CAAZ;IAAE,cAAc,EAAE,cAAe;GAAI;EACrC,AAAA,eAAe,CAAf;IAAE,cAAc,EAAE,iBAAkB;GAAI;EACxC,AAAA,oBAAoB,CAApB;IAAE,cAAc,EAAE,sBAAuB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,cAAc,EAAE,yBAA0B;GAAI;EAEhD,AAAA,aAAa,CAAb;IAAE,SAAS,EAAE,eAAgB;GAAI;EACjC,AAAA,eAAe,CAAf;IAAE,SAAS,EAAE,iBAAkB;GAAI;EACnC,AAAA,qBAAqB,CAArB;IAAE,SAAS,EAAE,uBAAwB;GAAI;EAEzC,AAAA,yBAAyB,CAAzB;IAAE,eAAe,EAAE,qBAAsB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,eAAe,EAAE,mBAAoB;GAAI;EAC3C,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,iBAAkB;GAAI;EACzC,AAAA,2BAA2B,CAA3B;IAAE,eAAe,EAAE,wBAAyB;GAAI;EAChD,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,uBAAwB;GAAI;EAE/C,AAAA,qBAAqB,CAArB;IAAE,WAAW,EAAE,qBAAsB;GAAI;EACzC,AAAA,mBAAmB,CAAnB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,sBAAsB,CAAtB;IAAE,WAAW,EAAE,iBAAkB;GAAI;EACrC,AAAA,wBAAwB,CAAxB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,uBAAuB,CAAvB;IAAE,WAAW,EAAE,kBAAmB;GAAI;EAEtC,AAAA,uBAAuB,CAAvB;IAAE,aAAa,EAAE,qBAAsB;GAAI;EAC3C,AAAA,qBAAqB,CAArB;IAAE,aAAa,EAAE,mBAAoB;GAAI;EACzC,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,iBAAkB;GAAI;EACvC,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,wBAAyB;GAAI;EAC9C,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,uBAAwB;GAAI;EAC7C,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,kBAAmB;GAAI;EAExC,AAAA,mBAAmB,CAAnB;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,oBAAoB,CAApB;IAAE,UAAU,EAAE,qBAAsB;GAAI;EACxC,AAAA,kBAAkB,CAAlB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,qBAAqB,CAArB;IAAE,UAAU,EAAE,iBAAkB;GAAI;EACpC,AAAA,uBAAuB,CAAvB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,sBAAsB,CAAtB;IAAE,UAAU,EAAE,kBAAmB;GAAI;;;ApEWrC,MAAM,EAAL,SAAS,EAAE,KAAK;EoEhDjB,AAAA,cAAc,CAAd;IAAE,KAAK,EAAE,EAAG;GAAI;EAChB,AAAA,aAAa,CAAb;IAAE,KAAK,EAAE,CAAE;GAAI;EACf,AAAA,kBAAkB,CAAlB;IAAE,KAAK,EAAE,CAAE;GAAI;EAEf,AAAA,YAAY,CAAZ;IAAE,cAAc,EAAE,cAAe;GAAI;EACrC,AAAA,eAAe,CAAf;IAAE,cAAc,EAAE,iBAAkB;GAAI;EACxC,AAAA,oBAAoB,CAApB;IAAE,cAAc,EAAE,sBAAuB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,cAAc,EAAE,yBAA0B;GAAI;EAEhD,AAAA,aAAa,CAAb;IAAE,SAAS,EAAE,eAAgB;GAAI;EACjC,AAAA,eAAe,CAAf;IAAE,SAAS,EAAE,iBAAkB;GAAI;EACnC,AAAA,qBAAqB,CAArB;IAAE,SAAS,EAAE,uBAAwB;GAAI;EAEzC,AAAA,yBAAyB,CAAzB;IAAE,eAAe,EAAE,qBAAsB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,eAAe,EAAE,mBAAoB;GAAI;EAC3C,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,iBAAkB;GAAI;EACzC,AAAA,2BAA2B,CAA3B;IAAE,eAAe,EAAE,wBAAyB;GAAI;EAChD,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,uBAAwB;GAAI;EAE/C,AAAA,qBAAqB,CAArB;IAAE,WAAW,EAAE,qBAAsB;GAAI;EACzC,AAAA,mBAAmB,CAAnB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,sBAAsB,CAAtB;IAAE,WAAW,EAAE,iBAAkB;GAAI;EACrC,AAAA,wBAAwB,CAAxB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,uBAAuB,CAAvB;IAAE,WAAW,EAAE,kBAAmB;GAAI;EAEtC,AAAA,uBAAuB,CAAvB;IAAE,aAAa,EAAE,qBAAsB;GAAI;EAC3C,AAAA,qBAAqB,CAArB;IAAE,aAAa,EAAE,mBAAoB;GAAI;EACzC,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,iBAAkB;GAAI;EACvC,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,wBAAyB;GAAI;EAC9C,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,uBAAwB;GAAI;EAC7C,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,kBAAmB;GAAI;EAExC,AAAA,mBAAmB,CAAnB;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,oBAAoB,CAApB;IAAE,UAAU,EAAE,qBAAsB;GAAI;EACxC,AAAA,kBAAkB,CAAlB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,qBAAqB,CAArB;IAAE,UAAU,EAAE,iBAAkB;GAAI;EACpC,AAAA,uBAAuB,CAAvB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,sBAAsB,CAAtB;IAAE,UAAU,EAAE,kBAAmB;GAAI;;;ApEWrC,MAAM,EAAL,SAAS,EAAE,KAAK;EoEhDjB,AAAA,cAAc,CAAd;IAAE,KAAK,EAAE,EAAG;GAAI;EAChB,AAAA,aAAa,CAAb;IAAE,KAAK,EAAE,CAAE;GAAI;EACf,AAAA,kBAAkB,CAAlB;IAAE,KAAK,EAAE,CAAE;GAAI;EAEf,AAAA,YAAY,CAAZ;IAAE,cAAc,EAAE,cAAe;GAAI;EACrC,AAAA,eAAe,CAAf;IAAE,cAAc,EAAE,iBAAkB;GAAI;EACxC,AAAA,oBAAoB,CAApB;IAAE,cAAc,EAAE,sBAAuB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,cAAc,EAAE,yBAA0B;GAAI;EAEhD,AAAA,aAAa,CAAb;IAAE,SAAS,EAAE,eAAgB;GAAI;EACjC,AAAA,eAAe,CAAf;IAAE,SAAS,EAAE,iBAAkB;GAAI;EACnC,AAAA,qBAAqB,CAArB;IAAE,SAAS,EAAE,uBAAwB;GAAI;EAEzC,AAAA,yBAAyB,CAAzB;IAAE,eAAe,EAAE,qBAAsB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,eAAe,EAAE,mBAAoB;GAAI;EAC3C,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,iBAAkB;GAAI;EACzC,AAAA,2BAA2B,CAA3B;IAAE,eAAe,EAAE,wBAAyB;GAAI;EAChD,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,uBAAwB;GAAI;EAE/C,AAAA,qBAAqB,CAArB;IAAE,WAAW,EAAE,qBAAsB;GAAI;EACzC,AAAA,mBAAmB,CAAnB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,sBAAsB,CAAtB;IAAE,WAAW,EAAE,iBAAkB;GAAI;EACrC,AAAA,wBAAwB,CAAxB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,uBAAuB,CAAvB;IAAE,WAAW,EAAE,kBAAmB;GAAI;EAEtC,AAAA,uBAAuB,CAAvB;IAAE,aAAa,EAAE,qBAAsB;GAAI;EAC3C,AAAA,qBAAqB,CAArB;IAAE,aAAa,EAAE,mBAAoB;GAAI;EACzC,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,iBAAkB;GAAI;EACvC,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,wBAAyB;GAAI;EAC9C,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,uBAAwB;GAAI;EAC7C,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,kBAAmB;GAAI;EAExC,AAAA,mBAAmB,CAAnB;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,oBAAoB,CAApB;IAAE,UAAU,EAAE,qBAAsB;GAAI;EACxC,AAAA,kBAAkB,CAAlB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,qBAAqB,CAArB;IAAE,UAAU,EAAE,iBAAkB;GAAI;EACpC,AAAA,uBAAuB,CAAvB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,sBAAsB,CAAtB;IAAE,UAAU,EAAE,kBAAmB;GAAI;;;ApEWrC,MAAM,EAAL,SAAS,EAAE,MAAM;EoEhDlB,AAAA,cAAc,CAAd;IAAE,KAAK,EAAE,EAAG;GAAI;EAChB,AAAA,aAAa,CAAb;IAAE,KAAK,EAAE,CAAE;GAAI;EACf,AAAA,kBAAkB,CAAlB;IAAE,KAAK,EAAE,CAAE;GAAI;EAEf,AAAA,YAAY,CAAZ;IAAE,cAAc,EAAE,cAAe;GAAI;EACrC,AAAA,eAAe,CAAf;IAAE,cAAc,EAAE,iBAAkB;GAAI;EACxC,AAAA,oBAAoB,CAApB;IAAE,cAAc,EAAE,sBAAuB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,cAAc,EAAE,yBAA0B;GAAI;EAEhD,AAAA,aAAa,CAAb;IAAE,SAAS,EAAE,eAAgB;GAAI;EACjC,AAAA,eAAe,CAAf;IAAE,SAAS,EAAE,iBAAkB;GAAI;EACnC,AAAA,qBAAqB,CAArB;IAAE,SAAS,EAAE,uBAAwB;GAAI;EAEzC,AAAA,yBAAyB,CAAzB;IAAE,eAAe,EAAE,qBAAsB;GAAI;EAC7C,AAAA,uBAAuB,CAAvB;IAAE,eAAe,EAAE,mBAAoB;GAAI;EAC3C,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,iBAAkB;GAAI;EACzC,AAAA,2BAA2B,CAA3B;IAAE,eAAe,EAAE,wBAAyB;GAAI;EAChD,AAAA,0BAA0B,CAA1B;IAAE,eAAe,EAAE,uBAAwB;GAAI;EAE/C,AAAA,qBAAqB,CAArB;IAAE,WAAW,EAAE,qBAAsB;GAAI;EACzC,AAAA,mBAAmB,CAAnB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,sBAAsB,CAAtB;IAAE,WAAW,EAAE,iBAAkB;GAAI;EACrC,AAAA,wBAAwB,CAAxB;IAAE,WAAW,EAAE,mBAAoB;GAAI;EACvC,AAAA,uBAAuB,CAAvB;IAAE,WAAW,EAAE,kBAAmB;GAAI;EAEtC,AAAA,uBAAuB,CAAvB;IAAE,aAAa,EAAE,qBAAsB;GAAI;EAC3C,AAAA,qBAAqB,CAArB;IAAE,aAAa,EAAE,mBAAoB;GAAI;EACzC,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,iBAAkB;GAAI;EACvC,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,wBAAyB;GAAI;EAC9C,AAAA,wBAAwB,CAAxB;IAAE,aAAa,EAAE,uBAAwB;GAAI;EAC7C,AAAA,yBAAyB,CAAzB;IAAE,aAAa,EAAE,kBAAmB;GAAI;EAExC,AAAA,mBAAmB,CAAnB;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,oBAAoB,CAApB;IAAE,UAAU,EAAE,qBAAsB;GAAI;EACxC,AAAA,kBAAkB,CAAlB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,qBAAqB,CAArB;IAAE,UAAU,EAAE,iBAAkB;GAAI;EACpC,AAAA,uBAAuB,CAAvB;IAAE,UAAU,EAAE,mBAAoB;GAAI;EACtC,AAAA,sBAAsB,CAAtB;IAAE,UAAU,EAAE,kBAAmB;GAAI;;;ACzCrC,AAAA,WAAW,CAAX;EzCHF,KAAK,EAAE,eAAgB;CyCGI;;AACzB,AAAA,YAAY,CAAZ;EzCDF,KAAK,EAAE,gBAAiB;CyCCI;;AAC1B,AAAA,WAAW,CAAX;EzCCF,KAAK,EAAE,eAAgB;CyCDI;;ArEkDzB,MAAM,EAAL,SAAS,EAAE,KAAK;EqEpDjB,AAAA,cAAc,CAAd;IzCHF,KAAK,EAAE,eAAgB;GyCGI;EACzB,AAAA,eAAe,CAAf;IzCDF,KAAK,EAAE,gBAAiB;GyCCI;EAC1B,AAAA,cAAc,CAAd;IzCCF,KAAK,EAAE,eAAgB;GyCDI;;;ArEkDzB,MAAM,EAAL,SAAS,EAAE,KAAK;EqEpDjB,AAAA,cAAc,CAAd;IzCHF,KAAK,EAAE,eAAgB;GyCGI;EACzB,AAAA,eAAe,CAAf;IzCDF,KAAK,EAAE,gBAAiB;GyCCI;EAC1B,AAAA,cAAc,CAAd;IzCCF,KAAK,EAAE,eAAgB;GyCDI;;;ArEkDzB,MAAM,EAAL,SAAS,EAAE,KAAK;EqEpDjB,AAAA,cAAc,CAAd;IzCHF,KAAK,EAAE,eAAgB;GyCGI;EACzB,AAAA,eAAe,CAAf;IzCDF,KAAK,EAAE,gBAAiB;GyCCI;EAC1B,AAAA,cAAc,CAAd;IzCCF,KAAK,EAAE,eAAgB;GyCDI;;;ArEkDzB,MAAM,EAAL,SAAS,EAAE,MAAM;EqEpDlB,AAAA,cAAc,CAAd;IzCHF,KAAK,EAAE,eAAgB;GyCGI;EACzB,AAAA,eAAe,CAAf;IzCDF,KAAK,EAAE,gBAAiB;GyCCI;EAC1B,AAAA,cAAc,CAAd;IzCCF,KAAK,EAAE,eAAgB;GyCDI;;;ACJ7B,AAAA,UAAU,CAAC;EACT,QAAQ,EAAE,KAAM;EAChB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,IAAI,EAAE,CAAE;EACR,OAAO,E1E0kBmB,IAAI;C0EzkB/B;;AAED,AAAA,aAAa,CAAC;EACZ,QAAQ,EAAE,KAAM;EAChB,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,CAAE;EACR,OAAO,E1EkkBmB,IAAI;C0EjkB/B;;AAED,AAAA,WAAW,CAAC;EACV,QAAQ,EAAE,MAAO;EACjB,GAAG,EAAE,CAAE;EACP,OAAO,E1E6jBmB,IAAI;C0E5jB/B;;AClBD,AAAA,QAAQ,CAAC;ElECP,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,GAAI;EACX,MAAM,EAAE,GAAI;EACZ,OAAO,EAAE,CAAE;EACX,MAAM,EAAE,IAAK;EACb,QAAQ,EAAE,MAAO;EACjB,IAAI,EAAE,gBAAI;EACV,MAAM,EAAE,CAAE;CkENX;;AAED,AAAA,kBAAkB,AlEcf,OAAO,EkEdV,AAAA,kBAAkB,AlEef,MAAM,CAAC;EACN,QAAQ,EAAE,MAAO;EACjB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,MAAM,EAAE,CAAE;EACV,QAAQ,EAAE,OAAQ;EAClB,IAAI,EAAE,IAAK;CACZ;;AmE1BC,AAAA,KAAK,CAAL;EAAE,KAAQ,E5EyKR,GAAG,C4EzKe,UAAU;CAAI;;AAAlC,AAAA,KAAK,CAAL;EAAE,KAAQ,E5E0KR,GAAG,C4E1Ke,UAAU;CAAI;;AAAlC,AAAA,KAAK,CAAL;EAAE,KAAQ,E5E2KR,GAAG,C4E3Ke,UAAU;CAAI;;AAAlC,AAAA,MAAM,CAAN;EAAE,KAAQ,E5E4KP,IAAI,C4E5Ka,UAAU;CAAI;;AAAlC,AAAA,KAAK,CAAL;EAAE,MAAQ,E5EyKR,GAAG,C4EzKe,UAAU;CAAI;;AAAlC,AAAA,KAAK,CAAL;EAAE,MAAQ,E5E0KR,GAAG,C4E1Ke,UAAU;CAAI;;AAAlC,AAAA,KAAK,CAAL;EAAE,MAAQ,E5E2KR,GAAG,C4E3Ke,UAAU;CAAI;;AAAlC,AAAA,MAAM,CAAN;EAAE,MAAQ,E5E4KP,IAAI,C4E5Ka,UAAU;CAAI;;AAItC,AAAA,OAAO,CAAC;EAAE,SAAS,EAAE,eAAgB;CAAI;;AACzC,AAAA,OAAO,CAAC;EAAE,UAAU,EAAE,eAAgB;CAAI;;ACElC,AAAA,IAAI,CAAJ;EAAE,MAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,UAAY,E7EsIf,CAAC,C6EtIiC,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,YAAc,E7EoIjB,CAAC,C6EpImC,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,aAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,WAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,YAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;EAC1C,WAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,UAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;EACzC,aAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,MAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,UAAY,E7E0Id,OAAS,C6E1IwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,YAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,aAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,WAAa,E7EsIf,OAAS,C6EtIyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,YAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;EAC1C,WAAa,E7EmIf,OAAS,C6EnIwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,UAAY,E7EiId,OAAS,C6EjIwB,UAAU;EACzC,aAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,MAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,UAAY,E7E8Id,MAAS,C6E9IwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,YAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,WAAa,E7E0If,MAAS,C6E1IyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,YAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;EAC1C,WAAa,E7EuIf,MAAS,C6EvIwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,UAAY,E7EqId,MAAS,C6ErIwB,UAAU;EACzC,aAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,MAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,UAAY,E7EgIX,IAAI,C6EhI0B,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,YAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,aAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,WAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,YAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;EAC1C,WAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,UAAY,E7EuHX,IAAI,C6EvH0B,UAAU;EACzC,aAAe,E7EsHd,IAAI,C6EtH6B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,MAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,UAAY,E7EsJd,MAAS,C6EtJwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,YAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,aAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,WAAa,E7EkJf,MAAS,C6ElJyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,YAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;EAC1C,WAAa,E7E+If,MAAS,C6E/IwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,UAAY,E7E6Id,MAAS,C6E7IwB,UAAU;EACzC,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,MAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,UAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,YAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,aAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,WAAa,E7EsJf,IAAS,C6EtJyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,YAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;EAC1C,WAAa,E7EmJf,IAAS,C6EnJwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,UAAY,E7EiJd,IAAS,C6EjJwB,UAAU;EACzC,aAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,OAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,WAAY,E7EsIf,CAAC,C6EtIiC,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,aAAc,E7EoIjB,CAAC,C6EpImC,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,cAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,YAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,aAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;EAC1C,YAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,WAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;EACzC,cAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,OAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,WAAY,E7E0Id,OAAS,C6E1IwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,aAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,cAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,YAAa,E7EsIf,OAAS,C6EtIyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,aAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;EAC1C,YAAa,E7EmIf,OAAS,C6EnIwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,WAAY,E7EiId,OAAS,C6EjIwB,UAAU;EACzC,cAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,OAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,WAAY,E7E8Id,MAAS,C6E9IwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,aAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,YAAa,E7E0If,MAAS,C6E1IyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,aAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;EAC1C,YAAa,E7EuIf,MAAS,C6EvIwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,WAAY,E7EqId,MAAS,C6ErIwB,UAAU;EACzC,cAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,OAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,WAAY,E7EgIX,IAAI,C6EhI0B,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,aAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,cAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,YAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,aAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;EAC1C,YAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,WAAY,E7EuHX,IAAI,C6EvH0B,UAAU;EACzC,cAAe,E7EsHd,IAAI,C6EtH6B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,OAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,WAAY,E7EsJd,MAAS,C6EtJwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,aAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,cAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,YAAa,E7EkJf,MAAS,C6ElJyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,aAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;EAC1C,YAAa,E7E+If,MAAS,C6E/IwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,WAAY,E7E6Id,MAAS,C6E7IwB,UAAU;EACzC,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;CAC7C;;AAZD,AAAA,IAAI,CAAJ;EAAE,OAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;CAAI;;AACrD,AAAA,KAAK,CAAL;EAAE,WAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;CAAI;;AAC/C,AAAA,KAAK,CAAL;EAAE,aAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;CAAI;;AACjD,AAAA,KAAK,CAAL;EAAE,cAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;CAAI;;AAClD,AAAA,KAAK,CAAL;EAAE,YAAa,E7EsJf,IAAS,C6EtJyB,UAAU;CAAI;;AAChD,AAAA,KAAK,CAAL;EACE,aAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;EAC1C,YAAa,E7EmJf,IAAS,C6EnJwB,UAAU;CAC1C;;AACD,AAAA,KAAK,CAAL;EACE,WAAY,E7EiJd,IAAS,C6EjJwB,UAAU;EACzC,cAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;CAC7C;;AAKL,AAAA,OAAO,CAAP;EAAE,MAAM,EAAS,eAAgB;CAAI;;AACrC,AAAA,QAAQ,CAAR;EAAE,UAAU,EAAK,eAAgB;CAAI;;AACrC,AAAA,QAAQ,CAAR;EAAE,YAAY,EAAG,eAAgB;CAAI;;AACrC,AAAA,QAAQ,CAAR;EAAE,aAAa,EAAE,eAAgB;CAAI;;AACrC,AAAA,QAAQ,CAAR;EAAE,WAAW,EAAI,eAAgB;CAAI;;AACrC,AAAA,QAAQ,CAAR;EACE,YAAY,EAAE,eAAgB;EAC9B,WAAW,EAAG,eAAgB;CAC/B;;AACD,AAAA,QAAQ,CAAR;EACE,UAAU,EAAK,eAAgB;EAC/B,aAAa,EAAE,eAAgB;CAChC;;AzEgBD,MAAM,EAAL,SAAS,EAAE,KAAK;EyE7Cb,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,WAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,aAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,WAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,aAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,WAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,aAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,WAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,aAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,WAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,WAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,aAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,YAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,cAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,YAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,cAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,YAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,cAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,YAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,cAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,YAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,YAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,cAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAKL,AAAA,UAAU,CAAV;IAAE,MAAM,EAAS,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,UAAU,EAAK,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,YAAY,EAAG,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,aAAa,EAAE,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,WAAW,EAAI,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IACE,YAAY,EAAE,eAAgB;IAC9B,WAAW,EAAG,eAAgB;GAC/B;EACD,AAAA,WAAW,CAAX;IACE,UAAU,EAAK,eAAgB;IAC/B,aAAa,EAAE,eAAgB;GAChC;;;AzEgBD,MAAM,EAAL,SAAS,EAAE,KAAK;EyE7Cb,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,WAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,aAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,WAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,aAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,WAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,aAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,WAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,aAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,WAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,WAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,aAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,YAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,cAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,YAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,cAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,YAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,cAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,YAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,cAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,YAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,YAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,cAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAKL,AAAA,UAAU,CAAV;IAAE,MAAM,EAAS,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,UAAU,EAAK,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,YAAY,EAAG,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,aAAa,EAAE,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,WAAW,EAAI,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IACE,YAAY,EAAE,eAAgB;IAC9B,WAAW,EAAG,eAAgB;GAC/B;EACD,AAAA,WAAW,CAAX;IACE,UAAU,EAAK,eAAgB;IAC/B,aAAa,EAAE,eAAgB;GAChC;;;AzEgBD,MAAM,EAAL,SAAS,EAAE,KAAK;EyE7Cb,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,WAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,aAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,WAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,aAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,WAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,aAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,WAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,aAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,WAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,WAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,aAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,YAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,cAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,YAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,cAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,YAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,cAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,YAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,cAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,YAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,YAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,cAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAKL,AAAA,UAAU,CAAV;IAAE,MAAM,EAAS,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,UAAU,EAAK,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,YAAY,EAAG,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,aAAa,EAAE,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,WAAW,EAAI,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IACE,YAAY,EAAE,eAAgB;IAC9B,WAAW,EAAG,eAAgB;GAC/B;EACD,AAAA,WAAW,CAAX;IACE,UAAU,EAAK,eAAgB;IAC/B,aAAa,EAAE,eAAgB;GAChC;;;AzEgBD,MAAM,EAAL,SAAS,EAAE,MAAM;EyE7Cd,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,WAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,aAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,WAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,aAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,WAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,aAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,WAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,aAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,WAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,aAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,MAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,UAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,YAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,aAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,WAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,YAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,WAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,UAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,aAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuIX,CAAC,CADD,CAAC,C6EtIuC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsIf,CAAC,C6EtIiC,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoIjB,CAAC,C6EpImC,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoIlB,CAAC,C6EpIoC,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkIhB,CAAC,C6ElIkC,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgIjB,CAAC,C6EhIkC,UAAU;IAC1C,YAAa,E7E+HhB,CAAC,C6E/HiC,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Hf,CAAC,C6E7HiC,UAAU;IACzC,cAAe,E7E4HlB,CAAC,C6E5HoC,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2IV,OAAS,CADT,OAAS,C6E1I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Id,OAAS,C6E1IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwIhB,OAAS,C6ExI0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwIjB,OAAS,C6ExI2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsIf,OAAS,C6EtIyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoIhB,OAAS,C6EpIyB,UAAU;IAC1C,YAAa,E7EmIf,OAAS,C6EnIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiId,OAAS,C6EjIwB,UAAU;IACzC,cAAe,E7EgIjB,OAAS,C6EhI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E+IV,MAAS,CADT,MAAS,C6E9I8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E8Id,MAAS,C6E9IwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E4IhB,MAAS,C6E5I0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E0If,MAAS,C6E1IyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EwIhB,MAAS,C6ExIyB,UAAU;IAC1C,YAAa,E7EuIf,MAAS,C6EvIwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EqId,MAAS,C6ErIwB,UAAU;IACzC,cAAe,E7EoIjB,MAAS,C6EpI2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EiIP,IAAI,CAAJ,IAAI,C6EjIgC,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EgIX,IAAI,C6EhI0B,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7E+Hb,IAAI,C6E/H4B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7E8Hd,IAAI,C6E9H6B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7E6HZ,IAAI,C6E7H2B,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7E2Hb,IAAI,C6E3H2B,UAAU;IAC1C,YAAa,E7E0HZ,IAAI,C6E1H0B,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EuHX,IAAI,C6EvH0B,UAAU;IACzC,cAAe,E7EsHd,IAAI,C6EtH6B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7EuJV,MAAS,CADT,MAAS,C6EtJ8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7EsJd,MAAS,C6EtJwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EoJhB,MAAS,C6EpJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EoJjB,MAAS,C6EpJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EkJf,MAAS,C6ElJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EgJhB,MAAS,C6EhJyB,UAAU;IAC1C,YAAa,E7E+If,MAAS,C6E/IwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7E6Id,MAAS,C6E7IwB,UAAU;IACzC,cAAe,E7E4IjB,MAAS,C6E5I2B,UAAU;GAC7C;EAZD,AAAA,OAAO,CAAP;IAAE,OAAQ,E7E2JV,IAAS,CADT,IAAS,C6E1J8B,UAAU;GAAI;EACrD,AAAA,QAAQ,CAAR;IAAE,WAAY,E7E0Jd,IAAS,C6E1JwB,UAAU;GAAI;EAC/C,AAAA,QAAQ,CAAR;IAAE,aAAc,E7EwJhB,IAAS,C6ExJ0B,UAAU;GAAI;EACjD,AAAA,QAAQ,CAAR;IAAE,cAAe,E7EwJjB,IAAS,C6ExJ2B,UAAU;GAAI;EAClD,AAAA,QAAQ,CAAR;IAAE,YAAa,E7EsJf,IAAS,C6EtJyB,UAAU;GAAI;EAChD,AAAA,QAAQ,CAAR;IACE,aAAc,E7EoJhB,IAAS,C6EpJyB,UAAU;IAC1C,YAAa,E7EmJf,IAAS,C6EnJwB,UAAU;GAC1C;EACD,AAAA,QAAQ,CAAR;IACE,WAAY,E7EiJd,IAAS,C6EjJwB,UAAU;IACzC,cAAe,E7EgJjB,IAAS,C6EhJ2B,UAAU;GAC7C;EAKL,AAAA,UAAU,CAAV;IAAE,MAAM,EAAS,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,UAAU,EAAK,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,YAAY,EAAG,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,aAAa,EAAE,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IAAE,WAAW,EAAI,eAAgB;GAAI;EACrC,AAAA,WAAW,CAAX;IACE,YAAY,EAAE,eAAgB;IAC9B,WAAW,EAAG,eAAgB;GAC/B;EACD,AAAA,WAAW,CAAX;IACE,UAAU,EAAK,eAAgB;IAC/B,aAAa,EAAE,eAAgB;GAChC;;;AClCL,AAAA,aAAa,CAAE;EAAE,UAAU,EAAE,kBAAmB;CAAI;;AACpD,AAAA,YAAY,CAAG;EAAE,WAAW,EAAE,iBAAkB;CAAI;;AACpD,AAAA,cAAc,CAAC;EhEJb,QAAQ,EAAE,MAAO;EACjB,aAAa,EAAE,QAAS;EACxB,WAAW,EAAE,MAAO;CgEEqB;;AAQvC,AAAA,UAAU,CAAV;EAAE,UAAU,EAAE,eAAgB;CAAI;;AAClC,AAAA,WAAW,CAAX;EAAE,UAAU,EAAE,gBAAiB;CAAI;;AACnC,AAAA,YAAY,CAAZ;EAAE,UAAU,EAAE,iBAAkB;CAAI;;A1EsCpC,MAAM,EAAL,SAAS,EAAE,KAAK;E0ExCjB,AAAA,aAAa,CAAb;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,cAAc,CAAd;IAAE,UAAU,EAAE,gBAAiB;GAAI;EACnC,AAAA,eAAe,CAAf;IAAE,UAAU,EAAE,iBAAkB;GAAI;;;A1EsCpC,MAAM,EAAL,SAAS,EAAE,KAAK;E0ExCjB,AAAA,aAAa,CAAb;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,cAAc,CAAd;IAAE,UAAU,EAAE,gBAAiB;GAAI;EACnC,AAAA,eAAe,CAAf;IAAE,UAAU,EAAE,iBAAkB;GAAI;;;A1EsCpC,MAAM,EAAL,SAAS,EAAE,KAAK;E0ExCjB,AAAA,aAAa,CAAb;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,cAAc,CAAd;IAAE,UAAU,EAAE,gBAAiB;GAAI;EACnC,AAAA,eAAe,CAAf;IAAE,UAAU,EAAE,iBAAkB;GAAI;;;A1EsCpC,MAAM,EAAL,SAAS,EAAE,MAAM;E0ExClB,AAAA,aAAa,CAAb;IAAE,UAAU,EAAE,eAAgB;GAAI;EAClC,AAAA,cAAc,CAAd;IAAE,UAAU,EAAE,gBAAiB;GAAI;EACnC,AAAA,eAAe,CAAf;IAAE,UAAU,EAAE,iBAAkB;GAAI;;;AAMxC,AAAA,eAAe,CAAE;EAAE,cAAc,EAAE,oBAAqB;CAAI;;AAC5D,AAAA,eAAe,CAAE;EAAE,cAAc,EAAE,oBAAqB;CAAI;;AAC5D,AAAA,gBAAgB,CAAC;EAAE,cAAc,EAAE,qBAAsB;CAAI;;AAI7D,AAAA,mBAAmB,CAAC;EAAE,WAAW,E9EkOZ,MAAM;C8ElO+B;;AAC1D,AAAA,iBAAiB,CAAG;EAAE,WAAW,E9EkOd,IAAI;C8ElOiC;;AACxD,AAAA,YAAY,CAAQ;EAAE,UAAU,EAAE,MAAO;CAAI;;AAI7C,AAAA,WAAW,CAAC;EACV,KAAK,EAAE,eAAgB;CACxB;;AlEnCC,AAAA,WAAW,CAAX;EACE,KAAK,EZwGmB,OAAO,CYxGjB,UAAU;CACzB;;AACD,AAAC,CAAA,AAAA,WAAW,APcT,MAAM,EOdT,AAAC,CAAA,AAAA,WAAW,APeT,MAAM,CAAC;EObN,KAAK,EAAE,OAAM,CAAc,UAAU;CPetC;;AOpBH,AAAA,aAAa,CAAb;EACE,KAAK,EZgGA,OAAO,CYhGE,UAAU;CACzB;;AACD,AAAC,CAAA,AAAA,aAAa,APcX,MAAM,EOdT,AAAC,CAAA,AAAA,aAAa,APeX,MAAM,CAAC;EObN,KAAK,EAAE,OAAM,CAAc,UAAU;CPetC;;AOpBH,AAAA,aAAa,CAAb;EACE,KAAK,EZ+FA,OAAO,CY/FE,UAAU;CACzB;;AACD,AAAC,CAAA,AAAA,aAAa,APcX,MAAM,EOdT,AAAC,CAAA,AAAA,aAAa,APeX,MAAM,CAAC;EObN,KAAK,EAAE,OAAM,CAAc,UAAU;CPetC;;AOpBH,AAAA,UAAU,CAAV;EACE,KAAK,EZiGA,OAAO,CYjGE,UAAU;CACzB;;AACD,AAAC,CAAA,AAAA,UAAU,APcR,MAAM,EOdT,AAAC,CAAA,AAAA,UAAU,APeR,MAAM,CAAC;EObN,KAAK,EAAE,OAAM,CAAc,UAAU;CPetC;;AOpBH,AAAA,aAAa,CAAb;EACE,KAAK,EZ6FA,OAAO,CY7FE,UAAU;CACzB;;AACD,AAAC,CAAA,AAAA,aAAa,APcX,MAAM,EOdT,AAAC,CAAA,AAAA,aAAa,APeX,MAAM,CAAC;EObN,KAAK,EAAE,OAAM,CAAc,UAAU;CPetC;;AOpBH,AAAA,YAAY,CAAZ;EACE,KAAK,EZ4FA,OAAO,CY5FE,UAAU;CACzB;;AACD,AAAC,CAAA,AAAA,YAAY,APcV,MAAM,EOdT,AAAC,CAAA,AAAA,YAAY,APeV,MAAM,CAAC;EObN,KAAK,EAAE,OAAM,CAAc,UAAU;CPetC;;AOpBH,AAAA,eAAe,CAAf;EACE,KAAK,EZsGmB,OAAO,CYtGjB,UAAU;CACzB;;AACD,AAAC,CAAA,AAAA,eAAe,APcb,MAAM,EOdT,AAAC,CAAA,AAAA,eAAe,APeb,MAAM,CAAC;EObN,KAAK,EAAE,OAAM,CAAc,UAAU;CPetC;;AyEmCL,AAAA,UAAU,CAAC;EjExDT,IAAI,EAAE,KAAM;EACZ,KAAK,EAAE,WAAY;EACnB,WAAW,EAAE,IAAK;EAClB,gBAAgB,EAAE,WAAY;EAC9B,MAAM,EAAE,CAAE;CiEsDX;;ACxDD,AAAA,UAAU,CAAC;E/DDT,UAAU,EAAE,iBAAkB;C+DG/B;;AAKC,AAAA,aAAa,CAAb;EAEI,OAAO,EAAE,eAAgB;CAE5B;;A3EsDC,MAAM,EAAL,SAAS,EAAE,KAAK;E2ErDnB,AAAA,eAAe,CAAf;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;A3EoCC,MAAM,EAAL,SAAS,EAAE,KAAK;E2E7CnB,AAAA,aAAa,CAAb;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;A3EsDC,MAAM,EAAL,SAAS,EAAE,KAAK;E2ErDnB,AAAA,eAAe,CAAf;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;A3EoCC,MAAM,EAAL,SAAS,EAAE,KAAK;E2E7CnB,AAAA,aAAa,CAAb;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;A3EsDC,MAAM,EAAL,SAAS,EAAE,KAAK;E2ErDnB,AAAA,eAAe,CAAf;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;A3EoCC,MAAM,EAAL,SAAS,EAAE,KAAK;E2E7CnB,AAAA,aAAa,CAAb;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;A3EsDC,MAAM,EAAL,SAAS,EAAE,MAAM;E2ErDpB,AAAA,eAAe,CAAf;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;A3EoCC,MAAM,EAAL,SAAS,EAAE,MAAM;E2E7CpB,AAAA,aAAa,CAAb;IAEI,OAAO,EAAE,eAAgB;GAE5B;;;AACD,AAAA,eAAe,CAAf;EAEI,OAAO,EAAE,eAAgB;CAE5B;;AAQH,AAAA,oBAAoB,CAAC;EACnB,OAAO,EAAE,eAAgB;CAK1B;;AAHC,MAAM,CAAN,KAAK;EAHP,AAAA,oBAAoB,CAAC;IAIjB,OAAO,EAAE,gBAAiB;GAE7B;;;AACD,AAAA,qBAAqB,CAAC;EACpB,OAAO,EAAE,eAAgB;CAK1B;;AAHC,MAAM,CAAN,KAAK;EAHP,AAAA,qBAAqB,CAAC;IAIlB,OAAO,EAAE,iBAAkB;GAE9B;;;AACD,AAAA,2BAA2B,CAAC;EAC1B,OAAO,EAAE,eAAgB;CAK1B;;AAHC,MAAM,CAAN,KAAK;EAHP,AAAA,2BAA2B,CAAC;IAIxB,OAAO,EAAE,uBAAwB;GAEpC;;;AAGC,MAAM,CAAN,KAAK;EADP,AAAA,aAAa,CAAC;IAEV,OAAO,EAAE,eAAgB;GAE5B;;;AC5CD;;;;EAIE;AEdF;;;GAGG;AACH,AAAA,IAAI;AACJ,AAAA,IAAI;AACJ,AAAA,QAAQ,CAAC;EACP,MAAM,EAAE,IAAK;EACb,UAAU,EAAE,MAAO;CACpB;;AAED,AAAA,aAAa,CAAC;EACZ,UAAU,EAAE,0BAAG,CAAmC,IAAI,CAAC,MAAM;CAC9D;;AAED,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,QAAS;CAUpB;;AARC,AAHF,aAGe,CAHf,QAAQ,CAGU;EACd,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAI;CAM1B;;AAPD,AAHF,aAGe,CAHf,QAAQ,EAGN,AAHF,aAGe,CAHf,QAAQ,AAMH,OAAO,CAAC;EACP,MAAM,EAAE,MAAO;EACf,SAAS,EFWU,MAAM;CEV1B;;AAIL,AAAQ,QAAA,AAAA,OAAO;AACf,AAAa,aAAA,AAAA,OAAO,CAAC;EACnB,OAAO,EAAE,GAAI;EACb,QAAQ,EAAE,KAAM;EAChB,GAAG,EAAE,CAAE;EACP,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,EAAG;CACb;;AAED,AAAQ,QAAA,AAAA,OAAO,CAAC;EACd,UAAU,ElFuEgB,OAAO;EkFtEjC,KAAK,EAAE,IAAK;CACb;;A9EgBG,MAAM,EAAL,SAAS,EAAE,KAAK;E8EdrB,AAAA,gBAAgB;EAChB,AAAA,YAAY,CAAC;IAET,WAAW,EFbC,KAAK;IEcjB,OAAO,EAAE,IAAK;I/E/BZ,UAAU,E+EgCe,YAAY,CFgFxB,IAAI,CACP,WAAW,EEjFmD,WAAW,CFgFtE,IAAI,CACP,WAAW;GEnE1B;EAXG,AARJ,iBAQqB,CARrB,gBAAgB,EAQZ,AAPJ,iBAOqB;EAPrB,YAAY,CAOY;IAClB,WAAW,EAAE,CAAE;GAChB;;;A9EiBD,MAAM,EAAL,SAAS,EAAE,KAAK;E8E3BrB,AAAA,gBAAgB,EAAhB,AAAA,gBAAgB,AAeX,OAAO;EAdZ,AAAA,YAAY;EAAZ,AAAA,YAAY,AAcP,OAAO,CAAC;IACP,WAAW,EAAE,CAAE;GAChB;;;AAIL,AAAA,gBAAgB;AAChB,AAAA,aAAa,CAAC;EDkBZ,UAAY,EAAE,0BAAY;EAC1B,UAAY,EAAE,kBAAI;CCjBnB;;AAED,AAAA,gBAAgB,CAAC;EACf,UAAU,ElFwCgB,OAAO;CkF9BlC;;AAXD,AAEI,gBAFY,GAEZ,eAAe;AAFnB,AAGI,gBAHY,GAGZ,QAAQ,CAAC;EACT,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;CACb;;AANH,AAQI,gBARY,GAQZ,QAAQ,CAAC;EACT,OAAO,EAAE,IAAK;CACf;;AAGH,AAAA,aAAa,CAAC;EACZ,KAAK,EAAE,IAAK;CAsBb;;AAvBD,AAAA,aAAa,EAAb,AAAA,aAAa,AAIV,OAAO,CAAC;E/EtEL,UAAU,E+EuEe,WAAW,CFyCvB,IAAI,CACP,WAAW,EE1CkD,KAAK,CFyC/D,IAAI,CACP,WAAW;EExCvB,KAAK,EFxDO,KAAK;CEyDlB;;AAED,AAVF,iBAUmB,CAVnB,aAAa,EAUX,AAVF,iBAUmB,CAVnB,aAAa,AAYR,OAAO,CAAC;EACP,WAAW,EF9DD,MAAK;CE+DhB;;A9E1BD,MAAM,EAAL,SAAS,EAAE,KAAK;E8EYrB,AAAA,aAAa,EAAb,AAAA,aAAa,AAmBR,OAAO,CAAC;IACP,WAAW,EFrED,MAAK;GEsEhB;;;AAIL,AAAA,YAAY,CAAC;EACX,OAAO,EFpDsB,IAAI;EEqDjC,KAAK,EAAE,IAAK;EACZ,UAAU,EFrDmB,GAAG,CAC2B,KAAK,CAAC,OAAM;EEqDvE,UAAU,EAAE,IAAK;CAClB;;AAED,AAAA,eAAe,CAAC;EACd,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,IAAK;EACjB,aAAa,EAAE,GAAG,CAAC,KAAK,ClFrBjB,oBAAI;CkFgCZ;;AAdD,AAIE,eAJa,CAIb,EAAE,CAAC;EACD,SAAS,EAAE,MAAO;EAClB,MAAM,EAAE,CAAE;CACX;;AAPH,AAQE,eARa,CAQb,WAAW,CAAC;EACV,aAAa,EAAE,CAAE;EACjB,OAAO,EAAE,CAAE;EACX,UAAU,EAAE,WAAY;EACxB,WAAW,EAAE,MAAO;CACrB;;AC9HH;;;GAGG;AAEH,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,UAAW;EAqCpB;;KAEG;EAOH;;;KAGG;CAmBJ;;AArED,AAEE,YAFU,CAEV,aAAa,CAAC;EACZ,WAAW,EAAE,GAAI;EACjB,KAAK,EHuBO,KAAK;EGtBjB,OAAO,EHuCmB,IAAI,CAAJ,IAAI;EGtC9B,UAAU,EAAE,OAAM;EAClB,UAAU,EAAE,KAAK,CHmHF,IAAI,CACP,WAAW;EGnHvB,QAAQ,EAAE,MAAO;EACjB,YAAY,EAAE,CAAE;CA2BjB;;AApCH,AAWM,YAXM,CAEV,aAAa,GAST,UAAU,CAAC;EACX,OAAO,EAAE,IAAK;CACf;;A/EsCD,MAAM,EAAL,SAAS,EAAE,KAAK;E+EnCf,AAdJ,aAciB,AAAA,iBAAiB,CAhBpC,YAAY,CAEV,aAAa,CAcwB;IAC/B,KAAK,EH6DQ,IAAI;GGtDlB;EARD,AAEI,aAFS,AAAA,iBAAiB,CAhBpC,YAAY,CAEV,aAAa,GAgBL,KAAK,CAAC;IACN,OAAO,EAAE,IAAK;GACf;EAJH,AAKI,aALS,AAAA,iBAAiB,CAhBpC,YAAY,CAEV,aAAa,GAmBL,UAAU,CAAC;IACX,OAAO,EAAE,MAAO;GACjB;;;A/EyCL,MAAM,EAAL,SAAS,EAAE,KAAK;E+EhErB,AAEE,YAFU,CAEV,aAAa,CAAC;IA0BV,KAAK,EHkDU,IAAI;GG1CtB;EApCH,AA6BQ,YA7BI,CAEV,aAAa,GA2BP,KAAK,CAAC;IACN,OAAO,EAAE,IAAK;GACf;EA/BP,AAgCQ,YAhCI,CAEV,aAAa,GA8BP,UAAU,CAAC;IACX,OAAO,EAAE,MAAO;GACjB;;;AAlCP,AA0CkC,YA1CtB,AA0CT,kBAAkB,CAAC,WAAW,CAAC,SAAS,CAAC;EACxC,OAAO,EHDmB,IAAI,CACJ,IAAI;EGC9B,QAAQ,EAAE,QAAS;CACpB;;AA7CH,AAoDE,YApDU,CAoDV,QAAQ,CAAC;EACP,WAAW,EAAE,IAA2B;EACxC,cAAc,EAAE,IAA2B;CAC5C;;AAvDH,AA0DI,YA1DQ,CAyDV,WAAW,CAAA,AAAA,KAAC,EAAO,QAAQ,AAAf,EACV,cAAc,CAAC;EACb,UAAU,EAAE,IAAK;EACjB,KAAK,EAAE,CAAE;EACT,IAAI,EAAE,IAAK;CAKZ;;AAJC,MAAM,EAAL,SAAS,EAAE,KAAK;EA9DvB,AA0DI,YA1DQ,CAyDV,WAAW,CAAA,AAAA,KAAC,EAAO,QAAQ,AAAf,EACV,cAAc,CAAC;IAKX,IAAI,EAAE,CAAE;IACR,KAAK,EAAE,IAAK;GAEf;;;AAWL,AAAA,WAAW,CAAC;EACV,MAAM,EAAE,IAAmB;EAC3B,KAAK,EAAE,IAAK;CACb;;AAGD,AAAA,WAAW,CAAC;EACV,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,GAAI;EACT,KAAK,EAAE,GAAI;EACX,SAAS,EAAE,OAAa;EACxB,OAAO,EAAE,OAAQ;CAClB;;AC9FD;;;GAGG;AAEH,AAAA,QAAQ,CAAC;EACP,cAAc,EAAE,IAAK;CACtB;;AAGD,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAK;EACd,aAAa,EAAE,GAAI;CAgCpB;;AAlCD,AAIE,WAJS,CAIT,MAAM,CAAC;EACL,KAAK,EAAE,IAAK;CACb;;AANH,AAQE,WARS,CAQT,GAAG,CAAC;EACF,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,IAAK;CACd;;AAZH,AAcE,WAdS,CAcT,KAAK,CAAC;EACJ,OAAO,EAAE,gBAAiB;EAC1B,WAAW,EAAE,IAAK;CACnB;;AAjBH,AAmBE,WAnBS,CAmBT,OAAO,CAAC;EACN,OAAO,EAAE,OAAQ;EACjB,MAAM,EAAE,CAAE;CACX;;AAtBH,AAwBE,WAxBS,CAwBT,EAAE,CAAC;EACD,QAAQ,EAAE,MAAO;EACjB,WAAW,EAAE,MAAO;EACpB,MAAM,EAAE,SAAU;CACnB;;AA5BH,AA8BE,WA9BS,CA8BT,OAAO;AA9BT,AA+BE,WA/BS,CA+BT,cAAc,CAAC;EACb,SAAS,EpFmNI,QAAO;CoFlNrB;;AAIH,AAEI,YAFQ,GAER,SAAS,CAAC;EACV,UAAU,EAAE,YAAa;CAa1B;;AAhBH,AAKM,YALM,GAER,SAAS,GAGP,SAAS,CAAC;EzDhDZ,aAAa,EyDiDY,CAAC;CAKzB;;AAXL,AAQQ,YARI,GAER,SAAS,GAGP,SAAS,GAGP,SAAS,CAAC;EACV,KAAK,EAAE,IAAK;CACb;;AAVP,AAaI,YAbQ,GAER,SAAS,CAWT,eAAe,CAAC;EACd,UAAU,EAAE,GAAI;CACjB;;AAfL,AAmBc,YAnBF,CAmBV,SAAS,GAAG,cAAc,CAAC;EACzB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,OAAO,EAAE,CAAE;EACX,YAAY,EAAE,IAAK;EACnB,UAAU,EAAE,GAAI;CACjB;;AAzBH,AA4BM,YA5BM,CA2BV,UAAU,GACN,aAAa,CAAC;EACd,OAAO,EAAE,KAAM;CAChB;;AA9BL,AAiCM,YAjCM,CA2BV,UAAU,GAKN,SAAS,CACT,cAAc,CAAC;EHOnB,aAAa,EAAE,cAAM;EACrB,SAAS,EAAE,cAAM;CGNZ;;AAnCP,AAwCE,YAxCU,CAwCV,aAAa,CAAC;EACZ,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,IAAK;EACjB,OAAO,EAAE,CAAE;EACX,MAAM,EAAE,CAAE;EACV,YAAY,EAAE,GAAI;CAgBnB;;AA7DH,AA+CI,YA/CQ,CAwCV,aAAa,CAOX,aAAa,CAAC;EACZ,YAAY,EAAE,IAAK;CACpB;;AAjDL,AAmDM,YAnDM,CAwCV,aAAa,GAWT,SAAS,CAAC;EACV,MAAM,EAAE,CAAE;CAQX;;AA5DL,AAqDQ,YArDI,CAwCV,aAAa,GAWT,SAAS,GAEP,SAAS,CAAC;EACV,OAAO,EAAE,gBAAiB;EAC1B,OAAO,EAAE,KAAM;CAIhB;;AA3DP,AAwDU,YAxDE,CAwCV,aAAa,GAWT,SAAS,GAEP,SAAS,GAGP,SAAS,CAAC;EACV,KAAK,EAAE,IAAK;CACb;;AA1DT,AA+DE,YA/DU,CA+DV,WAAW,CAAC;EACV,SAAS,EAAE,IAAK;EAChB,OAAO,EpFwgBqB,KAAI,CAAC,GAAG;CoFngBrC;;AAtEH,AA+DE,YA/DU,CA+DV,WAAW,AAIR,IAAK,CAAA,AAAA,cAAc,EAAE;EACpB,OAAO,EAAE,kBAAmB;CAC7B;;AAIL,AACE,aADW,CACX,aAAa,CAAC;EACZ,aAAa,EAAE,CAAE;CAClB;;AC3HH;;GAEG;AjFsDC,MAAM,EAAL,SAAS,EAAE,KAAK;EiFnDrB,AAMM,aANO,AAIR,iBAAiB,CAEhB,gBAAgB;EANtB,AAOM,aAPO,AAIR,iBAAiB,CAGhB,YAAY,CAAC;IACX,WAAW,ELsEE,IAAI,CKtEgB,UAAU;GAC5C;EATP,AAYM,aAZO,AAIR,iBAAiB,CAQhB,aAAa,EAZnB,AAYM,aAZO,AAIR,iBAAiB,CAQhB,aAAa,AAEV,OAAO,CAAC;IAEP,WAAW,EAAE,CAAE;IACf,KAAK,EL6DM,IAAI,CK7DY,UAAU;GACtC;EAlBT,AAoBQ,aApBK,AAIR,iBAAiB,CAQhB,aAAa,CAQX,WAAW,CAAC;IACV,aAAa,EAAE,IAAK;GAKrB;EA1BT,AAuBU,aAvBG,AAIR,iBAAiB,CAQhB,aAAa,CAQX,WAAW,CAGT,MAAM,CAAC;IACL,KAAK,EAAE,IAAK;GACb;EAzBX,AA8BU,aA9BG,AAIR,iBAAiB,CAyBhB,YAAY,GACR,UAAU,CAAC;IACX,0BAA0B,ErF4RX,OAAM;GqF3RtB;EAhCT,AAkCU,aAlCG,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,CAAC;IACV,QAAQ,EAAE,QAAS;IACnB,OAAO,EAAE,GAAI;GAkDd;EAtFT,AAsCY,aAtCC,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,GAIP,SAAS,CAAC;IACV,YAAY,EAAE,CAAE;GAMjB;EA7CX,AAyCc,aAzCD,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,GAIP,SAAS,GAGP,SAAS,CAAC;IACV,KAAK,EAAE,IAAK;IACZ,UAAU,EAAE,MAAO;GACpB;EA5Cb,AA+CY,aA/CC,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,GAaP,aAAa,CAAC;IAEd,WAAW,EAAE,GAAI;IACjB,cAAc,EAAE,GAAI;GACrB;EAnDX,AAuDc,aAvDD,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,AAoBR,MAAM,GACH,SAAS,CAAC;IACV,QAAQ,EAAE,OAAQ;GACnB;EAzDb,AA2D0B,aA3Db,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,AAoBR,MAAM,GAKH,SAAS,GAAG,KAAK;EA3D/B,AA4Dc,aA5DD,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,AAoBR,MAAM,GAMH,aAAa,CAAC;IACd,OAAO,EAAE,gBAAiB;IAC1B,QAAQ,EAAE,QAAS;IACnB,KAAK,EAAE,OAAc;IACrB,IAAI,ELcG,IAAI;GKbZ;EAjEb,AAoE0B,aApEb,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,AAoBR,MAAM,GAcH,SAAS,GAAG,KAAK,CAAC;IAClB,GAAG,EAAE,CAAE;IACP,WAAW,EAAE,IAAK;IAClB,OAAO,ErF4iBW,KAAI,CAAC,GAAG;IqF3iB1B,gBAAgB,EAAE,OAAQ;I1D5DpC,0BAA0B,E3B+SL,OAAM;I2B9S3B,uBAAuB,E3B8SF,OAAM;GqFjPlB;EA1Eb,AA4EyC,aA5E5B,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,AAoBR,MAAM,AAsBJ,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC;IACjC,0BAA0B,EAAE,CAAE;GAC/B;EA9Eb,AAgFc,aAhFD,AAIR,iBAAiB,CAyBhB,YAAY,GAKR,SAAS,AAoBR,MAAM,GA0BH,aAAa,CAAC;IACd,GAAG,ErFkiBe,KAAI,CAAC,GAAG;IqFjiB1B,WAAW,EAAE,CAAE;IACf,0BAA0B,ErFwOf,OAAM;GqFvOlB;EApFb,AA2FkC,aA3FrB,AAIR,iBAAiB,CAuFhB,aAAa,CAAC,WAAW,GAAG,KAAK;EA3FvC,AA4FM,aA5FO,AAIR,iBAAiB,CAwFhB,aAAa;EA5FnB,AA6F6C,aA7FhC,AAIR,iBAAiB,CAyFhB,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI;EA7FjD,AA8FiC,aA9FpB,AAIR,iBAAiB,CA0FhB,YAAY,GAAG,SAAS,GAAG,aAAa;EA9F9C,AA+F6C,aA/FhC,AAIR,iBAAiB,CA2FhB,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW;EA/FxD,AAgGmB,aAhGN,AAIR,iBAAiB,CA4FhB,YAAY,CAAC,WAAW,CAAC;IACvB,OAAO,EAAE,eAAgB;IACzB,iBAAiB,EAAE,aAAU;GAC9B;EAnGP,AAsGM,aAtGO,AAIR,iBAAiB,CAkGhB,qBAAqB,CAAC;IACpB,OAAO,EAAE,gBAAiB;GAC3B;;;AAMP,AAAA,YAAY;AACZ,AAAe,YAAH,GAAG,WAAW,CAAC;EACzB,WAAW,EAAE,MAAO;EACpB,QAAQ,EAAE,MAAO;CAClB;;AAED,AAAa,YAAD,CAAC,SAAS,CAAC;EACrB,WAAW,EAAE,MAAO;CACrB;;AAED,AAAA,YAAY,CAAC;EACX,QAAQ,EAAE,QAAS;CAIpB;;AALD,AAAA,YAAY,AAET,MAAM,CAAC;EACN,QAAQ,EAAE,OAAQ;CACnB;;AAGH,AAAA,aAAa;AACb,AAAe,YAAH,GAAG,WAAW,CAAC;EACzB,QAAQ,EAAE,MAAO;EACjB,aAAa,EAAE,IAAK;CACrB;;AAED,AAAyB,YAAb,CAAC,SAAS,GAAG,SAAS,CAAC;EACjC,QAAQ,EAAE,QAAS;CAOpB;;AARD,AAEI,YAFQ,CAAC,SAAS,GAAG,SAAS,GAE9B,WAAW,CAAC;EACZ,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,GAAG,EAAE,GAAI;EACT,UAAU,EAAE,IAAK;CAClB;;AAIH,AAAA,qBAAqB,CAAC;EACpB,OAAO,EAAE,eAAgB;CAC1B;;ACvJD;;GAEG;AAEH,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,QAAS;EACnB,GAAG,EN6C2B,IAAe;EM5C7C,OAAO,EAAE,GAAI;CAiBd;;AApBD,AAAA,gBAAgB,EAAhB,AAAA,gBAAgB,AAMb,OAAO,CAAC;EACP,KAAK,ENqBO,KAAK;EMpBjB,KAAK,ENoBO,MAAK;EMnBjB,MAAM,EAAE,CAAE;EnFER,UAAU,EmFDQ,KAAK,CNiHV,IAAI,CACP,WAAW;CMjHxB;;AAXH,AAAA,gBAAgB,AAab,OAAO,CAAC;EACP,GAAG,EAAE,CAAE;EACP,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,KAAM;EAChB,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,EAAG;CACb;;AlFiCC,MAAM,EAAL,SAAS,EAAE,KAAK;EkF7BrB,AAEI,qBAFiB,CAEjB,gBAAgB,EAFpB,AAEI,qBAFiB,CAEjB,gBAAgB,AAEb,OAAO,CAAC;IACP,KAAK,EAAE,CAAE;GACV;EANP,AASI,qBATiB,CASjB,gBAAgB;EATpB,AAUI,qBAViB,CAUjB,YAAY,CAAC;IACX,YAAY,ENNF,KAAK;GMOhB;;;AlF8BD,MAAM,EAAL,SAAS,EAAE,KAAK;EkF1CrB,AAgBI,qBAhBiB,CAgBjB,gBAAgB,EAhBpB,AAgBI,qBAhBiB,CAgBjB,gBAAgB,AAEb,OAAO,CAAC;IACP,KAAK,EAAE,CAAE;GACV;;;AAMP,AACE,2BADyB,CACzB,gBAAgB,EADlB,AACE,2BADyB,CACzB,gBAAgB,AAEb,OAAO,CAAC;EACP,KAAK,EAAE,CAAE;CACV;;AAKL,AAAA,qBAAqB;AAArB,AAEE,qBAFmB,CAEnB,CAAC;AAFH,AAGE,qBAHmB,CAGnB,SAAS,CAAC;EACR,KAAK,ENDY,OAAO;CMEzB;;AALH,AAAA,qBAAqB,EAArB,AAAA,qBAAqB,AASlB,OAAO,CAAC;EACP,UAAU,ENTI,OAAO;CMUtB;;AAXH,AAaG,qBAbkB,CAanB,CAAC,AAAA,MAAM,CAAC;EACN,KAAK,ENVkB,IAAI;CMW5B;;AAfH,AAkBE,qBAlBmB,CAkBnB,EAAE;AAlBJ,AAmBE,qBAnBmB,CAmBnB,EAAE;AAnBJ,AAoBE,qBApBmB,CAoBnB,EAAE;AApBJ,AAqBE,qBArBmB,CAqBnB,EAAE;AArBJ,AAsBE,qBAtBmB,CAsBnB,EAAE;AAtBJ,AAuBE,qBAvBmB,CAuBnB,EAAE;AAvBJ,AAwBE,qBAxBmB,CAwBnB,KAAK,CAAC;EACJ,KAAK,ENrBkB,IAAI;CMsB5B;;AA1BH,AA6BE,qBA7BmB,CA6BnB,SAAS,CAAC;EACR,aAAa,EAAE,CAAE;EACjB,gBAAgB,EN7BI,OAAM;EM8B1B,aAAa,EAAE,GAAI;CAkCpB;;AAlEH,AAkCI,qBAlCiB,CA6BnB,SAAS,CAKP,SAAS,CAAC;EACR,MAAM,EAAE,CAAE;CACX;;AApCL,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,CAAC;EACR,QAAQ,EAAE,QAAS;EACnB,aAAa,EAAE,CAAE;EACjB,UAAU,EAAE,MAAO;EACnB,OAAO,EAAE,SAAU;CAuBpB;;AAjEL,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,EAtCb,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAON,MAAM,EA7Cb,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAQN,OAAO,EA9Cd,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AASN,MAAM,EA/Cb,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAUN,OAAO,CAAC;EACP,MAAM,EAAE,CAAE;CACX;;AAlDP,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAcN,MAAM,EApDb,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAeN,OAAO,EArDd,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAgBN,MAAM,EAtDb,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAiBN,OAAO,CAAC;EACP,iBAAiB,EAAE,WAAY;EAC/B,mBAAmB,EAAE,WAAY;EACjC,gBAAgB,EAAE,WAAY;EAC9B,KAAK,ENvDc,IAAI;CMwDxB;;AA5DP,AAsCI,qBAtCiB,CA6BnB,SAAS,CASP,SAAS,AAwBN,OAAO,CAAC;EACP,gBAAgB,EN9DN,OAAO;CM+DlB;;AAhEP,AAoEE,qBApEmB,CAoEnB,SAAS,CAAC;EACR,OAAO,EAAE,SAAU;CACpB;;AAIH,AAAA,sBAAsB,CAAC;EACrB,KAAK,EAAE,OAAO;CAQf;;AATD,AAAA,sBAAsB,EAAtB,AAAA,sBAAsB,AAKnB,OAAO,CAAC;EACP,UAAU,ENtEK,OAAO;EMuEtB,WAAW,EAAE,GAAG,CAAC,KAAK,CtFrCE,OAAO;CsFsChC;;ACjJH;;;GAGG;AAGH,AAAA,cAAc,AACX,cAAc,CAAC;E5DGd,uBAAuB,E3BsTF,OAAM;E2BrT3B,sBAAsB,E3BqTD,OAAM;CuFvT5B;;AAHH,AAAA,cAAc,AAIX,aAAa,CAAC;E5Dcb,0BAA0B,E3BwSL,OAAM;E2BvS3B,yBAAyB,E3BuSJ,OAAM;CuFpT5B;;AAGH,AAAA,oBAAoB,CAAC;EACnB,SAAS,EvF2OM,IAAI;EuF1OnB,MAAM,EAAE,CAAE;CACX;;AAGD,AAAA,iBAAiB,CAAC;EAChB,SAAS,EAAE,KAAM;EACjB,SAAS,EAAE,KAAM;EACjB,OAAO,EAAE,CAAE;CAWZ;;AAdD,AAIE,iBAJe,CAIf,iBAAiB,CAAC;EAChB,MAAM,EAAE,CAAE;CACX;;AANH,AAOE,iBAPe,CAOf,cAAc,CAAC;EACb,OAAO,EvFshBsB,MAAK,CAiBL,MAAM;CuFtiBpC;;AATH,AAUE,iBAVe,CAUf,CAAC,CAAC;EACA,WAAW,EAAE,MAAO;EACpB,MAAM,EAAE,CAAE;CACX;;AAIH,AAAA,gBAAgB;AAChB,AAAA,gBAAgB,CAAC;EACf,UAAU,EAAE,MAAO;EACnB,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,MAAK,CvF0hBiB,MAAM;EuFzhBrC,SAAS,EvFkNM,QAAO;CuFjNvB;;AAED,AAAA,gBAAgB,AACb,MAAM,CAAC;EACN,gBAAgB,EAAE,IAAK;EACvB,KAAK,EvF2DmB,OAAO;CuF1DhC;;AAGH;qEACqE;AACrE,AAAqB,KAAhB,AAAA,IAAK,CAAA,AAAA,OAAO,IAAI,uBAAuB,CAAC;EAC3C,mBAAmB,EAAE,kBAAmB;ENoCxC,SAAS,EMnCU,OAAO,CAAC,IAAG,CAAC,IAAI;CACpC;;AAED,UAAU,CAAV,OAAU;EACR,AAAA,EAAE;IACA,SAAS,EAAE,kBAAW,CAAQ,wBAAQ;IACtC,0BAA0B,EAAE,OAAQ;IACpC,OAAO,EAAE,CAAE;;EAGb,AAAA,GAAG;IACD,SAAS,EAAE,kBAAW,CAAQ,yBAAQ;IACtC,0BAA0B,EAAE,OAAQ;;EAGtC,AAAA,GAAG;IACD,SAAS,EAAE,kBAAW,CAAQ,wBAAQ;IACtC,OAAO,EAAE,CAAE;;EAGb,AAAA,GAAG;IACD,SAAS,EAAE,kBAAW,CAAQ,wBAAQ;;EAGxC,AAAA,IAAI;IACF,SAAS,EAAE,kBAAW;;;;AAI1B,kBAAkB,CAAlB,OAAkB;EAChB,AAAA,EAAE;IACA,iBAAiB,EAAE,kBAAW,CAAQ,wBAAQ;IAC9C,kCAAkC,EAAE,OAAQ;IAC5C,OAAO,EAAE,CAAE;;EAGb,AAAA,GAAG;IACD,iBAAiB,EAAE,kBAAW,CAAQ,yBAAQ;IAC9C,kCAAkC,EAAE,OAAQ;;EAG9C,AAAA,GAAG;IACD,iBAAiB,EAAE,kBAAW,CAAQ,wBAAQ;IAC9C,OAAO,EAAE,CAAE;;EAGb,AAAA,GAAG;IACD,iBAAiB,EAAE,kBAAW,CAAQ,wBAAQ;;EAGhD,AAAA,IAAI;IACF,iBAAiB,EAAE,kBAAW;;;;AAIlC,kCAAkC;AAClC,AACI,mBADe,GAAG,WAAW,GAC7B,EAAE,CAAC;EACH,QAAQ,EAAE,QAAS;CAMpB;;AARH,AAGM,mBAHa,GAAG,WAAW,GAC7B,EAAE,GAEA,cAAc,CAAC;EACf,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,CAAE;EACT,IAAI,EAAE,IAAK;CACZ;;AAIL,MAAM,EAAL,SAAS,EAAE,KAAK;EACf,AAAsB,mBAAH,GAAG,WAAW,CAAC;IAChC,KAAK,EAAE,KAAM;GAWd;EAZD,AAEI,mBAFe,GAAG,WAAW,GAE7B,EAAE,CAAC;IACH,QAAQ,EAAE,MAAO;GAQlB;EAXH,AAIM,mBAJa,GAAG,WAAW,GAE7B,EAAE,GAEA,cAAc,CAAC;IACf,QAAQ,EAAE,QAAS;IACnB,KAAK,EAAE,EAAG;IACV,IAAI,EAAE,IAAK;IACX,MAAM,EAAE,cAAe;IACvB,UAAU,EAAE,IAAK;GAClB;;;ACvIP;;;GAGG;AACH,AAAA,aAAa,CAAC;EAEZ,UAAU,EAAE,IAAK;CAkBlB;;AApBD,AAAA,aAAa,AAIV,MAAM,CAAC;EACN,YAAY,ExF2FP,OAAO;EwF1FZ,UAAU,EAAE,IAAK;CAClB;;AAPH,AAAA,aAAa,AAQV,kBAAkB,EARrB,AAAA,aAAa,AASV,sBAAsB,EATzB,AAAA,aAAa,AAUV,2BAA2B,CAAC;EAC3B,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,CAAE;CACZ;;AAbH,AAAA,aAAa,AAeV,IAAK,CAAA,AAAA,MAAM,EAAE;EACZ,kBAAkB,EAAE,IAAK;EACzB,eAAe,EAAE,IAAK;EACtB,UAAU,EAAE,IAAK;CAClB;;AAGH,AAEI,WAFO,AACR,YAAY,CACX,KAAK,CAAC;EACJ,KAAK,ExFsEF,OAAO;CwFrEX;;AAJL,AAKI,WALO,AACR,YAAY,CAIX,aAAa,CAAC;EACZ,YAAY,ExFmET,OAAO;EwFlEV,UAAU,EAAE,IAAK;CAClB;;AARL,AAYI,WAZO,AAWR,YAAY,CACX,KAAK,CAAC;EACJ,KAAK,ExF0DF,OAAO;CwFzDX;;AAdL,AAeI,WAfO,AAWR,YAAY,CAIX,aAAa,CAAC;EACZ,YAAY,ExFuDT,OAAO;EwFtDV,UAAU,EAAE,IAAK;CAClB;;AAlBL,AAsBI,WAtBO,AAqBR,UAAU,CACT,KAAK,CAAC;EACJ,KAAK,ExF+CF,OAAO;CwF9CX;;AAxBL,AAyBI,WAzBO,AAqBR,UAAU,CAIT,aAAa,CAAC;EACZ,YAAY,ExF4CT,OAAO;EwF3CV,UAAU,EAAE,IAAK;CAClB;;AA5BL,AAAA,WAAW,AA+BR,SAAS,CAAC;EACT,QAAQ,EAAE,QAAS;CAepB;;AA/CH,AAiCI,WAjCO,AA+BR,SAAS,CAER,aAAa,CAAC;EACZ,aAAa,EAAE,IAAK;CACrB;;AAnCL,AAoCI,WApCO,AA+BR,SAAS,CAKR,UAAU,CAAC;EACT,MAAM,EAAE,OAAQ;EAChB,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,GAAI;EACX,GAAG,EAAE,CAAE;EACP,OAAO,ExF4VoB,MAAK,CADL,OAAM;EwF1VjC,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;EACV,gBAAgB,EAAE,WAAY;EAC9B,SAAS,EAAE,IAAK;CACjB;;AAIL,iBAAiB;AACjB,AACE,YADU,CACV,kBAAkB,CAAC;EAEjB,YAAY,ExF2BY,OAAO;EwF1B/B,gBAAgB,EAAE,IAAK;CACxB;;AAGH,mBAAmB;AACnB,AACE,mBADiB,CACjB,IAAI,AACD,SAAS,AAAA,cAAc,EAF5B,AACE,mBADiB,CACjB,IAAI,AACyB,SAAS,AAAA,aAAa,CAAC;E7DpFlD,aAAa,E6DqFY,CAAC;CACzB;;AAIL,AAAU,OAAH,GAAG,KAAK,CAAC;EACd,YAAY,EAAE,CAAE;CACjB;;AAED,gDAAgD;AAChD,AAAsB,sBAAA,AAAA,GAAG,CAAC;EACxB,WAAW,ExFuVsB,OAAe;CwFtVjD;;AAED,AAAkC,SAAzB,GAAG,sBAAsB,AAAA,GAAG;AACrC,AAAwC,eAAzB,GAAG,sBAAsB,AAAA,GAAG;AAC3C,AAAqD,cAAvC,CAAC,aAAa,GAAG,sBAAsB,AAAA,GAAG,CAAC;EACvD,WAAW,ExFkVsB,WAAa;CwFjV/C;;AAED,AAAkC,SAAzB,GAAG,sBAAsB,AAAA,GAAG;AACrC,AAAwC,eAAzB,GAAG,sBAAsB,AAAA,GAAG;AAC3C,AAAqD,cAAvC,CAAC,aAAa,GAAG,sBAAsB,AAAA,GAAG,CAAC;EACvD,WAAW,ExF6UsB,SAAa;CwF5U/C;;ACjHD;;;GAGG;AAGH,AAAA,SAAS,CAAC;E9DFN,aAAa,EqDsGY,GAAG;CSjG/B;;AAGD,AAAA,YAAY,CAAC;EACX,MAAM,EAAE,IAAK;CACd;;AAED,AAAA,YAAY,CAAC;EACX,MAAM,EAAE,GAAI;CACb;;AAED,AAAA,aAAa,CAAC;EACZ,MAAM,EAAE,GAAI;CACb;;AAGD,AAAS,SAAA,AAAA,SAAS,CAAC;EACjB,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,KAAM;EACd,OAAO,EAAE,YAAa;EACtB,YAAY,EAAE,IAAK;CAqBpB;;AA1BD,AAMI,SANK,AAAA,SAAS,GAMd,aAAa,CAAC;EACd,KAAK,EAAE,IAAK;EACZ,QAAQ,EAAE,QAAS;EACnB,MAAM,EAAE,CAAE;CACX;;AAVH,AAAS,SAAA,AAAA,SAAS,AAaf,GAAG,EAbN,AAAS,SAAA,AAAA,SAAS,AAcf,YAAY,CAAC;EACZ,KAAK,EAAE,IAAK;CACb;;AAhBH,AAAS,SAAA,AAAA,SAAS,AAkBf,GAAG,EAlBN,AAAS,SAAA,AAAA,SAAS,AAmBf,YAAY,CAAC;EACZ,KAAK,EAAE,IAAK;CACb;;AArBH,AAAS,SAAA,AAAA,SAAS,AAsBf,IAAI,EAtBP,AAAS,SAAA,AAAA,SAAS,AAuBf,aAAa,CAAC;EACb,KAAK,EAAE,GAAI;CACZ;;AAeH,AACU,MADJ,CACJ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;EAChB,MAAM,EAAE,CAAE;CACX;;ACpEH;;;GAGG;AAEH,AAAA,UAAU,CAAC;E/DDP,aAAa,E+DEQ,GAAG;EAC1B,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,KAAM;EACf,aAAa,EAAE,IAAK;EACpB,UAAU,EVoFI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;CUnB7B;;AAtED,AAOI,UAPM,GAON,MAAM,CAAC;EACP,OAAO,EAAE,IAAK;CACf;;AATH,AAWI,UAXM,GAWN,iBAAiB,CAAC;EAClB,QAAQ,EAAE,QAAS;EACnB,UAAU,EAAE,MAAO;EACnB,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,KAAK,EAAE,wBAAI;EACX,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,UAAU,EAAE,kBAAI;EAChB,eAAe,EAAE,IAAK;CAKvB;;AAzBH,AAWI,UAXM,GAWN,iBAAiB,AAUhB,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,mBAAI;CACjB;;AAxBL,AA2BE,UA3BQ,CA2BR,EAAE,CAAC;EACD,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,IAAK;EAClB,MAAM,EAAE,UAAW;EACnB,WAAW,EAAE,MAAO;EACpB,OAAO,EAAE,CAAE;CAEZ;;AAlCH,AAoCE,UApCQ,CAoCR,CAAC,CAAC;EACA,SAAS,EAAE,IAAK;CAOjB;;AA5CH,AAsCM,UAtCI,CAoCR,CAAC,GAEG,KAAK,CAAC;EACN,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,OAAQ;EACf,SAAS,EAAE,IAAK;EAChB,UAAU,EAAE,GAAI;CACjB;;AA3CL,AA8CE,UA9CQ,CA8CR,EAAE,EA9CJ,AA8CM,UA9CI,CA8CJ,CAAC,CAAC;EACJ,OAAO,EAAE,GAAI;CACd;;AAhDH,AAmDE,UAnDQ,CAmDR,KAAK,CAAC;EACJ,UAAU,EAAE,GAAG,CVsEA,IAAI,CUtEe,MAAM;EACxC,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,KAAM;EACX,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,CAAE;EACX,SAAS,EAAE,IAAK;EAChB,KAAK,EAAE,mBAAI;CACZ;;AA3DH,AAAA,UAAU,AA8DP,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;EACtB,KAAK,EAAE,OAAQ;CAKhB;;AArEH,AAkEI,UAlEM,AA8DP,MAAM,CAIL,KAAK,CAAC;EACJ,SAAS,EAAE,IAAK;CACjB;;AtFJD,MAAM,EAAL,SAAS,EAAE,KAAK;EsFUnB,AAAA,UAAU,CAAC;IACT,UAAU,EAAE,MAAO;GAOpB;EARD,AAEE,UAFQ,CAER,KAAK,CAAC;IACJ,OAAO,EAAE,IAAK;GACf;EAJH,AAKE,UALQ,CAKR,CAAC,CAAC;IACA,SAAS,EAAE,IAAK;GACjB;;;ACtFL;;;GAGG;AAEH,AAAA,KAAK,CAAC;EACJ,UAAU,EAAE,IAAK;CAClB;;AAED,AAAA,IAAI,CAAC;EACH,QAAQ,EAAE,QAAS;EhENjB,aAAa,EqDwFG,GAAG;EWhFrB,UAAU,EAAE,OAAQ;EACpB,UAAU,EAAE,GAAG,CAAC,KAAK,CXSR,OAAO;EWRpB,aAAa,EAAE,IAAK;EACpB,KAAK,EAAE,IAAK;EACZ,UAAU,EX8EI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;CW4C7B;;AAjID,AAAA,IAAI,AAUD,YAAY,CAAC;EACZ,gBAAgB,E3FgFX,OAAO;C2F/Eb;;AAZH,AAAA,IAAI,AAaD,SAAS,CAAC;EACT,gBAAgB,E3F8EX,OAAO;C2F7Eb;;AAfH,AAAA,IAAI,AAgBD,WAAW,CAAC;EACX,gBAAgB,E3FsEX,OAAO;C2FrEb;;AAlBH,AAAA,IAAI,AAmBD,YAAY,CAAC;EACZ,gBAAgB,E3FoEX,OAAO;C2FnEb;;AArBH,AAAA,IAAI,AAsBD,YAAY,CAAC;EACZ,gBAAgB,E3FmEX,OAAO;C2FlEb;;AAxBH,AAAA,IAAI,AAyBD,YAAY,CAAC;EACZ,gBAAgB,EXbL,OAAO;CWcnB;;AA3BH,AA+BI,IA/BA,AA8BD,cAAc,CACb,SAAS;AA/Bb,AAgCI,IAhCA,AA8BD,cAAc,CAEb,WAAW,CAAC;EACV,OAAO,EAAE,IAAK;CACf;;AAlCL,AAsCM,IAtCF,CAqCF,YAAY,GACR,EAAE,CAAC;EACH,aAAa,EAAE,GAAG,CAAC,KAAK,CX2CX,OAAO;EW1CpB,MAAM,EAAE,CAAE;CAIX;;AA5CL,AAsCM,IAtCF,CAqCF,YAAY,GACR,EAAE,AAGD,aAAa,CAAC;EACb,aAAa,EAAE,IAAK;CACrB;;AA3CP,AAiDI,IAjDA,AAgDD,eAAe,CACd,SAAS,CAAC;EACR,UAAU,EAAE,KAAM;EAClB,QAAQ,EAAE,IAAK;CAChB;;AApDL,AAuDE,IAvDE,CAuDF,aAAa,CAAC;EACZ,YAAY,EAAE,GAAG,CAAC,KAAK,CX0BR,OAAO;CWzBvB;;AAzDH,AA0DE,IA1DE,CA0DF,YAAY,CAAC;EACX,WAAW,EAAE,GAAG,CAAC,KAAK,CXuBP,OAAO;CWtBvB;;AA5DH,AAAA,IAAI,AAkED,UAAU,CAAC;EACV,UAAU,EAAE,CAAE;CA6Cf;;AAhHH,AAqEU,IArEN,AAkED,UAAU,GAEP,WAAW,CACX,IAAI,AAAA,YAAY,CAAC;EACf,UAAU,EAAE,WAAY;CACzB;;AAvEP,AAwEM,IAxEF,AAkED,UAAU,GAEP,WAAW,CAIX,IAAI,AAED,MAAM;AA1Ef,AAyEM,IAzEF,AAkED,UAAU,GAEP,WAAW,CAKX,CAAC,AACE,MAAM,CAAC;EACN,UAAU,EAAE,kBAAI;CACjB;;AA5ET,AAAA,IAAI,AAkED,UAAU,AAeR,YAAY,CAAC;EV7ChB,MAAM,EAAE,GAAG,CAAC,KAAK,CjF8DS,OAAO;C2Ff9B;;AAnFL,AVqCI,IUrCA,AAkED,UAAU,AAeR,YAAY,GV5Cb,WAAW,CAAC;EACZ,KAAK,EU4C+B,IAAI;EV3CxC,UAAU,EjF2Dc,OAAO;EiF1D/B,gBAAgB,EjF0DQ,OAAO;CiFrDhC;;AU7CH,AVyCI,IUzCA,AAkED,UAAU,AAeR,YAAY,GV5Cb,WAAW,CAIX,CAAC;AUzCL,AV0CI,IU1CA,AAkED,UAAU,AAeR,YAAY,GV5Cb,WAAW,CAKX,IAAI,CAAC;EACH,KAAK,EUuC6B,IAAI;CVtCvC;;AU5CL,AAAA,IAAI,AAkED,UAAU,AAkBR,YAAY,CAAC;EVhDhB,MAAM,EAAE,GAAG,CAAC,KAAK,CjFuDV,OAAO;C2FLX;;AAtFL,AVqCI,IUrCA,AAkED,UAAU,AAkBR,YAAY,GV/Cb,WAAW,CAAC;EACZ,KAAK,EAHqC,IAAI;EAI9C,UAAU,EjFoDL,OAAO;EiFnDZ,gBAAgB,EjFmDX,OAAO;CiF9Cb;;AU7CH,AVyCI,IUzCA,AAkED,UAAU,AAkBR,YAAY,GV/Cb,WAAW,CAIX,CAAC;AUzCL,AV0CI,IU1CA,AAkED,UAAU,AAkBR,YAAY,GV/Cb,WAAW,CAKX,IAAI,CAAC;EACH,KAAK,EARmC,IAAI;CAS7C;;AU5CL,AAAA,IAAI,AAkED,UAAU,AAqBR,SAAS,CAAC;EVnDb,MAAM,EAAE,GAAG,CAAC,KAAK,CjFwDV,OAAO;C2FHX;;AAzFL,AVqCI,IUrCA,AAkED,UAAU,AAqBR,SAAS,GVlDV,WAAW,CAAC;EACZ,KAAK,EAHqC,IAAI;EAI9C,UAAU,EjFqDL,OAAO;EiFpDZ,gBAAgB,EjFoDX,OAAO;CiF/Cb;;AU7CH,AVyCI,IUzCA,AAkED,UAAU,AAqBR,SAAS,GVlDV,WAAW,CAIX,CAAC;AUzCL,AV0CI,IU1CA,AAkED,UAAU,AAqBR,SAAS,GVlDV,WAAW,CAKX,IAAI,CAAC;EACH,KAAK,EARmC,IAAI;CAS7C;;AU5CL,AAAA,IAAI,AAkED,UAAU,AAwBR,WAAW,CAAC;EVtDf,MAAM,EAAE,GAAG,CAAC,KAAK,CjFmDV,OAAO;C2FKX;;AA5FL,AVqCI,IUrCA,AAkED,UAAU,AAwBR,WAAW,GVrDZ,WAAW,CAAC;EACZ,KAAK,EAHqC,IAAI;EAI9C,UAAU,EjFgDL,OAAO;EiF/CZ,gBAAgB,EjF+CX,OAAO;CiF1Cb;;AU7CH,AVyCI,IUzCA,AAkED,UAAU,AAwBR,WAAW,GVrDZ,WAAW,CAIX,CAAC;AUzCL,AV0CI,IU1CA,AAkED,UAAU,AAwBR,WAAW,GVrDZ,WAAW,CAKX,IAAI,CAAC;EACH,KAAK,EARmC,IAAI;CAS7C;;AU5CL,AAAA,IAAI,AAkED,UAAU,AA2BR,YAAY,CAAC;EVzDhB,MAAM,EAAE,GAAG,CAAC,KAAK,CjFoDV,OAAO;C2FOX;;AA/FL,AVqCI,IUrCA,AAkED,UAAU,AA2BR,YAAY,GVxDb,WAAW,CAAC;EACZ,KAAK,EAHqC,IAAI;EAI9C,UAAU,EjFiDL,OAAO;EiFhDZ,gBAAgB,EjFgDX,OAAO;CiF3Cb;;AU7CH,AVyCI,IUzCA,AAkED,UAAU,AA2BR,YAAY,GVxDb,WAAW,CAIX,CAAC;AUzCL,AV0CI,IU1CA,AAkED,UAAU,AA2BR,YAAY,GVxDb,WAAW,CAKX,IAAI,CAAC;EACH,KAAK,EARmC,IAAI;CAS7C;;AU5CL,AAAA,IAAI,AAkED,UAAU,AA8BR,YAAY,CAAC;EV5DhB,MAAM,EAAE,GAAG,CAAC,KAAK,CjFsDV,OAAO;C2FQX;;AAlGL,AVqCI,IUrCA,AAkED,UAAU,AA8BR,YAAY,GV3Db,WAAW,CAAC;EACZ,KAAK,EAHqC,IAAI;EAI9C,UAAU,EjFmDL,OAAO;EiFlDZ,gBAAgB,EjFkDX,OAAO;CiF7Cb;;AU7CH,AVyCI,IUzCA,AAkED,UAAU,AA8BR,YAAY,GV3Db,WAAW,CAIX,CAAC;AUzCL,AV0CI,IU1CA,AAkED,UAAU,AA8BR,YAAY,GV3Db,WAAW,CAKX,IAAI,CAAC;EACH,KAAK,EARmC,IAAI;CAS7C;;AU5CL,AAoG+B,IApG3B,AAkED,UAAU,GAkCP,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;EAC9B,MAAM,EAAE,CAAE;EACV,UAAU,EAAE,IAAK;CAClB;;AAvGL,AA2GQ,IA3GJ,AAkED,UAAU,CAwCR,AAAA,KAAC,EAAO,IAAI,AAAX,IACE,WAAW,CAAC;EACZ,KAAK,EAAE,IAAK;CACb;;AA7GP,AAoHM,IApHF,CAmHF,UAAU,GACN,IAAI,CAAC;EACL,aAAa,EAAE,GAAI;CACpB;;AAtHL,AA0HE,IA1HE,CA0HF,WAAW,CAAC;EACV,UAAU,EAAE,MAAO;EACnB,KAAK,EAAE,IAAK;EACZ,WAAW,EAAE,GAAI;EACjB,SAAS,EAAE,IAAK;EAChB,aAAa,EAAE,KAAM;CACtB;;AAGH,AAGI,IAHA,GAGA,QAAQ;AAHZ,AAII,IAJA,GAIA,YAAY;AAHhB,AAEI,gBAFY,GAEZ,QAAQ;AAFZ,AAGI,gBAHY,GAGZ,YAAY,CAAC;EACb,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,IAAI,EAAE,CAAE;EACR,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;CACd;;AAVH,AAYE,IAZE,CAYF,QAAQ;AAXV,AAWE,gBAXc,CAWd,QAAQ,CAAC;EACP,OAAO,EAAE,EAAG;EACZ,UAAU,EAAE,wBAAI;EhEtJhB,aAAa,EqDwFG,GAAG;CWyEpB;;AAzBH,AAgBM,IAhBF,CAYF,QAAQ,GAIJ,GAAG;AAfT,AAeM,gBAfU,CAWd,QAAQ,GAIJ,GAAG,CAAC;EACJ,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,GAAI;EACT,IAAI,EAAE,GAAI;EACV,WAAW,EAAE,KAAM;EACnB,UAAU,EAAE,KAAM;EAClB,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;CACjB;;AAxBL,AA2BU,IA3BN,CA2BF,QAAQ,AAAA,KAAK;AA1Bf,AA0BU,gBA1BM,CA0Bd,QAAQ,AAAA,KAAK,CAAC;EACZ,UAAU,EAAE,kBAAI;CACjB;;AAIH,AAAA,WAAW,A9D5KR,OAAO;A8D6KV,AAAA,SAAS,A9D7KN,OAAO;A8D8KV,AAAA,WAAW,A9D9KR,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;A8D+KH,AAAA,WAAW,CAAC;EACV,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,KAAM;EACf,OAAO,EXxFK,IAAI;EWyFhB,QAAQ,EAAE,QAAS;CAwCpB;;AA5CD,AAAA,WAAW,AAOR,YAAY,CAAC;EACZ,aAAa,EAAE,GAAG,CAAC,KAAK,CXjGT,OAAO;CWqGvB;;AAHC,AATJ,cASkB,CATlB,WAAW,AAOR,YAAY,CAEM;EACf,aAAa,EAAE,IAAK;CACrB;;AAXL,AAeI,WAfO,GAeP,GAAG;AAfP,AAgBI,WAhBO,GAgBP,UAAU;AAhBd,AAiBI,WAjBO,GAiBP,IAAI;AAjBR,AAkBE,WAlBS,CAkBT,UAAU,CAAC;EACT,OAAO,EAAE,YAAa;EACtB,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,CAAE;EACV,WAAW,EAAE,CAAE;CAChB;;AAvBH,AAwBI,WAxBO,GAwBP,GAAG;AAxBP,AAyBI,WAzBO,GAyBP,UAAU;AAzBd,AA0BI,WA1BO,GA0BP,IAAI,CAAC;EACL,YAAY,EAAE,GAAI;CACnB;;AA5BH,AA6BI,WA7BO,GA6BP,UAAU,CAAC;EACX,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,GAAG,EAAE,GAAI;CAWV;;AA3CH,AAiC0B,WAjCf,GA6BP,UAAU,EAIV,AAAA,WAAC,CAAY,SAAS,AAArB,EAAuB;EACtB,QAAQ,EAAE,QAAS;CACpB;;AAnCL,AAsCM,WAtCK,GA6BP,UAAU,AAQT,WAAW,CACV,cAAc,CAAC;EACb,KAAK,EAAE,CAAE;EACT,IAAI,EAAE,IAAK;CACZ;;AAMP,AAAA,aAAa,CAAC;EACZ,OAAO,EAAE,GAAI;EACb,SAAS,EAAE,IAAK;EAChB,UAAU,EAAE,WAAY;EACxB,KAAK,E3F3HqB,OAAO;C2FmIlC;;AAPC,AALF,KAKO,CALP,aAAa,EAAb,AAAA,aAAa,AAMV,MAAM,CAAC;EACN,KAAK,E3F/HmB,OAAO;C2FgIhC;;AARH,AAAA,aAAa,AASV,IAAI,AAAA,OAAO,CAAC;EACX,UAAU,EAAE,IAAK;CAClB;;AAIH,AAAA,SAAS,CAAC;EVpKR,aAAa,EUqKgB,CAAC,CAAE,CAAC,CXvJf,GAAG,CAAH,GAAG;EWwJrB,OAAO,EXrJK,IAAI;CWoLjB;;AA9BC,AAHF,UAGY,CAHZ,SAAS,CAGM;EhE3OX,uBAAuB,EqDkFP,GAAG;ErDjFnB,sBAAsB,EqDiFN,GAAG;CW2JpB;;AALH,AAOI,SAPK,GAOL,MAAM,CAAC;EACP,aAAa,EAAE,CAAE;CAKlB;;AAbH,AASmB,SATV,GAOL,MAAM,GAEJ,KAAK,GAAG,EAAE,GAAG,EAAE;AATrB,AAUmB,SAVV,GAOL,MAAM,GAGJ,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;EAChB,gBAAgB,EAAE,CAAE;CACrB;;AAZL,AAgBE,SAhBO,CAgBP,GAAG,CAAC;EACF,UAAU,EAAE,GAAI;CACjB;;AAlBH,AAoBE,SApBO,CAoBP,iBAAiB,CAAC;EAChB,MAAM,EAAE,KAAM;CACf;;AAtBH,AAuBe,SAvBN,AAuBN,WAAW,CAAC,iBAAiB,CAAC;EAC7B,MAAM,EAAE,IAAK;CACd;;AAzBH,AA8BE,SA9BO,CA8BP,eAAe,CAAC;EACd,0BAA0B,EXrLV,GAAG;CWsLpB;;AAIH,AAAA,WAAW,CAAC;EVxMV,aAAa,EUyMgB,CAAC,CAAE,CAAC,CX3Lf,GAAG,CAAH,GAAG;EW4LrB,UAAU,EAAE,GAAG,CAAC,KAAK,CX7LJ,OAAO;EW8LxB,OAAO,EX1LK,IAAI;EW2LhB,gBAAgB,EX7LF,IAAI;CW8LnB;;AAED,AAAA,aAAa,CAAC;EAEZ,MAAM,EAAE,MAAO;CAOhB;;AALG,MAAM,EAAL,SAAS,EAAE,KAAK;EAJrB,AAGI,aAHS,GAGT,EAAE,CAAC;IAED,KAAK,EAAE,IAAK;IACZ,YAAY,EAAE,IAAK;GAEtB;;;AAIH,AAAA,aAAa,CAAC;EACZ,UAAU,EAAE,OAAQ;CA6BrB;;AA9BD,AAEE,aAFW,CAEX,YAAY,CAAC;EAEX,OAAO,EAAE,KAAM;EACf,aAAa,EAAE,cAAe;CAW/B;;AAhBH,AAEE,aAFW,CAEX,YAAY,A9D1SX,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;A8DoSH,AAEE,aAFW,CAEX,YAAY,AAIT,aAAa,CAAC;EACb,aAAa,EAAE,CAAE;CAClB;;AARL,AAEE,aAFW,CAEX,YAAY,AAOT,cAAc,CAAC;EACd,WAAW,EAAE,CAAE;CAChB;;AAXL,AAYI,aAZS,CAEX,YAAY,CAUV,GAAG,CAAC;EAEF,KAAK,EAAE,IAAK;CACb;;AAfL,AAiBE,aAjBW,CAiBX,aAAa,CAAC;EACZ,WAAW,EAAE,IAAK;EAClB,KAAK,EAAE,IAAK;CACb;;AApBH,AAqBE,aArBW,CAqBX,SAAS,CAAC;EACR,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,KAAM;EACf,WAAW,EAAE,GAAI;CAClB;;AAzBH,AA0BE,aA1BW,CA0BX,WAAW,CAAC;EACV,WAAW,EAAE,GAAI;EACjB,SAAS,EAAE,IAAK;CACjB;;AAMH,uBAAuB;AAEvB,AAAA,UAAU,CAAC;EACT,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE;EACX,UAAU,EAAE,IAAK;EACjB,QAAQ,EAAE,IAAK;CAiFhB;;AArFD,AAMI,UANM,GAMN,EAAE,CAAC;EhEhVH,aAAa,EgEiVU,GAAG;EAC1B,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,OAAQ;EACpB,aAAa,EAAE,GAAI;EACnB,WAAW,EAAE,iBAAkB;EAC/B,KAAK,EAAE,IAAK;CAgDb;;AA5DH,AAMI,UANM,GAMN,EAAE,AAOD,aAAa,CAAC;EACb,aAAa,EAAE,CAAE;CAClB;;AAfL,AAiB2B,UAjBjB,GAMN,EAAE,GAWA,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAiB;EACvB,MAAM,EAAE,YAAa;CACtB;;AAnBL,AAqBI,UArBM,GAMN,EAAE,CAeF,KAAK,CAAC;EACJ,OAAO,EAAE,YAAa;EACtB,WAAW,EAAE,GAAI;EACjB,WAAW,EAAE,GAAI;CAClB;;AAzBL,AA4BI,UA5BM,GAMN,EAAE,CAsBF,MAAM,CAAC;EACL,WAAW,EAAE,IAAK;EAClB,SAAS,EAAE,GAAI;CAChB;;AA/BL,AAkCI,UAlCM,GAMN,EAAE,CA4BF,MAAM,CAAC;EACL,OAAO,EAAE,IAAK;EACd,KAAK,EAAE,KAAM;EACb,KAAK,E3FnRF,OAAO;C2F0RX;;AA5CL,AAuCQ,UAvCE,GAMN,EAAE,CA4BF,MAAM,GAKF,GAAG,EAvCX,AAuCe,UAvCL,GAMN,EAAE,CA4BF,MAAM,GAKK,UAAU,EAvCzB,AAuC6B,UAvCnB,GAMN,EAAE,CA4BF,MAAM,GAKmB,IAAI,CAAC;EAC1B,YAAY,EAAE,GAAI;EAClB,MAAM,EAAE,OAAQ;CACjB;;AA1CP,AA6CY,UA7CF,GAMN,EAAE,AAuCD,MAAM,CAAC,MAAM,CAAC;EACb,OAAO,EAAE,YAAa;CACvB;;AA/CL,AAMI,UANM,GAMN,EAAE,AA2CD,KAAK,CAAC;EACL,KAAK,EAAE,IAAK;CASb;;AA3DL,AAmDM,UAnDI,GAMN,EAAE,AA2CD,KAAK,CAEJ,KAAK,CAAC;EACJ,eAAe,EAAE,YAAa;EAC9B,WAAW,EAAE,GAAI;CAClB;;AAtDP,AAwDM,UAxDI,GAMN,EAAE,AA2CD,KAAK,CAOJ,MAAM,CAAC;EACL,UAAU,E3F5RU,OAAO,C2F4RT,UAAU;CAC7B;;AA1DP,AA+DE,UA/DQ,CA+DR,OAAO,CAAC;EACN,iBAAiB,E3F9SZ,OAAO;C2F+Sb;;AAjEH,AAkEE,UAlEQ,CAkER,QAAQ,CAAC;EACP,iBAAiB,E3FhTZ,OAAO;C2FiTb;;AApEH,AAqEE,UArEQ,CAqER,KAAK,CAAC;EACJ,iBAAiB,E3F/SZ,OAAO;C2FgTb;;AAvEH,AAwEE,UAxEQ,CAwER,QAAQ,CAAC;EACP,iBAAiB,E3FpTZ,OAAO;C2FqTb;;AA1EH,AA2EE,UA3EQ,CA2ER,QAAQ,CAAC;EACP,iBAAiB,E3FtTZ,OAAO;C2FuTb;;AA7EH,AA+EE,UA/EQ,CA+ER,OAAO,CAAC;EACN,OAAO,EAAE,YAAa;EACtB,MAAM,EAAE,IAAK;EACb,MAAM,EAAE,KAAM;CACf;;AAMH,uGAAuG;AACvG,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,iBAAkB;CAqD5B;;AAtDD,AAGE,KAHG,CAGH,KAAK,CAAC;EAEJ,aAAa,EAAE,IAAK;CA+CrB;;AApDH,AAGE,KAHG,CAGH,KAAK,A9D1aJ,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;A8DmaH,AAOM,KAPD,CAGH,KAAK,GAID,GAAG,CAAC;EACJ,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,MAAM,EAAE,qBAAsB;EhE9ahC,aAAa,EgE+aY,GAAG;CAC3B;;AAZL,AAcM,KAdD,CAGH,KAAK,GAWD,OAAO,CAAC;EACR,MAAM,EAAE,GAAG,CAAC,KAAK,C3FpVd,OAAO;C2FqVX;;AAhBL,AAiBM,KAjBD,CAGH,KAAK,GAcD,QAAQ,CAAC;EACT,MAAM,EAAE,GAAG,CAAC,KAAK,C3F1Vd,OAAO;C2F2VX;;AAnBL,AAsBM,KAtBD,CAGH,KAAK,GAmBD,QAAQ,CAAC;EACT,WAAW,EAAE,IAAK;EAClB,UAAU,EAAE,KAAM;CAKnB;;AA7BL,AAyBQ,KAzBH,CAGH,KAAK,GAmBD,QAAQ,GAGN,KAAK,CAAC;EACN,OAAO,EAAE,KAAM;EACf,WAAW,EAAE,GAAI;CAClB;;AA5BP,AAgCM,KAhCD,CAGH,KAAK,GA6BD,WAAW,CAAC;EhEpcd,aAAa,EqDqHU,GAAG;EWiVxB,UAAU,EAAE,OAAQ;EACpB,WAAW,EAAE,IAAK;EAClB,YAAY,EAAE,IAAK;EACnB,OAAO,EAAE,IAAK;CAcf;;AAnDL,AAsCQ,KAtCH,CAGH,KAAK,GA6BD,WAAW,GAMT,EAAE,CAAC;EACH,MAAM,EAAE,SAAU;EAClB,WAAW,EAAE,GAAI;EACjB,SAAS,EAAE,IAAK;CACjB;;AA1CP,AA2CQ,KA3CH,CAGH,KAAK,GA6BD,WAAW,GAWT,CAAC,EA3CT,AA2Ca,KA3CR,CAGH,KAAK,GA6BD,WAAW,GAWJ,SAAS,CAAC;EACf,WAAW,EAAE,GAAI;EACjB,SAAS,EAAE,IAAK;EAChB,UAAU,EAAE,MAAO;EACnB,MAAM,EAAE,CAAE;CAEX;;AAjDP,AAgCM,KAhCD,CAGH,KAAK,GA6BD,WAAW,A9Dvcd,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;A8D8dH,AAAA,UAAU,CAAC;EACT,SAAS,EAAE,KAAM;CAClB;;AAID,AACE,MADI,CACJ,WAAW,CAAC;EACV,KAAK,EAAE,IAAK;CACb;;AC5eH;;;GAGG;AACH,AAAA,SAAS,CAAC;EACR,OAAO,EAAE,KAAM;EACf,UAAU,EAAE,IAAK;EACjB,UAAU,EAAE,IAAK;EACjB,KAAK,EAAE,IAAK;EACZ,UAAU,EZqFI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;ErD1F1B,aAAa,EiEMQ,GAAG;EAC1B,aAAa,EAAE,IAAK;CAgBrB;;AAvBD,AASE,SATO,CASP,KAAK,CAAC;EACJ,SAAS,E5F+OI,QAAO;C4F9OrB;;AAXH,AAaiB,SAbR,CAaP,SAAS,CAAA,AAAA,KAAC,AAAA,EAAO;EACf,gBAAgB,EAAE,oBAAI;EACtB,MAAM,EAAE,KAAM;EACd,MAAM,EAAE,GAAI;EjEhBZ,aAAa,EiEkBU,CAAC;CACzB;;AAnBH,AAoBkB,SApBT,CAoBP,SAAS,CAAA,AAAA,KAAC,AAAA,CAAM,sBAAsB,CAAC;EACrC,gBAAgB,EAAE,oBAAI;CACvB;;AAGH,AAAA,cAAc,CAAC;EjEEX,yBAAyB,EiEDC,GAAG;EjEE7B,sBAAsB,EiEFI,GAAG;EAC/B,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,MAAO;EACnB,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,IAAK;EAClB,UAAU,EAAE,kBAAI;CAKjB;;AAdD,AAWI,cAXU,GAWV,GAAG,CAAC;EACJ,SAAS,EAAE,IAAK;CACjB;;AAGH,AAAA,iBAAiB,CAAC;EAChB,OAAO,EAAE,QAAS;EAClB,WAAW,EAAE,IAAK;CACnB;;AAED,AAAA,gBAAgB,CAAC;EACf,OAAO,EAAE,KAAM;EACf,WAAW,EAAE,IAAK;CACnB;;AAED,AAAA,qBAAqB;AACrB,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,KAAM;EACf,SAAS,E5FmMM,QAAO;E4FlMtB,WAAW,EAAE,MAAO;EACpB,QAAQ,EAAE,MAAO;EACjB,aAAa,EAAE,QAAS;CACzB;;AAED,AAAA,cAAc,CAAC;EACb,cAAc,EAAE,SAAU;CAC3B;;AAED,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,KAAM;CAChB;;AAED,AAAA,qBAAqB,CAAC;EACpB,MAAM,EAAE,CAAE;CACX;;AC1ED;;;GAGG;AAEH,AAAA,SAAS,CAAC;EACR,QAAQ,EAAE,QAAS;EACnB,MAAM,EAAE,UAAW;EACnB,OAAO,EAAE,CAAE;EACX,UAAU,EAAE,IAAK;CAuFlB;;AA3FD,AAAA,SAAS,AAON,OAAO,CAAC;EACP,OAAO,EAAE,EAAG;EACZ,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,MAAM,EAAE,CAAE;EACV,KAAK,EAAE,GAAI;EACX,UAAU,EAAE,IAAK;EACjB,IAAI,EAAE,IAAK;EACX,MAAM,EAAE,CAAE;ElEhBV,aAAa,EkEiBU,GAAG;CAC3B;;AAjBH,AAmBI,SAnBK,GAmBL,EAAE,CAAC;EACH,QAAQ,EAAE,QAAS;EACnB,YAAY,EAAE,IAAK;EACnB,aAAa,EAAE,IAAK;CAwDrB;;AA9EH,AAmBI,SAnBK,GAmBL,EAAE,AhEvBH,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;AgEAH,AA0BM,SA1BG,GAmBL,EAAE,GAOA,cAAc,CAAC;ElE3BjB,aAAa,EqDwFG,GAAG;Ea1DjB,UAAU,EAAE,CAAE;EACd,UAAU,EAAE,IAAK;EACjB,KAAK,EAAE,IAAK;EACZ,WAAW,EAAE,IAAK;EAClB,YAAY,EAAE,IAAK;EACnB,OAAO,EAAE,CAAE;EACX,QAAQ,EAAE,QAAS;CAyBpB;;AA5DL,AAsCQ,SAtCC,GAmBL,EAAE,GAOA,cAAc,GAYZ,KAAK,CAAC;EACN,KAAK,EAAE,IAAK;EACZ,KAAK,EAAE,KAAM;EACb,OAAO,EAAE,IAAK;EACd,SAAS,EAAE,IAAK;CACjB;;AA3CP,AA4CQ,SA5CC,GAmBL,EAAE,GAOA,cAAc,GAkBZ,gBAAgB,CAAC;EACjB,MAAM,EAAE,CAAE;EACV,KAAK,EAAE,IAAK;EACZ,aAAa,EAAE,GAAG,CAAC,KAAK,CbuCb,OAAO;EatClB,OAAO,EAAE,IAAK;EACd,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI;CAIlB;;AAtDP,AAmDU,SAnDD,GAmBL,EAAE,GAOA,cAAc,GAkBZ,gBAAgB,GAOd,CAAC,CAAC;EACF,WAAW,EAAE,GAAI;CAClB;;AArDT,AAwDQ,SAxDC,GAmBL,EAAE,GAOA,cAAc,GA8BZ,cAAc,EAxDtB,AAwD0B,SAxDjB,GAmBL,EAAE,GAOA,cAAc,GA8BM,gBAAgB,CAAC;EACnC,OAAO,EAAE,IAAK;CACf;;AA1DP,AA+DM,SA/DG,GAmBL,EAAE,GA4CA,GAAG;AA/DT,AAgEM,SAhEG,GAmBL,EAAE,GA6CA,UAAU;AAhEhB,AAiEM,SAjEG,GAmBL,EAAE,GA8CA,IAAI,CAAC;EACL,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,IAAK;EAClB,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,UAAU,E7F8BY,OAAO;E6F7B7B,aAAa,EAAE,GAAI;EACnB,UAAU,EAAE,MAAO;EACnB,IAAI,EAAE,IAAK;EACX,GAAG,EAAE,CAAE;CACR;;AA7EL,AAkFM,SAlFG,GAiFL,WAAW,GACT,IAAI,CAAC;EACL,WAAW,EAAE,GAAI;EACjB,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,YAAa;EACtB,gBAAgB,EAAE,IAAK;ElEvFzB,aAAa,EkEyFY,GAAG;CAC3B;;AAIL,AAEM,iBAFW,GACb,EAAE,GACA,cAAc,CAAC;EACf,UAAU,EAAE,OAAQ;EACpB,MAAM,EAAE,cAAe;CAKxB;;AATL,AAMQ,iBANS,GACb,EAAE,GACA,cAAc,GAIZ,gBAAgB,CAAC;EACjB,mBAAmB,EAAE,IAAK;CAC3B;;AC1GP;;;GAGG;AAEH,AAAA,IAAI,CAAC;EnEDD,aAAa,E3B4TQ,OAAM;E8FxT7B,MAAM,EAAE,qBAAsB;CA6C/B;;AAhDD,AAAA,IAAI,AAKD,UAAU,CAAC;EACV,cAAc,EAAE,SACjB;CAAC;;AAPJ,AAAA,IAAI,AAUD,SAAS,CAAC;EnEXT,aAAa,EmEYU,CAAC;EACxB,kBAAkB,EAAE,IAAK;EACzB,eAAe,EAAE,IAAK;EACtB,UAAU,EAAE,IAAK;EACjB,YAAY,EAAE,GAAI;CACnB;;AAhBH,AAAA,IAAI,AAmBD,OAAO,CAAC;EACP,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EACxC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EACrC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;CACjC;;AAvBH,AAAA,IAAI,AAyBD,MAAM,CAAC;EACN,OAAO,EAAE,IAAK;CACf;;AA3BH,AAAA,IAAI,AA8BD,SAAS,CAAC;EACT,QAAQ,EAAE,QAAS;EACnB,QAAQ,EAAE,MAAO;CAelB;;AA/CH,AAiCuB,IAjCnB,AA8BD,SAAS,GAGN,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,EAAa;EACnB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,SAAS,EAAE,IAAK;EAChB,UAAU,EAAE,IAAK;EACjB,SAAS,EAAE,KAAM;EACjB,UAAU,EAAE,KAAM;EAClB,OAAO,EAAE,CAAE;EACX,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,KAAM;EAClB,MAAM,EAAE,OAAQ;EAChB,OAAO,EAAE,KAAM;CAChB;;AAKL,AAAA,YAAY,CAAC;EACX,gBAAgB,EAAE,OAAQ;EAC1B,KAAK,EAAE,IAAK;EACZ,YAAY,EAAE,IAAK;CAMpB;;AATD,AAAA,YAAY,AAIT,MAAM,EAJT,AAAA,YAAY,AAKT,OAAO,EALV,AAAA,YAAY,AAMT,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAGH,AAAA,YAAY,CAAC;EACX,gBAAgB,E9FgCT,OAAO;E8F/Bd,YAAY,EAAE,OAAM;CAIrB;;AAND,AAAA,YAAY,AAGT,MAAM,EAHT,AAAA,YAAY,AAGA,OAAO,EAHnB,AAAA,YAAY,AAGU,MAAM,CAAC;EACzB,gBAAgB,EAAE,OAAM;CACzB;;AAGH,AAAA,YAAY,CAAC;EACX,gBAAgB,E9FuBT,OAAO;E8FtBd,YAAY,EAAE,OAAM;CAIrB;;AAND,AAAA,YAAY,AAGT,MAAM,EAHT,AAAA,YAAY,AAGA,OAAO,EAHnB,AAAA,YAAY,AAGU,MAAM,CAAC;EACzB,gBAAgB,EAAE,OAAM;CACzB;;AAGH,AAAA,SAAS,CAAC;EACR,gBAAgB,E9FiBT,OAAO;E8FhBd,YAAY,EAAE,OAAM;CAIrB;;AAND,AAAA,SAAS,AAGN,MAAM,EAHT,AAAA,SAAS,AAGG,OAAO,EAHnB,AAAA,SAAS,AAGa,MAAM,CAAC;EACzB,gBAAgB,EAAE,OAAM;CACzB;;AAGH,AAAA,WAAW,CAAC;EACV,gBAAgB,E9FIT,OAAO;E8FHd,YAAY,EAAE,OAAM;CAIrB;;AAND,AAAA,WAAW,AAGR,MAAM,EAHT,AAAA,WAAW,AAGC,OAAO,EAHnB,AAAA,WAAW,AAGW,MAAM,CAAC;EACzB,gBAAgB,EAAE,OAAM;CACzB;;AAGH,AAAA,YAAY,CAAC;EACX,gBAAgB,E9FHT,OAAO;E8FId,YAAY,EAAE,OAAM;CAIrB;;AAND,AAAA,YAAY,AAGT,MAAM,EAHT,AAAA,YAAY,AAGA,OAAO,EAHnB,AAAA,YAAY,AAGU,MAAM,CAAC;EACzB,gBAAgB,EAAE,OAAM;CACzB;;AAGH,AAAA,YAAY,CAAC;EACX,MAAM,EAAE,cAAe;EACvB,UAAU,EAAE,WAAY;EACxB,KAAK,EAAE,IAAK;CAOb;;AAVD,AAAA,YAAY,AAIT,MAAM,EAJT,AAAA,YAAY,AAKT,MAAM,EALT,AAAA,YAAY,AAMT,OAAO,CAAC;EACP,KAAK,EAAE,wBAAI;EACX,YAAY,EAAE,wBAAI;CACnB;;AAaH,AAAA,QAAQ,CAAC;EnE7HL,aAAa,EmE8HQ,GAAG;EAC1B,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,QAAS;EAClB,MAAM,EAAE,aAAc;EACtB,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,IAAK;EACb,UAAU,EAAE,MAAO;EACnB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,cAAe;EACvB,gBAAgB,EAAE,OAAQ;EAC1B,SAAS,EAAE,IAAK;CA2BjB;;AAtCD,AAaI,QAbI,GAaJ,GAAG,EAbP,AAaW,QAbH,GAaG,UAAU,EAbrB,AAayB,QAbjB,GAaiB,IAAI,CAAC;EAC1B,SAAS,EAAE,IAAK;EAChB,OAAO,EAAE,KAAM;CAChB;;AAhBH,AAAA,QAAQ,AAkBL,MAAM,CAAC;EACN,UAAU,EAAE,OAAQ;EACpB,KAAK,EAAE,IAAK;EACZ,YAAY,EAAE,IAAK;CACpB;;AAtBH,AAAA,QAAQ,AAwBL,OAAO,EAxBV,AAAA,QAAQ,AAwBK,MAAM,CAAC;EAChB,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EACxC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EACrC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;CACjC;;AA5BH,AA+BI,QA/BI,GA+BJ,MAAM,CAAC;EACP,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,IAAK;EACV,KAAK,EAAE,KAAM;EACb,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI;CAClB;;ACtKH;;;GAGG;AAGH,AAAA,QAAQ,CAAC;EpEFL,aAAa,EoEGQ,GAAG;EAC1B,MAAM,EAAE,UAAW;EACnB,OAAO,EAAE,mBAAoB;EAC7B,WAAW,EAAE,cAAe;CAqC7B;;AAzCD,AAKE,QALM,CAKN,CAAC,CAAC;EACA,KAAK,EAAE,IAAK;EACZ,eAAe,EAAE,SAAU;CAI5B;;AAXH,AAKE,QALM,CAKN,CAAC,AAGE,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AAVL,AAYE,QAZM,CAYN,EAAE,CAAC;EACD,UAAU,EAAE,CAAE;EACd,WAAW,EAAE,GAAI;CAClB;;AAfH,AAgBG,QAhBK,CAgBN,CAAC,AAAA,WAAW,CAAC;EACX,aAAa,EAAE,CAAE;CAClB;;AAlBH,AAmBE,QAnBM,CAmBN,IAAI;AAnBN,AAoBE,QApBM,CAoBN,UAAU,CAAC;EACT,gBAAgB,EAAE,IAAK;CACxB;;AAtBH,AAAA,QAAQ,AAyBL,eAAe,CAAC;EAEf,YAAY,EAAE,OAAM;CACrB;;AA5BH,AAAA,QAAQ,AA6BL,gBAAgB,CAAC;EAEhB,YAAY,EAAE,OAAM;CACrB;;AAhCH,AAAA,QAAQ,AAiCL,aAAa,CAAC;EAEb,YAAY,EAAE,OAAM;CACrB;;AApCH,AAAA,QAAQ,AAqCL,gBAAgB,CAAC;EAEhB,YAAY,EAAE,OAAM;CACrB;;AC9CH;;;GAGG;AAEH,AAAA,MAAM,CAAC;ErEDH,aAAa,EqEEQ,GAAG;CAkB3B;;AAnBD,AAEE,MAFI,CAEJ,EAAE,CAAC;EACD,WAAW,EAAE,GAAI;CAClB;;AAJH,AAKE,MALI,CAKJ,KAAK,CAAC;EACJ,YAAY,EAAE,IAAK;CACpB;;AAPH,AAQE,MARI,CAQJ,MAAM,EARR,AAQE,MARI,CWgFN,yBAAyB,CXxEhB;EACL,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,EAAG;CAIb;;AAdH,AAQE,MARI,CAQJ,MAAM,AAGH,MAAM,EAXX,AAQE,MARI,CWgFN,yBAAyB,AXrEpB,MAAM,CAAC;EACN,OAAO,EAAE,EAAG;CACb;;AAbL,AAeE,MAfI,CAeJ,CAAC,CAAC;EACA,KAAK,EAAE,IAAK;EACZ,eAAe,EAAE,SAAU;CAC5B;;AAIH,AAAA,cAAc,CAAC;EAEb,YAAY,EAAE,OAAM;CACrB;;AAED,AAAA,aAAa;AACb,AAAA,YAAY,CAAC;EAEX,YAAY,EAAE,OAAM;CACrB;;AAED,AAAA,cAAc,CAAC;EAEb,YAAY,EAAE,OAAM;CACrB;;AAED,AAAA,WAAW,CAAC;EAEV,YAAY,EAAE,OAAM;CACrB;;AC9CD;;;GAGG;AAEH,AACU,IADN,GACA,EAAE,GAAG,CAAC,AAAA,MAAM;AADhB,AAEU,IAFN,GAEA,EAAE,GAAG,CAAC,AAAA,OAAO;AAFjB,AAGU,IAHN,GAGA,EAAE,GAAG,CAAC,AAAA,MAAM,CAAC;EACb,KAAK,EAAE,IAAK;CAEb;;AAGH,eAAe;AACf,AACS,UADC,GACN,EAAE,GAAG,CAAC,CAAC;EtEZP,aAAa,EsEaU,CAAC;EACxB,UAAU,EAAE,qBAAsB;EAClC,KAAK,EAAE,IAAK;CAMb;;AAVH,AAKM,UALI,GACN,EAAE,GAAG,CAAC,GAIJ,GAAG;AALT,AAMM,UANI,GACN,EAAE,GAAG,CAAC,GAKJ,UAAU;AANhB,AAOM,UAPI,GACN,EAAE,GAAG,CAAC,GAMJ,IAAI,CAAC;EACL,YAAY,EAAE,GAAI;CACnB;;AATL,AAWgB,UAXN,GAWN,EAAE,AAAA,OAAO,GAAG,CAAC;AAXjB,AAYiB,UAZP,GAYN,EAAE,AAAA,OAAO,GAAG,CAAC,AAAA,MAAM;AAZvB,AAaiB,UAbP,GAaN,EAAE,AAAA,OAAO,GAAG,CAAC,AAAA,MAAM,CAAC;EACpB,gBAAgB,EjGuEX,OAAO;CiGtEb;;AAfH,AAgBgB,UAhBN,GAgBN,EAAE,AAAA,OAAO,GAAG,CAAC,CAAC;EACd,WAAW,EAAE,GAAI;CAClB;;AAGH,iBAAiB;AACjB,AACS,YADG,GACR,EAAE,GAAG,CAAC,CAAC;EtElCP,aAAa,EsEmCU,CAAC;EACxB,UAAU,EAAE,CAAE;EACd,WAAW,EAAE,qBAAsB;EACnC,KAAK,EAAE,IAAK;CACb;;AANH,AAOgB,YAPJ,GAOR,EAAE,AAAA,OAAO,GAAG,CAAC;AAPjB,AAQiB,YARL,GAQR,EAAE,AAAA,OAAO,GAAG,CAAC,AAAA,MAAM,CAAC;EACpB,UAAU,EAAE,WAAY;EACxB,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,CAAE;EACd,iBAAiB,EjGmDZ,OAAO;CiGlDb;;AAbH,AAeM,YAfM,GAeR,EAAE,AAAA,OAAO,CAAC;EACV,aAAa,EAAE,cAAe;EAC9B,KAAK,EAAE,IAAK;EACZ,aAAa,EAAE,IAAK;EACpB,OAAO,EAAE,QAAS;EAClB,cAAc,EAAE,SAAU;CAC3B;;AAGH,cAAc;AACd,AAAA,gBAAgB,CAAC;EACf,aAAa,EAAE,IAAK;EACpB,UAAU,EAAE,IAAK;EACjB,UAAU,EjB6BI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EiB5B5B,aAAa,EjB0BK,GAAG;CiBwHtB;;AAtJD,AAKI,gBALY,GAKZ,SAAS,CAAC;EACV,MAAM,EAAE,CAAE;EACV,mBAAmB,EAAE,OAAQ;EtE3D7B,uBAAuB,EqDkFP,GAAG;ErDjFnB,sBAAsB,EqDiFN,GAAG;CiB8DpB;;AA5FH,AASM,gBATU,GAKZ,SAAS,GAIP,EAAE,CAAC;EACH,UAAU,EAAE,qBAAsB;EAClC,aAAa,EAAE,IAAK;EAuBpB,YAAY,EAAE,GAAI;CACnB;;AAnCL,AAYQ,gBAZQ,GAKZ,SAAS,GAIP,EAAE,GAGA,CAAC,CAAC;EACF,KAAK,EAAE,IAAK;EtEvEhB,aAAa,EsEwEc,CAAC;CAYzB;;AA1BP,AAYQ,gBAZQ,GAKZ,SAAS,GAIP,EAAE,GAGA,CAAC,AAGA,WAAW,CAAC;EACX,KAAK,EAAE,IAAK;CACb;;AAjBT,AAYQ,gBAZQ,GAKZ,SAAS,GAIP,EAAE,GAGA,CAAC,EAZT,AAYQ,gBAZQ,GAKZ,SAAS,GAIP,EAAE,GAGA,CAAC,AAOA,MAAM,CAAC;EACN,UAAU,EAAE,WAAY;EACxB,MAAM,EAAE,CAAE;CACX;;AAtBT,AAYQ,gBAZQ,GAKZ,SAAS,GAIP,EAAE,GAGA,CAAC,AAWA,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AAzBT,AA4BW,gBA5BK,GAKZ,SAAS,GAIP,EAAE,AAkBD,IAAK,CAAA,AAAA,OAAO,IACT,CAAC,AAAA,MAAM;AA5BjB,AA6BW,gBA7BK,GAKZ,SAAS,GAIP,EAAE,AAkBD,IAAK,CAAA,AAAA,OAAO,IAET,CAAC,AAAA,MAAM;AA7BjB,AA8BW,gBA9BK,GAKZ,SAAS,GAIP,EAAE,AAkBD,IAAK,CAAA,AAAA,OAAO,IAGT,CAAC,AAAA,OAAO,CAAC;EACT,YAAY,EAAE,WAAY;CAC3B;;AAhCT,AAqCQ,gBArCQ,GAKZ,SAAS,GAgCP,EAAE,AAAA,OAAO,CAAC;EACV,gBAAgB,EjGAb,OAAO;CiGYX;;AAlDL,AAuCU,gBAvCM,GAKZ,SAAS,GAgCP,EAAE,AAAA,OAAO,GAEL,CAAC;AAvCX,AAwCgB,gBAxCA,GAKZ,SAAS,GAgCP,EAAE,AAAA,OAAO,AAGR,MAAM,GAAG,CAAC,CAAC;EACV,gBAAgB,EAAE,IAAK;EACvB,KAAK,EAAE,IAAK;CACb;;AA3CP,AA4CQ,gBA5CQ,GAKZ,SAAS,GAgCP,EAAE,AAAA,OAAO,GAOP,CAAC,CAAC;EACF,gBAAgB,EAAE,WAAY;EAC9B,iBAAiB,EAAE,OAAQ;EAC3B,kBAAkB,EAAE,OAAQ;CAC7B;;AAhDP,AAoDQ,gBApDQ,GAKZ,SAAS,GA+CP,EAAE,AAAA,cAAc,CAAC;EACjB,WAAW,EAAE,CAAE;CAMhB;;AA3DL,AAuDU,gBAvDM,GAKZ,SAAS,GA+CP,EAAE,AAAA,cAAc,AAEf,OAAO,GACJ,CAAC,CAAC;EACF,iBAAiB,EAAE,WAAY;CAChC;;AAzDT,AAKI,gBALY,GAKZ,SAAS,AAyDR,WAAW,CAAC;EACX,KAAK,EAAE,eAAgB;CAgBxB;;AA/EL,AAgEQ,gBAhEQ,GAKZ,SAAS,AAyDR,WAAW,GAER,EAAE,CAAC;EACH,KAAK,EAAE,KAAM;CACd;;AAlEP,AAmEU,gBAnEM,GAKZ,SAAS,AAyDR,WAAW,GAKR,EAAE,AAAA,cAAc,CAAC;EACjB,YAAY,EAAE,CAAE;CAUjB;;AA9EP,AAqEU,gBArEM,GAKZ,SAAS,AAyDR,WAAW,GAKR,EAAE,AAAA,cAAc,GAEd,CAAC,CAAC;EACF,iBAAiB,EAAE,GAAI;CACxB;;AAvET,AAyEY,gBAzEI,GAKZ,SAAS,AAyDR,WAAW,GAKR,EAAE,AAAA,cAAc,AAKf,OAAO,GACJ,CAAC,CAAC;EACF,iBAAiB,EAAE,OAAQ;EAC3B,kBAAkB,EAAE,WAAY;CACjC;;AA5EX,AAiFQ,gBAjFQ,GAKZ,SAAS,GA4EP,EAAE,AAAA,OAAO,CAAC;EACV,WAAW,EAAE,IAAK;EAClB,OAAO,EAAE,MAAO;EAChB,SAAS,EAAE,IAAK;EAChB,KAAK,EAAE,IAAK;CAMb;;AA3FL,AAsFQ,gBAtFQ,GAKZ,SAAS,GA4EP,EAAE,AAAA,OAAO,GAKP,GAAG;AAtFX,AAuFQ,gBAvFQ,GAKZ,SAAS,GA4EP,EAAE,AAAA,OAAO,GAMP,UAAU;AAvFlB,AAwFQ,gBAxFQ,GAKZ,SAAS,GA4EP,EAAE,AAAA,OAAO,GAOP,IAAI,CAAC;EACL,YAAY,EAAE,GAAI;CACnB;;AA1FP,AA8FI,gBA9FY,GA8FZ,YAAY,CAAC;EACb,UAAU,EAAE,IAAK;EACjB,OAAO,EAAE,IAAK;EtEtId,0BAA0B,EqDoEV,GAAG;ErDnEnB,yBAAyB,EqDmET,GAAG;CiBoEpB;;AAlGH,AAoGmB,gBApGH,CAoGd,SAAS,AAAA,KAAK,GAAG,CAAC,AACf,OAAO,EArGZ,AAoGmB,gBApGH,CAoGd,SAAS,AAAA,KAAK,GAAG,CAAC,AAEf,MAAM,CAAC;EACN,UAAU,EAAE,WAAY;EACxB,KAAK,EAAE,IAAK;CACb;;AAzGL,AA8GU,gBA9GM,AA4Gb,YAAY,GACT,SAAS,GACP,EAAE,AAAA,OAAO,CAAC;EACV,gBAAgB,EjGzEf,OAAO;CiG0ET;;AAhHP,AAqHU,gBArHM,AAmHb,SAAS,GACN,SAAS,GACP,EAAE,AAAA,OAAO,CAAC;EACV,gBAAgB,EjG/Ef,OAAO;CiGgFT;;AAvHP,AA4HU,gBA5HM,AA0Hb,WAAW,GACR,SAAS,GACP,EAAE,AAAA,OAAO,CAAC;EACV,gBAAgB,EjG3Ff,OAAO;CiG4FT;;AA9HP,AAmIU,gBAnIM,AAiIb,YAAY,GACT,SAAS,GACP,EAAE,AAAA,OAAO,CAAC;EACV,gBAAgB,EjGjGf,OAAO;CiGkGT;;AArIP,AA0IU,gBA1IM,AAwIb,YAAY,GACT,SAAS,GACP,EAAE,AAAA,OAAO,CAAC;EACV,gBAAgB,EjGtGf,OAAO;CiGuGT;;AA5IP,AAiJU,gBAjJM,AA+Ib,YAAY,GACT,SAAS,GACP,EAAE,AAAA,OAAO,CAAC;EACV,gBAAgB,EjGrGI,OAAO;CiGsG5B;;AAKP,gBAAgB;AAChB,AACS,WADE,GACP,EAAE,GAAG,CAAC,CAAC;EACP,UAAU,EAAE,OAAQ;EACpB,KAAK,EAAE,IAAK;CACb;;AAJH,AAMW,WANA,AAKR,gBAAgB,GACb,EAAE,GAAG,CAAC,CAAC;EtEzNT,aAAa,EsE0NY,CAAC,CAAC,UAAU;CACpC;;AC/NL;;;GAGG;AACH,AAAA,cAAc,CAAC;EACb,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE;CA4BZ;;AA/BD,AAII,cAJU,GAIV,KAAK,CAAC;EvEJN,aAAa,EqDwFG,GAAG;EkBhFnB,OAAO,EAAE,MAAO;EAChB,UAAU,EAAE,IAAK;CAClB;;AAVH,AAII,cAJU,GAIV,KAAK,ArEPN,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;AqEDH,AAWE,cAXY,CAWZ,YAAY,CAAC;EACX,KAAK,EAAE,IAAK;CAKb;;AAjBH,AAaI,cAbU,CAWZ,YAAY,CAEV,GAAG,CAAC;EACF,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;CACd;;AAhBL,AAkBE,cAlBY,CAkBZ,aAAa,CAAC;EACZ,WAAW,EAAE,IAAK;CACnB;;AApBH,AAqBE,cArBY,CAqBZ,cAAc,CAAC;EACb,WAAW,EAAE,GAAI;CAClB;;AAvBH,AAwBE,cAxBY,CAwBZ,oBAAoB,CAAC;EACnB,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,QAAQ,EAAE,MAAO;EACjB,WAAW,EAAE,MAAO;EACpB,aAAa,EAAE,QAAS;CACzB;;AAGH,AAAuB,oBAAH,GAAG,KAAK,CAAC;EvEjCzB,aAAa,EuEmCQ,CAAC;EACxB,aAAa,EAAE,GAAG,CAAC,KAAK,ClBmDP,OAAO;CkB/CzB;;AAPD,AAAuB,oBAAH,GAAG,KAAK,AAIzB,aAAa,CAAC;EACb,mBAAmB,EAAE,CAAE;CACxB;;AC3CH;;;GAGG;AAEH,AAMQ,MANF,GAEF,KAAK,GAGH,EAAE,GACA,EAAE;AANV,AAOQ,MAPF,GAEF,KAAK,GAGH,EAAE,GAEA,EAAE;AAPV,AAMQ,MANF,GAGF,KAAK,GAEH,EAAE,GACA,EAAE;AANV,AAOQ,MAPF,GAGF,KAAK,GAEH,EAAE,GAEA,EAAE;AAPV,AAMQ,MANF,GAIF,KAAK,GACH,EAAE,GACA,EAAE;AANV,AAOQ,MAPF,GAIF,KAAK,GACH,EAAE,GAEA,EAAE,CAAC;EACH,UAAU,EAAE,GAAG,CAAC,KAAK,CnB8EV,OAAO;CmB7EnB;;AATP,AAaiB,MAbX,GAaF,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;EAChB,aAAa,EAAE,GAAG,CAAC,KAAK,CnBwET,OAAO;CmBvEvB;;AAfH,AAiBQ,MAjBF,CAiBJ,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;EACd,UAAU,EAAE,GAAI;CACjB;;AAIH,AAAA,eAAe,CAAC;EACd,MAAM,EAAE,GAAG,CAAC,KAAK,CnB8DA,OAAO;CmB7CzB;;AAlBD,AAMQ,eANO,GAEX,KAAK,GAGH,EAAE,GACA,EAAE;AANV,AAOQ,eAPO,GAEX,KAAK,GAGH,EAAE,GAEA,EAAE;AAPV,AAMQ,eANO,GAGX,KAAK,GAEH,EAAE,GACA,EAAE;AANV,AAOQ,eAPO,GAGX,KAAK,GAEH,EAAE,GAEA,EAAE;AAPV,AAMQ,eANO,GAIX,KAAK,GACH,EAAE,GACA,EAAE;AANV,AAOQ,eAPO,GAIX,KAAK,GACH,EAAE,GAEA,EAAE,CAAC;EACH,MAAM,EAAE,GAAG,CAAC,KAAK,CnBuDN,OAAO;CmBtDnB;;AATP,AAaM,eAbS,GAYX,KAAK,GAAG,EAAE,GACR,EAAE;AAbR,AAcM,eAdS,GAYX,KAAK,GAAG,EAAE,GAER,EAAE,CAAC;EACH,mBAAmB,EAAE,GAAI;CAC1B;;AAIL,AAAM,MAAA,AAAA,UAAU;AAAhB,AAEE,MAFI,AAAA,UAAU,CAEd,EAAE;AAFJ,AAGE,MAHI,AAAA,UAAU,CAGd,EAAE,CAAC;EACD,MAAM,EAAE,CAAE;CACX;;AAGH,+BAA+B;AAC/B,AAAK,KAAA,AAAA,eAAe,EAApB,AACK,KADA,AAAA,eAAe,CACf,EAAE,EADP,AACS,KADJ,AAAA,eAAe,CACX,EAAE,CAAC;EACR,UAAU,EAAE,MAAO;CACpB;;AAGH,AACE,MADI,AAAA,MAAM,CACV,EAAE,CAAC;EACD,UAAU,EAAE,IAAK;CAClB;;AAHH,AAIE,MAJI,AAAA,MAAM,CAIV,EAAE,CAAC;EACD,UAAU,EAAE,KAAM;CACnB;;ACrEH;;;GAGG;AACH,AAAA,cAAc,CAAC;EACb,gBAAgB,EpGsGU,OAAO;EoGrGjC,KAAK,EAAE,IAAK;CACb;;ACPD;;;GAGG;AACH,AACE,YADU,CACV,SAAS,CAAC;E1EmBR,0BAA0B,E0ElBI,CAAC;E1EmB/B,yBAAyB,E0EnBK,CAAC;EAC/B,QAAQ,EAAE,QAAS;EACnB,UAAU,EAAE,MAAO;EACnB,OAAO,EAAE,CAAE;CACZ;;AANH,AAQI,YARQ,AAOT,eAAe,CACd,qBAAqB,CAAC;EpB2DxB,iBAAiB,EAAE,eAAS;EAC5B,aAAa,EAAE,eAAS;EACxB,SAAS,EAAE,eAAS;CoB3DjB;;AAIL,AAAA,qBAAqB,CAAC;EpBqDpB,iBAAiB,EAAE,eAAS;EAC5B,aAAa,EAAE,eAAS;EACxB,SAAS,EAAE,eAAS;EoBrDpB,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,KAAM;EACd,QAAQ,EAAE,IAAK;CAChB;;AAED,AAAA,gBAAgB;AAChB,AAAA,iBAAiB,CAAC;EAChB,OAAO,EAAE,KAAM;CAChB;;AAED,AAAA,gBAAgB,CAAC;EAEf,aAAa,EAAE,IAAK;CACrB;;AAHD,AAAA,gBAAgB,AxE7Bb,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;AwE8BH,AAAA,qBAAqB;AACrB,AAAA,qBAAqB,CAAC;EACpB,UAAU,EAAE,yBAA0B;CACvC;;AAED,AAAA,iBAAiB,CAAC;E1EpCd,aAAa,E0EqCQ,GAAG;EAC1B,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,QAAS;EAClB,UAAU,ErBtBG,OAAO;EqBuBpB,MAAM,EAAE,GAAG,CAAC,KAAK,CrBvBJ,OAAO;EqBwBpB,MAAM,EAAE,YAAa;EACrB,KAAK,ErBqE0B,IAAI;CqBlCpC;;AA1CD,AAAA,iBAAiB,AAUd,MAAM,EAVT,AAAA,iBAAiB,AAWd,OAAO,CAAC;EACP,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,GAAG,EAAE,IAAK;EACV,MAAM,EAAE,iBAAkB;EAC1B,kBAAkB,ErBlCP,OAAO;EqBmClB,OAAO,EAAE,GAAI;EACb,MAAM,EAAE,CAAE;EACV,KAAK,EAAE,CAAE;EACT,cAAc,EAAE,IAAK;CACtB;;AArBH,AAAA,iBAAiB,AAuBd,MAAM,CAAC;EACN,YAAY,EAAE,GAAI;EAClB,UAAU,EAAE,IAAK;CAClB;;AA1BH,AAAA,iBAAiB,AA2Bd,OAAO,CAAC;EACP,YAAY,EAAE,GAAI;EAClB,UAAU,EAAE,IAAK;CAClB;;AACD,AA/BF,MA+BQ,CA/BR,iBAAiB,CA+BN;EACP,YAAY,EAAE,IAAK;EACnB,WAAW,EAAE,CAAE;CAQhB;;AAVD,AA/BF,MA+BQ,CA/BR,iBAAiB,AAkCZ,MAAM,EAHT,AA/BF,MA+BQ,CA/BR,iBAAiB,AAmCZ,OAAO,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,IAAI,EAAE,IAAK;EACX,kBAAkB,EAAE,WAAY;EAChC,iBAAiB,ErBzDR,OAAO;CqB0DjB;;AAIL,AAAA,gBAAgB,CAAC;E1EhFb,aAAa,E0EiFQ,GAAG;EAC1B,KAAK,EAAE,IAAK;EACZ,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;CAId;;AAHC,AALF,MAKQ,CALR,gBAAgB,CAKL;EACP,KAAK,EAAE,KAAM;CACd;;AAGH,AAAA,iBAAiB,CAAC;EAChB,OAAO,EAAE,KAAM;EACf,aAAa,EAAE,GAAI;EACnB,SAAS,EAAE,IAAK;CACjB;;AAED,AAAA,iBAAiB,CAAC;EAChB,WAAW,EAAE,GAAI;CAClB;;AAED,AAAA,sBAAsB,CAAC;EACrB,KAAK,EAAE,IAAK;CACb;;AAGD,AACE,0BADwB,CACxB,qBAAqB,CAAC;EpBvCtB,iBAAiB,EAAE,eAAS;EAC5B,aAAa,EAAE,eAAS;EACxB,SAAS,EAAE,eAAS;CoBuCnB;;AAGH,AAAA,qBAAqB,CAAC;EpB5CpB,iBAAiB,EAAE,kBAAS;EAC5B,aAAa,EAAE,kBAAS;EACxB,SAAS,EAAE,kBAAS;EoB4CpB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,MAAM,EAAE,CAAE;EACV,MAAM,EAAE,KAAM;EACd,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,OAAQ;EACpB,KAAK,EAAE,IAAK;EACZ,QAAQ,EAAE,IAAK;CAChB;;AAGD,AAEI,cAFU,GAEV,EAAE,CAAC;EAEH,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,kBAAI;EAC7B,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,CAAE;CAIX;;AAVH,AAEI,cAFU,GAEV,EAAE,AxEjIH,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;AwE2HH,AAEI,cAFU,GAEV,EAAE,AAKD,aAAa,CAAC;EACb,aAAa,EAAE,IAAK;CACrB;;AAIL,AAAA,kBAAkB,CAAC;E1EzIf,aAAa,E0E0IQ,GAAG;EAC1B,KAAK,EAAE,IAAK;EACZ,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,mBAAmB,CAAC;EAClB,WAAW,EAAE,IAAK;EAClB,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,mBAAmB;AACnB,AAAA,qBAAqB,CAAC;EACpB,OAAO,EAAE,KAAM;CAChB;;AAED,AAAA,mBAAmB,CAAC;EAClB,WAAW,EAAE,GAAI;CAClB;;AAED,AAAA,qBAAqB,CAAC;EACpB,SAAS,EAAE,IAAK;CACjB;;AAED,AAAA,mBAAmB,CAAC;EAClB,KAAK,EAAE,IAAK;EACZ,WAAW,EAAE,MAAO;CACrB;;AAED,AAAA,kBAAkB,CAAC;EACjB,KAAK,EAAE,IAAK;CACb;;AAGD,ApBpHW,mBoBoHQ,CpBpHjB,MAAM,GAAG,iBAAiB,CAAC;EACzB,UAAU,EjFoCL,OAAO;EiFnCZ,YAAY,EjFmCP,OAAO;EiFlCZ,KAAK,EAJqC,IAAI;CAS/C;;AoB4GH,ApBpHW,mBoBoHQ,CpBpHjB,MAAM,GAAG,iBAAiB,AAIvB,MAAM,EoBgHX,ApBpHW,mBoBoHQ,CpBpHjB,MAAM,GAAG,iBAAiB,AAKvB,OAAO,CAAC;EACP,iBAAiB,EjF+Bd,OAAO;CiF9BX;;AoBiHL,ApBxHW,oBoBwHS,CpBxHlB,MAAM,GAAG,iBAAiB,CAAC;EACzB,UAAU,EjFwCL,OAAO;EiFvCZ,YAAY,EjFuCP,OAAO;EiFtCZ,KAAK,EAJqC,IAAI;CAS/C;;AoBgHH,ApBxHW,oBoBwHS,CpBxHlB,MAAM,GAAG,iBAAiB,AAIvB,MAAM,EoBoHX,ApBxHW,oBoBwHS,CpBxHlB,MAAM,GAAG,iBAAiB,AAKvB,OAAO,CAAC;EACP,iBAAiB,EjFmCd,OAAO;CiFlCX;;AoBqHL,ApB5HW,oBoB4HS,CpB5HlB,MAAM,GAAG,iBAAiB,CAAC;EACzB,UAAU,EjFqCL,OAAO;EiFpCZ,YAAY,EjFoCP,OAAO;EiFnCZ,KAAK,EAJqC,IAAI;CAS/C;;AoBoHH,ApB5HW,oBoB4HS,CpB5HlB,MAAM,GAAG,iBAAiB,AAIvB,MAAM,EoBwHX,ApB5HW,oBoB4HS,CpB5HlB,MAAM,GAAG,iBAAiB,AAKvB,OAAO,CAAC;EACP,iBAAiB,EjFgCd,OAAO;CiF/BX;;AoByHL,ApBhIW,iBoBgIM,CpBhIf,MAAM,GAAG,iBAAiB,CAAC;EACzB,UAAU,EjFyCL,OAAO;EiFxCZ,YAAY,EjFwCP,OAAO;EiFvCZ,KAAK,EAJqC,IAAI;CAS/C;;AoBwHH,ApBhIW,iBoBgIM,CpBhIf,MAAM,GAAG,iBAAiB,AAIvB,MAAM,EoB4HX,ApBhIW,iBoBgIM,CpBhIf,MAAM,GAAG,iBAAiB,AAKvB,OAAO,CAAC;EACP,iBAAiB,EjFoCd,OAAO;CiFnCX;;AoB6HL,ApBpIW,oBoBoIS,CpBpIlB,MAAM,GAAG,iBAAiB,CAAC;EACzB,UAAU,EjFuCL,OAAO;EiFtCZ,YAAY,EjFsCP,OAAO;EiFrCZ,KAAK,EAJqC,IAAI;CAS/C;;AoB4HH,ApBpIW,oBoBoIS,CpBpIlB,MAAM,GAAG,iBAAiB,AAIvB,MAAM,EoBgIX,ApBpIW,oBoBoIS,CpBpIlB,MAAM,GAAG,iBAAiB,AAKvB,OAAO,CAAC;EACP,iBAAiB,EjFkCd,OAAO;CiFjCX;;AqBlEL;;;GAGG;AACH,AAEI,WAFO,GAEP,EAAE,CAAC;EACH,KAAK,EAAE,GAAI;EACX,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,MAAO;CAYpB;;AAlBH,AAOI,WAPO,GAEP,EAAE,CAKF,GAAG,CAAC;E3EPJ,aAAa,E2EQY,GAAG;EAC1B,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,IAAK;CACd;;AAXL,AAYO,WAZI,GAEP,EAAE,GAUA,CAAC,AAAA,MAAM;AAZb,AAcM,WAdK,GAEP,EAAE,GAUA,CAAC,AAAA,MAAM,CAEP,gBAAgB,CAAC;EACf,KAAK,EAAE,IAAK;CACb;;AAKP,AAAA,gBAAgB;AAChB,AAAA,gBAAgB,CAAC;EACf,OAAO,EAAE,KAAM;CAChB;;AAED,AAAA,gBAAgB,CAAC;EACf,SAAS,EtG8NM,QAAO;EsG7NtB,KAAK,EAAE,IAAK;EACZ,QAAQ,EAAE,MAAO;EACjB,WAAW,EAAE,MAAO;EACpB,aAAa,EAAE,QAAS;CACzB;;AAED,AAAA,gBAAgB,CAAC;EACf,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;CACjB;;ACzCD,AAAA,kBAAkB,CAAC;EACjB,OAAO,EAAE,IAAK;EACd,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,IAAI,EAAE,CAAE;EACR,KAAK,EAAE,CAAE;EACT,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAI;EAC1B,UAAU,EvGsFH,IAAI;CuGjCZ;;AA7DD,AAUE,kBAVgB,CAUhB,qBAAqB,CAAC;EACpB,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,IAAK;EACd,QAAQ,EAAE,KAAM;EAChB,GAAG,EAAE,CAAE;EACP,IAAI,EAAE,CAAE;EACR,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,CAAE;EACV,UAAU,EAAE,kBAAI;EAChB,OAAO,EAAE,EAAG;CACb;;AApBH,AAsBE,kBAtBgB,CAsBhB,aAAa,CAAC;EACZ,MAAM,EAAE,CAAE;EACV,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,IAAK;EACnB,aAAa,EAAE,IAAK;CACrB;;AA3BH,AAAA,kBAAkB;AAAlB,AA8BE,kBA9BgB,CA8BhB,aAAa;AA9Bf,AA+BE,kBA/BgB,CA+BhB,kBAAkB,CAAC;EACjB,MAAM,EvBmBsB,IAAe;CuBlB5C;;AAjCH,AAmCE,kBAnCgB,CAmChB,kBAAkB;AAnCpB,AAoCE,kBApCgB,CAoChB,mBAAmB,CAAC;EAClB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,MAAO;EACnB,WAAW,EvBQiB,IAAe;EuBP3C,MAAM,EAAE,OAAQ;CAKjB;;AAjDH,AAmCE,kBAnCgB,CAmChB,kBAAkB,AAUf,MAAM;AA7CX,AAoCE,kBApCgB,CAoChB,mBAAmB,AAShB,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;EACZ,eAAe,EAAE,IAAK;CACvB;;AAhDL,AAmDE,kBAnDgB,CAmDhB,kBAAkB,CAAC;EACjB,IAAI,EAAE,CAAE;CACT;;AArDH,AAuDE,kBAvDgB,CAuDhB,mBAAmB,CAAC;EAClB,KAAK,EAAE,CAAE;EACT,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE;CACZ;;AC5DH;;;GAGG;AACH,AAAA,iBAAiB,AACd,KAAK,EADR,AAAA,iBAAiB,AAEd,MAAM,CAAC;EACN,gBAAgB,EAAE,IAAK;CACxB;;AAJH,AAKI,iBALa,GAKb,GAAG,CAAC;EACJ,SAAS,EAAE,IAAK;EAChB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,GAAI;EACT,OAAO,EAAE,CAAE;EACX,OAAO,EAAE,YAAa;EACtB,UAAU,EAAE,KAAM;CACnB;;AChBH;;;GAGG;AACH,AAAA,MAAM,CAAC;EACL,UAAU,EAAE,kBAAI;CACjB;;AAED,AAAA,cAAc,CAAC;E9EJX,aAAa,E8EKQ,CAAC;EAExB,MAAM,EAAE,CAAE;CAIX;;AAED,AAAA,aAAa,CAAC;EACZ,mBAAmB,EzByEF,OAAO;CyBxEzB;;AAED,AAAA,aAAa,CAAC;EACZ,gBAAgB,EzBqEC,OAAO;CyBpEzB;;AAGD,AAIE,cAJY,CAIZ,aAAa;AAJf,AAKE,cALY,CAKZ,aAAa,CAAC;EAEZ,YAAY,EAAE,OAAM;CACrB;;AAGH,AAIE,cAJY,CAIZ,aAAa;AAJf,AAKE,cALY,CAKZ,aAAa,CAAC;EAEZ,YAAY,EAAE,OAAM;CACrB;;AAGH,AAIE,WAJS,CAIT,aAAa;AAJf,AAKE,WALS,CAKT,aAAa,CAAC;EAEZ,YAAY,EAAE,OAAM;CACrB;;AAGH,AAIE,cAJY,CAIZ,aAAa;AAJf,AAKE,cALY,CAKZ,aAAa,CAAC;EAEZ,YAAY,EAAE,OAAM;CACrB;;AAGH,AAIE,aAJW,CAIX,aAAa;AAJf,AAKE,aALW,CAKX,aAAa,CAAC;EAEZ,YAAY,EAAE,OAAM;CACrB;;AC9EH;;;GAGG;AAEH,AAAA,WAAW,CAAC;EACV,MAAM,EAAE,IAAK;EACb,QAAQ,EAAE,QAAS;CACpB;;AAGD,AAEE,YAFU,CAEV,mBAAmB,CAAC;EAClB,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,KAAM;E/ELd,uBAAuB,EqDkFP,GAAG;ErDjFnB,sBAAsB,EqDiFN,GAAG;C0B3EpB;;AANH,AAQE,YARU,CAQV,qBAAqB,CAAC;EACpB,UAAU,EAAE,CAAE;EACd,aAAa,EAAE,GAAI;EACnB,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI;EACjB,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAI;CAC5B;;AAdH,AAgBE,YAhBU,CAgBV,iBAAiB,CAAC;EAChB,UAAU,EAAE,CAAE;CACf;;AAlBH,AAoBE,YApBU,CAoBV,kBAAkB,CAAC;EACjB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,IAAK;EACV,IAAI,EAAE,GAAI;EACV,WAAW,EAAE,KAAM;CAMpB;;AA9BH,AAyBM,YAzBM,CAoBV,kBAAkB,GAKd,GAAG,CAAC;EACJ,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,MAAM,EAAE,cAAe;CACxB;;AA7BL,AA+BE,YA/BU,CA+BV,WAAW,CAAC;EACV,WAAW,EAAE,IAAK;CACnB;;AAIH,AAEE,cAFY,CAEZ,mBAAmB,CAAC;EAClB,OAAO,EAAE,IAAK;E/EzCd,uBAAuB,EqDkFP,GAAG;ErDjFnB,sBAAsB,EqDiFN,GAAG;C0BvCpB;;AALH,AAOE,cAPY,CAOZ,qBAAqB,CAAC;EACpB,UAAU,EAAE,GAAI;EAChB,aAAa,EAAE,GAAI;EACnB,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI;CAClB;;AAZH,AAcE,cAdY,CAcZ,iBAAiB,CAAC;EAChB,UAAU,EAAE,CAAE;CACf;;AAhBH,AAiBE,cAjBY,CAiBZ,qBAAqB;AAjBvB,AAkBE,cAlBY,CAkBZ,iBAAiB,CAAC;EAChB,WAAW,EAAE,IAAK;CACnB;;AApBH,AAuBM,cAvBQ,CAsBZ,kBAAkB,GACd,GAAG,CAAC;EACJ,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,KAAK,EAAE,IAAK;CACb;;AC3EL;;;GAGG;AACH,AACI,iBADa,GACb,MAAM,CAAC;EACP,MAAM,EAAE,CAAE;CACX;;AAGH,AAAA,iBAAiB,CAAC;EAChB,OAAO,EAAE,GAAI;CAId;;AALD,AAAA,iBAAiB,AAEd,YAAY,CAAC;EACZ,aAAa,EAAE,GAAG,CAAC,KAAK,C3B8ET,OAAO;C2B7EvB;;AAGH,AAAA,kBAAkB,CAAC;EACjB,aAAa,EAAE,GAAG,CAAC,KAAK,C3ByEP,OAAO;E2BxExB,OAAO,EAAE,IAAK;CASf;;AAXD,AAGE,kBAHgB,CAGhB,EAAE,CAAC;EACD,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,CAAE;CACX;;AANH,AAOE,kBAPgB,CAOhB,EAAE,CAAC;EACD,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,SAAU;CACpB;;AAGH,AAAA,kBAAkB,CAAC;EACjB,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;CACjB;;AAED,AAAA,qBAAqB,CAAC;EACpB,OAAO,EAAE,IAAK;CACf;;AAED,AAEE,oBAFkB,CAElB,EAAE,CAAC;EACD,KAAK,EAAE,IAAK;EACZ,KAAK,EAAE,KAAM;EACb,MAAM,EAAE,cAAe;EACvB,aAAa,EAAE,IAAK;EACpB,YAAY,EAAE,IAAK;CACpB;;AAGH,AAAA,wBAAwB,CAAC;EACvB,WAAW,EAAE,IAAK;EAClB,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,wBAAwB;AACxB,AAAA,wBAAwB;AACxB,AAAA,wBAAwB,CAAC;EACvB,OAAO,EAAE,KAAM;CAChB;;AAED,AAAA,wBAAwB,CAAC;EACvB,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,OAAQ;CACrB;;AAED,AAAA,wBAAwB,CAAC;EACvB,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;CACjB;;AAED,AAAA,wBAAwB,CAAC;EACvB,UAAU,EAAE,MAAO;EACnB,SAAS,EAAE,IAAK;EAChB,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,SAAU;CAQpB;;AAZD,AAAA,wBAAwB,AAKrB,QAAQ,CAAC;EACR,OAAO,EAAE,CAAE;CAKZ;;AAXH,AAOM,wBAPkB,AAKrB,QAAQ,GAEL,GAAG,CAAC;EACJ,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,IAAK;CACd;;ACjFL;;;GAGG;AACH,sCAAsC;AACtC,AAAA,WAAW,CAAC;EACV,UAAU,E5GqGgB,OAAO;C4GpGlC;;AAED,AAAA,gBAAgB,CAAC;EACf,SAAS,EAAE,IAAK;EAChB,UAAU,EAAE,MAAO;EACnB,aAAa,EAAE,IAAK;EACpB,WAAW,EAAE,GAAI;CAIlB;;AARD,AAKE,gBALc,CAKd,CAAC,CAAC;EACA,KAAK,EAAE,IAAK;CACb;;AAGH,AAAA,mBAAmB,CAAC;EAClB,SAAS,EAAE,KAAM;EACjB,MAAM,EAAE,MAAO;EACf,UAAU,EAAE,GAAI;CACjB;;AAED,0BAA0B;AAC1B,AAAY,WAAD,CAAC,gBAAgB,CAAC;EAC3B,UAAU,EAAE,MAAO;EACnB,WAAW,EAAE,GAAI;CAClB;;AAED,iDAAiD;AACjD,AAAA,gBAAgB,CAAC;EjF5Bb,aAAa,EiF6BQ,GAAG;EAC1B,OAAO,EAAE,CAAE;EACX,UAAU,EAAE,IAAK;EACjB,QAAQ,EAAE,QAAS;EACnB,MAAM,EAAE,mBAAoB;EAC5B,KAAK,EAAE,KAAM;CACd;;AAED,gBAAgB;AAChB,AAAA,iBAAiB,CAAC;EjFtCd,aAAa,EiFuCQ,GAAG;EAC1B,QAAQ,EAAE,QAAS;EACnB,IAAI,EAAE,KAAM;EACZ,GAAG,EAAE,KAAM;EACX,UAAU,EAAE,IAAK;EACjB,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,EAAG;CAMb;;AAbD,AAQI,iBARa,GAQb,GAAG,CAAC;EjF9CJ,aAAa,EiF+CU,GAAG;EAC1B,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;CACd;;AAGH,sDAAsD;AACtD,AAAA,uBAAuB,CAAC;EACtB,WAAW,EAAE,IAAK;CASnB;;AAVD,AAEE,uBAFqB,CAErB,aAAa,CAAC;EACZ,MAAM,EAAE,CAAE;CACX;;AAJH,AAKE,uBALqB,CAKrB,IAAI,CAAC;EACH,gBAAgB,EAAE,IAAK;EACvB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,MAAO;CACjB;;AAGH,AAAA,kBAAkB,CAAC;EACjB,UAAU,EAAE,IAAK;CAClB;;ACxED;;;GAGG;AAEH,AAAA,WAAW;AACX,AAAA,cAAc,CAAC;EACb,SAAS,EAAE,IAAK;EAChB,UAAU,EAAE,MAAO;EACnB,aAAa,EAAE,IAAK;EACpB,WAAW,EAAE,GAAI;CAIlB;;AATD,AAME,WANS,CAMT,CAAC;AALH,AAKE,cALY,CAKZ,CAAC,CAAC;EACA,KAAK,EAAE,IAAK;CACb;;AAGH,AAAA,WAAW;AACX,AAAA,cAAc,CAAC;EACb,UAAU,E7GyFgB,OAAO;C6GxFlC;;AAED,AAAA,UAAU;AACV,AAAA,aAAa,CAAC;EACZ,KAAK,EAAE,KAAM;EACb,MAAM,EAAE,OAAQ;CAKjB;;AAJC,MAAM,EAAL,SAAS,EAAE,KAAK;EAJnB,AAAA,UAAU;EACV,AAAA,aAAa,CAAC;IAIV,KAAK,EAAE,GAAI;IACX,UAAU,EAAE,IAAK;GAEpB;;;AAED,AAAA,eAAe;AACf,AAAA,kBAAkB,CAAC;EACjB,UAAU,EAAE,IAAK;EACjB,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,CAAE;EACd,KAAK,EAAE,IAAK;CAIb;;AATD,AAME,eANa,CAMb,sBAAsB;AALxB,AAKE,kBALgB,CAKhB,sBAAsB,CAAC;EACrB,KAAK,EAAE,IAAK;CACb;;AAGH,AAAA,cAAc;AACd,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAE,CAAE;EACV,UAAU,EAAE,MAAO;EACnB,OAAO,EAAE,gBAAiB;CAC3B;;AAED,AAAA,kBAAkB,CAAC;EACjB,MAAM,EAAE,MAAO;CAChB;;ACnDD;;;GAGG;AACH,AAAA,WAAW,CAAC;EACV,KAAK,EAAE,KAAM;EACb,MAAM,EAAE,gBAAiB;CA6B1B;;A1GkCG,MAAM,EAAL,SAAS,EAAE,KAAK;E0GjErB,AAAA,WAAW,CAAC;IAIR,KAAK,EAAE,IAAK;GA2Bf;;;AA/BD,AAOI,WAPO,GAOP,SAAS,CAAC;EACV,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,KAAM;EACjB,WAAW,EAAE,GAAI;CAKlB;;A1GkDC,MAAM,EAAL,SAAS,EAAE,KAAK;E0GjErB,AAOI,WAPO,GAOP,SAAS,CAAC;IAKR,KAAK,EAAE,IAAK;IACZ,UAAU,EAAE,MAAO;GAEtB;;;AAfH,AAiBI,WAjBO,GAiBP,cAAc,CAAC;EACf,WAAW,EAAE,KAAM;EAWnB,OAAO,EAAE,KAAM;CAChB;;A1GmCC,MAAM,EAAL,SAAS,EAAE,KAAK;E0GjErB,AAiBI,WAjBO,GAiBP,cAAc,CAAC;IAGb,WAAW,EAAE,CAAE;GAUlB;;;AA9BH,AAsBM,WAtBK,GAiBP,cAAc,GAKZ,EAAE,CAAC;EACH,WAAW,EAAE,GAAI;EACjB,SAAS,EAAE,IAAK;CAIjB;;A1GqCD,MAAM,EAAL,SAAS,EAAE,KAAK;E0GjErB,AAsBM,WAtBK,GAiBP,cAAc,GAKZ,EAAE,CAAC;IAID,UAAU,EAAE,MAAO;GAEtB;;;AChCL;;;GAGG;AAEH,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,QAAS;EACnB,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,iBAAkB;EAC1B,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,SAAU;CACnB;;AAED,AAAA,cAAc,CAAC;EACb,UAAU,EAAE,CAAE;CACf;;ACfD;;;GAGG;AAEH,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAE,MAAO;EACf,KAAK,EAAE,KAAM;EACb,OAAO,EAAE,GAAI;EACb,MAAM,EAAE,GAAG,CAAC,KAAK,ChHkGS,OAAO;CgHjGlC;;AAED,AAAA,iBAAiB,CAAC;EAChB,SAAS,EAAE,IAAK;EAChB,UAAU,EAAE,GAAI;CACjB;;AAED,AAAA,KAAK,CAAC;EACJ,aAAa,EAAE,GAAG,CAAC,KAAK,ChHyFE,OAAO;EgHxFjC,aAAa,EAAE,IAAK;EACpB,cAAc,EAAE,IAAK;EACrB,KAAK,EAAE,IAAK;CASb;;AAbD,AAAA,KAAK,AAKF,aAAa,CAAC;EACb,aAAa,EAAE,CAAE;EACjB,aAAa,EAAE,CAAE;EACjB,cAAc,EAAE,CAAE;CACnB;;AATH,AAUE,KAVG,CAUH,WAAW,CAAC;EACV,aAAa,EAAE,IAAK;CACrB;;AC7BH;;;;;;;GAOG;AAOH,AAAA,WAAW,CAAC;EACV,QAAQ,EAAE,QAAS;EACnB,YAAY,EAAG,OAAe;EAC9B,UAAU,EAAE,IAAK;EACjB,WAAW,EAAE,MAAO;EACpB,QAAQ,EAAE,MAAO;EACjB,aAAa,EAAE,QAAS;CAoCzB;;AA1CD,AAOI,WAPO,GAOP,YAAY,CAAC;EACb,QAAQ,EAAE,QAAS;EACnB,IAAI,EAAE,CAAE;EACR,GAAG,EAAE,CAAE;EACP,MAAM,EAAE,CAAE;EACV,KAAK,EAjBS,MAAiB;EAkB/B,WAAW,EAAG,MAAe;EAC7B,SAAS,EAAE,KAAM;EACjB,UAAU,EAAE,MAAO;EACnB,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,kBAAI;CAC7B;;AAjBH,AAAA,WAAW,AAkBR,OAAO,EnE2DV,AmE7EA,anE6Ea,GmE7Eb,WAAW,AnE6EK,IAAI,CmE3DT;EACP,YAAY,EAAG,OAAa;CAM7B;;AAzBH,AAoBM,WApBK,AAkBR,OAAO,GAEJ,YAAY,EnEyDlB,AmEzDM,anEyDO,GmE7Eb,WAAW,AnE6EK,IAAI,GmEzDd,YAAY,CAAC;EACb,WAAW,EAzBD,MAAK;EA0Bf,KAAK,EA1BK,MAAK;EA2Bf,SAAS,EAAE,KAAM;CAClB;;AAxBL,AAAA,WAAW,AA0BR,OAAO,EnEkDV,AmE5EA,anE4Ea,GmE5Eb,WAAW,AnE4EK,IAAI,CmElDT;EACP,YAAY,EAAG,OAAa;CAM7B;;AAjCH,AA4BM,WA5BK,AA0BR,OAAO,GAEJ,YAAY,EnEgDlB,AmEhDM,anEgDO,GmE5Eb,WAAW,AnE4EK,IAAI,GmEhDd,YAAY,CAAC;EACb,WAAW,EAhCD,MAAK;EAiCf,KAAK,EAjCK,MAAK;EAkCf,SAAS,EAAE,KAAM;CAClB;;AAhCL,AAAA,WAAW,AAkCR,OAAO,CAAC;EACP,YAAY,EAAG,MAAa;CAM7B;;AAzCH,AAoCM,WApCK,AAkCR,OAAO,GAEJ,YAAY,CAAC;EACb,WAAW,EAvCD,OAAK;EAwCf,KAAK,EAxCK,OAAK;EAyCf,SAAS,EAAE,KAAM;CAClB;;AAIL,AAAA,gBAAgB,CAAC;EAEf,MAAM,EAAG,MAAe;EACxB,KAAK,EAAG,MAAe;EACvB,OAAO,EAAE,CAAE;CAwBZ;;AA5BD,AAKI,gBALY,GAKZ,YAAY,CAAC;EACb,MAAM,EAAE,IAAK;EACb,UAAU,EAAE,MAAO;EACnB,KAAK,EAAE,IAAK;CACb;;AATH,AAAA,gBAAgB,AAUb,OAAO,EnEuBV,AmEjCA,anEiCa,GmEjCb,gBAAgB,AnEiCA,IAAI,CmEvBT;EACP,MAAM,EA3DM,MAAK;EA4DjB,KAAK,EA5DO,MAAK;EA6DjB,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;CAClB;;AAfH,AAAA,gBAAgB,AAgBb,OAAO,EnEgBV,AmEhCA,anEgCa,GmEhCb,gBAAgB,AnEgCA,IAAI,CmEhBT;EACP,MAAM,EAAG,MAAa;EACtB,KAAK,EAAG,MAAa;EACrB,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;CAClB;;AArBH,AAAA,gBAAgB,AAsBb,OAAO,CAAC;EACP,MAAM,EAAG,OAAa;EACtB,KAAK,EAAG,OAAa;EACrB,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;CAClB;;AAQH,AAAA,QAAQ,CAAC;EAJP,gBAAgB,EAKI,OAAO;E/FrF3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FoFI,OAAO;E/FnF3B,YAAY,E+F+E+B,kBAAI;CAKhD;;AAFD,AAAA,QAAQ,A5GnFH,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GmFzB,AAAA,QAAQ,A/FzEL,MAAM,E+FyET,AAAA,QAAQ,A/FxEL,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FiEH,AAAA,QAAQ,A/F9DL,SAAS,E+F8DZ,AAAA,QAAQ,A/F7DL,SAAS,CAAC;EACT,gBAAgB,E+F6DE,OAAO;E/F5DzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F0DH,AAAA,QAAQ,A/FxDL,OAAO,E+FwDV,AAAA,QAAQ,A/FvDL,OAAO;AACR,A+FsDF,K/FtDO,G+FsDP,QAAQ,A/FtDG,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FoDH,AAAA,cAAc,CAAC;EARb,gBAAgB,EASI,OAAO;E/FzF3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FwFI,OAAO;E/FvF3B,YAAY,E+F+E+B,kBAAI;CAShD;;AAFD,AAAA,cAAc,A5GvFT,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GuFzB,AAAA,cAAc,A/F7EX,MAAM,E+F6ET,AAAA,cAAc,A/F5EX,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FqEH,AAAA,cAAc,A/FlEX,SAAS,E+FkEZ,AAAA,cAAc,A/FjEX,SAAS,CAAC;EACT,gBAAgB,E+FiEE,OAAO;E/FhEzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F8DH,AAAA,cAAc,A/F5DX,OAAO,E+F4DV,AAAA,cAAc,A/F3DX,OAAO;AACR,A+F0DF,K/F1DO,G+F0DP,cAAc,A/F1DH,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FwDH,AAAA,YAAY,CAAC;EAZX,gBAAgB,EAaI,OAAO;E/F7F3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+F4FI,OAAO;E/F3F3B,YAAY,E+F+E+B,kBAAI;CAahD;;AAFD,AAAA,YAAY,A5G3FP,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G2FzB,AAAA,YAAY,A/FjFT,MAAM,E+FiFT,AAAA,YAAY,A/FhFT,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FyEH,AAAA,YAAY,A/FtET,SAAS,E+FsEZ,AAAA,YAAY,A/FrET,SAAS,CAAC;EACT,gBAAgB,E+FqEE,OAAO;E/FpEzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FkEH,AAAA,YAAY,A/FhET,OAAO,E+FgEV,AAAA,YAAY,A/F/DT,OAAO;AACR,A+F8DF,K/F9DO,G+F8DP,YAAY,A/F9DD,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+F4DH,AAAA,aAAa,CAAC;EAhBZ,gBAAgB,EAiBI,OAAO;E/FjG3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FgGI,OAAO;E/F/F3B,YAAY,E+F+E+B,kBAAI;CAiBhD;;AAFD,AAAA,aAAa,A5G/FR,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G+FzB,AAAA,aAAa,A/FrFV,MAAM,E+FqFT,AAAA,aAAa,A/FpFV,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+F6EH,AAAA,aAAa,A/F1EV,SAAS,E+F0EZ,AAAA,aAAa,A/FzEV,SAAS,CAAC;EACT,gBAAgB,E+FyEE,OAAO;E/FxEzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FsEH,AAAA,aAAa,A/FpEV,OAAO,E+FoEV,AAAA,aAAa,A/FnEV,OAAO;AACR,A+FkEF,K/FlEO,G+FkEP,aAAa,A/FlEF,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FgEH,AAAA,WAAW,CAAC;EApBV,gBAAgB,EAqBI,OAAO;E/FrG3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FoGI,OAAO;E/FnG3B,YAAY,E+F+E+B,kBAAI;CAqBhD;;AAFD,AAAA,WAAW,A5GnGN,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GmGzB,AAAA,WAAW,A/FzFR,MAAM,E+FyFT,AAAA,WAAW,A/FxFR,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FiFH,AAAA,WAAW,A/F9ER,SAAS,E+F8EZ,AAAA,WAAW,A/F7ER,SAAS,CAAC;EACT,gBAAgB,E+F6EE,OAAO;E/F5EzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F0EH,AAAA,WAAW,A/FxER,OAAO,E+FwEV,AAAA,WAAW,A/FvER,OAAO;AACR,A+FsEF,K/FtEO,G+FsEP,WAAW,A/FtEA,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FoEH,AAAA,eAAe,CAAC;EAxBd,gBAAgB,EAyBI,OAAO;E/FzG3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FwGI,OAAO;E/FvG3B,YAAY,E+F+E+B,kBAAI;CAyBhD;;AAFD,AAAA,eAAe,A5GvGV,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GuGzB,AAAA,eAAe,A/F7FZ,MAAM,E+F6FT,AAAA,eAAe,A/F5FZ,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FqFH,AAAA,eAAe,A/FlFZ,SAAS,E+FkFZ,AAAA,eAAe,A/FjFZ,SAAS,CAAC;EACT,gBAAgB,E+FiFE,OAAO;E/FhFzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F8EH,AAAA,eAAe,A/F5EZ,OAAO,E+F4EV,AAAA,eAAe,A/F3EZ,OAAO;AACR,A+F0EF,K/F1EO,G+F0EP,eAAe,A/F1EJ,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FwEH,AAAA,WAAW,CAAC;EA5BV,gBAAgB,EA6BI,OAAO;E/F7G3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+F4GI,OAAO;E/F3G3B,YAAY,E+F+E+B,kBAAI;CA6BhD;;AAFD,AAAA,WAAW,A5G3GN,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G2GzB,AAAA,WAAW,A/FjGR,MAAM,E+FiGT,AAAA,WAAW,A/FhGR,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FyFH,AAAA,WAAW,A/FtFR,SAAS,E+FsFZ,AAAA,WAAW,A/FrFR,SAAS,CAAC;EACT,gBAAgB,E+FqFE,OAAO;E/FpFzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FkFH,AAAA,WAAW,A/FhFR,OAAO,E+FgFV,AAAA,WAAW,A/F/ER,OAAO;AACR,A+F8EF,K/F9EO,G+F8EP,WAAW,A/F9EA,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+F4EH,AAAA,WAAW,CAAC;EAhCV,gBAAgB,EAiCI,OAAO;E/FjH3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FgHI,OAAO;E/F/G3B,YAAY,E+F+E+B,kBAAI;CAiChD;;AAFD,AAAA,WAAW,A5G/GN,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G+GzB,AAAA,WAAW,A/FrGR,MAAM,E+FqGT,AAAA,WAAW,A/FpGR,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+F6FH,AAAA,WAAW,A/F1FR,SAAS,E+F0FZ,AAAA,WAAW,A/FzFR,SAAS,CAAC;EACT,gBAAgB,E+FyFE,OAAO;E/FxFzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FsFH,AAAA,WAAW,A/FpFR,OAAO,E+FoFV,AAAA,WAAW,A/FnFR,OAAO;AACR,A+FkFF,K/FlFO,G+FkFP,WAAW,A/FlFA,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FgFH,AAAA,cAAc,CAAC;EApCb,gBAAgB,EAqCI,OAAO;E/FrH3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FoHI,OAAO;E/FnH3B,YAAY,E+F+E+B,kBAAI;CAqChD;;AAFD,AAAA,cAAc,A5GnHT,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GmHzB,AAAA,cAAc,A/FzGX,MAAM,E+FyGT,AAAA,cAAc,A/FxGX,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FiGH,AAAA,cAAc,A/F9FX,SAAS,E+F8FZ,AAAA,cAAc,A/F7FX,SAAS,CAAC;EACT,gBAAgB,E+F6FE,OAAO;E/F5FzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F0FH,AAAA,cAAc,A/FxFX,OAAO,E+FwFV,AAAA,cAAc,A/FvFX,OAAO;AACR,A+FsFF,K/FtFO,G+FsFP,cAAc,A/FtFH,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FoFH,AAAA,aAAa,CAAC;EAxCZ,gBAAgB,EAyCI,OAAO;E/FzH3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FwHI,OAAO;E/FvH3B,YAAY,E+F+E+B,kBAAI;CAyChD;;AAFD,AAAA,aAAa,A5GvHR,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GuHzB,AAAA,aAAa,A/F7GV,MAAM,E+F6GT,AAAA,aAAa,A/F5GV,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FqGH,AAAA,aAAa,A/FlGV,SAAS,E+FkGZ,AAAA,aAAa,A/FjGV,SAAS,CAAC;EACT,gBAAgB,E+FiGE,OAAO;E/FhGzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F8FH,AAAA,aAAa,A/F5FV,OAAO,E+F4FV,AAAA,aAAa,A/F3FV,OAAO;AACR,A+F0FF,K/F1FO,G+F0FP,aAAa,A/F1FF,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FwFH,AAAA,cAAc,CAAC;EA5Cb,gBAAgB,EA6CI,OAAO;E/F7H3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+F4HI,OAAO;E/F3H3B,YAAY,E+F+E+B,kBAAI;CA6ChD;;AAFD,AAAA,cAAc,A5G3HT,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G2HzB,AAAA,cAAc,A/FjHX,MAAM,E+FiHT,AAAA,cAAc,A/FhHX,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FyGH,AAAA,cAAc,A/FtGX,SAAS,E+FsGZ,AAAA,cAAc,A/FrGX,SAAS,CAAC;EACT,gBAAgB,E+FqGE,OAAO;E/FpGzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FkGH,AAAA,cAAc,A/FhGX,OAAO,E+FgGV,AAAA,cAAc,A/F/FX,OAAO;AACR,A+F8FF,K/F9FO,G+F8FP,cAAc,A/F9FH,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+F4FH,AAAA,WAAW,CAAC;EAhDV,gBAAgB,EAiDI,OAAO;E/FjI3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FgII,OAAO;E/F/H3B,YAAY,E+F+E+B,kBAAI;CAiDhD;;AAFD,AAAA,WAAW,A5G/HN,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G+HzB,AAAA,WAAW,A/FrHR,MAAM,E+FqHT,AAAA,WAAW,A/FpHR,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+F6GH,AAAA,WAAW,A/F1GR,SAAS,E+F0GZ,AAAA,WAAW,A/FzGR,SAAS,CAAC;EACT,gBAAgB,E+FyGE,OAAO;E/FxGzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FsGH,AAAA,WAAW,A/FpGR,OAAO,E+FoGV,AAAA,WAAW,A/FnGR,OAAO;AACR,A+FkGF,K/FlGO,G+FkGP,WAAW,A/FlGA,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FgGH,AAAA,cAAc,CAAC;EApDb,gBAAgB,EAqDI,OAAO;E/FrI3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FoII,OAAO;E/FnI3B,YAAY,E+F+E+B,kBAAI;CAqDhD;;AAFD,AAAA,cAAc,A5GnIT,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GmIzB,AAAA,cAAc,A/FzHX,MAAM,E+FyHT,AAAA,cAAc,A/FxHX,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FiHH,AAAA,cAAc,A/F9GX,SAAS,E+F8GZ,AAAA,cAAc,A/F7GX,SAAS,CAAC;EACT,gBAAgB,E+F6GE,OAAO;E/F5GzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F0GH,AAAA,cAAc,A/FxGX,OAAO,E+FwGV,AAAA,cAAc,A/FvGX,OAAO;AACR,A+FsGF,K/FtGO,G+FsGP,cAAc,A/FtGH,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FoGH,AAAA,WAAW,CAAC;EAxDV,gBAAgB,EAyDI,OAAO;E/FzI3B,KAAK,E+FyIwB,IAAI;E/FxIjC,gBAAgB,E+FwII,OAAO;E/FvI3B,YAAY,E+F+E+B,kBAAI;CAyDhD;;AAFD,AAAA,WAAW,A5GvIN,MAAM,CAAC;EaMR,KAAK,E+FkIsB,IAAI;E/FjI/B,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GuIzB,AAAA,WAAW,A/F7HR,MAAM,E+F6HT,AAAA,WAAW,A/F5HR,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FqHH,AAAA,WAAW,A/FlHR,SAAS,E+FkHZ,AAAA,WAAW,A/FjHR,SAAS,CAAC;EACT,gBAAgB,E+FiHE,OAAO;E/FhHzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F8GH,AAAA,WAAW,A/F5GR,OAAO,E+F4GV,AAAA,WAAW,A/F3GR,OAAO;AACR,A+F0GF,K/F1GO,G+F0GP,WAAW,A/F1GA,gBAAgB,CAAC;EACxB,KAAK,E+F0GsB,IAAI;E/FzG/B,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FwGH,AAAA,eAAe,CAAC;EA5Dd,gBAAgB,EA6DI,OAAO;E/F7I3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+F4II,OAAO;E/F3I3B,YAAY,E+F+E+B,kBAAI;CA6DhD;;AAFD,AAAA,eAAe,A5G3IV,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G2IzB,AAAA,eAAe,A/FjIZ,MAAM,E+FiIT,AAAA,eAAe,A/FhIZ,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FyHH,AAAA,eAAe,A/FtHZ,SAAS,E+FsHZ,AAAA,eAAe,A/FrHZ,SAAS,CAAC;EACT,gBAAgB,E+FqHE,OAAO;E/FpHzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FkHH,AAAA,eAAe,A/FhHZ,OAAO,E+FgHV,AAAA,eAAe,A/F/GZ,OAAO;AACR,A+F8GF,K/F9GO,G+F8GP,eAAe,A/F9GJ,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+F4GH,AAAA,WAAW,CAAC;EAhEV,gBAAgB,EAiEI,OAAO;E/FjJ3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FgJI,OAAO;E/F/I3B,YAAY,E+F+E+B,kBAAI;CAiEhD;;AAFD,AAAA,WAAW,A5G/IN,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G+IzB,AAAA,WAAW,A/FrIR,MAAM,E+FqIT,AAAA,WAAW,A/FpIR,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+F6HH,AAAA,WAAW,A/F1HR,SAAS,E+F0HZ,AAAA,WAAW,A/FzHR,SAAS,CAAC;EACT,gBAAgB,E+FyHE,OAAO;E/FxHzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FsHH,AAAA,WAAW,A/FpHR,OAAO,E+FoHV,AAAA,WAAW,A/FnHR,OAAO;AACR,A+FkHF,K/FlHO,G+FkHP,WAAW,A/FlHA,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FgHH,AAAA,YAAY,CAAC;EApEX,gBAAgB,EAqEI,OAAO;E/FrJ3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FoJI,OAAO;E/FnJ3B,YAAY,E+F+E+B,kBAAI;CAqEhD;;AAFD,AAAA,YAAY,A5GnJP,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GmJzB,AAAA,YAAY,A/FzIT,MAAM,E+FyIT,AAAA,YAAY,A/FxIT,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FiIH,AAAA,YAAY,A/F9HT,SAAS,E+F8HZ,AAAA,YAAY,A/F7HT,SAAS,CAAC;EACT,gBAAgB,E+F6HE,OAAO;E/F5HzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F0HH,AAAA,YAAY,A/FxHT,OAAO,E+FwHV,AAAA,YAAY,A/FvHT,OAAO;AACR,A+FsHF,K/FtHO,G+FsHP,YAAY,A/FtHD,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FoHH,AAAA,UAAU,CAAC;EAxET,gBAAgB,EAyEI,OAAO;E/FzJ3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FwJI,OAAO;E/FvJ3B,YAAY,E+F+E+B,kBAAI;CAyEhD;;AAFD,AAAA,UAAU,A5GvJL,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4GuJzB,AAAA,UAAU,A/F7IP,MAAM,E+F6IT,AAAA,UAAU,A/F5IP,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FqIH,AAAA,UAAU,A/FlIP,SAAS,E+FkIZ,AAAA,UAAU,A/FjIP,SAAS,CAAC;EACT,gBAAgB,E+FiIE,OAAO;E/FhIzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+F8HH,AAAA,UAAU,A/F5HP,OAAO,E+F4HV,AAAA,UAAU,A/F3HP,OAAO;AACR,A+F0HF,K/F1HO,G+F0HP,UAAU,A/F1HC,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+FwHH,AAAA,OAAO,CAAC;EA5EN,gBAAgB,EA6EI,OAAO;E/F7J3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+F4JI,OAAO;E/F3J3B,YAAY,E+F+E+B,kBAAI;CA6EhD;;AAFD,AAAA,OAAO,A5G3JF,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G2JzB,AAAA,OAAO,A/FjJJ,MAAM,E+FiJT,AAAA,OAAO,A/FhJJ,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+FyIH,AAAA,OAAO,A/FtIJ,SAAS,E+FsIZ,AAAA,OAAO,A/FrIJ,SAAS,CAAC;EACT,gBAAgB,E+FqIE,OAAO;E/FpIzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FkIH,AAAA,OAAO,A/FhIJ,OAAO,E+FgIV,AAAA,OAAO,A/F/HJ,OAAO;AACR,A+F8HF,K/F9HO,G+F8HP,OAAO,A/F9HI,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;A+F4HH,AAAA,UAAU,CAAC;EAhFT,gBAAgB,EAiFI,OAAO;E/FjK3B,KAAK,E+F+E8B,IAAI;E/F9EvC,gBAAgB,E+FgKI,OAAO;E/F/J3B,YAAY,E+F+E+B,kBAAI;CAiFhD;;AAFD,AAAA,UAAU,A5G/JL,MAAM,CAAC;EaMR,KAAK,E+FwE4B,IAAI;E/FvErC,gBAAgB,EAXE,OAAM;EAYxB,YAAY,EAXE,kBAAM;CbGC;;A4G+JzB,AAAA,UAAU,A/FrJP,MAAM,E+FqJT,AAAA,UAAU,A/FpJP,MAAM,CAAC;EAKJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,C+FgEkB,kBAAI;C/F9D9C;;A+F6IH,AAAA,UAAU,A/F1IP,SAAS,E+F0IZ,AAAA,UAAU,A/FzIP,SAAS,CAAC;EACT,gBAAgB,E+FyIE,OAAO;E/FxIzB,YAAY,E+FwD6B,kBAAI;C/FvD9C;;A+FsIH,AAAA,UAAU,A/FpIP,OAAO,E+FoIV,AAAA,UAAU,A/FnIP,OAAO;AACR,A+FkIF,K/FlIO,G+FkIP,UAAU,A/FlIC,gBAAgB,CAAC;EACxB,KAAK,E+FgD4B,IAAI;E/F/CrC,gBAAgB,EAnCE,OAAM;EAoCxB,gBAAgB,EAAE,IAAK;EACvB,YAAY,EApCE,kBAAM;CAsCrB;;AgG7CH;;;GAGG;AAEH,AAAA,UAAU,CAAC;EACT,UAAU,EAAE,OAAQ;EACpB,gBAAgB,EAAE,IAAK;EACvB,KAAK,EAAE,IAAK;EACZ,YAAY,EAAE,IAAK;EACnB,mBAAmB,EAAE,IAAK;CAM3B;;AAXD,AAAA,UAAU,AAMP,MAAM,EANT,AAAA,UAAU,AAOP,OAAO,EAPV,AAAA,UAAU,AAQP,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAQ;CAC3B;;AAIH,AAAiB,gBAAD,CAAC,EAAE,CAAC;EAClB,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,KAAM;EACnB,KAAK,EAAE,IAAK;EACZ,WAAW,EAAE,IAAK;CACnB;;AAED,AAAA,gBAAgB,CAAC;EACf,aAAa,EAAE,IAAK;CACrB;;AAED,AAAA,eAAe,CAAC;EACd,YAAY,EAAE,IAAK;CACpB;;AAGD,AAAA,iBAAiB,CAAC;EAChB,UAAU,EAAE,OAAQ;CACrB;;AAED,AAAA,QAAQ,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,CAAE;CACX;;AAED,AAAiB,iBAAA,AAAA,cAAc;AAC/B,AAAkB,kBAAA,AAAA,cAAc,CAAC;EAC/B,WAAW,EAAE,CAAE;EACf,YAAY,EAAE,CAAE;CACjB;;AAED,AAAiB,iBAAA,AAAA,aAAa;AAC9B,AAAkB,kBAAA,AAAA,aAAa,CAAC;EAC9B,YAAY,EAAE,CAAE;CACjB;;AAED,AAAA,WAAW,CAAC;EACV,OAAO,ElCuCK,IAAI;EkCtChB,MAAM,EAAE,CAAE;CACX;;AAED,AAAA,cAAc,CAAC;EACb,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI;EACjB,aAAa,EAAE,IAAK;CACrB;;AAED,AAAA,gBAAgB,CAAC;EACf,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE;CAaZ;;AAhBD,AAII,gBAJY,GAIZ,EAAE,CAAC;EACH,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;EAChB,YAAY,EAAE,GAAI;EAClB,WAAW,EAAE,IAAK;CAOnB;;AAfH,AASI,gBATY,GAIZ,EAAE,CAKF,GAAG,CAAC;EACF,UAAU,EAAE,oBAAqB;CAIlC;;AAdL,AASI,gBATY,GAIZ,EAAE,CAKF,GAAG,AAEA,MAAM,CAAC;EjCUZ,aAAa,EAAE,aAAM;EACrB,SAAS,EAAE,aAAM;CiCTZ;;AAKP,AAAA,cAAc,CAAC;EACb,UAAU,EAAE,cAAe;CAC5B;;AAED,AAAA,eAAe,CAAC;EACd,OAAO,EAAE,QAAS;EAClB,WAAW,EAAE,IAAK;EAClB,aAAa,EAAE,GAAI;EACnB,UAAU,ElCEI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EkCD5B,WAAW,ElCCG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EkCA5B,aAAa,ElCFK,GAAG;EkCGrB,MAAM,EAAE,IAAK;CAId;;AAXD,AAAA,eAAe,AAQZ,MAAM,CAAC;EACN,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAI;CAChC;;AClGH;;;GAGG;AAGH,AAAA,2BAA2B,AAExB,yBAAyB,EAF5B,AAAA,2BAA2B,AAGxB,MAAM,EAHT,AAAA,2BAA2B,AAIxB,OAAO;AAHV,AAAA,kBAAkB,AACf,yBAAyB;AAD5B,AAAA,kBAAkB,AAEf,MAAM;AAFT,AAAA,kBAAkB,AAGf,OAAO,CAAC;EACP,OAAO,EAAE,IAAK;CACf;;AANH,AAOE,2BAPyB,CAOzB,0BAA0B;AAN5B,AAME,kBANgB,CAMhB,0BAA0B,CAAC;EACzB,MAAM,EAAE,GAAG,CAAC,KAAK,CnCQN,OAAO;EmCNlB,OAAO,EAAE,QAAS;EAClB,MAAM,EAAE,IAAK;CACd;;AAGH,AAA2B,2BAAA,AAAA,wBAAwB,CAAC;EAClD,YAAY,EnH8EL,OAAO;CmH7Ef;;AAED,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAE,GAAG,CAAC,KAAK,CnCJJ,OAAO;CmCMrB;;AAED,AAA+E,2BAApD,CAAC,qCAAqC,CAAA,AAAA,aAAC,AAAA,EAAe;EAC/E,gBAAgB,EnHqET,OAAO;EmHpEd,KAAK,EAAE,KAAM;CACd;;AAED,AAAA,wBAAwB,CAAC;EACvB,OAAO,EAAE,QAAS;EAClB,WAAW,EAAE,IAAK;EAClB,mBAAmB,EAAE,IAAK;CAC3B;;AAED,AAA8C,kBAA5B,CAAC,0BAA0B,CAAC,4BAA4B,CAAC;EACzE,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;EACjB,MAAM,EAAE,IAAK;EACb,UAAU,EAAE,IAAK;CAClB;;AAED,AAAyD,kBAAvC,CAAA,AAAA,GAAC,CAAI,KAAK,AAAT,EAAW,0BAA0B,CAAC,4BAA4B,CAAC;EACpF,aAAa,EAAE,GAAI;EACnB,YAAY,EAAE,IAAK;CACpB;;AAED,AAAuD,2BAA5B,CAAC,0BAA0B,CAAC,yBAAyB,CAAC;EAC/E,MAAM,EAAE,IAAK;EACb,KAAK,EAAE,GAAI;CACZ;;AAED,AAAiF,2BAAtD,CAAC,0BAA0B,CAAC,yBAAyB,CAAC,CAAC,CAAC;EACjF,UAAU,EAAE,CAAE;CACf;;AAED,AAEE,iBAFe,CAEf,sBAAsB;AADxB,AACE,uBADqB,CACrB,sBAAsB,CAAC;EACrB,MAAM,EAAE,GAAG,CAAC,KAAK,CnC3CN,OAAO;CmCgDnB;;AARH,AAEE,iBAFe,CAEf,sBAAsB,AAEnB,MAAM;AAHX,AACE,uBADqB,CACrB,sBAAsB,AAEnB,MAAM,CAAC;EACN,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,GAAG,CAAC,KAAK,CnHgCd,OAAO;CmH/BX;;AAIL,AAAuE,2BAA5C,CAAC,wBAAwB,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB;EACvE,KAAK,EAAE,IAAK;CACb;;AAED,AAAuE,2BAA5C,CAAC,wBAAwB,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB;EACvE,gBAAgB,EAAE,IAAK;CAKxB;;AAND,AAAuE,2BAA5C,CAAC,wBAAwB,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,GAArD,AAAuE,2BAA5C,CAAC,wBAAwB,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,CAGlD,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AAIH,AACE,2BADyB,CACzB,4BAA4B,CAAC;EAC3B,MAAM,EAAE,GAAG,CAAC,KAAK,CnClEN,OAAO;CmCuEnB;;AAPH,AACE,2BADyB,CACzB,4BAA4B,AAGzB,MAAM,CAAC;EACN,YAAY,EnHST,OAAO;CmHRX;;AANL,AAQ6B,2BARF,AAQxB,yBAAyB,CAAC,4BAA4B,CAAC;EACtD,YAAY,EnCzED,OAAO;CmC0EnB;;AAGH,AAAyD,2BAA9B,CAAC,4BAA4B,CAAC,0BAA0B,CAAC;EAClF,gBAAgB,EnHAT,OAAO;EmHCd,YAAY,EAAE,OAAM;EACpB,OAAO,EAAE,QAAS;EAClB,KAAK,EAAE,IAAK;CACb;;AAED,AAAyD,2BAA9B,CAAC,4BAA4B,CAAC,kCAAkC,CAAC;EAC1F,YAAY,EAAE,GAAI;EAClB,KAAK,EAAE,wBAAI;CAIZ;;AAND,AAAyD,2BAA9B,CAAC,4BAA4B,CAAC,kCAAkC,AAGxF,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AAGH,AAA8C,kBAA5B,CAAC,0BAA0B,CAAC,4BAA4B,CAAC;EACzE,aAAa,EAAE,IAAK;CACrB;;ACpHD;;;GAGG;AAEH,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,IAAK;CACf;;AAED,AAAA,OAAO,CAAC;EACN,MAAM,EAAE,IAAK;CACd;;AAED,AAAA,cAAc,CAAC;EACb,aAAa,EAAE,IAAK;CACrB;;AAED,AAAA,mBAAmB,CAAC;EAClB,aAAa,EAAE,CAAE;CAClB;;AAED,AAAA,WAAW,CAAC;EACV,YAAY,EAAE,GAAI;CACnB;;AAGD,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,MAAO;CACjB;;AAGD,AAAA,kBAAkB,CAAC;EACjB,OAAO,EAAE,KAAM;EACf,MAAM,EAAE,MAAO;EACf,UAAU,EAAE,MAAO;CAapB;;AAhBD,AAAA,kBAAkB,AAIf,cAAc,CAAC;EACd,aAAa,EAAE,IAAK;CACrB;;AANH,AAOI,kBAPc,GAOd,mBAAmB,CAAC;EACpB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE;EACX,WAAW,EAAE,GAAI;EACjB,SAAS,EAAE,IAAK;CACjB;;AAZH,AAaI,kBAbc,GAad,iBAAiB,CAAC;EAClB,cAAc,EAAE,SAAU;CAC3B;;AAIH,AAAA,OAAO,ErB5CP,AqB4CA,QrB5CQ,AAyBL,eAAe,ECClB,AoBkBA,apBlBa;AACb,AoBiBA,YpBjBY,EIxBZ,AgByCA,ahBzCa,EK6Db,AWpBA,aXoBa,CACX,WAAW;AWpBb,AAAA,UAAU;ArB7CV,AqB4CO,QrB5CC,AA6BL,gBAAgB;ACGnB,AoBYO,cpBZO;AIrBd,AgBiCO,chBjCO;AKoBd,AWaO,cXbO,CACZ,WAAW;AWcb,AAAA,QAAQ;ArB9CR,AqB6CU,QrB7CF,AAiCL,aAAa;ACIhB,AoBQU,WpBRC;AI9BX,AgBsCU,WhBtCC;AKmCX,AWGU,WXHC,CACT,WAAW;AWIb,AAAA,QAAQ;AACR,AAAA,cAAc;AhBjCd,AgBgCQ,chBhCM;AKKd,AW2BQ,cX3BM,CACZ,WAAW;AW4Bb,AAAA,SAAS;ArBjDT,AqBgDc,QrBhDN,AAqCL,gBAAgB;AChBnB,AoB2Bc,cpB3BA;AIFd,AgB6Bc,chB7BA;AKkCd,AWLc,cXKA,CACZ,WAAW;AWJb,AAAA,QAAQ;AACR,AAAA,QAAQ;AACR,AAAA,SAAS;AACT,AAAA,QAAQ;AACR,AAAA,UAAU;AACV,AAAA,WAAW;AACX,AAAA,UAAU;AACV,AAAA,UAAU;AACV,AAAA,SAAS;AACT,AAAA,cAAc;AXKd,AWNS,aXMI,CAIX,aAAa;AAJf,AWNS,aXMI,CAKX,aAAa;AWTf,AAAA,iBAAiB;AX7BjB,AW4Bc,cX5BA,CAIZ,aAAa;AAJf,AW4Bc,cX5BA,CAKZ,aAAa;AWyBf,AAAA,eAAe;AXnBf,AWkBiB,WXlBN,CAIT,aAAa;AAJf,AWkBiB,WXlBN,CAKT,aAAa;AWef,AAAA,eAAe;AACf,AAAA,qBAAqB;AX3CrB,AW0Ce,cX1CD,CAIZ,aAAa;AAJf,AW0Ce,cX1CD,CAKZ,aAAa;AWuCf,AAAA,gBAAgB;AXXhB,AWUqB,cXVP,CAIZ,aAAa;AAJf,AWUqB,cXVP,CAKZ,aAAa;AWOf,AAAA,eAAe;AACf,AAAA,eAAe;AACf,AAAA,gBAAgB;AAChB,AAAA,eAAe;AACf,AAAA,iBAAiB;AACjB,AAAA,kBAAkB;AAClB,AAAA,iBAAiB;AACjB,AAAA,iBAAiB;AACjB,AAAA,gBAAgB,CAAC;EACf,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,QAAQ,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,gBAAgB,EpHsBU,OAAO;CoHrBlC;;AAED,AAAA,cAAc,CAAC;EACb,gBAAgB,EAAE,OAAQ;CAC3B;;AAED,AAAA,SAAS,CAAC;EACR,gBAAgB,EpHET,IAAI;CoHDZ;;AAED,AAAA,OAAO,ErB1FP,AqB0FA,QrB1FQ,AAyBL,eAAe,ECClB,AoBgEA,apBhEa;AACb,AoB+DA,YpB/DY,EIxBZ,AgBuFA,ahBvFa,EK6Db,AW0BA,aX1Ba,CACX,WAAW,CWyBL;EACN,gBAAgB,EpHDT,OAAO;CoHEf;;AAED,AAAA,UAAU,ErB9FV,AqB8FA,QrB9FQ,AA6BL,gBAAgB,ECGnB,AoB8DA,cpB9Dc,EIrBd,AgBmFA,chBnFc,EKoBd,AW+DA,cX/Dc,CACZ,WAAW,CW8DF;EACT,gBAAgB,EpHJT,OAAO;CoHKf;;AAED,AAAA,QAAQ,ErBlGR,AqBkGA,QrBlGQ,AAiCL,aAAa,ECIhB,AoB6DA,WpB7DW,EI9BX,AgB2FA,WhB3FW,EKmCX,AWwDA,WXxDW,CACT,WAAW,CWuDJ;EACP,gBAAgB,EpHJT,OAAO;CoHKf;;AAED,AAAA,QAAQ,CAAC;EACP,gBAAgB,EpHTT,OAAO;CoHUf;;AAED,AAAA,cAAc,EhB3Fd,AgB2FA,chB3Fc,EKKd,AWsFA,cXtFc,CACZ,WAAW,CWqFE;EACb,gBAAgB,EpHbT,OAAO;CoHcf;;AAED,AAAA,SAAS,ErB9GT,AqB8GA,QrB9GQ,AAqCL,gBAAgB,EChBnB,AoByFA,cpBzFc,EIFd,AgB2FA,chB3Fc,EKkCd,AWyDA,cXzDc,CACZ,WAAW,CWwDH;EACR,gBAAgB,EpHlBT,OAAO;CoHmBf;;AAED,AAAA,QAAQ,CAAC;EACP,gBAAgB,EpCpGX,OAAO;CoCqGb;;AAED,AAAA,QAAQ,CAAC;EACP,gBAAgB,EpHxBT,OAAO;CoHyBf;;AAED,AAAA,SAAS,CAAC;EACR,gBAAgB,EpC9GV,OAAO;CoC+Gd;;AAED,AAAA,QAAQ,CAAC;EACP,gBAAgB,EpCjHX,OAAO;CoCkHb;;AAED,AAAA,UAAU,CAAC;EACT,gBAAgB,EpHxCT,OAAO;CoHyCf;;AAED,AAAA,WAAW,CAAC;EACV,gBAAgB,EpC9HR,OAAO;CoC+HhB;;AAED,AAAA,UAAU,CAAC;EACT,gBAAgB,EpH1CT,OAAO;CoH2Cf;;AAED,AAAA,UAAU,CAAC;EACT,gBAAgB,EpCpIT,OAAO;CoCqIf;;AAGD,AAAA,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;EACZ,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,gBAAgB,CAAC;EACf,gBAAgB,EAAE,KAAM;CACzB;;AAED,AAAA,cAAc,EX5Fd,AW4FA,aX5Fa,CAIX,aAAa;AAJf,AW4FA,aX5Fa,CAKX,aAAa,CWuFA;EACb,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,iBAAiB,EXjIjB,AWiIA,cXjIc,CAIZ,aAAa;AAJf,AWiIA,cXjIc,CAKZ,aAAa,CW4HG;EAChB,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,eAAe,EX1Hf,AW0HA,WX1HW,CAIT,aAAa;AAJf,AW0HA,WX1HW,CAKT,aAAa,CWqHC;EACd,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,eAAe,CAAC;EACd,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,qBAAqB,EXxJrB,AWwJA,cXxJc,CAIZ,aAAa;AAJf,AWwJA,cXxJc,CAKZ,aAAa,CWmJO;EACpB,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,gBAAgB,EX3HhB,AW2HA,cX3Hc,CAIZ,aAAa;AAJf,AW2HA,cX3Hc,CAKZ,aAAa,CWsHE;EACf,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,eAAe,CAAC;EACd,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,eAAe,CAAC;EACd,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,gBAAgB,CAAC;EACf,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,eAAe,CAAC;EACd,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,iBAAiB,CAAC;EAChB,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,kBAAkB,CAAC;EACjB,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,iBAAiB,CAAC;EAChB,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,iBAAiB,CAAC;EAChB,gBAAgB,EAAE,OAAM;CACzB;;AAED,AAAA,SAAS,CAAC;EACR,gBAAgB,EAAE,IAAK;CACxB;;CAGD,AAAA,AAAc,KAAb,EAAO,KAAK,AAAZ,CAAa,SAAS,CAAC;EACtB,OAAO,EAAE,GAAI;CACd;;AAGD,AAAA,SAAS,CAAC;EACR,KAAK,EpHrIE,OAAO;CoHsIf;;AAED,AAAA,YAAY,CAAC;EACX,KAAK,EpHxIE,OAAO;CoHyIf;;AAED,AAAA,UAAU,CAAC;EACT,KAAK,EpHxIE,OAAO;CoHyIf;;AAED,AAAA,UAAU,CAAC;EACT,KAAK,EpH7IE,OAAO;CoH8If;;AAED,AAAA,WAAW,CAAC;EACV,KAAK,EpHtJE,IAAI;CoHuJZ;;AAED,AAAA,gBAAgB,CAAC;EACf,KAAK,EpHrJE,OAAO;CoHsJf;;AAED,AAAA,WAAW,CAAC;EACV,KAAK,EpH1JE,OAAO;CoH2Jf;;AAED,AAAA,UAAU,CAAC;EACT,KAAK,EpHtJqB,OAAO;CoHuJlC;;AAED,AAAA,UAAU,CAAC;EACT,KAAK,EpChPA,OAAO;CoCiPb;;AAED,AAAA,UAAU,CAAC;EACT,KAAK,EpHpKE,OAAO;CoHqKf;;AAED,AAAA,WAAW,CAAC;EACV,KAAK,EpC1PC,OAAO;CoC2Pd;;AAED,AAAA,UAAU,CAAC;EACT,KAAK,EpC7PA,OAAO;CoC8Pb;;AAED,AAAA,YAAY,CAAC;EACX,KAAK,EpHpLE,OAAO;CoHqLf;;AAED,AAAA,aAAa,CAAC;EACZ,KAAK,EpC1QG,OAAO;CoC2QhB;;AAED,AAAA,YAAY,CAAC;EACX,KAAK,EpHtLE,OAAO;CoHuLf;;AAED,AAAA,YAAY,CAAC;EACX,KAAK,EpChRE,OAAO;CoCiRf;;AAED,AAAA,WAAW,CAAC;EACV,KAAK,EAAE,KAAM;CAKd;;AAND,AAAA,WAAW,AAER,MAAM,EAFT,AAAA,WAAW,AAGR,MAAM,CAAC;EACN,KAAK,EAAE,KAAM;CACd;;AAGH,AAAA,WAAW,CAAC;EACV,KAAK,EAAE,IAAK;CAKb;;AAND,AAAA,WAAW,AAER,MAAM,EAFT,AAAA,WAAW,AAGR,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AAIH,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,eAAgB;CAC1B;;AAGD,AAAA,UAAU,CAAC;EACT,MAAM,EAAE,YAAa;CACtB;;AAGD,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,YAAa;CACvB;;AAGD,AAAA,UAAU,CAAC;EACT,MAAM,EAAE,YAAa;CACtB;;AAGD,AAAA,UAAU,CAAC;EACT,UAAU,EAAE,eAAgB;CAC7B;;AAGD,AAAA,cAAc,EzBjDd,AyBiDA,azBjDa,EU7Jb,Ae8MA,cf9Mc,EC5Hd,Ac0UA,Wd1UW,EKmCX,ASuSA,oBTvSoB,CSuSL;EACb,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE;CACZ;;AAED,AACI,sBADkB,GAClB,gBAAgB,CAAC;EACjB,WAAW,EAAE,CAAE;EACf,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,CAAE;EAChB,aAAa,EAAE,CAAE;CAClB;;AAIH,AAAA,KAAK,CAAC;EzF3VF,aAAa,EyF4VQ,CAAC,CAAC,UAAU;CACpC;;AAED,AAAA,UAAU,EAAV,AACa,UADH,AACJ,MAAM,CAAC,EAAE,EADf,AACyB,UADf,AACQ,MAAM,CAAC,EAAE,CAAC;EACxB,WAAW,EAAE,GAAI;CAClB;;AAGH,AAAA,QAAQ,CAAC;EACP,SAAS,EpH7GM,QAAO;CoH8GvB;;AAED,AAAA,QAAQ,CAAC;EACP,SAAS,EpHhHM,OAAM;CoHiHtB;;AAGD,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,cAAe;EACxB,KAAK,EAAE,eAAgB;EACvB,MAAM,EAAE,eAAgB;CACzB;;AAGD,AAAA,iBAAiB,CAAC;EnCxRhB,UAAU,EjFIH,OAAO;EiFHd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmCsR9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,uBAAuB,CAAC;EnC7RtB,UAAU,EjFGH,OAAO;EiFFd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmC2R9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,iBAAiB,CAAC;EnClShB,UAAU,EjFGH,OAAO;EiFFd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmCgS9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,iBAAiB,CAAC;EnCvShB,UAAU,EjFIH,OAAO;EiFHd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmCqS9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,mBAAmB,CAAC;EnC5SlB,UAAU,EjFAH,OAAO;EiFCd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmC0S9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,mBAAmB,CAAC;EnCjTlB,UAAU,EjFMH,OAAO;EiFLd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmC+S9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,kBAAkB,CAAC;EnCtTjB,UAAU,EjFEH,OAAO;EiFDd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmCoT9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,gBAAgB,CAAC;EnC3Tf,UAAU,EjFDH,OAAO;EiFEd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmCyT9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,kBAAkB,CAAC;EnChUjB,UAAU,EjFFH,IAAI;EiFGX,UAAU,EAAE,4FAAgB;EAC5B,UAAU,EAAE,0CAAmB;EAC/B,UAAU,EAAE,0DAAoB;EAChC,UAAU,EAAE,iCAAkB;EmC8T9B,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,mBAAmB,CAAC;EnCrUlB,UAAU,EDhFH,OAAO;ECiFd,UAAU,EAAE,+FAAgB;EAC5B,UAAU,EAAE,6CAAmB;EAC/B,UAAU,EAAE,6DAAoB;EAChC,UAAU,EAAE,oCAAkB;EmCmU9B,KAAK,EAAE,IAAK;CACb;;AAGD,AACE,kBADgB,CAChB,iBAAiB,CAAC;EAChB,SAAS,EAAE,IAAK;CACjB;;AAIH,AAAA,WAAW,CAAC;EACV,WAAW,EAAE,CAAE;CAChB;;AAGD,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,iBAAkB;CAC7B;;AAGD,AAAA,YAAY,CAAC;EACX,SAAS,EAAE,IAAK;EAChB,OAAO,EAAE,QAAS;EAClB,WAAW,EAAE,IAAK;EAClB,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,eAAe,CAAC;EACd,MAAM,EAAE,GAAI;EACZ,UAAU,EpC3WO,OAAO;EoC4WxB,MAAM,EAAE,YAAa;CACtB;;AAED,AACI,UADM,GACN,CAAC,CAAC;EACF,OAAO,EAAE,GAAI;EACb,KAAK,EAAE,IAAK;CAIb;;AAPH,AACI,UADM,GACN,CAAC,AAGA,MAAM,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AAKL,AAAA,WAAW,CAAC;EACV,WAAW,EAAE,GAAI;CAClB;;AAGD,AAAA,WAAW,AvFzdR,OAAO,CAAC;EACP,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,EAAG;EACZ,KAAK,EAAE,IAAK;CACb;;AuFqdH,AAEE,WAFS,CAET,GAAG,CAAC;EACF,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,KAAK,EAAE,IAAK;CACb;;AANH,AAOE,WAPS,CAOT,SAAS;AAPX,AAQE,WARS,CAQT,YAAY;AARd,AASE,WATS,CAST,QAAQ,CAAC;EACP,OAAO,EAAE,KAAM;EACf,WAAW,EAAE,IAAK;CACnB;;AAZH,AAaE,WAbS,CAaT,SAAS,CAAC;EACR,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI;CAClB;;AAhBH,AAiBE,WAjBS,CAiBT,YAAY,CAAC;EACX,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;CACjB;;AApBH,AAyBI,WAzBO,AAqBR,cAAc,CAIb,SAAS;AAzBb,AA0BI,WA1BO,AAqBR,cAAc,CAKb,YAAY;AA1BhB,AA2BI,WA3BO,AAqBR,cAAc,CAMb,QAAQ,CAAC;EACP,WAAW,EAAE,IAAK;CACnB;;AA7BL,AA8BI,WA9BO,AAqBR,cAAc,CASb,SAAS,CAAC;EACR,SAAS,EAAE,IAAK;CACjB;;AAKL,AAAA,OAAO,EzBtNP,AyBsNA,azBtNa,CAEX,YAAY,CAUV,GAAG,EyBqKP,AAqCA,WArCW,AAqBR,cAAc,CACb,GAAG;AAgBP,AAAA,OAAO;AACP,AAAA,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,OAAO,EzB5NP,AyB4NA,azB5Na,CAEX,YAAY,CAUV,GAAG,EyBqKP,AA2CA,WA3CW,AAqBR,cAAc,CACb,GAAG,CAqBC;EACN,KAAK,EAAE,eAAgB;EACvB,MAAM,EAAE,eAAgB;CAIzB;;AAND,AAGI,OAHG,GAGH,SAAS,EzB/Nb,AyB+NI,azB/NS,CAEX,YAAY,CAUV,GAAG,GyBmNH,SAAS,EA9Cb,AA8CI,WA9CO,AAqBR,cAAc,CACb,GAAG,GAwBH,SAAS,CAAC;EACV,WAAW,EAAE,IAAK;CACnB;;AAGH,AAAA,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;CAId;;AAND,AAGI,OAHG,GAGH,SAAS,CAAC;EACV,WAAW,EAAE,IAAK;CACnB;;AAGH,AAAA,OAAO,CAAC;EACN,KAAK,EAAE,KAAM;EACb,MAAM,EAAE,KAAM;CAIf;;AAND,AAGI,OAHG,GAGH,SAAS,CAAC;EACV,WAAW,EAAE,KAAM;CACpB;;AAIH,AAAA,aAAa,CAAC;EACZ,MAAM,EAAE,GAAG,CAAC,KAAK,CpHpbS,OAAO;EoHqbjC,OAAO,EAAE,GAAI;CACd;;AAED,AAAA,gBAAgB,CAAC;EACf,MAAM,EAAE,GAAG,CAAC,KAAK,CpHzbS,OAAO;EoH0bjC,OAAO,EAAE,GAAI;CACd;;AAGD,AAAA,YAAY,CAAC;EzFriBT,aAAa,E3B4TQ,OAAM;CoH2O9B;;AAED,AAAA,WAAW,CAAC;EzFziBR,aAAa,EyF0iBQ,GAAG;CAC3B;;AAGD,AAAA,YAAY;AACZ,AAAA,YAAY;AACZ,AAAA,YAAY,CAAC;EACX,MAAM,EAAE,IAAK;CACd;;AAED,AAAA,YAAY,CAAC;EACX,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,YAAY,CAAC;EACX,KAAK,EAAE,IAAK;CACb;;AAED,AAAA,YAAY,CAAC;EACX,KAAK,EAAE,IAAK;CACb;;AAGD,AAAA,QAAQ;AACR,AAAA,QAAQ;AACR,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,KAAM;EACf,UAAU,EAAE,MAAO;CACpB;;AAED,AAAA,QAAQ,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,WAAW,EAAE,IAAK;CACnB;;AAED,AAAA,QAAQ,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,WAAW,EAAE,IAAK;CACnB;;AAED,AAAA,QAAQ,CAAC;EACP,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,WAAW,EAAE,IAAK;CACnB;;AAGD,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAE,GAAG,CAAC,KAAK,CpCrgBA,OAAO;EoCsgBxB,OAAO,EAAE,GAAI;EACb,aAAa,EAAE,IAAK;EACpB,UAAU,EAAE,OAAQ;CAiBrB;;AArBD,AAME,iBANe,CAMf,eAAe,CAAC;EACd,SAAS,EAAE,KAAM;EACjB,UAAU,EAAE,KAAM;EAClB,MAAM,EAAE,IAAK;EACb,KAAK,EAAE,IAAK;CACb;;AAXH,AAYE,iBAZe,CAYf,kBAAkB,CAAC;EACjB,WAAW,EAAE,KAAM;CACpB;;AAdH,AAeE,iBAfe,CAef,mBAAmB,CAAC;EAClB,MAAM,EAAE,CAAE;CACX;;AAjBH,AAkBE,iBAlBe,CAkBf,gBAAgB,CAAC;EACf,KAAK,EAAE,IAAK;CACb;;AAGH,AAAA,kBAAkB,CAAC;EACjB,UAAU,EAAE,KAAM;CACnB;;AAED,AAAA,4BAA4B,CAAC;EAC3B,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,aAAI;EACV,MAAM,EAAE,GAAI;EACZ,MAAM,EAAE,IAAK;EACb,QAAQ,EAAE,MAAO;EACjB,OAAO,EAAE,CAAE;EACX,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,GAAI;CACZ;;AAED,AAAA,eAAe,CAAC;EACd,UAAU,EAAE,OAAQ;EACpB,MAAM,EAAE,eAAgB;EACxB,aAAa,EAAE,IAAK;CACrB;;AAED,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,GAAI;CAId;;AALD,AAAA,mBAAmB,AAEhB,MAAM,CAAC;EACN,OAAO,EAAE,CAAE;CACZ;;AAIH,AAAA,MAAM,CAAC;EACL,QAAQ,EAAE,QAAS;EACnB,QAAQ,EAAE,MAAO;EACjB,KAAK,EAAE,IAAK;CAKb;;AARD,AAIE,MAJI,CAIJ,GAAG;AAJL,AAKE,MALI,CAKJ,MAAM,CAAC;EACL,KAAK,EAAE,eAAgB;CACxB;;AAIH,AAAA,UAAU,CAAC;EACT,KAAK,EAAE,IAAK;CACb;;AChqBD;;;GAGG;AACH,MAAM,CAAN,KAAK;EAEH,AAAA,SAAS,EAKT,AALA,aAKa;EACb,AANA,YAMY;EACZ,AAPA,eAOe,CAPL;IACR,OAAO,EAAE,eAAgB;GAC1B;EAUD,AAAA,gBAAgB;EAChB,AAAA,YAAY,CAAC;IACX,WAAW,EAAE,YAAa;IAC1B,UAAU,EAAE,YAAa;IpCkD3B,iBAAiB,EAAE,eAAS;IAC5B,aAAa,EAAE,eAAS;IACxB,SAAS,EAAE,eAAS;GoClDnB;EAED,AAAc,aAAD,CAAC,gBAAgB,CAAC;IAC7B,WAAW,EAAE,YAAa;GAC3B;EAGD,AAAA,QAAQ,CAAC;IACP,KAAK,EAAE,IAAK;IACZ,MAAM,EAAE,CAAE;IACV,MAAM,EAAE,CAAE;IACV,OAAO,EAAE,CAAE;GACZ;EAED,AAAA,YAAY,CAAC;IACX,KAAK,EAAE,IAAK;IACZ,KAAK,EAAE,WAAY;GACpB;EAGD,AAAA,iBAAiB,CAAC;IAChB,QAAQ,EAAE,IAAK;GAKhB;EAND,AAEc,iBAFG,GAEb,MAAM,CAAC,EAAE,CAAC,EAAE;EAFhB,AAGc,iBAHG,GAGb,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACb,WAAW,EAAE,iBAAkB;GAChC;;;AEhDL;;;GAGG;AACH,AAEE,UAFQ,CAER,YAAY,CAAC;EAAC;;;;;;;;;;;;;;;;;;;;;;;;OAwBT;CASJ;;AAnCH,AA4BI,UA5BM,CAER,YAAY,CA0BV,KAAK,CAAC;EtCER,gBAAgB,EsCDU,OAAM;EtCEhC,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;CsCCzE;;AA9BL,AA4BI,UA5BM,CAER,YAAY,CA0BV,KAAK,AtCMN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AsCpCH,AAgCM,UAhCI,CAER,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,EvH+Db,OAAO;CuH9DX;;AAlCL,AtCyGE,UsCzGQ,CtCyGR,aAAa;AsCzGf,AtC0Ge,UsC1GL,CtC0GR,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,ED/CF,OAAO;CCgDtB;;AsC5GH,AtCgHI,UsChHM,CtC+GR,WAAW,CACT,KAAK;AsChHT,AtCiHI,UsCjHM,CtC+GR,WAAW,CAET,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AsCnHL,AtCqHI,UsCrHM,CtC+GR,WAAW,CAMT,OAAO,CAAC;EACN,KAAK,EDxDU,OAAO;ECyDtB,UAAU,ED1DQ,OAAM;CCiEzB;;AsC9HL,AtCqHI,UsCrHM,CtC+GR,WAAW,CAMT,OAAO,AAGJ,MAAM,EsCxHb,AtCqHI,UsCrHM,CtC+GR,WAAW,CAMT,OAAO,AAIJ,MAAM,EsCzHb,AtCqHI,UsCrHM,CtC+GR,WAAW,CAMT,OAAO,AAKJ,OAAO,CAAC;EACP,KAAK,ED5Dc,IAAI;EC6DvB,UAAU,EAAE,OAAM;CACnB;;AsC7HP,AtCgII,UsChIM,CtC+GR,WAAW,CAiBT,cAAc,CAAC;EACb,YAAY,EAAE,OAAM;CAErB;;AsCnIL,AtCqII,UsCrIM,CtC+GR,WAAW,CAsBT,cAAc,CAAC;EACb,KAAK,EjFhCiB,OAAO;CiFiC9B;;AsCvIL,AtC6IM,UsC7II,CtC2IR,YAAY,GAAG,SAAS,GAEpB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;CAKpC;;AsCnJL,AtC6IM,UsC7II,CtC2IR,YAAY,GAAG,SAAS,GAEpB,SAAS,AAER,OAAO,EsC/Id,AtC6IM,UsC7II,CtC2IR,YAAY,GAAG,SAAS,GAEpB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,EDnFQ,OAAO;CCoFrB;;AsClJP,AtCsJkB,UsCtJR,CtC2IR,YAAY,GAAG,SAAS,AAWrB,UAAU,GAAG,SAAS;AsCtJ3B,AtCuJc,UsCvJJ,CtC2IR,YAAY,GAAG,SAAS,AAYrB,MAAM,GAAG,SAAS;AsCvJvB,AtCwJe,UsCxJL,CtC2IR,YAAY,GAAG,SAAS,GAapB,SAAS,AAAA,OAAO,CAAC;EACjB,KAAK,ED1FgB,IAAI;EC2FzB,UAAU,ED7FQ,OAAM;CC8FzB;;AsC3JL,AtC6Je,UsC7JL,CtC2IR,YAAY,GAAG,SAAS,GAkBpB,SAAS,AAAA,OAAO,CAAC;EACjB,iBAAiB,EjF9Dd,OAAO;CiF+DX;;AsC/JL,AtCkKM,UsClKI,CtC2IR,YAAY,GAAG,SAAS,GAuBpB,aAAa,CAAC;EACd,MAAM,EAAE,KAAM;EACd,UAAU,EDpGU,OAAO;CCqG5B;;AsCrKL,AtCyKE,UsCzKQ,CtCyKR,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;EACb,UAAU,EAAE,OAAQ;CACrB;;AsC5KH,AtC+KW,UsC/KD,CtC+KR,QAAQ,CAAC,CAAC,CAAC;EACT,KAAK,EDlHY,OAAO;CCsHzB;;AsCpLH,AtC+KW,UsC/KD,CtC+KR,QAAQ,CAAC,CAAC,AAEP,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;AsCnLL,AtCyLQ,UsCzLE,CtCuLR,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,EDzHgB,OAAO;CC0H7B;;AsC3LP,AtC4LiB,UsC5LP,CtCuLR,aAAa,GACT,SAAS,GAIP,SAAS,AAAA,OAAO;AsC5LxB,AtC6LiB,UsC7LP,CtCuLR,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,ED5HsB,IAAI;EC6H/B,UAAU,EAAE,WAAY;CACzB;;AsChMP,AtCsMI,UsCtMM,CtCqMR,aAAa,CACX,aAAa,CAAC;EACZ,UAAU,EDvIU,OAAO;ECwI3B,MAAM,EAAE,CAAE;CAQX;;AsChNL,AtCsMI,UsCtMM,CtCqMR,aAAa,CACX,aAAa;AsCtMjB,AtC0MgB,UsC1MN,CtCqMR,aAAa,CACX,aAAa,AAIV,MAAM,GAAG,UAAU,CAAC;EACnB,KAAK,ED5Ic,IAAI;CC6IxB;;AsC5MP,AtCsMI,UsCtMM,CtCqMR,aAAa,CACX,aAAa,AAOV,MAAM,CAAC;EACN,UAAU,EAAE,OAAO;CACpB;;AsC/MP,AtCiNI,UsCjNM,CtCqMR,aAAa,CAYX,UAAU,CAAC;EACT,KAAK,EDpJU,OAAO;CCqJvB;;AsC1KL,AAAyC,UAA/B,AAAA,eAAe,CAAC,YAAY,GAAG,KAAK,CAAC;EtCX7C,gBAAgB,EjFkET,OAAO;EiFjEd,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;CsCc7E;;AAFD,AAAyC,UAA/B,AAAA,eAAe,CAAC,YAAY,GAAG,KAAK,AtCP3C,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AuCxCH;;;GAGG;AAEH,AAGI,gBAHY,CAEd,YAAY,CACV,OAAO,CAAC;EvCHV,gBAAgB,EjF+FT,OAAO;CwHrEX;;AA1BL,AvCEc,gBuCFE,CAEd,YAAY,CACV,OAAO,CvCDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,EuCCqC,IAAI;CvCA/C;;AuCJH,AvCMe,gBuCNC,CAEd,YAAY,CACV,OAAO,CvCGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AuCNrB,AvCOe,gBuCPC,CAEd,YAAY,CACV,OAAO,CvCIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;AuCPtB,AvCQe,gBuCRC,CAEd,YAAY,CACV,OAAO,CvCKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AuCRrB,AvCSe,gBuCTC,CAEd,YAAY,CACV,OAAO,CvCMT,IAAI,CAAC,KAAK,GAAG,CAAC;AuCThB,AvCUgB,gBuCVA,CAEd,YAAY,CACV,OAAO,CvCOT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AuCVtB,AvCWgB,gBuCXA,CAEd,YAAY,CACV,OAAO,CvCQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AuCXtB,AvCYmB,gBuCZH,CAEd,YAAY,CACV,OAAO,CvCST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;AuCfH,AvCkBE,gBuClBc,CAEd,YAAY,CACV,OAAO,CvCeT,eAAe,CAAC;EACd,KAAK,EuCfqC,IAAI;CvCoB/C;;AuCxBH,AvCkBE,gBuClBc,CAEd,YAAY,CACV,OAAO,CvCeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;AuCvBL,AAKM,gBALU,CAEd,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,gBALU,CAEd,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,gBAbM,CAEd,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,gBAjBI,CAEd,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,gBAjBI,CAEd,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,gBA5BY,CAEd,YAAY,CA0BV,KAAK,CAAC;EvCCR,gBAAgB,EjFkET,OAAO;EiFjEd,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;CuCEzE;;AA9BL,AA4BI,gBA5BY,CAEd,YAAY,CA0BV,KAAK,AvCKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AuCnCH,AAgCM,gBAhCU,CAEd,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,ExH8Db,OAAO;CwH7DX;;AAlCL,AvCyNE,gBuCzNc,CvCyNd,aAAa;AuCzNf,AvC0Ne,gBuC1NC,CvC0Nd,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,EDvJD,OAAO;CCwJvB;;AuC5NH,AvC6NE,gBuC7Nc,CvC6Nd,gBAAgB;AuC7NlB,AvC8NE,gBuC9Nc,CvC8Nd,YAAY,CAAC;EACX,WAAW,EAAE,GAAG,CAAC,KAAK,CjFzHE,OAAO;CiF0HhC;;AuChOH,AvCmOM,gBuCnOU,CvCkOd,WAAW,GACP,KAAK;AuCnOX,AvCoOc,gBuCpOE,CvCkOd,WAAW,GAEP,KAAK,GAAG,SAAS,CAAC;EAClB,KAAK,ED/JW,IAAI;CCgKrB;;AuCtOL,AvCyOkB,gBuCzOF,CvCyOd,aAAa,GAAG,SAAS,CAAC;EACxB,UAAU,EAAE,0BAA2B;CA4BxC;;AuCtQH,AvC4OM,gBuC5OU,CvCyOd,aAAa,GAAG,SAAS,GAGrB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;EACnC,WAAW,EAAE,GAAI;CAIlB;;AuClPL,AvC4OM,gBuC5OU,CvCyOd,aAAa,GAAG,SAAS,GAGrB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,ED1KS,IAAI;CC2KnB;;AuCjPP,AvCoPc,gBuCpPE,CvCyOd,aAAa,GAAG,SAAS,AAWtB,MAAM,GAAG,SAAS;AuCpPvB,AvCqPe,gBuCrPC,CvCyOd,aAAa,GAAG,SAAS,AAYtB,OAAO,GAAG,SAAS,CAAC;EACnB,KAAK,ED/KiB,IAAI;ECgL1B,UAAU,EDlLS,OAAO;CCmL3B;;AuCxPL,AvCyOkB,gBuCzOF,CvCyOd,aAAa,GAAG,SAAS,AAmBtB,OAAO,CAAC;EACP,iBAAiB,EjF9Jd,OAAO;CiFkKX;;AuCjQL,AvC8PQ,gBuC9PQ,CvCyOd,aAAa,GAAG,SAAS,AAmBtB,OAAO,GAEJ,SAAS,CAAC;EACV,WAAW,EAAE,GAAI;CAClB;;AuChQP,AvCmQM,gBuCnQU,CvCyOd,aAAa,GAAG,SAAS,GA0BrB,aAAa,CAAC;EACd,UAAU,ED/LS,OAAO;CCgM3B;;AuCrQL,AvCwQE,gBuCxQc,CvCwQd,WAAW,CAAC;EACV,KAAK,EAAE,OAAO;EACd,UAAU,EDtMK,OAAO;CCuMvB;;AuC3QH,AvC6QW,gBuC7QK,CvC6Qd,QAAQ,CAAC,SAAS,CAAC;EACjB,KAAK,EDxMa,IAAI;CC4MvB;;AuClRH,AvC6QW,gBuC7QK,CvC6Qd,QAAQ,CAAC,SAAS,AAEf,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;AuCjRL,AvCsRQ,gBuCtRQ,CvCoRd,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,ED9MiB,IAAI;CC+M3B;;AuCxRP,AvCyRiB,gBuCzRD,CvCoRd,aAAa,GACT,SAAS,AAIR,OAAO,GAAG,SAAS;AuCzR1B,AvC0RiB,gBuC1RD,CvCoRd,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,EDjNuB,IAAI;CCkNjC;;AuC5RP,AvC6RiB,gBuC7RD,CvCoRd,aAAa,GACT,SAAS,AAQR,OAAO,GAAG,SAAS,CAAC;EACnB,WAAW,EAAE,GAAI;CAClB;;A7E5OH,MAAM,EAAL,SAAS,EAAE,KAAK;EoHnDrB,AvCoS2B,gBuCpSX,AvCmSX,aAAa,AAAA,iBAAiB,CAC7B,aAAa,GAAG,EAAE,GAAG,aAAa,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,KAAK,CjF/LF,OAAO;GiFgM5B;;;AuCtSP,AAuCE,gBAvCc,CAuCd,YAAY,CAAC;EACX,gBAAgB,ExH8DQ,OAAO;CwH7DhC;;AAGH,AAAyC,UAA/B,AAAA,eAAe,CAAC,YAAY,GAAG,KAAK,CAAC;EvCf7C,gBAAgB,EjFkET,OAAO;EiFjEd,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;CuCkB7E;;AAFD,AAAyC,UAA/B,AAAA,eAAe,CAAC,YAAY,GAAG,KAAK,AvCX3C,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AwCxCH;;;GAGG;AAEH,uBAAuB;AACvB,AAII,WAJO,CAET,YAAY,CAEV,cAAc,CAAC;EACb,KAAK,EAAE,IAAK;CACb;;AANL,AAOI,WAPO,CAET,YAAY,CAKV,aAAa,CAAC;EACZ,KAAK,EAAE,IAAK;EACZ,YAAY,EAAE,cAAe;CAC9B;;AAVL,AAWM,WAXK,CAET,YAAY,GASR,OAAO,CAAC;ExCZZ,gBAAgB,EwCaY,IAAI;CAmB7B;;AA/BL,AxCCc,WwCDH,CAET,YAAY,GASR,OAAO,CxCVX,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,EwCU2B,IAAI;CxCTrC;;AwCHH,AxCKe,WwCLJ,CAET,YAAY,GASR,OAAO,CxCNX,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AwCLrB,AxCMe,WwCNJ,CAET,YAAY,GASR,OAAO,CxCLX,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;AwCNtB,AxCOe,WwCPJ,CAET,YAAY,GASR,OAAO,CxCJX,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AwCPrB,AxCQe,WwCRJ,CAET,YAAY,GASR,OAAO,CxCHX,IAAI,CAAC,KAAK,GAAG,CAAC;AwCRhB,AxCSgB,WwCTL,CAET,YAAY,GASR,OAAO,CxCFX,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AwCTtB,AxCUgB,WwCVL,CAET,YAAY,GASR,OAAO,CxCDX,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AwCVtB,AxCWmB,WwCXR,CAET,YAAY,GASR,OAAO,CxCAX,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EwCAkC,IAAI;ExCChD,KAAK,EwCDiC,IAAI;CxCE3C;;AwCdH,AxCiBE,WwCjBS,CAET,YAAY,GASR,OAAO,CxCMX,eAAe,CAAC;EACd,KAAK,EwCN2B,IAAI;CxCWrC;;AwCvBH,AxCiBE,WwCjBS,CAET,YAAY,GASR,OAAO,CxCMX,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EwCR+B,IAAI;ExCSxC,UAAU,EwCTgC,IAAI;CxCU/C;;AwCtBL,AAaQ,WAbG,CAET,YAAY,GASR,OAAO,GAEL,eAAe,CAAC;EAChB,KAAK,EAAE,IAAK;EACZ,YAAY,EAAE,cAAe;CAC9B;;AAhBP,AAkBe,WAlBJ,CAET,YAAY,GASR,OAAO,CAMP,WAAW,GACP,EAAE,GAAG,CAAC,CAAC;EACP,YAAY,EAAE,cAAe;CAC9B;;AApBT,AAyBY,WAzBD,CAET,YAAY,GASR,OAAO,CAWP,mBAAmB,CAAC,WAAW,GAE3B,EAAE,GACA,CAAC;AAzBb,AAyBY,WAzBD,CAET,YAAY,GASR,OAAO,CAYP,aAAa,GACT,EAAE,GACA,CAAC,CAAC;EACF,WAAW,EAAE,cAAe;EAC5B,kBAAkB,EAAE,CAAE;CACvB;;AA5BX,AAgCM,WAhCK,CAET,YAAY,GA8BR,KAAK,CAAC;ExCJV,gBAAgB,EwCKU,IAAI;ExCJ9B,KAAK,EwCI2B,IAAI;ExCHpC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;EwCOxE,YAAY,EAAE,cAAe;CAK9B;;AAvCL,AAgCM,WAhCK,CAET,YAAY,GA8BR,KAAK,AxCAR,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AwCCG,MAAM,EAAL,SAAS,EAAE,KAAK;EAnCvB,AAgCM,WAhCK,CAET,YAAY,GA8BR,KAAK,CAAC;IxCJV,gBAAgB,EwCQY,IAAI;IxCPhC,KAAK,EwCO6B,IAAI;IxCNtC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;IwCUtE,YAAY,EAAE,IAAK;GAEtB;EAvCL,AAgCM,WAhCK,CAET,YAAY,GA8BR,KAAK,AxCAR,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM;GACzB;;;AwClCH,AAyCM,WAzCK,CAET,YAAY,CAuCV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,EAAE,IAAK;CACxB;;AA3CL,AxCuGE,WwCvGS,CxCuGT,aAAa;AwCvGf,AxCwGe,WwCxGJ,CxCwGT,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,ED/CF,OAAO;CCgDtB;;AwC1GH,AxC8GI,WwC9GO,CxC6GT,WAAW,CACT,KAAK;AwC9GT,AxC+GI,WwC/GO,CxC6GT,WAAW,CAET,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AwCjHL,AxCmHI,WwCnHO,CxC6GT,WAAW,CAMT,OAAO,CAAC;EACN,KAAK,EDxDU,OAAO;ECyDtB,UAAU,ED1DQ,OAAM;CCiEzB;;AwC5HL,AxCmHI,WwCnHO,CxC6GT,WAAW,CAMT,OAAO,AAGJ,MAAM,EwCtHb,AxCmHI,WwCnHO,CxC6GT,WAAW,CAMT,OAAO,AAIJ,MAAM,EwCvHb,AxCmHI,WwCnHO,CxC6GT,WAAW,CAMT,OAAO,AAKJ,OAAO,CAAC;EACP,KAAK,ED5Dc,IAAI;EC6DvB,UAAU,EAAE,OAAM;CACnB;;AwC3HP,AxC8HI,WwC9HO,CxC6GT,WAAW,CAiBT,cAAc,CAAC;EACb,YAAY,EAAE,OAAM;CAErB;;AwCjIL,AxCmII,WwCnIO,CxC6GT,WAAW,CAsBT,cAAc,CAAC;EACb,KAAK,EjFhCiB,OAAO;CiFiC9B;;AwCrIL,AxC2IM,WwC3IK,CxCyIT,YAAY,GAAG,SAAS,GAEpB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;CAKpC;;AwCjJL,AxC2IM,WwC3IK,CxCyIT,YAAY,GAAG,SAAS,GAEpB,SAAS,AAER,OAAO,EwC7Id,AxC2IM,WwC3IK,CxCyIT,YAAY,GAAG,SAAS,GAEpB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,EDnFQ,OAAO;CCoFrB;;AwChJP,AxCoJkB,WwCpJP,CxCyIT,YAAY,GAAG,SAAS,AAWrB,UAAU,GAAG,SAAS;AwCpJ3B,AxCqJc,WwCrJH,CxCyIT,YAAY,GAAG,SAAS,AAYrB,MAAM,GAAG,SAAS;AwCrJvB,AxCsJe,WwCtJJ,CxCyIT,YAAY,GAAG,SAAS,GAapB,SAAS,AAAA,OAAO,CAAC;EACjB,KAAK,ED1FgB,IAAI;EC2FzB,UAAU,ED7FQ,OAAM;CC8FzB;;AwCzJL,AxC2Je,WwC3JJ,CxCyIT,YAAY,GAAG,SAAS,GAkBpB,SAAS,AAAA,OAAO,CAAC;EACjB,iBAAiB,EwC7GM,IAAI;CxC8G5B;;AwC7JL,AxCgKM,WwChKK,CxCyIT,YAAY,GAAG,SAAS,GAuBpB,aAAa,CAAC;EACd,MAAM,EAAE,KAAM;EACd,UAAU,EDpGU,OAAO;CCqG5B;;AwCnKL,AxCuKE,WwCvKS,CxCuKT,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;EACb,UAAU,EAAE,OAAQ;CACrB;;AwC1KH,AxC6KW,WwC7KA,CxC6KT,QAAQ,CAAC,CAAC,CAAC;EACT,KAAK,EDlHY,OAAO;CCsHzB;;AwClLH,AxC6KW,WwC7KA,CxC6KT,QAAQ,CAAC,CAAC,AAEP,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;AwCjLL,AxCuLQ,WwCvLG,CxCqLT,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,EDzHgB,OAAO;CC0H7B;;AwCzLP,AxC0LiB,WwC1LN,CxCqLT,aAAa,GACT,SAAS,GAIP,SAAS,AAAA,OAAO;AwC1LxB,AxC2LiB,WwC3LN,CxCqLT,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,ED5HsB,IAAI;EC6H/B,UAAU,EAAE,WAAY;CACzB;;AwC9LP,AxCoMI,WwCpMO,CxCmMT,aAAa,CACX,aAAa,CAAC;EACZ,UAAU,EDvIU,OAAO;ECwI3B,MAAM,EAAE,CAAE;CAQX;;AwC9ML,AxCoMI,WwCpMO,CxCmMT,aAAa,CACX,aAAa;AwCpMjB,AxCwMgB,WwCxML,CxCmMT,aAAa,CACX,aAAa,AAIV,MAAM,GAAG,UAAU,CAAC;EACnB,KAAK,ED5Ic,IAAI;CC6IxB;;AwC1MP,AxCoMI,WwCpMO,CxCmMT,aAAa,CACX,aAAa,AAOV,MAAM,CAAC;EACN,UAAU,EAAE,OAAO;CACpB;;AwC7MP,AxC+MI,WwC/MO,CxCmMT,aAAa,CAYX,UAAU,CAAC;EACT,KAAK,EDpJU,OAAO;CCqJvB;;AyCvNL;;;GAGG;AAEH,uBAAuB;AACvB,AAII,iBAJa,CAEf,YAAY,CAEV,cAAc,CAAC;EACb,KAAK,EAAE,IAAK;CACb;;AANL,AAOI,iBAPa,CAEf,YAAY,CAKV,aAAa,CAAC;EACZ,KAAK,EAAE,IAAK;EACZ,YAAY,EAAE,cAAe;CAC9B;;AAVL,AAWM,iBAXW,CAEf,YAAY,GASR,OAAO,CAAC;EzCZZ,gBAAgB,EyCaY,IAAI;CAmB7B;;AA/BL,AzCCc,iByCDG,CAEf,YAAY,GASR,OAAO,CzCVX,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,EyCU2B,IAAI;CzCTrC;;AyCHH,AzCKe,iByCLE,CAEf,YAAY,GASR,OAAO,CzCNX,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AyCLrB,AzCMe,iByCNE,CAEf,YAAY,GASR,OAAO,CzCLX,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;AyCNtB,AzCOe,iByCPE,CAEf,YAAY,GASR,OAAO,CzCJX,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AyCPrB,AzCQe,iByCRE,CAEf,YAAY,GASR,OAAO,CzCHX,IAAI,CAAC,KAAK,GAAG,CAAC;AyCRhB,AzCSgB,iByCTC,CAEf,YAAY,GASR,OAAO,CzCFX,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AyCTtB,AzCUgB,iByCVC,CAEf,YAAY,GASR,OAAO,CzCDX,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AyCVtB,AzCWmB,iByCXF,CAEf,YAAY,GASR,OAAO,CzCAX,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EyCAkC,IAAI;EzCChD,KAAK,EyCDiC,IAAI;CzCE3C;;AyCdH,AzCiBE,iByCjBe,CAEf,YAAY,GASR,OAAO,CzCMX,eAAe,CAAC;EACd,KAAK,EyCN2B,IAAI;CzCWrC;;AyCvBH,AzCiBE,iByCjBe,CAEf,YAAY,GASR,OAAO,CzCMX,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EyCR+B,IAAI;EzCSxC,UAAU,EyCTgC,IAAI;CzCU/C;;AyCtBL,AAaQ,iBAbS,CAEf,YAAY,GASR,OAAO,GAEL,eAAe,CAAC;EAChB,KAAK,EAAE,IAAK;EACZ,YAAY,EAAE,cAAe;CAC9B;;AAhBP,AAkBe,iBAlBE,CAEf,YAAY,GASR,OAAO,CAMP,WAAW,GACP,EAAE,GAAG,CAAC,CAAC;EACP,YAAY,EAAE,cAAe;CAC9B;;AApBT,AAyBY,iBAzBK,CAEf,YAAY,GASR,OAAO,CAWP,mBAAmB,CAAC,WAAW,GAE3B,EAAE,GACA,CAAC;AAzBb,AAyBY,iBAzBK,CAEf,YAAY,GASR,OAAO,CAYP,aAAa,GACT,EAAE,GACA,CAAC,CAAC;EACF,WAAW,EAAE,cAAe;EAC5B,kBAAkB,EAAE,CAAE;CACvB;;AA5BX,AAgCM,iBAhCW,CAEf,YAAY,GA8BR,KAAK,CAAC;EzCJV,gBAAgB,EyCKU,IAAI;EzCJ9B,KAAK,EyCI2B,IAAI;EzCHpC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;EyCOxE,YAAY,EAAE,cAAe;CAK9B;;AAvCL,AAgCM,iBAhCW,CAEf,YAAY,GA8BR,KAAK,AzCAR,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AyCCG,MAAM,EAAL,SAAS,EAAE,KAAK;EAnCvB,AAgCM,iBAhCW,CAEf,YAAY,GA8BR,KAAK,CAAC;IzCJV,gBAAgB,EyCQY,IAAI;IzCPhC,KAAK,EyCO6B,IAAI;IzCNtC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;IyCUtE,YAAY,EAAE,IAAK;GAEtB;EAvCL,AAgCM,iBAhCW,CAEf,YAAY,GA8BR,KAAK,AzCAR,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM;GACzB;;;AyClCH,AAyCM,iBAzCW,CAEf,YAAY,CAuCV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,EAAE,IAAK;CACxB;;AA3CL,AzCwNE,iByCxNe,CzCwNf,aAAa;AyCxNf,AzCyNe,iByCzNE,CzCyNf,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,EDvJD,OAAO;CCwJvB;;AyC3NH,AzC4NE,iByC5Ne,CzC4Nf,gBAAgB;AyC5NlB,AzC6NE,iByC7Ne,CzC6Nf,YAAY,CAAC;EACX,WAAW,EAAE,GAAG,CAAC,KAAK,CjFzHE,OAAO;CiF0HhC;;AyC/NH,AzCkOM,iByClOW,CzCiOf,WAAW,GACP,KAAK;AyClOX,AzCmOc,iByCnOG,CzCiOf,WAAW,GAEP,KAAK,GAAG,SAAS,CAAC;EAClB,KAAK,ED/JW,IAAI;CCgKrB;;AyCrOL,AzCwOkB,iByCxOD,CzCwOf,aAAa,GAAG,SAAS,CAAC;EACxB,UAAU,EAAE,0BAA2B;CA4BxC;;AyCrQH,AzC2OM,iByC3OW,CzCwOf,aAAa,GAAG,SAAS,GAGrB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;EACnC,WAAW,EAAE,GAAI;CAIlB;;AyCjPL,AzC2OM,iByC3OW,CzCwOf,aAAa,GAAG,SAAS,GAGrB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,ED1KS,IAAI;CC2KnB;;AyChPP,AzCmPc,iByCnPG,CzCwOf,aAAa,GAAG,SAAS,AAWtB,MAAM,GAAG,SAAS;AyCnPvB,AzCoPe,iByCpPE,CzCwOf,aAAa,GAAG,SAAS,AAYtB,OAAO,GAAG,SAAS,CAAC;EACnB,KAAK,ED/KiB,IAAI;ECgL1B,UAAU,EDlLS,OAAO;CCmL3B;;AyCvPL,AzCwOkB,iByCxOD,CzCwOf,aAAa,GAAG,SAAS,AAmBtB,OAAO,CAAC;EACP,iBAAiB,EyC9MO,IAAI;CzCkN7B;;AyChQL,AzC6PQ,iByC7PS,CzCwOf,aAAa,GAAG,SAAS,AAmBtB,OAAO,GAEJ,SAAS,CAAC;EACV,WAAW,EAAE,GAAI;CAClB;;AyC/PP,AzCkQM,iByClQW,CzCwOf,aAAa,GAAG,SAAS,GA0BrB,aAAa,CAAC;EACd,UAAU,ED/LS,OAAO;CCgM3B;;AyCpQL,AzCuQE,iByCvQe,CzCuQf,WAAW,CAAC;EACV,KAAK,EAAE,OAAO;EACd,UAAU,EDtMK,OAAO;CCuMvB;;AyC1QH,AzC4QW,iByC5QM,CzC4Qf,QAAQ,CAAC,SAAS,CAAC;EACjB,KAAK,EDxMa,IAAI;CC4MvB;;AyCjRH,AzC4QW,iByC5QM,CzC4Qf,QAAQ,CAAC,SAAS,AAEf,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;AyChRL,AzCqRQ,iByCrRS,CzCmRf,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,ED9MiB,IAAI;CC+M3B;;AyCvRP,AzCwRiB,iByCxRA,CzCmRf,aAAa,GACT,SAAS,AAIR,OAAO,GAAG,SAAS;AyCxR1B,AzCyRiB,iByCzRA,CzCmRf,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,EDjNuB,IAAI;CCkNjC;;AyC3RP,AzC4RiB,iByC5RA,CzCmRf,aAAa,GACT,SAAS,AAQR,OAAO,GAAG,SAAS,CAAC;EACnB,WAAW,EAAE,GAAI;CAClB;;A7E5OH,MAAM,EAAL,SAAS,EAAE,KAAK;EsHlDrB,AzCmS2B,iByCnSV,AzCkSZ,aAAa,AAAA,iBAAiB,CAC7B,aAAa,GAAG,EAAE,GAAG,aAAa,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,KAAK,CjF/LF,OAAO;GiFgM5B;;;A0C3SP;;;GAGG;AAEH,AAGI,WAHO,CAET,YAAY,CACV,OAAO,CAAC;E1CHV,gBAAgB,EjF8FT,OAAO;C2HpEX;;AA1BL,A1CEc,W0CFH,CAET,YAAY,CACV,OAAO,C1CDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,E0CCqC,IAAI;C1CA/C;;A0CJH,A1CMe,W0CNJ,CAET,YAAY,CACV,OAAO,C1CGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A0CNrB,A1COe,W0CPJ,CAET,YAAY,CACV,OAAO,C1CIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;A0CPtB,A1CQe,W0CRJ,CAET,YAAY,CACV,OAAO,C1CKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A0CRrB,A1CSe,W0CTJ,CAET,YAAY,CACV,OAAO,C1CMT,IAAI,CAAC,KAAK,GAAG,CAAC;A0CThB,A1CUgB,W0CVL,CAET,YAAY,CACV,OAAO,C1COT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A0CVtB,A1CWgB,W0CXL,CAET,YAAY,CACV,OAAO,C1CQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A0CXtB,A1CYmB,W0CZR,CAET,YAAY,CACV,OAAO,C1CST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;A0CfH,A1CkBE,W0ClBS,CAET,YAAY,CACV,OAAO,C1CeT,eAAe,CAAC;EACd,KAAK,E0CfqC,IAAI;C1CoB/C;;A0CxBH,A1CkBE,W0ClBS,CAET,YAAY,CACV,OAAO,C1CeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;A0CvBL,AAKM,WALK,CAET,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,WALK,CAET,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,WAbC,CAET,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,WAjBD,CAET,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,WAjBD,CAET,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,WA5BO,CAET,YAAY,CA0BV,KAAK,CAAC;E1CCR,gBAAgB,E0CAU,OAAM;E1CChC,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;C0CEzE;;AA9BL,AA4BI,WA5BO,CAET,YAAY,CA0BV,KAAK,A1CKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;A0CnCH,AAgCM,WAhCK,CAET,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,E3H6Db,OAAO;C2H5DX;;AAlCL,A1CwGE,W0CxGS,C1CwGT,aAAa;A0CxGf,A1CyGe,W0CzGJ,C1CyGT,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,ED/CF,OAAO;CCgDtB;;A0C3GH,A1C+GI,W0C/GO,C1C8GT,WAAW,CACT,KAAK;A0C/GT,A1CgHI,W0ChHO,C1C8GT,WAAW,CAET,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;A0ClHL,A1CoHI,W0CpHO,C1C8GT,WAAW,CAMT,OAAO,CAAC;EACN,KAAK,EDxDU,OAAO;ECyDtB,UAAU,ED1DQ,OAAM;CCiEzB;;A0C7HL,A1CoHI,W0CpHO,C1C8GT,WAAW,CAMT,OAAO,AAGJ,MAAM,E0CvHb,A1CoHI,W0CpHO,C1C8GT,WAAW,CAMT,OAAO,AAIJ,MAAM,E0CxHb,A1CoHI,W0CpHO,C1C8GT,WAAW,CAMT,OAAO,AAKJ,OAAO,CAAC;EACP,KAAK,ED5Dc,IAAI;EC6DvB,UAAU,EAAE,OAAM;CACnB;;A0C5HP,A1C+HI,W0C/HO,C1C8GT,WAAW,CAiBT,cAAc,CAAC;EACb,YAAY,EAAE,OAAM;CAErB;;A0ClIL,A1CoII,W0CpIO,C1C8GT,WAAW,CAsBT,cAAc,CAAC;EACb,KAAK,EjFhCiB,OAAO;CiFiC9B;;A0CtIL,A1C4IM,W0C5IK,C1C0IT,YAAY,GAAG,SAAS,GAEpB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;CAKpC;;A0ClJL,A1C4IM,W0C5IK,C1C0IT,YAAY,GAAG,SAAS,GAEpB,SAAS,AAER,OAAO,E0C9Id,A1C4IM,W0C5IK,C1C0IT,YAAY,GAAG,SAAS,GAEpB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,EDnFQ,OAAO;CCoFrB;;A0CjJP,A1CqJkB,W0CrJP,C1C0IT,YAAY,GAAG,SAAS,AAWrB,UAAU,GAAG,SAAS;A0CrJ3B,A1CsJc,W0CtJH,C1C0IT,YAAY,GAAG,SAAS,AAYrB,MAAM,GAAG,SAAS;A0CtJvB,A1CuJe,W0CvJJ,C1C0IT,YAAY,GAAG,SAAS,GAapB,SAAS,AAAA,OAAO,CAAC;EACjB,KAAK,ED1FgB,IAAI;EC2FzB,UAAU,ED7FQ,OAAM;CC8FzB;;A0C1JL,A1C4Je,W0C5JJ,C1C0IT,YAAY,GAAG,SAAS,GAkBpB,SAAS,AAAA,OAAO,CAAC;EACjB,iBAAiB,EjF/Dd,OAAO;CiFgEX;;A0C9JL,A1CiKM,W0CjKK,C1C0IT,YAAY,GAAG,SAAS,GAuBpB,aAAa,CAAC;EACd,MAAM,EAAE,KAAM;EACd,UAAU,EDpGU,OAAO;CCqG5B;;A0CpKL,A1CwKE,W0CxKS,C1CwKT,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;EACb,UAAU,EAAE,OAAQ;CACrB;;A0C3KH,A1C8KW,W0C9KA,C1C8KT,QAAQ,CAAC,CAAC,CAAC;EACT,KAAK,EDlHY,OAAO;CCsHzB;;A0CnLH,A1C8KW,W0C9KA,C1C8KT,QAAQ,CAAC,CAAC,AAEP,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;A0ClLL,A1CwLQ,W0CxLG,C1CsLT,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,EDzHgB,OAAO;CC0H7B;;A0C1LP,A1C2LiB,W0C3LN,C1CsLT,aAAa,GACT,SAAS,GAIP,SAAS,AAAA,OAAO;A0C3LxB,A1C4LiB,W0C5LN,C1CsLT,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,ED5HsB,IAAI;EC6H/B,UAAU,EAAE,WAAY;CACzB;;A0C/LP,A1CqMI,W0CrMO,C1CoMT,aAAa,CACX,aAAa,CAAC;EACZ,UAAU,EDvIU,OAAO;ECwI3B,MAAM,EAAE,CAAE;CAQX;;A0C/ML,A1CqMI,W0CrMO,C1CoMT,aAAa,CACX,aAAa;A0CrMjB,A1CyMgB,W0CzML,C1CoMT,aAAa,CACX,aAAa,AAIV,MAAM,GAAG,UAAU,CAAC;EACnB,KAAK,ED5Ic,IAAI;CC6IxB;;A0C3MP,A1CqMI,W0CrMO,C1CoMT,aAAa,CACX,aAAa,AAOV,MAAM,CAAC;EACN,UAAU,EAAE,OAAO;CACpB;;A0C9MP,A1CgNI,W0ChNO,C1CoMT,aAAa,CAYX,UAAU,CAAC;EACT,KAAK,EDpJU,OAAO;CCqJvB;;A2CvNL;;;GAGG;AAEH,AAGI,iBAHa,CAEf,YAAY,CACV,OAAO,CAAC;E3CHV,gBAAgB,EjF8FT,OAAO;C4HpEX;;AA1BL,A3CEc,iB2CFG,CAEf,YAAY,CACV,OAAO,C3CDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,E2CCqC,IAAI;C3CA/C;;A2CJH,A3CMe,iB2CNE,CAEf,YAAY,CACV,OAAO,C3CGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A2CNrB,A3COe,iB2CPE,CAEf,YAAY,CACV,OAAO,C3CIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;A2CPtB,A3CQe,iB2CRE,CAEf,YAAY,CACV,OAAO,C3CKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A2CRrB,A3CSe,iB2CTE,CAEf,YAAY,CACV,OAAO,C3CMT,IAAI,CAAC,KAAK,GAAG,CAAC;A2CThB,A3CUgB,iB2CVC,CAEf,YAAY,CACV,OAAO,C3COT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A2CVtB,A3CWgB,iB2CXC,CAEf,YAAY,CACV,OAAO,C3CQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A2CXtB,A3CYmB,iB2CZF,CAEf,YAAY,CACV,OAAO,C3CST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;A2CfH,A3CkBE,iB2ClBe,CAEf,YAAY,CACV,OAAO,C3CeT,eAAe,CAAC;EACd,KAAK,E2CfqC,IAAI;C3CoB/C;;A2CxBH,A3CkBE,iB2ClBe,CAEf,YAAY,CACV,OAAO,C3CeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;A2CvBL,AAKM,iBALW,CAEf,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,iBALW,CAEf,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,iBAbO,CAEf,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,iBAjBK,CAEf,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,iBAjBK,CAEf,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,iBA5Ba,CAEf,YAAY,CA0BV,KAAK,CAAC;E3CCR,gBAAgB,EjFiET,OAAO;EiFhEd,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;C2CEzE;;AA9BL,AA4BI,iBA5Ba,CAEf,YAAY,CA0BV,KAAK,A3CKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;A2CnCH,AAgCM,iBAhCW,CAEf,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,E5H6Db,OAAO;C4H5DX;;AAlCL,A3CyNE,iB2CzNe,C3CyNf,aAAa;A2CzNf,A3C0Ne,iB2C1NE,C3C0Nf,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,EDvJD,OAAO;CCwJvB;;A2C5NH,A3C6NE,iB2C7Ne,C3C6Nf,gBAAgB;A2C7NlB,A3C8NE,iB2C9Ne,C3C8Nf,YAAY,CAAC;EACX,WAAW,EAAE,GAAG,CAAC,KAAK,CjFzHE,OAAO;CiF0HhC;;A2ChOH,A3CmOM,iB2CnOW,C3CkOf,WAAW,GACP,KAAK;A2CnOX,A3CoOc,iB2CpOG,C3CkOf,WAAW,GAEP,KAAK,GAAG,SAAS,CAAC;EAClB,KAAK,ED/JW,IAAI;CCgKrB;;A2CtOL,A3CyOkB,iB2CzOD,C3CyOf,aAAa,GAAG,SAAS,CAAC;EACxB,UAAU,EAAE,0BAA2B;CA4BxC;;A2CtQH,A3C4OM,iB2C5OW,C3CyOf,aAAa,GAAG,SAAS,GAGrB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;EACnC,WAAW,EAAE,GAAI;CAIlB;;A2ClPL,A3C4OM,iB2C5OW,C3CyOf,aAAa,GAAG,SAAS,GAGrB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,ED1KS,IAAI;CC2KnB;;A2CjPP,A3CoPc,iB2CpPG,C3CyOf,aAAa,GAAG,SAAS,AAWtB,MAAM,GAAG,SAAS;A2CpPvB,A3CqPe,iB2CrPE,C3CyOf,aAAa,GAAG,SAAS,AAYtB,OAAO,GAAG,SAAS,CAAC;EACnB,KAAK,ED/KiB,IAAI;ECgL1B,UAAU,EDlLS,OAAO;CCmL3B;;A2CxPL,A3CyOkB,iB2CzOD,C3CyOf,aAAa,GAAG,SAAS,AAmBtB,OAAO,CAAC;EACP,iBAAiB,EjF/Jd,OAAO;CiFmKX;;A2CjQL,A3C8PQ,iB2C9PS,C3CyOf,aAAa,GAAG,SAAS,AAmBtB,OAAO,GAEJ,SAAS,CAAC;EACV,WAAW,EAAE,GAAI;CAClB;;A2ChQP,A3CmQM,iB2CnQW,C3CyOf,aAAa,GAAG,SAAS,GA0BrB,aAAa,CAAC;EACd,UAAU,ED/LS,OAAO;CCgM3B;;A2CrQL,A3CwQE,iB2CxQe,C3CwQf,WAAW,CAAC;EACV,KAAK,EAAE,OAAO;EACd,UAAU,EDtMK,OAAO;CCuMvB;;A2C3QH,A3C6QW,iB2C7QM,C3C6Qf,QAAQ,CAAC,SAAS,CAAC;EACjB,KAAK,EDxMa,IAAI;CC4MvB;;A2ClRH,A3C6QW,iB2C7QM,C3C6Qf,QAAQ,CAAC,SAAS,AAEf,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;A2CjRL,A3CsRQ,iB2CtRS,C3CoRf,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,ED9MiB,IAAI;CC+M3B;;A2CxRP,A3CyRiB,iB2CzRA,C3CoRf,aAAa,GACT,SAAS,AAIR,OAAO,GAAG,SAAS;A2CzR1B,A3C0RiB,iB2C1RA,C3CoRf,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,EDjNuB,IAAI;CCkNjC;;A2C5RP,A3C6RiB,iB2C7RA,C3CoRf,aAAa,GACT,SAAS,AAQR,OAAO,GAAG,SAAS,CAAC;EACnB,WAAW,EAAE,GAAI;CAClB;;A7E5OH,MAAM,EAAL,SAAS,EAAE,KAAK;EwHnDrB,A3CoS2B,iB2CpSV,A3CmSZ,aAAa,AAAA,iBAAiB,CAC7B,aAAa,GAAG,EAAE,GAAG,aAAa,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,KAAK,CjF/LF,OAAO;GiFgM5B;;;A4C3SP;;;GAGG;AAEH,AAGI,SAHK,CAEP,YAAY,CACV,OAAO,CAAC;E5CHV,gBAAgB,EjF2FT,OAAO;C6HjEX;;AA1BL,A5CEc,S4CFL,CAEP,YAAY,CACV,OAAO,C5CDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,E4CCoC,IAAI;C5CA9C;;A4CJH,A5CMe,S4CNN,CAEP,YAAY,CACV,OAAO,C5CGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A4CNrB,A5COe,S4CPN,CAEP,YAAY,CACV,OAAO,C5CIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;A4CPtB,A5CQe,S4CRN,CAEP,YAAY,CACV,OAAO,C5CKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A4CRrB,A5CSe,S4CTN,CAEP,YAAY,CACV,OAAO,C5CMT,IAAI,CAAC,KAAK,GAAG,CAAC;A4CThB,A5CUgB,S4CVP,CAEP,YAAY,CACV,OAAO,C5COT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A4CVtB,A5CWgB,S4CXP,CAEP,YAAY,CACV,OAAO,C5CQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A4CXtB,A5CYmB,S4CZV,CAEP,YAAY,CACV,OAAO,C5CST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;A4CfH,A5CkBE,S4ClBO,CAEP,YAAY,CACV,OAAO,C5CeT,eAAe,CAAC;EACd,KAAK,E4CfoC,IAAI;C5CoB9C;;A4CxBH,A5CkBE,S4ClBO,CAEP,YAAY,CACV,OAAO,C5CeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;A4CvBL,AAKM,SALG,CAEP,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,SALG,CAEP,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,SAbD,CAEP,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,SAjBH,CAEP,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,SAjBH,CAEP,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,SA5BK,CAEP,YAAY,CA0BV,KAAK,CAAC;E5CCR,gBAAgB,E4CAU,OAAM;E5CChC,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;C4CEzE;;AA9BL,AA4BI,SA5BK,CAEP,YAAY,CA0BV,KAAK,A5CKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;A4CnCH,AAgCM,SAhCG,CAEP,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,E7H0Db,OAAO;C6HzDX;;AAlCL,A5CwGE,S4CxGO,C5CwGP,aAAa;A4CxGf,A5CyGe,S4CzGN,C5CyGP,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,ED/CF,OAAO;CCgDtB;;A4C3GH,A5C+GI,S4C/GK,C5C8GP,WAAW,CACT,KAAK;A4C/GT,A5CgHI,S4ChHK,C5C8GP,WAAW,CAET,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;A4ClHL,A5CoHI,S4CpHK,C5C8GP,WAAW,CAMT,OAAO,CAAC;EACN,KAAK,EDxDU,OAAO;ECyDtB,UAAU,ED1DQ,OAAM;CCiEzB;;A4C7HL,A5CoHI,S4CpHK,C5C8GP,WAAW,CAMT,OAAO,AAGJ,MAAM,E4CvHb,A5CoHI,S4CpHK,C5C8GP,WAAW,CAMT,OAAO,AAIJ,MAAM,E4CxHb,A5CoHI,S4CpHK,C5C8GP,WAAW,CAMT,OAAO,AAKJ,OAAO,CAAC;EACP,KAAK,ED5Dc,IAAI;EC6DvB,UAAU,EAAE,OAAM;CACnB;;A4C5HP,A5C+HI,S4C/HK,C5C8GP,WAAW,CAiBT,cAAc,CAAC;EACb,YAAY,EAAE,OAAM;CAErB;;A4ClIL,A5CoII,S4CpIK,C5C8GP,WAAW,CAsBT,cAAc,CAAC;EACb,KAAK,EjFhCiB,OAAO;CiFiC9B;;A4CtIL,A5C4IM,S4C5IG,C5C0IP,YAAY,GAAG,SAAS,GAEpB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;CAKpC;;A4ClJL,A5C4IM,S4C5IG,C5C0IP,YAAY,GAAG,SAAS,GAEpB,SAAS,AAER,OAAO,E4C9Id,A5C4IM,S4C5IG,C5C0IP,YAAY,GAAG,SAAS,GAEpB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,EDnFQ,OAAO;CCoFrB;;A4CjJP,A5CqJkB,S4CrJT,C5C0IP,YAAY,GAAG,SAAS,AAWrB,UAAU,GAAG,SAAS;A4CrJ3B,A5CsJc,S4CtJL,C5C0IP,YAAY,GAAG,SAAS,AAYrB,MAAM,GAAG,SAAS;A4CtJvB,A5CuJe,S4CvJN,C5C0IP,YAAY,GAAG,SAAS,GAapB,SAAS,AAAA,OAAO,CAAC;EACjB,KAAK,ED1FgB,IAAI;EC2FzB,UAAU,ED7FQ,OAAM;CC8FzB;;A4C1JL,A5C4Je,S4C5JN,C5C0IP,YAAY,GAAG,SAAS,GAkBpB,SAAS,AAAA,OAAO,CAAC;EACjB,iBAAiB,EjFlEd,OAAO;CiFmEX;;A4C9JL,A5CiKM,S4CjKG,C5C0IP,YAAY,GAAG,SAAS,GAuBpB,aAAa,CAAC;EACd,MAAM,EAAE,KAAM;EACd,UAAU,EDpGU,OAAO;CCqG5B;;A4CpKL,A5CwKE,S4CxKO,C5CwKP,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;EACb,UAAU,EAAE,OAAQ;CACrB;;A4C3KH,A5C8KW,S4C9KF,C5C8KP,QAAQ,CAAC,CAAC,CAAC;EACT,KAAK,EDlHY,OAAO;CCsHzB;;A4CnLH,A5C8KW,S4C9KF,C5C8KP,QAAQ,CAAC,CAAC,AAEP,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;A4ClLL,A5CwLQ,S4CxLC,C5CsLP,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,EDzHgB,OAAO;CC0H7B;;A4C1LP,A5C2LiB,S4C3LR,C5CsLP,aAAa,GACT,SAAS,GAIP,SAAS,AAAA,OAAO;A4C3LxB,A5C4LiB,S4C5LR,C5CsLP,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,ED5HsB,IAAI;EC6H/B,UAAU,EAAE,WAAY;CACzB;;A4C/LP,A5CqMI,S4CrMK,C5CoMP,aAAa,CACX,aAAa,CAAC;EACZ,UAAU,EDvIU,OAAO;ECwI3B,MAAM,EAAE,CAAE;CAQX;;A4C/ML,A5CqMI,S4CrMK,C5CoMP,aAAa,CACX,aAAa;A4CrMjB,A5CyMgB,S4CzMP,C5CoMP,aAAa,CACX,aAAa,AAIV,MAAM,GAAG,UAAU,CAAC;EACnB,KAAK,ED5Ic,IAAI;CC6IxB;;A4C3MP,A5CqMI,S4CrMK,C5CoMP,aAAa,CACX,aAAa,AAOV,MAAM,CAAC;EACN,UAAU,EAAE,OAAO;CACpB;;A4C9MP,A5CgNI,S4ChNK,C5CoMP,aAAa,CAYX,UAAU,CAAC;EACT,KAAK,EDpJU,OAAO;CCqJvB;;A6CvNL;;;GAGG;AAEH,AAGI,eAHW,CAEb,YAAY,CACV,OAAO,CAAC;E7CHV,gBAAgB,EjF2FT,OAAO;C8HjEX;;AA1BL,A7CEc,e6CFC,CAEb,YAAY,CACV,OAAO,C7CDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,E6CCoC,IAAI;C7CA9C;;A6CJH,A7CMe,e6CNA,CAEb,YAAY,CACV,OAAO,C7CGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A6CNrB,A7COe,e6CPA,CAEb,YAAY,CACV,OAAO,C7CIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;A6CPtB,A7CQe,e6CRA,CAEb,YAAY,CACV,OAAO,C7CKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A6CRrB,A7CSe,e6CTA,CAEb,YAAY,CACV,OAAO,C7CMT,IAAI,CAAC,KAAK,GAAG,CAAC;A6CThB,A7CUgB,e6CVD,CAEb,YAAY,CACV,OAAO,C7COT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A6CVtB,A7CWgB,e6CXD,CAEb,YAAY,CACV,OAAO,C7CQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A6CXtB,A7CYmB,e6CZJ,CAEb,YAAY,CACV,OAAO,C7CST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;A6CfH,A7CkBE,e6ClBa,CAEb,YAAY,CACV,OAAO,C7CeT,eAAe,CAAC;EACd,KAAK,E6CfoC,IAAI;C7CoB9C;;A6CxBH,A7CkBE,e6ClBa,CAEb,YAAY,CACV,OAAO,C7CeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;A6CvBL,AAKM,eALS,CAEb,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,eALS,CAEb,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,eAbK,CAEb,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,eAjBG,CAEb,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,eAjBG,CAEb,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,eA5BW,CAEb,YAAY,CA0BV,KAAK,CAAC;E7CCR,gBAAgB,EjF8DT,OAAO;EiF7Dd,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;C6CEzE;;AA9BL,AA4BI,eA5BW,CAEb,YAAY,CA0BV,KAAK,A7CKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;A6CnCH,AAgCM,eAhCS,CAEb,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,E9H0Db,OAAO;C8HzDX;;AAlCL,A7CyNE,e6CzNa,C7CyNb,aAAa;A6CzNf,A7C0Ne,e6C1NA,C7C0Nb,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,EDvJD,OAAO;CCwJvB;;A6C5NH,A7C6NE,e6C7Na,C7C6Nb,gBAAgB;A6C7NlB,A7C8NE,e6C9Na,C7C8Nb,YAAY,CAAC;EACX,WAAW,EAAE,GAAG,CAAC,KAAK,CjFzHE,OAAO;CiF0HhC;;A6ChOH,A7CmOM,e6CnOS,C7CkOb,WAAW,GACP,KAAK;A6CnOX,A7CoOc,e6CpOC,C7CkOb,WAAW,GAEP,KAAK,GAAG,SAAS,CAAC;EAClB,KAAK,ED/JW,IAAI;CCgKrB;;A6CtOL,A7CyOkB,e6CzOH,C7CyOb,aAAa,GAAG,SAAS,CAAC;EACxB,UAAU,EAAE,0BAA2B;CA4BxC;;A6CtQH,A7C4OM,e6C5OS,C7CyOb,aAAa,GAAG,SAAS,GAGrB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;EACnC,WAAW,EAAE,GAAI;CAIlB;;A6ClPL,A7C4OM,e6C5OS,C7CyOb,aAAa,GAAG,SAAS,GAGrB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,ED1KS,IAAI;CC2KnB;;A6CjPP,A7CoPc,e6CpPC,C7CyOb,aAAa,GAAG,SAAS,AAWtB,MAAM,GAAG,SAAS;A6CpPvB,A7CqPe,e6CrPA,C7CyOb,aAAa,GAAG,SAAS,AAYtB,OAAO,GAAG,SAAS,CAAC;EACnB,KAAK,ED/KiB,IAAI;ECgL1B,UAAU,EDlLS,OAAO;CCmL3B;;A6CxPL,A7CyOkB,e6CzOH,C7CyOb,aAAa,GAAG,SAAS,AAmBtB,OAAO,CAAC;EACP,iBAAiB,EjFlKd,OAAO;CiFsKX;;A6CjQL,A7C8PQ,e6C9PO,C7CyOb,aAAa,GAAG,SAAS,AAmBtB,OAAO,GAEJ,SAAS,CAAC;EACV,WAAW,EAAE,GAAI;CAClB;;A6ChQP,A7CmQM,e6CnQS,C7CyOb,aAAa,GAAG,SAAS,GA0BrB,aAAa,CAAC;EACd,UAAU,ED/LS,OAAO;CCgM3B;;A6CrQL,A7CwQE,e6CxQa,C7CwQb,WAAW,CAAC;EACV,KAAK,EAAE,OAAO;EACd,UAAU,EDtMK,OAAO;CCuMvB;;A6C3QH,A7C6QW,e6C7QI,C7C6Qb,QAAQ,CAAC,SAAS,CAAC;EACjB,KAAK,EDxMa,IAAI;CC4MvB;;A6ClRH,A7C6QW,e6C7QI,C7C6Qb,QAAQ,CAAC,SAAS,AAEf,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;A6CjRL,A7CsRQ,e6CtRO,C7CoRb,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,ED9MiB,IAAI;CC+M3B;;A6CxRP,A7CyRiB,e6CzRF,C7CoRb,aAAa,GACT,SAAS,AAIR,OAAO,GAAG,SAAS;A6CzR1B,A7C0RiB,e6C1RF,C7CoRb,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,EDjNuB,IAAI;CCkNjC;;A6C5RP,A7C6RiB,e6C7RF,C7CoRb,aAAa,GACT,SAAS,AAQR,OAAO,GAAG,SAAS,CAAC;EACnB,WAAW,EAAE,GAAI;CAClB;;A7E5OH,MAAM,EAAL,SAAS,EAAE,KAAK;E0HnDrB,A7CoS2B,e6CpSZ,A7CmSV,aAAa,AAAA,iBAAiB,CAC7B,aAAa,GAAG,EAAE,GAAG,aAAa,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,KAAK,CjF/LF,OAAO;GiFgM5B;;;A8C3SP;;;GAGG;AAEH,AAGI,YAHQ,CAEV,YAAY,CACV,OAAO,CAAC;E9CHV,gBAAgB,EjF4FT,OAAO;C+HlEX;;AA1BL,A9CEc,Y8CFF,CAEV,YAAY,CACV,OAAO,C9CDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,E8CCqC,IAAI;C9CA/C;;A8CJH,A9CMe,Y8CNH,CAEV,YAAY,CACV,OAAO,C9CGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A8CNrB,A9COe,Y8CPH,CAEV,YAAY,CACV,OAAO,C9CIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;A8CPtB,A9CQe,Y8CRH,CAEV,YAAY,CACV,OAAO,C9CKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A8CRrB,A9CSe,Y8CTH,CAEV,YAAY,CACV,OAAO,C9CMT,IAAI,CAAC,KAAK,GAAG,CAAC;A8CThB,A9CUgB,Y8CVJ,CAEV,YAAY,CACV,OAAO,C9COT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A8CVtB,A9CWgB,Y8CXJ,CAEV,YAAY,CACV,OAAO,C9CQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A8CXtB,A9CYmB,Y8CZP,CAEV,YAAY,CACV,OAAO,C9CST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;A8CfH,A9CkBE,Y8ClBU,CAEV,YAAY,CACV,OAAO,C9CeT,eAAe,CAAC;EACd,KAAK,E8CfqC,IAAI;C9CoB/C;;A8CxBH,A9CkBE,Y8ClBU,CAEV,YAAY,CACV,OAAO,C9CeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;A8CvBL,AAKM,YALM,CAEV,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,YALM,CAEV,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,YAbE,CAEV,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,YAjBA,CAEV,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,YAjBA,CAEV,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,YA5BQ,CAEV,YAAY,CA0BV,KAAK,CAAC;E9CCR,gBAAgB,E8CAU,OAAM;E9CChC,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;C8CEzE;;AA9BL,AA4BI,YA5BQ,CAEV,YAAY,CA0BV,KAAK,A9CKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;A8CnCH,AAgCM,YAhCM,CAEV,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,E/H2Db,OAAO;C+H1DX;;AAlCL,A9CwGE,Y8CxGU,C9CwGV,aAAa;A8CxGf,A9CyGe,Y8CzGH,C9CyGV,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,ED/CF,OAAO;CCgDtB;;A8C3GH,A9C+GI,Y8C/GQ,C9C8GV,WAAW,CACT,KAAK;A8C/GT,A9CgHI,Y8ChHQ,C9C8GV,WAAW,CAET,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;A8ClHL,A9CoHI,Y8CpHQ,C9C8GV,WAAW,CAMT,OAAO,CAAC;EACN,KAAK,EDxDU,OAAO;ECyDtB,UAAU,ED1DQ,OAAM;CCiEzB;;A8C7HL,A9CoHI,Y8CpHQ,C9C8GV,WAAW,CAMT,OAAO,AAGJ,MAAM,E8CvHb,A9CoHI,Y8CpHQ,C9C8GV,WAAW,CAMT,OAAO,AAIJ,MAAM,E8CxHb,A9CoHI,Y8CpHQ,C9C8GV,WAAW,CAMT,OAAO,AAKJ,OAAO,CAAC;EACP,KAAK,ED5Dc,IAAI;EC6DvB,UAAU,EAAE,OAAM;CACnB;;A8C5HP,A9C+HI,Y8C/HQ,C9C8GV,WAAW,CAiBT,cAAc,CAAC;EACb,YAAY,EAAE,OAAM;CAErB;;A8ClIL,A9CoII,Y8CpIQ,C9C8GV,WAAW,CAsBT,cAAc,CAAC;EACb,KAAK,EjFhCiB,OAAO;CiFiC9B;;A8CtIL,A9C4IM,Y8C5IM,C9C0IV,YAAY,GAAG,SAAS,GAEpB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;CAKpC;;A8ClJL,A9C4IM,Y8C5IM,C9C0IV,YAAY,GAAG,SAAS,GAEpB,SAAS,AAER,OAAO,E8C9Id,A9C4IM,Y8C5IM,C9C0IV,YAAY,GAAG,SAAS,GAEpB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,EDnFQ,OAAO;CCoFrB;;A8CjJP,A9CqJkB,Y8CrJN,C9C0IV,YAAY,GAAG,SAAS,AAWrB,UAAU,GAAG,SAAS;A8CrJ3B,A9CsJc,Y8CtJF,C9C0IV,YAAY,GAAG,SAAS,AAYrB,MAAM,GAAG,SAAS;A8CtJvB,A9CuJe,Y8CvJH,C9C0IV,YAAY,GAAG,SAAS,GAapB,SAAS,AAAA,OAAO,CAAC;EACjB,KAAK,ED1FgB,IAAI;EC2FzB,UAAU,ED7FQ,OAAM;CC8FzB;;A8C1JL,A9C4Je,Y8C5JH,C9C0IV,YAAY,GAAG,SAAS,GAkBpB,SAAS,AAAA,OAAO,CAAC;EACjB,iBAAiB,EjFjEd,OAAO;CiFkEX;;A8C9JL,A9CiKM,Y8CjKM,C9C0IV,YAAY,GAAG,SAAS,GAuBpB,aAAa,CAAC;EACd,MAAM,EAAE,KAAM;EACd,UAAU,EDpGU,OAAO;CCqG5B;;A8CpKL,A9CwKE,Y8CxKU,C9CwKV,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;EACb,UAAU,EAAE,OAAQ;CACrB;;A8C3KH,A9C8KW,Y8C9KC,C9C8KV,QAAQ,CAAC,CAAC,CAAC;EACT,KAAK,EDlHY,OAAO;CCsHzB;;A8CnLH,A9C8KW,Y8C9KC,C9C8KV,QAAQ,CAAC,CAAC,AAEP,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;A8ClLL,A9CwLQ,Y8CxLI,C9CsLV,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,EDzHgB,OAAO;CC0H7B;;A8C1LP,A9C2LiB,Y8C3LL,C9CsLV,aAAa,GACT,SAAS,GAIP,SAAS,AAAA,OAAO;A8C3LxB,A9C4LiB,Y8C5LL,C9CsLV,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,ED5HsB,IAAI;EC6H/B,UAAU,EAAE,WAAY;CACzB;;A8C/LP,A9CqMI,Y8CrMQ,C9CoMV,aAAa,CACX,aAAa,CAAC;EACZ,UAAU,EDvIU,OAAO;ECwI3B,MAAM,EAAE,CAAE;CAQX;;A8C/ML,A9CqMI,Y8CrMQ,C9CoMV,aAAa,CACX,aAAa;A8CrMjB,A9CyMgB,Y8CzMJ,C9CoMV,aAAa,CACX,aAAa,AAIV,MAAM,GAAG,UAAU,CAAC;EACnB,KAAK,ED5Ic,IAAI;CC6IxB;;A8C3MP,A9CqMI,Y8CrMQ,C9CoMV,aAAa,CACX,aAAa,AAOV,MAAM,CAAC;EACN,UAAU,EAAE,OAAO;CACpB;;A8C9MP,A9CgNI,Y8ChNQ,C9CoMV,aAAa,CAYX,UAAU,CAAC;EACT,KAAK,EDpJU,OAAO;CCqJvB;;A+CvNL;;;GAGG;AAEH,AAGI,kBAHc,CAEhB,YAAY,CACV,OAAO,CAAC;E/CHV,gBAAgB,EjF4FT,OAAO;CgIlEX;;AA1BL,A/CEc,kB+CFI,CAEhB,YAAY,CACV,OAAO,C/CDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,E+CCqC,IAAI;C/CA/C;;A+CJH,A/CMe,kB+CNG,CAEhB,YAAY,CACV,OAAO,C/CGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A+CNrB,A/COe,kB+CPG,CAEhB,YAAY,CACV,OAAO,C/CIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;A+CPtB,A/CQe,kB+CRG,CAEhB,YAAY,CACV,OAAO,C/CKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;A+CRrB,A/CSe,kB+CTG,CAEhB,YAAY,CACV,OAAO,C/CMT,IAAI,CAAC,KAAK,GAAG,CAAC;A+CThB,A/CUgB,kB+CVE,CAEhB,YAAY,CACV,OAAO,C/COT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A+CVtB,A/CWgB,kB+CXE,CAEhB,YAAY,CACV,OAAO,C/CQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;A+CXtB,A/CYmB,kB+CZD,CAEhB,YAAY,CACV,OAAO,C/CST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;A+CfH,A/CkBE,kB+ClBgB,CAEhB,YAAY,CACV,OAAO,C/CeT,eAAe,CAAC;EACd,KAAK,E+CfqC,IAAI;C/CoB/C;;A+CxBH,A/CkBE,kB+ClBgB,CAEhB,YAAY,CACV,OAAO,C/CeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;A+CvBL,AAKM,kBALY,CAEhB,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,kBALY,CAEhB,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,kBAbQ,CAEhB,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,kBAjBM,CAEhB,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,kBAjBM,CAEhB,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,kBA5Bc,CAEhB,YAAY,CA0BV,KAAK,CAAC;E/CCR,gBAAgB,EjF+DT,OAAO;EiF9Dd,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;C+CEzE;;AA9BL,AA4BI,kBA5Bc,CAEhB,YAAY,CA0BV,KAAK,A/CKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;A+CnCH,AAgCM,kBAhCY,CAEhB,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,EhI2Db,OAAO;CgI1DX;;AAlCL,A/CyNE,kB+CzNgB,C/CyNhB,aAAa;A+CzNf,A/C0Ne,kB+C1NG,C/C0NhB,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,EDvJD,OAAO;CCwJvB;;A+C5NH,A/C6NE,kB+C7NgB,C/C6NhB,gBAAgB;A+C7NlB,A/C8NE,kB+C9NgB,C/C8NhB,YAAY,CAAC;EACX,WAAW,EAAE,GAAG,CAAC,KAAK,CjFzHE,OAAO;CiF0HhC;;A+ChOH,A/CmOM,kB+CnOY,C/CkOhB,WAAW,GACP,KAAK;A+CnOX,A/CoOc,kB+CpOI,C/CkOhB,WAAW,GAEP,KAAK,GAAG,SAAS,CAAC;EAClB,KAAK,ED/JW,IAAI;CCgKrB;;A+CtOL,A/CyOkB,kB+CzOA,C/CyOhB,aAAa,GAAG,SAAS,CAAC;EACxB,UAAU,EAAE,0BAA2B;CA4BxC;;A+CtQH,A/C4OM,kB+C5OY,C/CyOhB,aAAa,GAAG,SAAS,GAGrB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;EACnC,WAAW,EAAE,GAAI;CAIlB;;A+ClPL,A/C4OM,kB+C5OY,C/CyOhB,aAAa,GAAG,SAAS,GAGrB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,ED1KS,IAAI;CC2KnB;;A+CjPP,A/CoPc,kB+CpPI,C/CyOhB,aAAa,GAAG,SAAS,AAWtB,MAAM,GAAG,SAAS;A+CpPvB,A/CqPe,kB+CrPG,C/CyOhB,aAAa,GAAG,SAAS,AAYtB,OAAO,GAAG,SAAS,CAAC;EACnB,KAAK,ED/KiB,IAAI;ECgL1B,UAAU,EDlLS,OAAO;CCmL3B;;A+CxPL,A/CyOkB,kB+CzOA,C/CyOhB,aAAa,GAAG,SAAS,AAmBtB,OAAO,CAAC;EACP,iBAAiB,EjFjKd,OAAO;CiFqKX;;A+CjQL,A/C8PQ,kB+C9PU,C/CyOhB,aAAa,GAAG,SAAS,AAmBtB,OAAO,GAEJ,SAAS,CAAC;EACV,WAAW,EAAE,GAAI;CAClB;;A+ChQP,A/CmQM,kB+CnQY,C/CyOhB,aAAa,GAAG,SAAS,GA0BrB,aAAa,CAAC;EACd,UAAU,ED/LS,OAAO;CCgM3B;;A+CrQL,A/CwQE,kB+CxQgB,C/CwQhB,WAAW,CAAC;EACV,KAAK,EAAE,OAAO;EACd,UAAU,EDtMK,OAAO;CCuMvB;;A+C3QH,A/C6QW,kB+C7QO,C/C6QhB,QAAQ,CAAC,SAAS,CAAC;EACjB,KAAK,EDxMa,IAAI;CC4MvB;;A+ClRH,A/C6QW,kB+C7QO,C/C6QhB,QAAQ,CAAC,SAAS,AAEf,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;A+CjRL,A/CsRQ,kB+CtRU,C/CoRhB,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,ED9MiB,IAAI;CC+M3B;;A+CxRP,A/CyRiB,kB+CzRC,C/CoRhB,aAAa,GACT,SAAS,AAIR,OAAO,GAAG,SAAS;A+CzR1B,A/C0RiB,kB+C1RC,C/CoRhB,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,EDjNuB,IAAI;CCkNjC;;A+C5RP,A/C6RiB,kB+C7RC,C/CoRhB,aAAa,GACT,SAAS,AAQR,OAAO,GAAG,SAAS,CAAC;EACnB,WAAW,EAAE,GAAI;CAClB;;A7E5OH,MAAM,EAAL,SAAS,EAAE,KAAK;E4HnDrB,A/CoS2B,kB+CpST,A/CmSb,aAAa,AAAA,iBAAiB,CAC7B,aAAa,GAAG,EAAE,GAAG,aAAa,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,KAAK,CjF/LF,OAAO;GiFgM5B;;;AgD3SP;;;GAGG;AAEH,AAGI,YAHQ,CAEV,YAAY,CACV,OAAO,CAAC;EhDHV,gBAAgB,EjFkGT,OAAO;CiIxEX;;AA1BL,AhDEc,YgDFF,CAEV,YAAY,CACV,OAAO,ChDDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,EgDC8B,IAAI;ChDAxC;;AgDJH,AhDMe,YgDNH,CAEV,YAAY,CACV,OAAO,ChDGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AgDNrB,AhDOe,YgDPH,CAEV,YAAY,CACV,OAAO,ChDIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;AgDPtB,AhDQe,YgDRH,CAEV,YAAY,CACV,OAAO,ChDKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AgDRrB,AhDSe,YgDTH,CAEV,YAAY,CACV,OAAO,ChDMT,IAAI,CAAC,KAAK,GAAG,CAAC;AgDThB,AhDUgB,YgDVJ,CAEV,YAAY,CACV,OAAO,ChDOT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AgDVtB,AhDWgB,YgDXJ,CAEV,YAAY,CACV,OAAO,ChDQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AgDXtB,AhDYmB,YgDZP,CAEV,YAAY,CACV,OAAO,ChDST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;AgDfH,AhDkBE,YgDlBU,CAEV,YAAY,CACV,OAAO,ChDeT,eAAe,CAAC;EACd,KAAK,EgDf8B,IAAI;ChDoBxC;;AgDxBH,AhDkBE,YgDlBU,CAEV,YAAY,CACV,OAAO,ChDeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;AgDvBL,AAKM,YALM,CAEV,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,YALM,CAEV,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,YAbE,CAEV,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,YAjBA,CAEV,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,YAjBA,CAEV,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,YA5BQ,CAEV,YAAY,CA0BV,KAAK,CAAC;EhDCR,gBAAgB,EgDAU,OAAM;EhDChC,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;CgDEzE;;AA9BL,AA4BI,YA5BQ,CAEV,YAAY,CA0BV,KAAK,AhDKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AgDnCH,AAgCM,YAhCM,CAEV,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,EjIiEb,OAAO;CiIhEX;;AAlCL,AhDwGE,YgDxGU,ChDwGV,aAAa;AgDxGf,AhDyGe,YgDzGH,ChDyGV,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,ED/CF,OAAO;CCgDtB;;AgD3GH,AhD+GI,YgD/GQ,ChD8GV,WAAW,CACT,KAAK;AgD/GT,AhDgHI,YgDhHQ,ChD8GV,WAAW,CAET,OAAO,CAAC;EACN,KAAK,EAAE,IAAK;CACb;;AgDlHL,AhDoHI,YgDpHQ,ChD8GV,WAAW,CAMT,OAAO,CAAC;EACN,KAAK,EDxDU,OAAO;ECyDtB,UAAU,ED1DQ,OAAM;CCiEzB;;AgD7HL,AhDoHI,YgDpHQ,ChD8GV,WAAW,CAMT,OAAO,AAGJ,MAAM,EgDvHb,AhDoHI,YgDpHQ,ChD8GV,WAAW,CAMT,OAAO,AAIJ,MAAM,EgDxHb,AhDoHI,YgDpHQ,ChD8GV,WAAW,CAMT,OAAO,AAKJ,OAAO,CAAC;EACP,KAAK,ED5Dc,IAAI;EC6DvB,UAAU,EAAE,OAAM;CACnB;;AgD5HP,AhD+HI,YgD/HQ,ChD8GV,WAAW,CAiBT,cAAc,CAAC;EACb,YAAY,EAAE,OAAM;CAErB;;AgDlIL,AhDoII,YgDpIQ,ChD8GV,WAAW,CAsBT,cAAc,CAAC;EACb,KAAK,EjFhCiB,OAAO;CiFiC9B;;AgDtIL,AhD4IM,YgD5IM,ChD0IV,YAAY,GAAG,SAAS,GAEpB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;CAKpC;;AgDlJL,AhD4IM,YgD5IM,ChD0IV,YAAY,GAAG,SAAS,GAEpB,SAAS,AAER,OAAO,EgD9Id,AhD4IM,YgD5IM,ChD0IV,YAAY,GAAG,SAAS,GAEpB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,EDnFQ,OAAO;CCoFrB;;AgDjJP,AhDqJkB,YgDrJN,ChD0IV,YAAY,GAAG,SAAS,AAWrB,UAAU,GAAG,SAAS;AgDrJ3B,AhDsJc,YgDtJF,ChD0IV,YAAY,GAAG,SAAS,AAYrB,MAAM,GAAG,SAAS;AgDtJvB,AhDuJe,YgDvJH,ChD0IV,YAAY,GAAG,SAAS,GAapB,SAAS,AAAA,OAAO,CAAC;EACjB,KAAK,ED1FgB,IAAI;EC2FzB,UAAU,ED7FQ,OAAM;CC8FzB;;AgD1JL,AhD4Je,YgD5JH,ChD0IV,YAAY,GAAG,SAAS,GAkBpB,SAAS,AAAA,OAAO,CAAC;EACjB,iBAAiB,EjF3Dd,OAAO;CiF4DX;;AgD9JL,AhDiKM,YgDjKM,ChD0IV,YAAY,GAAG,SAAS,GAuBpB,aAAa,CAAC;EACd,MAAM,EAAE,KAAM;EACd,UAAU,EDpGU,OAAO;CCqG5B;;AgDpKL,AhDwKE,YgDxKU,ChDwKV,WAAW,CAAC;EACV,KAAK,EAAE,OAAM;EACb,UAAU,EAAE,OAAQ;CACrB;;AgD3KH,AhD8KW,YgD9KC,ChD8KV,QAAQ,CAAC,CAAC,CAAC;EACT,KAAK,EDlHY,OAAO;CCsHzB;;AgDnLH,AhD8KW,YgD9KC,ChD8KV,QAAQ,CAAC,CAAC,AAEP,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;AgDlLL,AhDwLQ,YgDxLI,ChDsLV,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,EDzHgB,OAAO;CC0H7B;;AgD1LP,AhD2LiB,YgD3LL,ChDsLV,aAAa,GACT,SAAS,GAIP,SAAS,AAAA,OAAO;AgD3LxB,AhD4LiB,YgD5LL,ChDsLV,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,ED5HsB,IAAI;EC6H/B,UAAU,EAAE,WAAY;CACzB;;AgD/LP,AhDqMI,YgDrMQ,ChDoMV,aAAa,CACX,aAAa,CAAC;EACZ,UAAU,EDvIU,OAAO;ECwI3B,MAAM,EAAE,CAAE;CAQX;;AgD/ML,AhDqMI,YgDrMQ,ChDoMV,aAAa,CACX,aAAa;AgDrMjB,AhDyMgB,YgDzMJ,ChDoMV,aAAa,CACX,aAAa,AAIV,MAAM,GAAG,UAAU,CAAC;EACnB,KAAK,ED5Ic,IAAI;CC6IxB;;AgD3MP,AhDqMI,YgDrMQ,ChDoMV,aAAa,CACX,aAAa,AAOV,MAAM,CAAC;EACN,UAAU,EAAE,OAAO;CACpB;;AgD9MP,AhDgNI,YgDhNQ,ChDoMV,aAAa,CAYX,UAAU,CAAC;EACT,KAAK,EDpJU,OAAO;CCqJvB;;AiDvNL;;;GAGG;AAEH,AAGI,kBAHc,CAEhB,YAAY,CACV,OAAO,CAAC;EjDHV,gBAAgB,EjFkGT,OAAO;CkIxEX;;AA1BL,AjDEc,kBiDFI,CAEhB,YAAY,CACV,OAAO,CjDDT,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;EACZ,KAAK,EiDC8B,IAAI;CjDAxC;;AiDJH,AjDMe,kBiDNG,CAEhB,YAAY,CACV,OAAO,CjDGT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AiDNrB,AjDOe,kBiDPG,CAEhB,YAAY,CACV,OAAO,CjDIT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,OAAO;AiDPtB,AjDQe,kBiDRG,CAEhB,YAAY,CACV,OAAO,CjDKT,IAAI,GAAG,EAAE,GAAG,CAAC,AAAA,MAAM;AiDRrB,AjDSe,kBiDTG,CAEhB,YAAY,CACV,OAAO,CjDMT,IAAI,CAAC,KAAK,GAAG,CAAC;AiDThB,AjDUgB,kBiDVE,CAEhB,YAAY,CACV,OAAO,CjDOT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AiDVtB,AjDWgB,kBiDXE,CAEhB,YAAY,CACV,OAAO,CjDQT,IAAI,CAAC,KAAK,GAAG,CAAC,AAAA,MAAM;AiDXtB,AjDYmB,kBiDZD,CAEhB,YAAY,CACV,OAAO,CjDST,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;EACjB,UAAU,EAdyF,kBAAI;EAevG,KAAK,EAf0E,OAAO;CAgBvF;;AiDfH,AjDkBE,kBiDlBgB,CAEhB,YAAY,CACV,OAAO,CjDeT,eAAe,CAAC;EACd,KAAK,EiDf8B,IAAI;CjDoBxC;;AiDxBH,AjDkBE,kBiDlBgB,CAEhB,YAAY,CACV,OAAO,CjDeT,eAAe,AAEZ,MAAM,CAAC;EACN,KAAK,EAtBwE,OAAO;EAuBpF,UAAU,EAvBuF,kBAAI;CAwBtG;;AiDvBL,AAKM,kBALY,CAEhB,YAAY,CACV,OAAO,CAEL,eAAe,CAAC;EACd,KAAK,EAAE,IAAK;CAIb;;AAVP,AAKM,kBALY,CAEhB,YAAY,CACV,OAAO,CAEL,eAAe,AAEZ,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AAEH,MAAM,EAAL,SAAS,EAAE,KAAK;EAXvB,AAaU,kBAbQ,CAEhB,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,AACC,QAAQ,CAAC;IACR,gBAAgB,EAAE,wBAAI;GACvB;EAhBb,AAiBY,kBAjBM,CAEhB,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,CAAC;IACA,KAAK,EAAE,IAAK;GAIb;EAtBb,AAiBY,kBAjBM,CAEhB,YAAY,CACV,OAAO,CASH,cAAc,CACZ,EAAE,CAIA,CAAC,AAEE,MAAM,CAAC;IACN,UAAU,EAAE,OAAM;GACnB;;;AArBf,AA4BI,kBA5Bc,CAEhB,YAAY,CA0BV,KAAK,CAAC;EjDCR,gBAAgB,EjFqET,OAAO;EiFpEd,KAAK,EAFgC,IAAI;EAGzC,aAAa,EAHuF,CAAC,CAGjE,KAAK,CAHwB,WAAW;CiDEzE;;AA9BL,AA4BI,kBA5Bc,CAEhB,YAAY,CA0BV,KAAK,AjDKN,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAM;CACzB;;AiDnCH,AAgCM,kBAhCY,CAEhB,YAAY,CA8BV,EAAE,AAAA,YAAY,CAAC;EACb,gBAAgB,ElIiEb,OAAO;CkIhEX;;AAlCL,AjDyNE,kBiDzNgB,CjDyNhB,aAAa;AiDzNf,AjD0Ne,kBiD1NG,CjD0NhB,aAAa,AAAA,OAAO,CAAC;EACnB,gBAAgB,EDvJD,OAAO;CCwJvB;;AiD5NH,AjD6NE,kBiD7NgB,CjD6NhB,gBAAgB;AiD7NlB,AjD8NE,kBiD9NgB,CjD8NhB,YAAY,CAAC;EACX,WAAW,EAAE,GAAG,CAAC,KAAK,CjFzHE,OAAO;CiF0HhC;;AiDhOH,AjDmOM,kBiDnOY,CjDkOhB,WAAW,GACP,KAAK;AiDnOX,AjDoOc,kBiDpOI,CjDkOhB,WAAW,GAEP,KAAK,GAAG,SAAS,CAAC;EAClB,KAAK,ED/JW,IAAI;CCgKrB;;AiDtOL,AjDyOkB,kBiDzOA,CjDyOhB,aAAa,GAAG,SAAS,CAAC;EACxB,UAAU,EAAE,0BAA2B;CA4BxC;;AiDtQH,AjD4OM,kBiD5OY,CjDyOhB,aAAa,GAAG,SAAS,GAGrB,SAAS,CAAC;EACV,WAAW,EAAE,qBAAsB;EACnC,WAAW,EAAE,GAAI;CAIlB;;AiDlPL,AjD4OM,kBiD5OY,CjDyOhB,aAAa,GAAG,SAAS,GAGrB,SAAS,AAGR,MAAM,CAAC;EACN,KAAK,ED1KS,IAAI;CC2KnB;;AiDjPP,AjDoPc,kBiDpPI,CjDyOhB,aAAa,GAAG,SAAS,AAWtB,MAAM,GAAG,SAAS;AiDpPvB,AjDqPe,kBiDrPG,CjDyOhB,aAAa,GAAG,SAAS,AAYtB,OAAO,GAAG,SAAS,CAAC;EACnB,KAAK,ED/KiB,IAAI;ECgL1B,UAAU,EDlLS,OAAO;CCmL3B;;AiDxPL,AjDyOkB,kBiDzOA,CjDyOhB,aAAa,GAAG,SAAS,AAmBtB,OAAO,CAAC;EACP,iBAAiB,EjF3Jd,OAAO;CiF+JX;;AiDjQL,AjD8PQ,kBiD9PU,CjDyOhB,aAAa,GAAG,SAAS,AAmBtB,OAAO,GAEJ,SAAS,CAAC;EACV,WAAW,EAAE,GAAI;CAClB;;AiDhQP,AjDmQM,kBiDnQY,CjDyOhB,aAAa,GAAG,SAAS,GA0BrB,aAAa,CAAC;EACd,UAAU,ED/LS,OAAO;CCgM3B;;AiDrQL,AjDwQE,kBiDxQgB,CjDwQhB,WAAW,CAAC;EACV,KAAK,EAAE,OAAO;EACd,UAAU,EDtMK,OAAO;CCuMvB;;AiD3QH,AjD6QW,kBiD7QO,CjD6QhB,QAAQ,CAAC,SAAS,CAAC;EACjB,KAAK,EDxMa,IAAI;CC4MvB;;AiDlRH,AjD6QW,kBiD7QO,CjD6QhB,QAAQ,CAAC,SAAS,AAEf,MAAM,CAAC;EACN,eAAe,EAAE,IAAK;CACvB;;AiDjRL,AjDsRQ,kBiDtRU,CjDoRhB,aAAa,GACT,SAAS,GACP,SAAS,CAAC;EACV,KAAK,ED9MiB,IAAI;CC+M3B;;AiDxRP,AjDyRiB,kBiDzRC,CjDoRhB,aAAa,GACT,SAAS,AAIR,OAAO,GAAG,SAAS;AiDzR1B,AjD0RiB,kBiD1RC,CjDoRhB,aAAa,GACT,SAAS,GAKP,SAAS,AAAA,MAAM,CAAC;EAChB,KAAK,EDjNuB,IAAI;CCkNjC;;AiD5RP,AjD6RiB,kBiD7RC,CjDoRhB,aAAa,GACT,SAAS,AAQR,OAAO,GAAG,SAAS,CAAC;EACnB,WAAW,EAAE,GAAI;CAClB;;A7E5OH,MAAM,EAAL,SAAS,EAAE,KAAK;E8HnDrB,AjDoS2B,kBiDpST,AjDmSb,aAAa,AAAA,iBAAiB,CAC7B,aAAa,GAAG,EAAE,GAAG,aAAa,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,KAAK,CjF/LF,OAAO;GiFgM5B", + "names": [] +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/adminlte.min.css.map b/hera-admin/src/main/resources/static/adminlte/dist/css/adminlte.min.css.map new file mode 100755 index 00000000..6ee069e2 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/adminlte.min.css.map @@ -0,0 +1,140 @@ +{ + "version": 3, + "file": "adminlte.min.css", + "sources": [ + "../../build/scss/AdminLTE.scss", + "../../build/scss/_bootstrap_variables.scss", + "../../bower_components/bootstrap/scss/bootstrap.scss", + "../../bower_components/bootstrap/scss/_variables.scss", + "../../bower_components/bootstrap/scss/_mixins.scss", + "../../bower_components/bootstrap/scss/mixins/_breakpoints.scss", + "../../bower_components/bootstrap/scss/mixins/_hover.scss", + "../../bower_components/bootstrap/scss/mixins/_image.scss", + "../../bower_components/bootstrap/scss/mixins/_badge.scss", + "../../bower_components/bootstrap/scss/mixins/_resize.scss", + "../../bower_components/bootstrap/scss/mixins/_screen-reader.scss", + "../../bower_components/bootstrap/scss/mixins/_size.scss", + "../../bower_components/bootstrap/scss/mixins/_reset-text.scss", + "../../bower_components/bootstrap/scss/mixins/_text-emphasis.scss", + "../../bower_components/bootstrap/scss/mixins/_text-hide.scss", + "../../bower_components/bootstrap/scss/mixins/_text-truncate.scss", + "../../bower_components/bootstrap/scss/mixins/_transforms.scss", + "../../bower_components/bootstrap/scss/mixins/_visibility.scss", + "../../bower_components/bootstrap/scss/mixins/_alert.scss", + "../../bower_components/bootstrap/scss/mixins/_buttons.scss", + "../../bower_components/bootstrap/scss/mixins/_cards.scss", + "../../bower_components/bootstrap/scss/mixins/_pagination.scss", + "../../bower_components/bootstrap/scss/mixins/_lists.scss", + "../../bower_components/bootstrap/scss/mixins/_list-group.scss", + "../../bower_components/bootstrap/scss/mixins/_nav-divider.scss", + "../../bower_components/bootstrap/scss/mixins/_forms.scss", + "../../bower_components/bootstrap/scss/mixins/_table-row.scss", + "../../bower_components/bootstrap/scss/mixins/_background-variant.scss", + "../../bower_components/bootstrap/scss/mixins/_border-radius.scss", + "../../bower_components/bootstrap/scss/mixins/_gradients.scss", + "../../bower_components/bootstrap/scss/mixins/_clearfix.scss", + "../../bower_components/bootstrap/scss/mixins/_grid-framework.scss", + "../../bower_components/bootstrap/scss/mixins/_grid.scss", + "../../bower_components/bootstrap/scss/mixins/_float.scss", + "../../bower_components/bootstrap/scss/_custom.scss", + "../../bower_components/bootstrap/scss/_normalize.scss", + "../../bower_components/bootstrap/scss/_print.scss", + "../../bower_components/bootstrap/scss/_reboot.scss", + "../../bower_components/bootstrap/scss/_type.scss", + "../../bower_components/bootstrap/scss/_images.scss", + "../../bower_components/bootstrap/scss/_code.scss", + "../../bower_components/bootstrap/scss/_grid.scss", + "../../bower_components/bootstrap/scss/_tables.scss", + "../../bower_components/bootstrap/scss/_forms.scss", + "../../bower_components/bootstrap/scss/_buttons.scss", + "../../bower_components/bootstrap/scss/_transitions.scss", + "../../bower_components/bootstrap/scss/_dropdown.scss", + "../../bower_components/bootstrap/scss/_button-group.scss", + "../../bower_components/bootstrap/scss/_input-group.scss", + "../../bower_components/bootstrap/scss/_custom-forms.scss", + "../../bower_components/bootstrap/scss/_nav.scss", + "../../bower_components/bootstrap/scss/_navbar.scss", + "../../bower_components/bootstrap/scss/_card.scss", + "../../bower_components/bootstrap/scss/_breadcrumb.scss", + "../../bower_components/bootstrap/scss/_pagination.scss", + "../../bower_components/bootstrap/scss/_badge.scss", + "../../bower_components/bootstrap/scss/_jumbotron.scss", + "../../bower_components/bootstrap/scss/_alert.scss", + "../../bower_components/bootstrap/scss/_progress.scss", + "../../bower_components/bootstrap/scss/_media.scss", + "../../bower_components/bootstrap/scss/_list-group.scss", + "../../bower_components/bootstrap/scss/_responsive-embed.scss", + "../../bower_components/bootstrap/scss/_close.scss", + "../../bower_components/bootstrap/scss/_modal.scss", + "../../bower_components/bootstrap/scss/_tooltip.scss", + "../../bower_components/bootstrap/scss/_popover.scss", + "../../bower_components/bootstrap/scss/_carousel.scss", + "../../bower_components/bootstrap/scss/_utilities.scss", + "../../bower_components/bootstrap/scss/utilities/_align.scss", + "../../bower_components/bootstrap/scss/utilities/_background.scss", + "../../bower_components/bootstrap/scss/utilities/_borders.scss", + "../../bower_components/bootstrap/scss/utilities/_clearfix.scss", + "../../bower_components/bootstrap/scss/utilities/_display.scss", + "../../bower_components/bootstrap/scss/utilities/_flex.scss", + "../../bower_components/bootstrap/scss/utilities/_float.scss", + "../../bower_components/bootstrap/scss/utilities/_position.scss", + "../../bower_components/bootstrap/scss/utilities/_screenreaders.scss", + "../../bower_components/bootstrap/scss/utilities/_sizing.scss", + "../../bower_components/bootstrap/scss/utilities/_spacing.scss", + "../../bower_components/bootstrap/scss/utilities/_text.scss", + "../../bower_components/bootstrap/scss/utilities/_visibility.scss", + "../../build/scss/_variables.scss", + "../../build/scss/_mixins.scss", + "../../build/scss/_layout.scss", + "../../build/scss/_header.scss", + "../../build/scss/_sidebar.scss", + "../../build/scss/_sidebar-mini.scss", + "../../build/scss/_control-sidebar.scss", + "../../build/scss/_dropdown.scss", + "../../build/scss/_forms.scss", + "../../build/scss/_progress-bars.scss", + "../../build/scss/_small-box.scss", + "../../build/scss/_boxes.scss", + "../../build/scss/_info-box.scss", + "../../build/scss/_timeline.scss", + "../../build/scss/_buttons.scss", + "../../build/scss/_callout.scss", + "../../build/scss/_alerts.scss", + "../../build/scss/_navs.scss", + "../../build/scss/_products.scss", + "../../build/scss/_table.scss", + "../../build/scss/_labels.scss", + "../../build/scss/_direct-chat.scss", + "../../build/scss/_users-list.scss", + "../../build/scss/_site-search.scss", + "../../build/scss/_carousel.scss", + "../../build/scss/_modal.scss", + "../../build/scss/_social-widgets.scss", + "../../build/scss/_mailbox.scss", + "../../build/scss/_lockscreen.scss", + "../../build/scss/_login_and_register.scss", + "../../build/scss/_404_500_errors.scss", + "../../build/scss/_invoice.scss", + "../../build/scss/_profile.scss", + "../../build/scss/_bootstrap-social.scss", + "../../build/scss/_fullcalendar.scss", + "../../build/scss/_select2.scss", + "../../build/scss/_miscellaneous.scss", + "../../build/scss/_print.scss", + "../../build/scss/skins/_all-skins.scss", + "../../build/scss/skins/skin-blue.scss", + "../../build/scss/skins/skin-blue-light.scss", + "../../build/scss/skins/skin-black.scss", + "../../build/scss/skins/skin-black-light.scss", + "../../build/scss/skins/skin-green.scss", + "../../build/scss/skins/skin-green-light.scss", + "../../build/scss/skins/skin-red.scss", + "../../build/scss/skins/skin-red-light.scss", + "../../build/scss/skins/skin-yellow.scss", + "../../build/scss/skins/skin-yellow-light.scss", + "../../build/scss/skins/skin-purple.scss", + "../../build/scss/skins/skin-purple-light.scss" + ], + "mappings": "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", + "names": [] +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-bootstrap-social.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-bootstrap-social.css new file mode 100755 index 00000000..02513c76 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-bootstrap-social.css @@ -0,0 +1,760 @@ +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ +.btn-social { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.btn-social > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social.btn-lg { + padding-left: 61px; +} +.btn-social.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social.btn-sm { + padding-left: 38px; +} +.btn-social.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social.btn-xs { + padding-left: 30px; +} +.btn-social.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + height: 34px; + width: 34px; + padding: 0; +} +.btn-social-icon > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social-icon.btn-lg { + padding-left: 61px; +} +.btn-social-icon.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social-icon.btn-sm { + padding-left: 38px; +} +.btn-social-icon.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social-icon.btn-xs { + padding-left: 30px; +} +.btn-social-icon.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon > :first-child { + border: none; + text-align: center; + width: 100%; +} +.btn-social-icon.btn-lg { + height: 45px; + width: 45px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-sm { + height: 30px; + width: 30px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-xs { + height: 22px; + width: 22px; + padding-left: 0; + padding-right: 0; +} +.btn-adn { + color: #ffffff; + background-color: #d87a68; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:focus, +.btn-adn.focus { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:hover { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + background-image: none; +} +.btn-adn .badge { + color: #d87a68; + background-color: #ffffff; +} +.btn-bitbucket { + color: #ffffff; + background-color: #205081; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:focus, +.btn-bitbucket.focus { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:hover { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + background-image: none; +} +.btn-bitbucket .badge { + color: #205081; + background-color: #ffffff; +} +.btn-dropbox { + color: #ffffff; + background-color: #1087dd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:focus, +.btn-dropbox.focus { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:hover { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + background-image: none; +} +.btn-dropbox .badge { + color: #1087dd; + background-color: #ffffff; +} +.btn-facebook { + color: #ffffff; + background-color: #3b5998; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:focus, +.btn-facebook.focus { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:hover { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + background-image: none; +} +.btn-facebook .badge { + color: #3b5998; + background-color: #ffffff; +} +.btn-flickr { + color: #ffffff; + background-color: #ff0084; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:focus, +.btn-flickr.focus { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:hover { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + background-image: none; +} +.btn-flickr .badge { + color: #ff0084; + background-color: #ffffff; +} +.btn-foursquare { + color: #ffffff; + background-color: #f94877; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:focus, +.btn-foursquare.focus { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:hover { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + background-image: none; +} +.btn-foursquare .badge { + color: #f94877; + background-color: #ffffff; +} +.btn-github { + color: #ffffff; + background-color: #444444; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:focus, +.btn-github.focus { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:hover { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + background-image: none; +} +.btn-github .badge { + color: #444444; + background-color: #ffffff; +} +.btn-google { + color: #ffffff; + background-color: #dd4b39; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:focus, +.btn-google.focus { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:hover { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + background-image: none; +} +.btn-google .badge { + color: #dd4b39; + background-color: #ffffff; +} +.btn-instagram { + color: #ffffff; + background-color: #3f729b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:focus, +.btn-instagram.focus { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:hover { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + background-image: none; +} +.btn-instagram .badge { + color: #3f729b; + background-color: #ffffff; +} +.btn-linkedin { + color: #ffffff; + background-color: #007bb6; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:focus, +.btn-linkedin.focus { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:hover { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + background-image: none; +} +.btn-linkedin .badge { + color: #007bb6; + background-color: #ffffff; +} +.btn-microsoft { + color: #ffffff; + background-color: #2672ec; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:focus, +.btn-microsoft.focus { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:hover { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + background-image: none; +} +.btn-microsoft .badge { + color: #2672ec; + background-color: #ffffff; +} +.btn-openid { + color: #ffffff; + background-color: #f7931e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:focus, +.btn-openid.focus { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:hover { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + background-image: none; +} +.btn-openid .badge { + color: #f7931e; + background-color: #ffffff; +} +.btn-pinterest { + color: #ffffff; + background-color: #cb2027; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:focus, +.btn-pinterest.focus { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:hover { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + background-image: none; +} +.btn-pinterest .badge { + color: #cb2027; + background-color: #ffffff; +} +.btn-reddit { + color: #000000; + background-color: #eff7ff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:focus, +.btn-reddit.focus { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:hover { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + background-image: none; +} +.btn-reddit .badge { + color: #eff7ff; + background-color: #000000; +} +.btn-soundcloud { + color: #ffffff; + background-color: #ff5500; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:focus, +.btn-soundcloud.focus { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:hover { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + background-image: none; +} +.btn-soundcloud .badge { + color: #ff5500; + background-color: #ffffff; +} +.btn-tumblr { + color: #ffffff; + background-color: #2c4762; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:focus, +.btn-tumblr.focus { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:hover { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + background-image: none; +} +.btn-tumblr .badge { + color: #2c4762; + background-color: #ffffff; +} +.btn-twitter { + color: #ffffff; + background-color: #55acee; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:focus, +.btn-twitter.focus { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:hover { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + background-image: none; +} +.btn-twitter .badge { + color: #55acee; + background-color: #ffffff; +} +.btn-vimeo { + color: #ffffff; + background-color: #1ab7ea; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:focus, +.btn-vimeo.focus { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:hover { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + background-image: none; +} +.btn-vimeo .badge { + color: #1ab7ea; + background-color: #ffffff; +} +.btn-vk { + color: #ffffff; + background-color: #587ea3; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:focus, +.btn-vk.focus { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:hover { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + background-image: none; +} +.btn-vk .badge { + color: #587ea3; + background-color: #ffffff; +} +.btn-yahoo { + color: #ffffff; + background-color: #720e9e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:focus, +.btn-yahoo.focus { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:hover { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + background-image: none; +} +.btn-yahoo .badge { + color: #720e9e; + background-color: #ffffff; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-bootstrap-social.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-bootstrap-social.min.css new file mode 100755 index 00000000..59cf7f23 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-bootstrap-social.min.css @@ -0,0 +1 @@ +.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-fullcalendar.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-fullcalendar.css new file mode 100755 index 00000000..54426afd --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-fullcalendar.css @@ -0,0 +1,93 @@ +/* + * Plugin: Full Calendar + * --------------------- + */ +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; +} +.fc-button:hover, +.fc-button:active, +.fc-button.hover { + background-color: #e9e9e9; +} +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} +.fc-header-right { + padding-right: 10px; +} +.fc-header-left { + padding-left: 10px; +} +.fc-widget-header { + background: #fafafa; +} +.fc-grid { + width: 100%; + border: 0; +} +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} +.fc-toolbar { + padding: 10px; + margin: 0; +} +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; +} +.fc-color-picker > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; +} +.fc-color-picker > li .fa { + -webkit-transition: -webkit-transform linear 0.3s; + -moz-transition: -moz-transform linear 0.3s; + -o-transition: -o-transform linear 0.3s; + transition: transform linear 0.3s; +} +.fc-color-picker > li .fa:hover { + -webkit-transform: rotate(30deg); + -ms-transform: rotate(30deg); + -o-transform: rotate(30deg); + transform: rotate(30deg); +} +#add-new-event { + -webkit-transition: all linear 0.3s; + -o-transition: all linear 0.3s; + transition: all linear 0.3s; +} +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + cursor: move; +} +.external-event:hover { + box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-fullcalendar.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-fullcalendar.min.css new file mode 100755 index 00000000..47514784 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-fullcalendar.min.css @@ -0,0 +1 @@ +.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-select2.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-select2.css new file mode 100755 index 00000000..4636a2cc --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-select2.css @@ -0,0 +1,97 @@ +/* + * Plugin: Select2 + * --------------- + */ +.select2-container--default.select2-container--focus, +.select2-selection.select2-container--focus, +.select2-container--default:focus, +.select2-selection:focus, +.select2-container--default:active, +.select2-selection:active { + outline: none; +} +.select2-container--default .select2-selection--single, +.select2-selection .select2-selection--single { + border: 1px solid #d2d6de; + border-radius: 0; + padding: 6px 12px; + height: 34px; +} +.select2-container--default.select2-container--open { + border-color: #3c8dbc; +} +.select2-dropdown { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #3c8dbc; + color: white; +} +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} +.select2-dropdown .select2-search__field, +.select2-search--inline .select2-search__field { + border: 1px solid #d2d6de; +} +.select2-dropdown .select2-search__field:focus, +.select2-search--inline .select2-search__field:focus { + outline: none; + border: 1px solid #3c8dbc; +} +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} +.select2-container--default .select2-results__option[aria-selected=true], +.select2-container--default .select2-results__option[aria-selected=true]:hover { + color: #444; +} +.select2-container--default .select2-selection--multiple { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-selection--multiple:focus { + border-color: #3c8dbc; +} +.select2-container--default.select2-container--focus .select2-selection--multiple { + border-color: #d2d6de; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #3c8dbc; + border-color: #367fa9; + padding: 1px 10px; + color: #fff; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255, 255, 255, 0.7); +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #fff; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-select2.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-select2.min.css new file mode 100755 index 00000000..e09368f1 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-select2.min.css @@ -0,0 +1 @@ +.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-without-plugins.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-without-plugins.css new file mode 100755 index 00000000..4a04b8fb --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-without-plugins.css @@ -0,0 +1,4015 @@ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); +/*! + * AdminLTE v2.3.5 Without Third-Party Plugins + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + height: 100%; +} +.layout-boxed html, +.layout-boxed body { + height: 100%; +} +body { + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} +/* Layout */ +.wrapper { + height: 100%; + position: relative; + overflow-x: hidden; + overflow-y: auto; +} +.wrapper:before, +.wrapper:after { + content: " "; + display: table; +} +.wrapper:after { + clear: both; +} +.layout-boxed .wrapper { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); + position: relative; +} +.layout-boxed { + background: url('../img/boxed-bg.jpg') repeat fixed; +} +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; + margin-left: 230px; + z-index: 820; +} +.layout-top-nav .content-wrapper, +.layout-top-nav .right-side, +.layout-top-nav .main-footer { + margin-left: 0; +} +@media (max-width: 767px) { + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0; + } +} +@media (min-width: 768px) { + .sidebar-collapse .content-wrapper, + .sidebar-collapse .right-side, + .sidebar-collapse .main-footer { + margin-left: 0; + } +} +@media (max-width: 767px) { + .sidebar-open .content-wrapper, + .sidebar-open .right-side, + .sidebar-open .main-footer { + -webkit-transform: translate(230px, 0); + -ms-transform: translate(230px, 0); + -o-transform: translate(230px, 0); + transform: translate(230px, 0); + } +} +.content-wrapper, +.right-side { + min-height: 100%; + background-color: #ecf0f5; + z-index: 800; +} +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid #d2d6de; +} +/* Fixed layout */ +.fixed .main-header, +.fixed .main-sidebar, +.fixed .left-side { + position: fixed; +} +.fixed .main-header { + top: 0; + right: 0; + left: 0; +} +.fixed .content-wrapper, +.fixed .right-side { + padding-top: 50px; +} +@media (max-width: 767px) { + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 100px; + } +} +.fixed.layout-boxed .wrapper { + max-width: 100%; +} +.fixed .wrapper { + overflow: hidden; +} +.hold-transition .content-wrapper, +.hold-transition .right-side, +.hold-transition .main-footer, +.hold-transition .main-sidebar, +.hold-transition .left-side, +.hold-transition .main-header .navbar, +.hold-transition .main-header .logo, +.hold-transition .menu-open .fa-angle-left { + /* Fix for IE */ + -webkit-transition: none; + -o-transition: none; + transition: none; +} +/* Content */ +.content { + min-height: 250px; + padding: 15px; + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: 'Source Sans Pro', sans-serif; +} +/* General Links */ +a { + color: #3c8dbc; +} +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: #72afd2; +} +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; +} +.page-header > small { + color: #666; + display: block; + margin-top: 5px; +} +/* + * Component: Main Header + * ---------------------- + */ +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; +} +.main-header .navbar { + -webkit-transition: margin-left 0.3s ease-in-out; + -o-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; + margin-bottom: 0; + margin-left: 230px; + border: none; + min-height: 50px; + border-radius: 0; +} +.layout-top-nav .main-header .navbar { + margin-left: 0; +} +.main-header #navbar-search-input.form-control { + background: rgba(255, 255, 255, 0.2); + border-color: transparent; +} +.main-header #navbar-search-input.form-control:focus, +.main-header #navbar-search-input.form-control:active { + border-color: rgba(0, 0, 0, 0.1); + background: rgba(255, 255, 255, 0.9); +} +.main-header #navbar-search-input.form-control::-moz-placeholder { + color: #ccc; + opacity: 1; +} +.main-header #navbar-search-input.form-control:-ms-input-placeholder { + color: #ccc; +} +.main-header #navbar-search-input.form-control::-webkit-input-placeholder { + color: #ccc; +} +.main-header .navbar-custom-menu, +.main-header .navbar-right { + float: right; +} +@media (max-width: 991px) { + .main-header .navbar-custom-menu a, + .main-header .navbar-right a { + color: inherit; + background: transparent; + } +} +@media (max-width: 767px) { + .main-header .navbar-right { + float: none; + } + .navbar-collapse .main-header .navbar-right { + margin: 7.5px -15px; + } + .main-header .navbar-right > li { + color: inherit; + border: 0; + } +} +.main-header .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: 15px 15px; + font-family: fontAwesome; +} +.main-header .sidebar-toggle:before { + content: "\f0c9"; +} +.main-header .sidebar-toggle:hover { + color: #fff; +} +.main-header .sidebar-toggle:focus, +.main-header .sidebar-toggle:active { + background: transparent; +} +.main-header .sidebar-toggle .icon-bar { + display: none; +} +.main-header .navbar .nav > li.user > a > .fa, +.main-header .navbar .nav > li.user > a > .glyphicon, +.main-header .navbar .nav > li.user > a > .ion { + margin-right: 5px; +} +.main-header .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; +} +.main-header .logo { + -webkit-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + display: block; + float: left; + height: 50px; + font-size: 20px; + line-height: 50px; + text-align: center; + width: 230px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; +} +.main-header .logo .logo-lg { + display: block; +} +.main-header .logo .logo-mini { + display: none; +} +.main-header .navbar-brand { + color: #fff; +} +.content-header { + position: relative; + padding: 15px 15px 0 15px; +} +.content-header > h1 { + margin: 0; + font-size: 24px; +} +.content-header > h1 > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; +} +.content-header > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + border-radius: 2px; +} +.content-header > .breadcrumb > li > a { + color: #444; + text-decoration: none; + display: inline-block; +} +.content-header > .breadcrumb > li > a > .fa, +.content-header > .breadcrumb > li > a > .glyphicon, +.content-header > .breadcrumb > li > a > .ion { + margin-right: 5px; +} +.content-header > .breadcrumb > li + li:before { + content: '>\00a0'; +} +@media (max-width: 991px) { + .content-header > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: #d2d6de; + padding-left: 10px; + } + .content-header > .breadcrumb li:before { + color: #97a0b3; + } +} +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: 15px 15px; +} +@media (max-width: 991px) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} +@media (max-width: 767px) { + .main-header { + position: relative; + } + .main-header .logo, + .main-header .navbar { + width: 100%; + float: none; + } + .main-header .navbar { + margin: 0; + } + .main-header .navbar-custom-menu { + float: right; + } +} +@media (max-width: 991px) { + .navbar-collapse.pull-left { + float: none !important; + } + .navbar-collapse.pull-left + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } +} +/* + * Component: Sidebar + * ------------------ + */ +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: 230px; + z-index: 810; + -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + padding-top: 100px; + } +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (min-width: 768px) { + .sidebar-collapse .main-sidebar, + .sidebar-collapse .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (max-width: 767px) { + .sidebar-open .main-sidebar, + .sidebar-open .left-side { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + } +} +.sidebar { + padding-bottom: 10px; +} +.sidebar-form input:focus { + border-color: transparent; +} +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; +} +.user-panel:before, +.user-panel:after { + content: " "; + display: table; +} +.user-panel:after { + clear: both; +} +.user-panel > .image > img { + width: 100%; + max-width: 45px; + height: auto; +} +.user-panel > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; +} +.user-panel > .info > p { + font-weight: 600; + margin-bottom: 9px; +} +.user-panel > .info > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; +} +.user-panel > .info > a > .fa, +.user-panel > .info > a > .ion, +.user-panel > .info > a > .glyphicon { + margin-right: 3px; +} +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; +} +.sidebar-menu > li { + position: relative; + margin: 0; + padding: 0; +} +.sidebar-menu > li > a { + padding: 12px 5px 12px 15px; + display: block; +} +.sidebar-menu > li > a > .fa, +.sidebar-menu > li > a > .glyphicon, +.sidebar-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu > li .label, +.sidebar-menu > li .badge { + margin-right: 5px; +} +.sidebar-menu > li .badge { + margin-top: 3px; +} +.sidebar-menu li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; +} +.sidebar-menu li > a > .fa-angle-left, +.sidebar-menu li > a > .pull-right-container > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + -webkit-transition: transform 0.5s ease; + -o-transition: transform 0.5s ease; + transition: transform 0.5s ease; +} +.sidebar-menu li > a > .fa-angle-left { + position: absolute; + top: 50%; + right: 10px; + margin-top: -8px; +} +.sidebar-menu .menu-open > a > .fa-angle-left, +.sidebar-menu .menu-open > a > .pull-right-container > .fa-angle-left { + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.sidebar-menu .active > .treeview-menu { + display: block; +} +/* + * Component: Sidebar Mini + */ +@media (min-width: 768px) { + .sidebar-mini.sidebar-collapse .content-wrapper, + .sidebar-mini.sidebar-collapse .right-side, + .sidebar-mini.sidebar-collapse .main-footer { + margin-left: 50px !important; + z-index: 840; + } + .sidebar-mini.sidebar-collapse .main-sidebar { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + width: 50px !important; + z-index: 850; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li { + position: relative; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { + margin-right: 0; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { + border-top-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, + .sidebar-mini.sidebar-collapse .sidebar-form, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, + .sidebar-mini.sidebar-collapse .sidebar-menu li.header { + display: none !important; + -webkit-transform: translateZ(0); + } + .sidebar-mini.sidebar-collapse .main-header .logo { + width: 50px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { + display: none; + } + .sidebar-mini.sidebar-collapse .main-header .navbar { + margin-left: 50px; + } +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + display: block !important; + position: absolute; + width: 180px; + left: 50px; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container { + position: relative !important; + float: right; + width: auto !important; + left: 180px !important; + top: -22px !important; + z-index: 900; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container > .label:not(:first-of-type) { + display: none; +} +.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + top: 44px; + margin-left: 0; +} +.sidebar-expanded-on-hover .main-footer, +.sidebar-expanded-on-hover .content-wrapper { + margin-left: 50px; +} +.sidebar-expanded-on-hover .main-sidebar { + box-shadow: 3px 0 8px rgba(0, 0, 0, 0.125); +} +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} +.sidebar-menu:hover { + overflow: visible; +} +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} +.sidebar-menu li > a { + position: relative; +} +.sidebar-menu li > a > .pull-right-container { + position: absolute; + right: 10px; + top: 50%; + margin-top: -7px; +} +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -230px; + width: 230px; + -webkit-transition: right 0.3s ease-in-out; + -o-transition: right 0.3s ease-in-out; + transition: right 0.3s ease-in-out; +} +.control-sidebar { + position: absolute; + padding-top: 50px; + z-index: 1010; +} +@media (max-width: 768px) { + .control-sidebar { + padding-top: 100px; + } +} +.control-sidebar > .tab-content { + padding: 10px 15px; +} +.control-sidebar.control-sidebar-open, +.control-sidebar.control-sidebar-open + .control-sidebar-bg { + right: 0; +} +.control-sidebar-open .control-sidebar-bg, +.control-sidebar-open .control-sidebar { + right: 0; +} +@media (min-width: 768px) { + .control-sidebar-open .content-wrapper, + .control-sidebar-open .right-side, + .control-sidebar-open .main-footer { + margin-right: 230px; + } +} +.fixed .control-sidebar { + position: fixed; + height: 100%; + overflow-y: auto; + padding-bottom: 50px; +} +.nav-tabs.control-sidebar-tabs > li:first-of-type > a, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { + border-left-width: 0; +} +.nav-tabs.control-sidebar-tabs > li > a { + border-radius: 0; +} +.nav-tabs.control-sidebar-tabs > li > a, +.nav-tabs.control-sidebar-tabs > li > a:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; +} +.nav-tabs.control-sidebar-tabs > li > a .icon { + font-size: 16px; +} +.nav-tabs.control-sidebar-tabs > li.active > a, +.nav-tabs.control-sidebar-tabs > li.active > a:hover, +.nav-tabs.control-sidebar-tabs > li.active > a:focus, +.nav-tabs.control-sidebar-tabs > li.active > a:active { + border-top: none; + border-right: none; + border-bottom: none; +} +@media (max-width: 768px) { + .nav-tabs.control-sidebar-tabs { + display: table; + } + .nav-tabs.control-sidebar-tabs > li { + display: table-cell; + } +} +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; +} +.control-sidebar-menu > li > a { + display: block; + padding: 10px 15px; +} +.control-sidebar-menu > li > a:before, +.control-sidebar-menu > li > a:after { + content: " "; + display: table; +} +.control-sidebar-menu > li > a:after { + clear: both; +} +.control-sidebar-menu > li > a > .control-sidebar-subheading { + margin-top: 0; +} +.control-sidebar-menu .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; +} +.control-sidebar-menu .menu-info { + margin-left: 45px; + margin-top: 3px; +} +.control-sidebar-menu .menu-info > .control-sidebar-subheading { + margin: 0; +} +.control-sidebar-menu .menu-info > p { + margin: 0; + font-size: 11px; +} +.control-sidebar-menu .progress { + margin: 0; +} +.control-sidebar-dark { + color: #b8c7ce; +} +.control-sidebar-dark, +.control-sidebar-dark + .control-sidebar-bg { + background: #222d32; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs { + border-bottom: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { + background: #181f23; + color: #b8c7ce; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #141a1d; + border-bottom-color: #141a1d; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { + background: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { + color: #fff; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #222d32; + color: #fff; +} +.control-sidebar-dark .control-sidebar-heading, +.control-sidebar-dark .control-sidebar-subheading { + color: #fff; +} +.control-sidebar-dark .control-sidebar-menu > li > a:hover { + background: #1e282c; +} +.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { + color: #b8c7ce; +} +.control-sidebar-light { + color: #5e5e5e; +} +.control-sidebar-light, +.control-sidebar-light + .control-sidebar-bg { + background: #f9fafc; + border-left: 1px solid #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs { + border-bottom: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { + background: #e8ecf4; + color: #444444; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #d2d6de; + border-bottom-color: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { + background: #eff1f7; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #f9fafc; + color: #111; +} +.control-sidebar-light .control-sidebar-heading, +.control-sidebar-light .control-sidebar-subheading { + color: #111; +} +.control-sidebar-light .control-sidebar-menu { + margin-left: -14px; +} +.control-sidebar-light .control-sidebar-menu > li > a:hover { + background: #f4f4f5; +} +.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { + color: #5e5e5e; +} +/* + * Component: Dropdown menus + * ------------------------- + */ +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; +} +.dropdown-menu > li > a { + color: #777; +} +.dropdown-menu > li > a > .glyphicon, +.dropdown-menu > li > a > .fa, +.dropdown-menu > li > a > .ion { + margin-right: 10px; +} +.dropdown-menu > li > a:hover { + background-color: #e1e3e9; + color: #333; +} +.dropdown-menu > .divider { + background-color: #eee; +} +.navbar-nav > .notifications-menu > .dropdown-menu, +.navbar-nav > .messages-menu > .dropdown-menu, +.navbar-nav > .tasks-menu > .dropdown-menu { + width: 280px; + padding: 0 0 0 0; + margin: 0; + top: 100%; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li, +.navbar-nav > .messages-menu > .dropdown-menu > li, +.navbar-nav > .tasks-menu > .dropdown-menu > li { + position: relative; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.header, +.navbar-nav > .messages-menu > .dropdown-menu > li.header, +.navbar-nav > .tasks-menu > .dropdown-menu > li.header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444 !important; + text-align: center; +} +@media (max-width: 991px) { + .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + background: #fff !important; + color: #444 !important; + } +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { + text-decoration: none; + font-weight: normal; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + display: block; + white-space: nowrap; + /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { + background: #f4f4f4; + text-decoration: none; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + padding: 10px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { + width: 20px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { + margin: 0; + padding: 10px 10px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + content: " "; + display: table; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + clear: both; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + padding: 10px; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { + padding: 0; + margin: 0; +} +.navbar-nav > .user-menu > .dropdown-menu { + border-top-right-radius: 0; + border-top-left-radius: 0; + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; +} +.navbar-nav > .user-menu > .dropdown-menu, +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header { + height: 175px; + padding: 10px; + text-align: center; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + margin-top: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { + display: block; + font-size: 12px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body a { + color: #444 !important; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-body a { + background: #fff !important; + color: #444 !important; + } +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer { + background-color: #f9f9f9; + padding: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { + color: #666666; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { + background-color: #f9f9f9; + } +} +.navbar-nav > .user-menu .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; +} +@media (max-width: 767px) { + .navbar-nav > .user-menu .user-image { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } +} +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + -webkit-animation: flipInX 0.7s both; + -o-animation: flipInX 0.7s both; + animation: flipInX 0.7s both; +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + transform: perspective(400px); + } +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + -webkit-transform: perspective(400px); + } +} +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav > li { + position: relative; +} +.navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 0; + left: auto; +} +@media (max-width: 991px) { + .navbar-custom-menu > .navbar-nav { + float: right; + } + .navbar-custom-menu > .navbar-nav > li { + position: static; + } + .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } +} +/* + * Component: Form + * --------------- + */ +.form-control { + border-radius: 0; + box-shadow: none; + border-color: #d2d6de; +} +.form-control:focus { + border-color: #3c8dbc; + box-shadow: none; +} +.form-control::-moz-placeholder, +.form-control:-ms-input-placeholder, +.form-control::-webkit-input-placeholder { + color: #bbb; + opacity: 1; +} +.form-control:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-group.has-success label { + color: #00a65a; +} +.form-group.has-success .form-control, +.form-group.has-success .input-group-addon { + border-color: #00a65a; + box-shadow: none; +} +.form-group.has-success .help-block { + color: #00a65a; +} +.form-group.has-warning label { + color: #f39c12; +} +.form-group.has-warning .form-control, +.form-group.has-warning .input-group-addon { + border-color: #f39c12; + box-shadow: none; +} +.form-group.has-warning .help-block { + color: #f39c12; +} +.form-group.has-error label { + color: #dd4b39; +} +.form-group.has-error .form-control, +.form-group.has-error .input-group-addon { + border-color: #dd4b39; + box-shadow: none; +} +.form-group.has-error .help-block { + color: #dd4b39; +} +/* Input group */ +.input-group .input-group-addon { + border-radius: 0; + border-color: #d2d6de; + background-color: #fff; +} +/* button groups */ +.btn-group-vertical .btn.btn-flat:first-of-type, +.btn-group-vertical .btn.btn-flat:last-of-type { + border-radius: 0; +} +.icheck > label { + padding-left: 0; +} +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: 34px; +} +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: 46px; +} +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: 30px; +} +/* + * Component: Progress Bar + * ----------------------- + */ +.progress, +.progress > .progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +.progress, +.progress > .progress-bar, +.progress .progress-bar, +.progress > .progress-bar .progress-bar { + border-radius: 1px; +} +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; +} +.progress.sm, +.progress-sm, +.progress.sm .progress-bar, +.progress-sm .progress-bar { + border-radius: 1px; +} +.progress.xs, +.progress-xs { + height: 7px; +} +.progress.xs, +.progress-xs, +.progress.xs .progress-bar, +.progress-xs .progress-bar { + border-radius: 1px; +} +.progress.xxs, +.progress-xxs { + height: 3px; +} +.progress.xxs, +.progress-xxs, +.progress.xxs .progress-bar, +.progress-xxs .progress-bar { + border-radius: 1px; +} +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; +} +.progress.vertical > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; +} +.progress.vertical.sm, +.progress.vertical.progress-sm { + width: 20px; +} +.progress.vertical.xs, +.progress.vertical.progress-xs { + width: 10px; +} +.progress.vertical.xxs, +.progress.vertical.progress-xxs { + width: 3px; +} +.progress-group .progress-text { + font-weight: 600; +} +.progress-group .progress-number { + float: right; +} +/* Remove margins from progress bars when put in a table */ +.table tr > td .progress { + margin: 0; +} +.progress-bar-light-blue, +.progress-bar-primary { + background-color: #3c8dbc; +} +.progress-striped .progress-bar-light-blue, +.progress-striped .progress-bar-primary { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-green, +.progress-bar-success { + background-color: #00a65a; +} +.progress-striped .progress-bar-green, +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-aqua, +.progress-bar-info { + background-color: #00c0ef; +} +.progress-striped .progress-bar-aqua, +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-yellow, +.progress-bar-warning { + background-color: #f39c12; +} +.progress-striped .progress-bar-yellow, +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-red, +.progress-bar-danger { + background-color: #dd4b39; +} +.progress-striped .progress-bar-red, +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +/* + * Component: Small Box + * -------------------- + */ +.small-box { + border-radius: 2px; + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.small-box > .inner { + padding: 10px; +} +.small-box > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; +} +.small-box > .small-box-footer:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); +} +.small-box h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; +} +.small-box p { + font-size: 15px; +} +.small-box p > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; +} +.small-box h3, +.small-box p { + z-index: 5; +} +.small-box .icon { + -webkit-transition: all 0.3s linear; + -o-transition: all 0.3s linear; + transition: all 0.3s linear; + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); +} +.small-box:hover { + text-decoration: none; + color: #f9f9f9; +} +.small-box:hover .icon { + font-size: 95px; +} +@media (max-width: 767px) { + .small-box { + text-align: center; + } + .small-box .icon { + display: none; + } + .small-box p { + font-size: 12px; + } +} +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + border-radius: 3px; + background: #ffffff; + border-top: 3px solid #d2d6de; + margin-bottom: 20px; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.box.box-primary { + border-top-color: #3c8dbc; +} +.box.box-info { + border-top-color: #00c0ef; +} +.box.box-danger { + border-top-color: #dd4b39; +} +.box.box-warning { + border-top-color: #f39c12; +} +.box.box-success { + border-top-color: #00a65a; +} +.box.box-default { + border-top-color: #d2d6de; +} +.box.collapsed-box .box-body, +.box.collapsed-box .box-footer { + display: none; +} +.box .nav-stacked > li { + border-bottom: 1px solid #f4f4f4; + margin: 0; +} +.box .nav-stacked > li:last-of-type { + border-bottom: none; +} +.box.height-control .box-body { + max-height: 300px; + overflow: auto; +} +.box .border-right { + border-right: 1px solid #f4f4f4; +} +.box .border-left { + border-left: 1px solid #f4f4f4; +} +.box.box-solid { + border-top: 0; +} +.box.box-solid > .box-header .btn.btn-default { + background: transparent; +} +.box.box-solid > .box-header .btn:hover, +.box.box-solid > .box-header a:hover { + background: rgba(0, 0, 0, 0.1); +} +.box.box-solid.box-default { + border: 1px solid #d2d6de; +} +.box.box-solid.box-default > .box-header { + color: #444444; + background: #d2d6de; + background-color: #d2d6de; +} +.box.box-solid.box-default > .box-header a, +.box.box-solid.box-default > .box-header .btn { + color: #444444; +} +.box.box-solid.box-primary { + border: 1px solid #3c8dbc; +} +.box.box-solid.box-primary > .box-header { + color: #ffffff; + background: #3c8dbc; + background-color: #3c8dbc; +} +.box.box-solid.box-primary > .box-header a, +.box.box-solid.box-primary > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-info { + border: 1px solid #00c0ef; +} +.box.box-solid.box-info > .box-header { + color: #ffffff; + background: #00c0ef; + background-color: #00c0ef; +} +.box.box-solid.box-info > .box-header a, +.box.box-solid.box-info > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-danger { + border: 1px solid #dd4b39; +} +.box.box-solid.box-danger > .box-header { + color: #ffffff; + background: #dd4b39; + background-color: #dd4b39; +} +.box.box-solid.box-danger > .box-header a, +.box.box-solid.box-danger > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-warning { + border: 1px solid #f39c12; +} +.box.box-solid.box-warning > .box-header { + color: #ffffff; + background: #f39c12; + background-color: #f39c12; +} +.box.box-solid.box-warning > .box-header a, +.box.box-solid.box-warning > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-success { + border: 1px solid #00a65a; +} +.box.box-solid.box-success > .box-header { + color: #ffffff; + background: #00a65a; + background-color: #00a65a; +} +.box.box-solid.box-success > .box-header a, +.box.box-solid.box-success > .box-header .btn { + color: #ffffff; +} +.box.box-solid > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; +} +.box.box-solid[class*='bg'] > .box-header { + color: #fff; +} +.box .box-group > .box { + margin-bottom: 5px; +} +.box .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; +} +.box > .overlay, +.overlay-wrapper > .overlay, +.box > .loading-img, +.overlay-wrapper > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.box .overlay, +.overlay-wrapper .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + border-radius: 3px; +} +.box .overlay > .fa, +.overlay-wrapper .overlay > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; +} +.box .overlay.dark, +.overlay-wrapper .overlay.dark { + background: rgba(0, 0, 0, 0.5); +} +.box-header:before, +.box-body:before, +.box-footer:before, +.box-header:after, +.box-body:after, +.box-footer:after { + content: " "; + display: table; +} +.box-header:after, +.box-body:after, +.box-footer:after { + clear: both; +} +.box-header { + color: #444; + display: block; + padding: 10px; + position: relative; +} +.box-header.with-border { + border-bottom: 1px solid #f4f4f4; +} +.collapsed-box .box-header.with-border { + border-bottom: none; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion, +.box-header .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion { + margin-right: 5px; +} +.box-header > .box-tools { + position: absolute; + right: 10px; + top: 5px; +} +.box-header > .box-tools [data-toggle="tooltip"] { + position: relative; +} +.box-header > .box-tools.pull-right .dropdown-menu { + right: 0; + left: auto; +} +.box-header > .box-tools .dropdown-menu > li > a { + color: #444!important; +} +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: #97a0b3; +} +.open .btn-box-tool, +.btn-box-tool:hover { + color: #606c84; +} +.btn-box-tool.btn:active { + box-shadow: none; +} +.box-body { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + padding: 10px; +} +.no-header .box-body { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.box-body > .table { + margin-bottom: 0; +} +.box-body .fc { + margin-top: 5px; +} +.box-body .full-width-chart { + margin: -19px; +} +.box-body.no-padding .full-width-chart { + margin: -9px; +} +.box-body .box-pane { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; +} +.box-body .box-pane-right { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 0; +} +.box-footer { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-top: 1px solid #f4f4f4; + padding: 10px; + background-color: #ffffff; +} +.chart-legend { + margin: 10px 0; +} +@media (max-width: 991px) { + .chart-legend > li { + float: left; + margin-right: 10px; + } +} +.box-comments { + background: #f7f7f7; +} +.box-comments .box-comment { + padding: 8px 0; + border-bottom: 1px solid #eee; +} +.box-comments .box-comment:before, +.box-comments .box-comment:after { + content: " "; + display: table; +} +.box-comments .box-comment:after { + clear: both; +} +.box-comments .box-comment:last-of-type { + border-bottom: 0; +} +.box-comments .box-comment:first-of-type { + padding-top: 0; +} +.box-comments .box-comment img { + float: left; +} +.box-comments .comment-text { + margin-left: 40px; + color: #555; +} +.box-comments .username { + color: #444; + display: block; + font-weight: 600; +} +.box-comments .text-muted { + font-weight: 400; + font-size: 12px; +} +/* Widget: TODO LIST */ +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; +} +.todo-list > li { + border-radius: 2px; + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; +} +.todo-list > li:last-of-type { + margin-bottom: 0; +} +.todo-list > li > input[type='checkbox'] { + margin: 0 10px 0 5px; +} +.todo-list > li .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; +} +.todo-list > li .label { + margin-left: 10px; + font-size: 9px; +} +.todo-list > li .tools { + display: none; + float: right; + color: #dd4b39; +} +.todo-list > li .tools > .fa, +.todo-list > li .tools > .glyphicon, +.todo-list > li .tools > .ion { + margin-right: 5px; + cursor: pointer; +} +.todo-list > li:hover .tools { + display: inline-block; +} +.todo-list > li.done { + color: #999; +} +.todo-list > li.done .text { + text-decoration: line-through; + font-weight: 500; +} +.todo-list > li.done .label { + background: #d2d6de !important; +} +.todo-list .danger { + border-left-color: #dd4b39; +} +.todo-list .warning { + border-left-color: #f39c12; +} +.todo-list .info { + border-left-color: #00c0ef; +} +.todo-list .success { + border-left-color: #00a65a; +} +.todo-list .primary { + border-left-color: #3c8dbc; +} +.todo-list .handle { + display: inline-block; + cursor: move; + margin: 0 5px; +} +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; +} +.chat .item { + margin-bottom: 10px; +} +.chat .item:before, +.chat .item:after { + content: " "; + display: table; +} +.chat .item:after { + clear: both; +} +.chat .item > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + border-radius: 50%; +} +.chat .item > .online { + border: 2px solid #00a65a; +} +.chat .item > .offline { + border: 2px solid #dd4b39; +} +.chat .item > .message { + margin-left: 55px; + margin-top: -40px; +} +.chat .item > .message > .name { + display: block; + font-weight: 600; +} +.chat .item > .attachment { + border-radius: 3px; + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; +} +.chat .item > .attachment > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; +} +.chat .item > .attachment > p, +.chat .item > .attachment > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; +} +.chat .item > .attachment:before, +.chat .item > .attachment:after { + content: " "; + display: table; +} +.chat .item > .attachment:after { + clear: both; +} +.box-input { + max-width: 200px; +} +.modal .panel-body { + color: #444; +} +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 2px; + margin-bottom: 15px; +} +.info-box small { + font-size: 14px; +} +.info-box .progress { + background: rgba(0, 0, 0, 0.2); + margin: 5px -10px 5px -10px; + height: 2px; +} +.info-box .progress, +.info-box .progress .progress-bar { + border-radius: 0; +} +.info-box .progress .progress-bar { + background: #fff; +} +.info-box-icon { + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0, 0, 0, 0.2); +} +.info-box-icon > img { + max-width: 100%; +} +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.info-box-text { + text-transform: uppercase; +} +.info-box-more { + display: block; +} +.progress-description { + margin: 0; +} +/* + * Component: Timeline + * ------------------- + */ +.timeline { + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; +} +.timeline:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + border-radius: 2px; +} +.timeline > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; +} +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} +.timeline > li:after { + clear: both; +} +.timeline > li > .timeline-item { + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; +} +.timeline > li > .timeline-item > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; +} +.timeline > li > .timeline-item > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid #f4f4f4; + padding: 10px; + font-size: 16px; + line-height: 1.1; +} +.timeline > li > .timeline-item > .timeline-header > a { + font-weight: 600; +} +.timeline > li > .timeline-item > .timeline-body, +.timeline > li > .timeline-item > .timeline-footer { + padding: 10px; +} +.timeline > li > .fa, +.timeline > li > .glyphicon, +.timeline > li > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: #d2d6de; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; +} +.timeline > .time-label > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + border-radius: 4px; +} +.timeline-inverse > li > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + -webkit-box-shadow: none; + box-shadow: none; +} +.timeline-inverse > li > .timeline-item > .timeline-header { + border-bottom-color: #ddd; +} +/* + * Component: Button + * ----------------- + */ +.btn { + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid transparent; +} +.btn.uppercase { + text-transform: uppercase; +} +.btn.btn-flat { + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; +} +.btn:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn:focus { + outline: none; +} +.btn.btn-file { + position: relative; + overflow: hidden; +} +.btn.btn-file > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + opacity: 0; + filter: alpha(opacity=0); + outline: none; + background: white; + cursor: inherit; + display: block; +} +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; +} +.btn-default:hover, +.btn-default:active, +.btn-default.hover { + background-color: #e7e7e7; +} +.btn-primary { + background-color: #3c8dbc; + border-color: #367fa9; +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.hover { + background-color: #367fa9; +} +.btn-success { + background-color: #00a65a; + border-color: #008d4c; +} +.btn-success:hover, +.btn-success:active, +.btn-success.hover { + background-color: #008d4c; +} +.btn-info { + background-color: #00c0ef; + border-color: #00acd6; +} +.btn-info:hover, +.btn-info:active, +.btn-info.hover { + background-color: #00acd6; +} +.btn-danger { + background-color: #dd4b39; + border-color: #d73925; +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.hover { + background-color: #d73925; +} +.btn-warning { + background-color: #f39c12; + border-color: #e08e0b; +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.hover { + background-color: #e08e0b; +} +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; +} +.btn-outline:hover, +.btn-outline:focus, +.btn-outline:active { + color: rgba(255, 255, 255, 0.7); + border-color: rgba(255, 255, 255, 0.7); +} +.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn[class*='bg-']:hover { + -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); + box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); +} +.btn-app { + border-radius: 3px; + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; +} +.btn-app > .fa, +.btn-app > .glyphicon, +.btn-app > .ion { + font-size: 20px; + display: block; +} +.btn-app:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; +} +.btn-app:active, +.btn-app:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-app > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; +} +/* + * Component: Callout + * ------------------ + */ +.callout { + border-radius: 3px; + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; +} +.callout a { + color: #fff; + text-decoration: underline; +} +.callout a:hover { + color: #eee; +} +.callout h4 { + margin-top: 0; + font-weight: 600; +} +.callout p:last-child { + margin-bottom: 0; +} +.callout code, +.callout .highlight { + background-color: #fff; +} +.callout.callout-danger { + border-color: #c23321; +} +.callout.callout-warning { + border-color: #c87f0a; +} +.callout.callout-info { + border-color: #0097bc; +} +.callout.callout-success { + border-color: #00733e; +} +/* + * Component: alert + * ---------------- + */ +.alert { + border-radius: 3px; +} +.alert h4 { + font-weight: 600; +} +.alert .icon { + margin-right: 10px; +} +.alert .close { + color: #000; + opacity: 0.2; + filter: alpha(opacity=20); +} +.alert .close:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.alert a { + color: #fff; + text-decoration: underline; +} +.alert-success { + border-color: #008d4c; +} +.alert-danger, +.alert-error { + border-color: #d73925; +} +.alert-warning { + border-color: #e08e0b; +} +.alert-info { + border-color: #00acd6; +} +/* + * Component: Nav + * -------------- + */ +.nav > li > a:hover, +.nav > li > a:active, +.nav > li > a:focus { + color: #444; + background: #f7f7f7; +} +/* NAV PILLS */ +.nav-pills > li > a { + border-radius: 0; + border-top: 3px solid transparent; + color: #444; +} +.nav-pills > li > a > .fa, +.nav-pills > li > a > .glyphicon, +.nav-pills > li > a > .ion { + margin-right: 5px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + border-top-color: #3c8dbc; +} +.nav-pills > li.active > a { + font-weight: 600; +} +/* NAV STACKED */ +.nav-stacked > li > a { + border-radius: 0; + border-top: 0; + border-left: 3px solid transparent; + color: #444; +} +.nav-stacked > li.active > a, +.nav-stacked > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: #3c8dbc; +} +.nav-stacked > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; +} +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; +} +.nav-tabs-custom > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.nav-tabs-custom > .nav-tabs > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + margin-right: 5px; +} +.nav-tabs-custom > .nav-tabs > li.disabled > a { + color: #777; +} +.nav-tabs-custom > .nav-tabs > li > a { + color: #444; + border-radius: 0; +} +.nav-tabs-custom > .nav-tabs > li > a.text-muted { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li > a, +.nav-tabs-custom > .nav-tabs > li > a:hover { + background: transparent; + margin: 0; +} +.nav-tabs-custom > .nav-tabs > li > a:hover { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { + border-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.active { + border-top-color: #3c8dbc; +} +.nav-tabs-custom > .nav-tabs > li.active > a, +.nav-tabs-custom > .nav-tabs > li.active:hover > a { + background-color: #fff; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.active > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type { + margin-left: 0; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { + border-left-color: transparent; +} +.nav-tabs-custom > .nav-tabs.pull-right { + float: none !important; +} +.nav-tabs-custom > .nav-tabs.pull-right > li { + float: right; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { + margin-right: 0; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { + border-left-width: 1px; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { + border-left-color: #f4f4f4; + border-right-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.header > .fa, +.nav-tabs-custom > .nav-tabs > li.header > .glyphicon, +.nav-tabs-custom > .nav-tabs > li.header > .ion { + margin-right: 5px; +} +.nav-tabs-custom > .tab-content { + background: #fff; + padding: 10px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.nav-tabs-custom .dropdown.open > a:active, +.nav-tabs-custom .dropdown.open > a:focus { + background: transparent; + color: #999; +} +.nav-tabs-custom.tab-primary > .nav-tabs > li.active { + border-top-color: #3c8dbc; +} +.nav-tabs-custom.tab-info > .nav-tabs > li.active { + border-top-color: #00c0ef; +} +.nav-tabs-custom.tab-danger > .nav-tabs > li.active { + border-top-color: #dd4b39; +} +.nav-tabs-custom.tab-warning > .nav-tabs > li.active { + border-top-color: #f39c12; +} +.nav-tabs-custom.tab-success > .nav-tabs > li.active { + border-top-color: #00a65a; +} +.nav-tabs-custom.tab-default > .nav-tabs > li.active { + border-top-color: #d2d6de; +} +/* PAGINATION */ +.pagination > li > a { + background: #fafafa; + color: #666; +} +.pagination.pagination-flat > li > a { + border-radius: 0 !important; +} +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; +} +.products-list > .item { + border-radius: 3px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + padding: 10px 0; + background: #fff; +} +.products-list > .item:before, +.products-list > .item:after { + content: " "; + display: table; +} +.products-list > .item:after { + clear: both; +} +.products-list .product-img { + float: left; +} +.products-list .product-img img { + width: 50px; + height: 50px; +} +.products-list .product-info { + margin-left: 60px; +} +.products-list .product-title { + font-weight: 600; +} +.products-list .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.product-list-in-box > .item { + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; + border-bottom: 1px solid #f4f4f4; +} +.product-list-in-box > .item:last-of-type { + border-bottom-width: 0; +} +/* + * Component: Table + * ---------------- + */ +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + border-top: 1px solid #f4f4f4; +} +.table > thead > tr > th { + border-bottom: 2px solid #f4f4f4; +} +.table tr td .progress { + margin-top: 5px; +} +.table-bordered { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table.no-border, +.table.no-border td, +.table.no-border th { + border: 0; +} +/* .text-center in tables */ +table.text-center, +table.text-center td, +table.text-center th { + text-align: center; +} +.table.align th { + text-align: left; +} +.table.align td { + text-align: right; +} +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: #d2d6de; + color: #444; +} +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat .box-body { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + position: relative; + overflow-x: hidden; + padding: 0; +} +.direct-chat.chat-pane-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-messages { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} +.direct-chat-msg, +.direct-chat-text { + display: block; +} +.direct-chat-msg { + margin-bottom: 10px; +} +.direct-chat-msg:before, +.direct-chat-msg:after { + content: " "; + display: table; +} +.direct-chat-msg:after { + clear: both; +} +.direct-chat-messages, +.direct-chat-contacts { + -webkit-transition: -webkit-transform 0.5s ease-in-out; + -moz-transition: -moz-transform 0.5s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out; + transition: transform 0.5s ease-in-out; +} +.direct-chat-text { + border-radius: 5px; + position: relative; + padding: 5px 10px; + background: #d2d6de; + border: 1px solid #d2d6de; + margin: 5px 0 0 50px; + color: #444444; +} +.direct-chat-text:after, +.direct-chat-text:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: #d2d6de; + content: ' '; + height: 0; + width: 0; + pointer-events: none; +} +.direct-chat-text:after { + border-width: 5px; + margin-top: -5px; +} +.direct-chat-text:before { + border-width: 6px; + margin-top: -6px; +} +.right .direct-chat-text { + margin-right: 50px; + margin-left: 0; +} +.right .direct-chat-text:after, +.right .direct-chat-text:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: #d2d6de; +} +.direct-chat-img { + border-radius: 50%; + float: left; + width: 40px; + height: 40px; +} +.right .direct-chat-img { + float: right; +} +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} +.direct-chat-name { + font-weight: 600; +} +.direct-chat-timestamp { + color: #999; +} +.direct-chat-contacts-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-contacts { + -webkit-transform: translate(101%, 0); + -ms-transform: translate(101%, 0); + -o-transform: translate(101%, 0); + transform: translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} +.contacts-list > li { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 10px; + margin: 0; +} +.contacts-list > li:before, +.contacts-list > li:after { + content: " "; + display: table; +} +.contacts-list > li:after { + clear: both; +} +.contacts-list > li:last-of-type { + border-bottom: none; +} +.contacts-list-img { + border-radius: 50%; + width: 40px; + float: left; +} +.contacts-list-info { + margin-left: 45px; + color: #fff; +} +.contacts-list-name, +.contacts-list-status { + display: block; +} +.contacts-list-name { + font-weight: 600; +} +.contacts-list-status { + font-size: 12px; +} +.contacts-list-date { + color: #aaa; + font-weight: normal; +} +.contacts-list-msg { + color: #999; +} +.direct-chat-danger .right > .direct-chat-text { + background: #dd4b39; + border-color: #dd4b39; + color: #ffffff; +} +.direct-chat-danger .right > .direct-chat-text:after, +.direct-chat-danger .right > .direct-chat-text:before { + border-left-color: #dd4b39; +} +.direct-chat-primary .right > .direct-chat-text { + background: #3c8dbc; + border-color: #3c8dbc; + color: #ffffff; +} +.direct-chat-primary .right > .direct-chat-text:after, +.direct-chat-primary .right > .direct-chat-text:before { + border-left-color: #3c8dbc; +} +.direct-chat-warning .right > .direct-chat-text { + background: #f39c12; + border-color: #f39c12; + color: #ffffff; +} +.direct-chat-warning .right > .direct-chat-text:after, +.direct-chat-warning .right > .direct-chat-text:before { + border-left-color: #f39c12; +} +.direct-chat-info .right > .direct-chat-text { + background: #00c0ef; + border-color: #00c0ef; + color: #ffffff; +} +.direct-chat-info .right > .direct-chat-text:after, +.direct-chat-info .right > .direct-chat-text:before { + border-left-color: #00c0ef; +} +.direct-chat-success .right > .direct-chat-text { + background: #00a65a; + border-color: #00a65a; + color: #ffffff; +} +.direct-chat-success .right > .direct-chat-text:after, +.direct-chat-success .right > .direct-chat-text:before { + border-left-color: #00a65a; +} +/* + * Component: Users List + * --------------------- + */ +.users-list > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; +} +.users-list > li img { + border-radius: 50%; + max-width: 100%; + height: auto; +} +.users-list > li > a:hover, +.users-list > li > a:hover .users-list-name { + color: #999; +} +.users-list-name, +.users-list-date { + display: block; +} +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.users-list-date { + color: #999; + font-size: 12px; +} +/* + * Component: Carousel + * ------------------- + */ +.carousel-control.left, +.carousel-control.right { + background-image: none; +} +.carousel-control > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; +} +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0, 0, 0, 0.3); +} +.modal-content { + border-radius: 0; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + border: 0; +} +@media (min-width: 768px) { + .modal-content { + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + } +} +.modal-header { + border-bottom-color: #f4f4f4; +} +.modal-footer { + border-top-color: #f4f4f4; +} +.modal-primary .modal-header, +.modal-primary .modal-footer { + border-color: #307095; +} +.modal-warning .modal-header, +.modal-warning .modal-footer { + border-color: #c87f0a; +} +.modal-info .modal-header, +.modal-info .modal-footer { + border-color: #0097bc; +} +.modal-success .modal-header, +.modal-success .modal-footer { + border-color: #00733e; +} +.modal-danger .modal-header, +.modal-danger .modal-footer { + border-color: #c23321; +} +/* + * Component: Social Widgets + * ------------------------- + */ +.box-widget { + border: none; + position: relative; +} +.widget-user .widget-user-header { + padding: 20px; + height: 120px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} +.widget-user .widget-user-desc { + margin-top: 0; +} +.widget-user .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; +} +.widget-user .widget-user-image > img { + width: 90px; + height: auto; + border: 3px solid #fff; +} +.widget-user .box-footer { + padding-top: 30px; +} +.widget-user-2 .widget-user-header { + padding: 20px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user-2 .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; +} +.widget-user-2 .widget-user-desc { + margin-top: 0; +} +.widget-user-2 .widget-user-username, +.widget-user-2 .widget-user-desc { + margin-left: 75px; +} +.widget-user-2 .widget-user-image > img { + width: 65px; + height: auto; + float: left; +} +.treeview-menu { + display: none; + list-style: none; + padding: 0; + margin: 0; + padding-left: 5px; +} +.treeview-menu .treeview-menu { + padding-left: 20px; +} +.treeview-menu > li { + margin: 0; +} +.treeview-menu > li > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; +} +.treeview-menu > li > a > .fa, +.treeview-menu > li > a > .glyphicon, +.treeview-menu > li > a > .ion { + width: 20px; +} +.treeview-menu > li > a > .pull-right-container > .fa-angle-left, +.treeview-menu > li > a > .pull-right-container > .fa-angle-down, +.treeview-menu > li > a > .fa-angle-left, +.treeview-menu > li > a > .fa-angle-down { + width: auto; +} +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages > .table { + margin: 0; +} +.mailbox-controls { + padding: 5px; +} +.mailbox-controls.with-border { + border-bottom: 1px solid #f4f4f4; +} +.mailbox-read-info { + border-bottom: 1px solid #f4f4f4; + padding: 10px; +} +.mailbox-read-info h3 { + font-size: 20px; + margin: 0; +} +.mailbox-read-info h5 { + margin: 0; + padding: 5px 0 0 0; +} +.mailbox-read-time { + color: #999; + font-size: 13px; +} +.mailbox-read-message { + padding: 10px; +} +.mailbox-attachments li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; +} +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; +} +.mailbox-attachment-icon.has-img { + padding: 0; +} +.mailbox-attachment-icon.has-img > img { + max-width: 100%; + height: auto; +} +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE TAG */ +.lockscreen { + background: #d2d6de; +} +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.lockscreen-logo a { + color: #444; +} +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} +/* Will contain the image and the sign in form */ +.lockscreen-item { + border-radius: 4px; + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} +/* User image */ +.lockscreen-image { + border-radius: 50%; + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; +} +.lockscreen-image > img { + border-radius: 50%; + width: 70px; + height: 70px; +} +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; +} +.lockscreen-credentials .form-control { + border: 0; +} +.lockscreen-credentials .btn { + background-color: #fff; + border: 0; + padding: 0 10px; +} +.lockscreen-footer { + margin-top: 10px; +} +/* + * Page: Login & Register + * ---------------------- + */ +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.login-logo a, +.register-logo a { + color: #444; +} +.login-page, +.register-page { + background: #d2d6de; +} +.login-box, +.register-box { + width: 360px; + margin: 7% auto; +} +@media (max-width: 768px) { + .login-box, + .register-box { + width: 90%; + margin-top: 20px; + } +} +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; +} +.login-box-body .form-control-feedback, +.register-box-body .form-control-feedback { + color: #777; +} +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} +.social-auth-links { + margin: 10px 0; +} +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; +} +@media (max-width: 991px) { + .error-page { + width: 100%; + } +} +.error-page > .headline { + float: left; + font-size: 100px; + font-weight: 300; +} +@media (max-width: 991px) { + .error-page > .headline { + float: none; + text-align: center; + } +} +.error-page > .error-content { + margin-left: 190px; + display: block; +} +@media (max-width: 991px) { + .error-page > .error-content { + margin-left: 0; + } +} +.error-page > .error-content > h3 { + font-weight: 300; + font-size: 25px; +} +@media (max-width: 991px) { + .error-page > .error-content > h3 { + text-align: center; + } +} +/* + * Page: Invoice + * ------------- + */ +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} +.invoice-title { + margin-top: 0; +} +/* + * Page: Profile + * ------------- + */ +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid #d2d6de; +} +.profile-username { + font-size: 21px; + margin-top: 5px; +} +.post { + border-bottom: 1px solid #d2d6de; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; +} +.post:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; +} +.post .user-block { + margin-bottom: 15px; +} +/* + * General: Miscellaneous + * ---------------------- + */ +.pad { + padding: 10px; +} +.margin { + margin: 10px; +} +.margin-bottom { + margin-bottom: 20px; +} +.margin-bottom-none { + margin-bottom: 0; +} +.margin-r-5 { + margin-right: 5px; +} +.inline { + display: inline; +} +.description-block { + display: block; + margin: 10px 0; + text-align: center; +} +.description-block.margin-bottom { + margin-bottom: 25px; +} +.description-block > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; +} +.description-block > .description-text { + text-transform: uppercase; +} +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange, +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active, +.callout.callout-danger, +.callout.callout-warning, +.callout.callout-info, +.callout.callout-success, +.alert-success, +.alert-danger, +.alert-error, +.alert-warning, +.alert-info, +.label-danger, +.label-info, +.label-warning, +.label-primary, +.label-success, +.modal-primary .modal-body, +.modal-primary .modal-header, +.modal-primary .modal-footer, +.modal-warning .modal-body, +.modal-warning .modal-header, +.modal-warning .modal-footer, +.modal-info .modal-body, +.modal-info .modal-header, +.modal-info .modal-footer, +.modal-success .modal-body, +.modal-success .modal-header, +.modal-success .modal-footer, +.modal-danger .modal-body, +.modal-danger .modal-header, +.modal-danger .modal-footer { + color: #fff !important; +} +.bg-gray { + color: #000; + background-color: #d2d6de !important; +} +.bg-gray-light { + background-color: #f7f7f7; +} +.bg-black { + background-color: #111111 !important; +} +.bg-red, +.callout.callout-danger, +.alert-danger, +.alert-error, +.label-danger, +.modal-danger .modal-body { + background-color: #dd4b39 !important; +} +.bg-yellow, +.callout.callout-warning, +.alert-warning, +.label-warning, +.modal-warning .modal-body { + background-color: #f39c12 !important; +} +.bg-aqua, +.callout.callout-info, +.alert-info, +.label-info, +.modal-info .modal-body { + background-color: #00c0ef !important; +} +.bg-blue { + background-color: #0073b7 !important; +} +.bg-light-blue, +.label-primary, +.modal-primary .modal-body { + background-color: #3c8dbc !important; +} +.bg-green, +.callout.callout-success, +.alert-success, +.label-success, +.modal-success .modal-body { + background-color: #00a65a !important; +} +.bg-navy { + background-color: #001f3f !important; +} +.bg-teal { + background-color: #39cccc !important; +} +.bg-olive { + background-color: #3d9970 !important; +} +.bg-lime { + background-color: #01ff70 !important; +} +.bg-orange { + background-color: #ff851b !important; +} +.bg-fuchsia { + background-color: #f012be !important; +} +.bg-purple { + background-color: #605ca8 !important; +} +.bg-maroon { + background-color: #d81b60 !important; +} +.bg-gray-active { + color: #000; + background-color: #b5bbc8 !important; +} +.bg-black-active { + background-color: #000000 !important; +} +.bg-red-active, +.modal-danger .modal-header, +.modal-danger .modal-footer { + background-color: #d33724 !important; +} +.bg-yellow-active, +.modal-warning .modal-header, +.modal-warning .modal-footer { + background-color: #db8b0b !important; +} +.bg-aqua-active, +.modal-info .modal-header, +.modal-info .modal-footer { + background-color: #00a7d0 !important; +} +.bg-blue-active { + background-color: #005384 !important; +} +.bg-light-blue-active, +.modal-primary .modal-header, +.modal-primary .modal-footer { + background-color: #357ca5 !important; +} +.bg-green-active, +.modal-success .modal-header, +.modal-success .modal-footer { + background-color: #008d4c !important; +} +.bg-navy-active { + background-color: #001a35 !important; +} +.bg-teal-active { + background-color: #30bbbb !important; +} +.bg-olive-active { + background-color: #368763 !important; +} +.bg-lime-active { + background-color: #00e765 !important; +} +.bg-orange-active { + background-color: #ff7701 !important; +} +.bg-fuchsia-active { + background-color: #db0ead !important; +} +.bg-purple-active { + background-color: #555299 !important; +} +.bg-maroon-active { + background-color: #ca195a !important; +} +[class^="bg-"].disabled { + opacity: 0.65; + filter: alpha(opacity=65); +} +.text-red { + color: #dd4b39 !important; +} +.text-yellow { + color: #f39c12 !important; +} +.text-aqua { + color: #00c0ef !important; +} +.text-blue { + color: #0073b7 !important; +} +.text-black { + color: #111111 !important; +} +.text-light-blue { + color: #3c8dbc !important; +} +.text-green { + color: #00a65a !important; +} +.text-gray { + color: #d2d6de !important; +} +.text-navy { + color: #001f3f !important; +} +.text-teal { + color: #39cccc !important; +} +.text-olive { + color: #3d9970 !important; +} +.text-lime { + color: #01ff70 !important; +} +.text-orange { + color: #ff851b !important; +} +.text-fuchsia { + color: #f012be !important; +} +.text-purple { + color: #605ca8 !important; +} +.text-maroon { + color: #d81b60 !important; +} +.link-muted { + color: #7a869d; +} +.link-muted:hover, +.link-muted:focus { + color: #606c84; +} +.link-black { + color: #666; +} +.link-black:hover, +.link-black:focus { + color: #999; +} +.hide { + display: none !important; +} +.no-border { + border: 0 !important; +} +.no-padding { + padding: 0 !important; +} +.no-margin { + margin: 0 !important; +} +.no-shadow { + box-shadow: none !important; +} +.list-unstyled, +.chart-legend, +.contacts-list, +.users-list, +.mailbox-attachments { + list-style: none; + margin: 0; + padding: 0; +} +.list-group-unbordered > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} +.flat { + border-radius: 0 !important; +} +.text-bold, +.text-bold.table td, +.text-bold.table th { + font-weight: 700; +} +.text-sm { + font-size: 12px; +} +.jqstooltip { + padding: 5px !important; + width: auto !important; + height: auto !important; +} +.bg-teal-gradient { + background: #39cccc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important; + background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important; + background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important; + background: -o-linear-gradient(#7adddd, #39cccc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important; + color: #fff; +} +.bg-light-blue-gradient { + background: #3c8dbc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important; + background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important; + background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important; + background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; + color: #fff; +} +.bg-blue-gradient { + background: #0073b7 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important; + background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important; + background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important; + background: -o-linear-gradient(#0089db, #0073b7) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; + color: #fff; +} +.bg-aqua-gradient { + background: #00c0ef !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important; + background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important; + background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important; + background: -o-linear-gradient(#14d1ff, #00c0ef) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; + color: #fff; +} +.bg-yellow-gradient { + background: #f39c12 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important; + background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important; + background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important; + background: -o-linear-gradient(#f7bc60, #f39c12) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; + color: #fff; +} +.bg-purple-gradient { + background: #605ca8 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important; + background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important; + background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important; + background: -o-linear-gradient(#9491c4, #605ca8) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; + color: #fff; +} +.bg-green-gradient { + background: #00a65a !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important; + background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important; + background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important; + background: -o-linear-gradient(#00ca6d, #00a65a) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; + color: #fff; +} +.bg-red-gradient { + background: #dd4b39 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important; + background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important; + background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important; + background: -o-linear-gradient(#e47365, #dd4b39) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; + color: #fff; +} +.bg-black-gradient { + background: #111111 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important; + background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important; + background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important; + background: -o-linear-gradient(#2b2b2b, #111111) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important; + color: #fff; +} +.bg-maroon-gradient { + background: #d81b60 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important; + background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important; + background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important; + background: -o-linear-gradient(#e73f7c, #d81b60) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important; + color: #fff; +} +.description-block .description-icon { + font-size: 16px; +} +.no-pad-top { + padding-top: 0; +} +.position-static { + position: static !important; +} +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} +.list-seperator { + height: 1px; + background: #f4f4f4; + margin: 15px 0 9px 0; +} +.list-link > a { + padding: 4px; + color: #777; +} +.list-link > a:hover { + color: #222; +} +.font-light { + font-weight: 300; +} +.user-block:before, +.user-block:after { + content: " "; + display: table; +} +.user-block:after { + clear: both; +} +.user-block img { + width: 40px; + height: 40px; + float: left; +} +.user-block .username, +.user-block .description, +.user-block .comment { + display: block; + margin-left: 50px; +} +.user-block .username { + font-size: 16px; + font-weight: 600; +} +.user-block .description { + color: #999; + font-size: 13px; +} +.user-block.user-block-sm .username, +.user-block.user-block-sm .description, +.user-block.user-block-sm .comment { + margin-left: 40px; +} +.user-block.user-block-sm .username { + font-size: 14px; +} +.img-sm, +.img-md, +.img-lg, +.box-comments .box-comment img, +.user-block.user-block-sm img { + float: left; +} +.img-sm, +.box-comments .box-comment img, +.user-block.user-block-sm img { + width: 30px !important; + height: 30px !important; +} +.img-sm + .img-push { + margin-left: 40px; +} +.img-md { + width: 60px; + height: 60px; +} +.img-md + .img-push { + margin-left: 70px; +} +.img-lg { + width: 100px; + height: 100px; +} +.img-lg + .img-push { + margin-left: 110px; +} +.img-bordered { + border: 3px solid #d2d6de; + padding: 3px; +} +.img-bordered-sm { + border: 2px solid #d2d6de; + padding: 2px; +} +.attachment-block { + border: 1px solid #f4f4f4; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; +} +.attachment-block .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; +} +.attachment-block .attachment-pushed { + margin-left: 110px; +} +.attachment-block .attachment-heading { + margin: 0; +} +.attachment-block .attachment-text { + color: #555; +} +.connectedSortable { + min-height: 100px; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} +.full-opacity-hover { + opacity: 0.65; + filter: alpha(opacity=65); +} +.full-opacity-hover:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.chart { + position: relative; + overflow: hidden; + width: 100%; +} +.chart svg, +.chart canvas { + width: 100% !important; +} +/* + * Misc: print + * ----------- + */ +@media print { + .no-print, + .main-sidebar, + .left-side, + .main-header, + .content-header { + display: none !important; + } + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0 !important; + min-height: 0 !important; + -webkit-transform: translate(0, 0) !important; + -ms-transform: translate(0, 0) !important; + -o-transform: translate(0, 0) !important; + transform: translate(0, 0) !important; + } + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0 !important; + } + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + .invoice-col { + float: left; + width: 33.3333333%; + } + .table-responsive { + overflow: auto; + } + .table-responsive > .table tr th, + .table-responsive > .table tr td { + white-space: normal !important; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-without-plugins.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-without-plugins.min.css new file mode 100755 index 00000000..905675ea --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/alt/AdminLTE-without-plugins.min.css @@ -0,0 +1,7 @@ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);/*! + * AdminLTE v2.3.5 Without Third-Party Plugins + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/html,body{height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative;overflow-x:hidden;overflow-y:auto}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .right-side,.hold-transition .main-footer,.hold-transition .main-sidebar,.hold-transition .left-side,.hold-transition .main-header .navbar,.hold-transition .main-header .logo,.hold-transition .menu-open .fa-angle-left{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none !important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px !important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px !important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none !important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block !important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative !important;float:right;width:auto !important;left:180px !important;top:-22px !important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-expanded-on-hover .main-footer,.sidebar-expanded-on-hover .content-wrapper{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{box-shadow:3px 0 8px rgba(0,0,0,0.125)}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444 !important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff !important;color:#444 !important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none !important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.pull-right-container>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.fa-angle-down{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{box-shadow:none !important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px !important;width:auto !important;height:auto !important}.bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static !important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px !important;height:30px !important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100% !important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none !important}.content-wrapper,.right-side,.main-footer{margin-left:0 !important;min-height:0 !important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0 !important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal !important}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.css new file mode 100755 index 00000000..7ed56a3e --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.css @@ -0,0 +1,1781 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue .main-header .navbar .nav > li > a:hover, +.skin-blue .main-header .navbar .nav > li > a:active, +.skin-blue .main-header .navbar .nav > li > a:focus, +.skin-blue .main-header .navbar .nav .open > a, +.skin-blue .main-header .navbar .nav .open > a:hover, +.skin-blue .main-header .navbar .nav .open > a:focus, +.skin-blue .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue .main-header .logo { + background-color: #367fa9; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue .main-header .logo:hover { + background-color: #357ca5; +} +.skin-blue .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue .content-header { + background: transparent; +} +.skin-blue .wrapper, +.skin-blue .main-sidebar, +.skin-blue .left-side { + background-color: #222d32; +} +.skin-blue .user-panel > .info, +.skin-blue .user-panel > .info > a { + color: #fff; +} +.skin-blue .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-blue .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-blue .sidebar-menu > li:hover > a, +.skin-blue .sidebar-menu > li.active > a, +.skin-blue .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-blue .sidebar-menu > li.active > a { + border-left-color: #3c8dbc; +} +.skin-blue .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-blue .sidebar a { + color: #b8c7ce; +} +.skin-blue .sidebar a:hover { + text-decoration: none; +} +.skin-blue .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-blue .sidebar-menu .treeview-menu > li.active > a, +.skin-blue .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-blue .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-blue .sidebar-form input[type="text"], +.skin-blue .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-blue .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue .sidebar-form input[type="text"]:focus, +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} +/* + * Skin: Blue + * ---------- + */ +.skin-blue-light .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .nav > li > a:hover, +.skin-blue-light .main-header .navbar .nav > li > a:active, +.skin-blue-light .main-header .navbar .nav > li > a:focus, +.skin-blue-light .main-header .navbar .nav .open > a, +.skin-blue-light .main-header .navbar .nav .open > a:hover, +.skin-blue-light .main-header .navbar .nav .open > a:focus, +.skin-blue-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue-light .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue-light .main-header .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue-light .main-header .logo:hover { + background-color: #3b8ab8; +} +.skin-blue-light .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue-light .content-header { + background: transparent; +} +.skin-blue-light .wrapper, +.skin-blue-light .main-sidebar, +.skin-blue-light .left-side { + background-color: #f9fafc; +} +.skin-blue-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-blue-light .user-panel > .info, +.skin-blue-light .user-panel > .info > a { + color: #444444; +} +.skin-blue-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-blue-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-blue-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li:hover > a, +.skin-blue-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-blue-light .sidebar-menu > li.active { + border-left-color: #3c8dbc; +} +.skin-blue-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-blue-light .sidebar a { + color: #444444; +} +.skin-blue-light .sidebar a:hover { + text-decoration: none; +} +.skin-blue-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-blue-light .sidebar-menu .treeview-menu > li.active > a, +.skin-blue-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-blue-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-blue-light .sidebar-form input[type="text"], +.skin-blue-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-blue-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue-light .sidebar-form input[type="text"]:focus, +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +.skin-blue-light .main-footer { + border-top-color: #d2d6de; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black .main-header .navbar-toggle { + color: #333; +} +.skin-black .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header .navbar { + background-color: #ffffff; +} +.skin-black .main-header .navbar .nav > li > a { + color: #333333; +} +.skin-black .main-header .navbar .nav > li > a:hover, +.skin-black .main-header .navbar .nav > li > a:active, +.skin-black .main-header .navbar .nav > li > a:focus, +.skin-black .main-header .navbar .nav .open > a, +.skin-black .main-header .navbar .nav .open > a:hover, +.skin-black .main-header .navbar .nav .open > a:focus, +.skin-black .main-header .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black .main-header .navbar .sidebar-toggle { + color: #333333; +} +.skin-black .main-header .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black .main-header .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black .main-header .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black .main-header li.user-header { + background-color: #222; +} +.skin-black .content-header { + background: transparent; + box-shadow: none; +} +.skin-black .wrapper, +.skin-black .main-sidebar, +.skin-black .left-side { + background-color: #222d32; +} +.skin-black .user-panel > .info, +.skin-black .user-panel > .info > a { + color: #fff; +} +.skin-black .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-black .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-black .sidebar-menu > li:hover > a, +.skin-black .sidebar-menu > li.active > a, +.skin-black .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-black .sidebar-menu > li.active > a { + border-left-color: #ffffff; +} +.skin-black .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-black .sidebar a { + color: #b8c7ce; +} +.skin-black .sidebar a:hover { + text-decoration: none; +} +.skin-black .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-black .sidebar-menu .treeview-menu > li.active > a, +.skin-black .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-black .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-black .sidebar-form input[type="text"], +.skin-black .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-black .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black .sidebar-form input[type="text"]:focus, +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-black .pace .pace-progress { + background: #222; +} +.skin-black .pace .pace-activity { + border-top-color: #222; + border-left-color: #222; +} +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black-light .main-header { + border-bottom: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar-toggle { + color: #333; +} +.skin-black-light .main-header .navbar-brand { + color: #333; + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar { + background-color: #ffffff; +} +.skin-black-light .main-header .navbar .nav > li > a { + color: #333333; +} +.skin-black-light .main-header .navbar .nav > li > a:hover, +.skin-black-light .main-header .navbar .nav > li > a:active, +.skin-black-light .main-header .navbar .nav > li > a:focus, +.skin-black-light .main-header .navbar .nav .open > a, +.skin-black-light .main-header .navbar .nav .open > a:hover, +.skin-black-light .main-header .navbar .nav .open > a:focus, +.skin-black-light .main-header .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black-light .main-header .navbar .sidebar-toggle { + color: #333333; +} +.skin-black-light .main-header .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black-light .main-header .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar .navbar-nav > li > a { + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black-light .main-header .navbar .navbar-right > li > a { + border-left: 1px solid #d2d6de; + border-right-width: 0; +} +.skin-black-light .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black-light .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black-light .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black-light .main-header li.user-header { + background-color: #222; +} +.skin-black-light .content-header { + background: transparent; + box-shadow: none; +} +.skin-black-light .wrapper, +.skin-black-light .main-sidebar, +.skin-black-light .left-side { + background-color: #f9fafc; +} +.skin-black-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-black-light .user-panel > .info, +.skin-black-light .user-panel > .info > a { + color: #444444; +} +.skin-black-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-black-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-black-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-black-light .sidebar-menu > li:hover > a, +.skin-black-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-black-light .sidebar-menu > li.active { + border-left-color: #ffffff; +} +.skin-black-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-black-light .sidebar a { + color: #444444; +} +.skin-black-light .sidebar a:hover { + text-decoration: none; +} +.skin-black-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-black-light .sidebar-menu .treeview-menu > li.active > a, +.skin-black-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-black-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-black-light .sidebar-form input[type="text"], +.skin-black-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-black-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black-light .sidebar-form input[type="text"]:focus, +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Green + * ----------- + */ +.skin-green .main-header .navbar { + background-color: #00a65a; +} +.skin-green .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green .main-header .navbar .nav > li > a:hover, +.skin-green .main-header .navbar .nav > li > a:active, +.skin-green .main-header .navbar .nav > li > a:focus, +.skin-green .main-header .navbar .nav .open > a, +.skin-green .main-header .navbar .nav .open > a:hover, +.skin-green .main-header .navbar .nav .open > a:focus, +.skin-green .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green .main-header .logo { + background-color: #008d4c; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green .main-header .logo:hover { + background-color: #008749; +} +.skin-green .main-header li.user-header { + background-color: #00a65a; +} +.skin-green .content-header { + background: transparent; +} +.skin-green .wrapper, +.skin-green .main-sidebar, +.skin-green .left-side { + background-color: #222d32; +} +.skin-green .user-panel > .info, +.skin-green .user-panel > .info > a { + color: #fff; +} +.skin-green .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-green .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-green .sidebar-menu > li:hover > a, +.skin-green .sidebar-menu > li.active > a, +.skin-green .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-green .sidebar-menu > li.active > a { + border-left-color: #00a65a; +} +.skin-green .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-green .sidebar a { + color: #b8c7ce; +} +.skin-green .sidebar a:hover { + text-decoration: none; +} +.skin-green .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-green .sidebar-menu .treeview-menu > li.active > a, +.skin-green .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-green .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-green .sidebar-form input[type="text"], +.skin-green .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-green .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green .sidebar-form input[type="text"]:focus, +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Green + * ----------- + */ +.skin-green-light .main-header .navbar { + background-color: #00a65a; +} +.skin-green-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green-light .main-header .navbar .nav > li > a:hover, +.skin-green-light .main-header .navbar .nav > li > a:active, +.skin-green-light .main-header .navbar .nav > li > a:focus, +.skin-green-light .main-header .navbar .nav .open > a, +.skin-green-light .main-header .navbar .nav .open > a:hover, +.skin-green-light .main-header .navbar .nav .open > a:focus, +.skin-green-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green-light .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green-light .main-header .logo { + background-color: #00a65a; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green-light .main-header .logo:hover { + background-color: #00a157; +} +.skin-green-light .main-header li.user-header { + background-color: #00a65a; +} +.skin-green-light .content-header { + background: transparent; +} +.skin-green-light .wrapper, +.skin-green-light .main-sidebar, +.skin-green-light .left-side { + background-color: #f9fafc; +} +.skin-green-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-green-light .user-panel > .info, +.skin-green-light .user-panel > .info > a { + color: #444444; +} +.skin-green-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-green-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-green-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-green-light .sidebar-menu > li:hover > a, +.skin-green-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-green-light .sidebar-menu > li.active { + border-left-color: #00a65a; +} +.skin-green-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-green-light .sidebar a { + color: #444444; +} +.skin-green-light .sidebar a:hover { + text-decoration: none; +} +.skin-green-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-green-light .sidebar-menu .treeview-menu > li.active > a, +.skin-green-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-green-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-green-light .sidebar-form input[type="text"], +.skin-green-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-green-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green-light .sidebar-form input[type="text"]:focus, +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Red + * --------- + */ +.skin-red .main-header .navbar { + background-color: #dd4b39; +} +.skin-red .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red .main-header .navbar .nav > li > a:hover, +.skin-red .main-header .navbar .nav > li > a:active, +.skin-red .main-header .navbar .nav > li > a:focus, +.skin-red .main-header .navbar .nav .open > a, +.skin-red .main-header .navbar .nav .open > a:hover, +.skin-red .main-header .navbar .nav .open > a:focus, +.skin-red .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red .main-header .logo { + background-color: #d73925; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red .main-header .logo:hover { + background-color: #d33724; +} +.skin-red .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red .content-header { + background: transparent; +} +.skin-red .wrapper, +.skin-red .main-sidebar, +.skin-red .left-side { + background-color: #222d32; +} +.skin-red .user-panel > .info, +.skin-red .user-panel > .info > a { + color: #fff; +} +.skin-red .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-red .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-red .sidebar-menu > li:hover > a, +.skin-red .sidebar-menu > li.active > a, +.skin-red .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-red .sidebar-menu > li.active > a { + border-left-color: #dd4b39; +} +.skin-red .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-red .sidebar a { + color: #b8c7ce; +} +.skin-red .sidebar a:hover { + text-decoration: none; +} +.skin-red .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-red .sidebar-menu .treeview-menu > li.active > a, +.skin-red .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-red .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-red .sidebar-form input[type="text"], +.skin-red .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-red .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red .sidebar-form input[type="text"]:focus, +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Red + * --------- + */ +.skin-red-light .main-header .navbar { + background-color: #dd4b39; +} +.skin-red-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red-light .main-header .navbar .nav > li > a:hover, +.skin-red-light .main-header .navbar .nav > li > a:active, +.skin-red-light .main-header .navbar .nav > li > a:focus, +.skin-red-light .main-header .navbar .nav .open > a, +.skin-red-light .main-header .navbar .nav .open > a:hover, +.skin-red-light .main-header .navbar .nav .open > a:focus, +.skin-red-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red-light .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red-light .main-header .logo { + background-color: #dd4b39; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red-light .main-header .logo:hover { + background-color: #dc4735; +} +.skin-red-light .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red-light .content-header { + background: transparent; +} +.skin-red-light .wrapper, +.skin-red-light .main-sidebar, +.skin-red-light .left-side { + background-color: #f9fafc; +} +.skin-red-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-red-light .user-panel > .info, +.skin-red-light .user-panel > .info > a { + color: #444444; +} +.skin-red-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-red-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-red-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-red-light .sidebar-menu > li:hover > a, +.skin-red-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-red-light .sidebar-menu > li.active { + border-left-color: #dd4b39; +} +.skin-red-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-red-light .sidebar a { + color: #444444; +} +.skin-red-light .sidebar a:hover { + text-decoration: none; +} +.skin-red-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-red-light .sidebar-menu .treeview-menu > li.active > a, +.skin-red-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-red-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-red-light .sidebar-form input[type="text"], +.skin-red-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-red-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red-light .sidebar-form input[type="text"]:focus, +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow .main-header .navbar .nav > li > a:hover, +.skin-yellow .main-header .navbar .nav > li > a:active, +.skin-yellow .main-header .navbar .nav > li > a:focus, +.skin-yellow .main-header .navbar .nav .open > a, +.skin-yellow .main-header .navbar .nav .open > a:hover, +.skin-yellow .main-header .navbar .nav .open > a:focus, +.skin-yellow .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow .main-header .logo { + background-color: #e08e0b; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow .main-header .logo:hover { + background-color: #db8b0b; +} +.skin-yellow .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow .content-header { + background: transparent; +} +.skin-yellow .wrapper, +.skin-yellow .main-sidebar, +.skin-yellow .left-side { + background-color: #222d32; +} +.skin-yellow .user-panel > .info, +.skin-yellow .user-panel > .info > a { + color: #fff; +} +.skin-yellow .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-yellow .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-yellow .sidebar-menu > li:hover > a, +.skin-yellow .sidebar-menu > li.active > a, +.skin-yellow .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-yellow .sidebar-menu > li.active > a { + border-left-color: #f39c12; +} +.skin-yellow .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-yellow .sidebar a { + color: #b8c7ce; +} +.skin-yellow .sidebar a:hover { + text-decoration: none; +} +.skin-yellow .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-yellow .sidebar-menu .treeview-menu > li.active > a, +.skin-yellow .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-yellow .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-yellow .sidebar-form input[type="text"], +.skin-yellow .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-yellow .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow .sidebar-form input[type="text"]:focus, +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow-light .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .nav > li > a:hover, +.skin-yellow-light .main-header .navbar .nav > li > a:active, +.skin-yellow-light .main-header .navbar .nav > li > a:focus, +.skin-yellow-light .main-header .navbar .nav .open > a, +.skin-yellow-light .main-header .navbar .nav .open > a:hover, +.skin-yellow-light .main-header .navbar .nav .open > a:focus, +.skin-yellow-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow-light .main-header .logo { + background-color: #f39c12; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow-light .main-header .logo:hover { + background-color: #f39a0d; +} +.skin-yellow-light .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow-light .content-header { + background: transparent; +} +.skin-yellow-light .wrapper, +.skin-yellow-light .main-sidebar, +.skin-yellow-light .left-side { + background-color: #f9fafc; +} +.skin-yellow-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-yellow-light .user-panel > .info, +.skin-yellow-light .user-panel > .info > a { + color: #444444; +} +.skin-yellow-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-yellow-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-yellow-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li:hover > a, +.skin-yellow-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-yellow-light .sidebar-menu > li.active { + border-left-color: #f39c12; +} +.skin-yellow-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-yellow-light .sidebar a { + color: #444444; +} +.skin-yellow-light .sidebar a:hover { + text-decoration: none; +} +.skin-yellow-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a, +.skin-yellow-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-yellow-light .sidebar-form input[type="text"], +.skin-yellow-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-yellow-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus, +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Purple + * ------------ + */ +.skin-purple .main-header .navbar { + background-color: #605ca8; +} +.skin-purple .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple .main-header .navbar .nav > li > a:hover, +.skin-purple .main-header .navbar .nav > li > a:active, +.skin-purple .main-header .navbar .nav > li > a:focus, +.skin-purple .main-header .navbar .nav .open > a, +.skin-purple .main-header .navbar .nav .open > a:hover, +.skin-purple .main-header .navbar .nav .open > a:focus, +.skin-purple .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple .main-header .logo { + background-color: #555299; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple .main-header .logo:hover { + background-color: #545096; +} +.skin-purple .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple .content-header { + background: transparent; +} +.skin-purple .wrapper, +.skin-purple .main-sidebar, +.skin-purple .left-side { + background-color: #222d32; +} +.skin-purple .user-panel > .info, +.skin-purple .user-panel > .info > a { + color: #fff; +} +.skin-purple .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-purple .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-purple .sidebar-menu > li:hover > a, +.skin-purple .sidebar-menu > li.active > a, +.skin-purple .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-purple .sidebar-menu > li.active > a { + border-left-color: #605ca8; +} +.skin-purple .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-purple .sidebar a { + color: #b8c7ce; +} +.skin-purple .sidebar a:hover { + text-decoration: none; +} +.skin-purple .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-purple .sidebar-menu .treeview-menu > li.active > a, +.skin-purple .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-purple .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-purple .sidebar-form input[type="text"], +.skin-purple .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-purple .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple .sidebar-form input[type="text"]:focus, +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Purple + * ------------ + */ +.skin-purple-light .main-header .navbar { + background-color: #605ca8; +} +.skin-purple-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .nav > li > a:hover, +.skin-purple-light .main-header .navbar .nav > li > a:active, +.skin-purple-light .main-header .navbar .nav > li > a:focus, +.skin-purple-light .main-header .navbar .nav .open > a, +.skin-purple-light .main-header .navbar .nav .open > a:hover, +.skin-purple-light .main-header .navbar .nav .open > a:focus, +.skin-purple-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple-light .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple-light .main-header .logo { + background-color: #605ca8; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple-light .main-header .logo:hover { + background-color: #5d59a6; +} +.skin-purple-light .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple-light .content-header { + background: transparent; +} +.skin-purple-light .wrapper, +.skin-purple-light .main-sidebar, +.skin-purple-light .left-side { + background-color: #f9fafc; +} +.skin-purple-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-purple-light .user-panel > .info, +.skin-purple-light .user-panel > .info > a { + color: #444444; +} +.skin-purple-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-purple-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-purple-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li:hover > a, +.skin-purple-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-purple-light .sidebar-menu > li.active { + border-left-color: #605ca8; +} +.skin-purple-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-purple-light .sidebar a { + color: #444444; +} +.skin-purple-light .sidebar a:hover { + text-decoration: none; +} +.skin-purple-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-purple-light .sidebar-menu .treeview-menu > li.active > a, +.skin-purple-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-purple-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-purple-light .sidebar-form input[type="text"], +.skin-purple-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-purple-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple-light .sidebar-form input[type="text"]:focus, +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.min.css new file mode 100755 index 00000000..c8e420e7 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .main-sidebar{border-right:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a,.skin-blue-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}.skin-black-light .main-header{border-bottom:1px solid #d2d6de}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #d2d6de;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #d2d6de}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .main-sidebar{border-right:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-black-light .sidebar-menu .treeview-menu>li.active>a,.skin-black-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-black-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .main-sidebar{border-right:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a,.skin-yellow-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .main-sidebar{border-right:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a,.skin-purple-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black-light.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black-light.css new file mode 100755 index 00000000..2f48e067 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black-light.css @@ -0,0 +1,171 @@ +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black-light .main-header { + border-bottom: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar-toggle { + color: #333; +} +.skin-black-light .main-header .navbar-brand { + color: #333; + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar { + background-color: #ffffff; +} +.skin-black-light .main-header .navbar .nav > li > a { + color: #333333; +} +.skin-black-light .main-header .navbar .nav > li > a:hover, +.skin-black-light .main-header .navbar .nav > li > a:active, +.skin-black-light .main-header .navbar .nav > li > a:focus, +.skin-black-light .main-header .navbar .nav .open > a, +.skin-black-light .main-header .navbar .nav .open > a:hover, +.skin-black-light .main-header .navbar .nav .open > a:focus, +.skin-black-light .main-header .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black-light .main-header .navbar .sidebar-toggle { + color: #333333; +} +.skin-black-light .main-header .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black-light .main-header .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar .navbar-nav > li > a { + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black-light .main-header .navbar .navbar-right > li > a { + border-left: 1px solid #d2d6de; + border-right-width: 0; +} +.skin-black-light .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #d2d6de; +} +.skin-black-light .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black-light .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black-light .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black-light .main-header li.user-header { + background-color: #222; +} +.skin-black-light .content-header { + background: transparent; + box-shadow: none; +} +.skin-black-light .wrapper, +.skin-black-light .main-sidebar, +.skin-black-light .left-side { + background-color: #f9fafc; +} +.skin-black-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-black-light .user-panel > .info, +.skin-black-light .user-panel > .info > a { + color: #444444; +} +.skin-black-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-black-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-black-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-black-light .sidebar-menu > li:hover > a, +.skin-black-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-black-light .sidebar-menu > li.active { + border-left-color: #ffffff; +} +.skin-black-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-black-light .sidebar a { + color: #444444; +} +.skin-black-light .sidebar a:hover { + text-decoration: none; +} +.skin-black-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-black-light .sidebar-menu .treeview-menu > li.active > a, +.skin-black-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-black-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-black-light .sidebar-form input[type="text"], +.skin-black-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-black-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black-light .sidebar-form input[type="text"]:focus, +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black-light.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black-light.min.css new file mode 100755 index 00000000..de298d4e --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black-light.min.css @@ -0,0 +1 @@ +.skin-black-light .main-header{border-bottom:1px solid #d2d6de}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #d2d6de;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #d2d6de}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .main-sidebar{border-right:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-black-light .sidebar-menu .treeview-menu>li.active>a,.skin-black-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-black-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black.css new file mode 100755 index 00000000..cead8e9a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black.css @@ -0,0 +1,161 @@ +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black .main-header .navbar-toggle { + color: #333; +} +.skin-black .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header .navbar { + background-color: #ffffff; +} +.skin-black .main-header .navbar .nav > li > a { + color: #333333; +} +.skin-black .main-header .navbar .nav > li > a:hover, +.skin-black .main-header .navbar .nav > li > a:active, +.skin-black .main-header .navbar .nav > li > a:focus, +.skin-black .main-header .navbar .nav .open > a, +.skin-black .main-header .navbar .nav .open > a:hover, +.skin-black .main-header .navbar .nav .open > a:focus, +.skin-black .main-header .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black .main-header .navbar .sidebar-toggle { + color: #333333; +} +.skin-black .main-header .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black .main-header .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black .main-header .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black .main-header li.user-header { + background-color: #222; +} +.skin-black .content-header { + background: transparent; + box-shadow: none; +} +.skin-black .wrapper, +.skin-black .main-sidebar, +.skin-black .left-side { + background-color: #222d32; +} +.skin-black .user-panel > .info, +.skin-black .user-panel > .info > a { + color: #fff; +} +.skin-black .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-black .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-black .sidebar-menu > li:hover > a, +.skin-black .sidebar-menu > li.active > a, +.skin-black .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-black .sidebar-menu > li.active > a { + border-left-color: #ffffff; +} +.skin-black .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-black .sidebar a { + color: #b8c7ce; +} +.skin-black .sidebar a:hover { + text-decoration: none; +} +.skin-black .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-black .sidebar-menu .treeview-menu > li.active > a, +.skin-black .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-black .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-black .sidebar-form input[type="text"], +.skin-black .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-black .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black .sidebar-form input[type="text"]:focus, +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-black .pace .pace-progress { + background: #222; +} +.skin-black .pace .pace-activity { + border-top-color: #222; + border-left-color: #222; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black.min.css new file mode 100755 index 00000000..6f3f803c --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-black.min.css @@ -0,0 +1 @@ +.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue-light.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue-light.css new file mode 100755 index 00000000..58064408 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue-light.css @@ -0,0 +1,163 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue-light .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .nav > li > a:hover, +.skin-blue-light .main-header .navbar .nav > li > a:active, +.skin-blue-light .main-header .navbar .nav > li > a:focus, +.skin-blue-light .main-header .navbar .nav .open > a, +.skin-blue-light .main-header .navbar .nav .open > a:hover, +.skin-blue-light .main-header .navbar .nav .open > a:focus, +.skin-blue-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue-light .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue-light .main-header .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue-light .main-header .logo:hover { + background-color: #3b8ab8; +} +.skin-blue-light .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue-light .content-header { + background: transparent; +} +.skin-blue-light .wrapper, +.skin-blue-light .main-sidebar, +.skin-blue-light .left-side { + background-color: #f9fafc; +} +.skin-blue-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-blue-light .user-panel > .info, +.skin-blue-light .user-panel > .info > a { + color: #444444; +} +.skin-blue-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-blue-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-blue-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li:hover > a, +.skin-blue-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-blue-light .sidebar-menu > li.active { + border-left-color: #3c8dbc; +} +.skin-blue-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-blue-light .sidebar a { + color: #444444; +} +.skin-blue-light .sidebar a:hover { + text-decoration: none; +} +.skin-blue-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-blue-light .sidebar-menu .treeview-menu > li.active > a, +.skin-blue-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-blue-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-blue-light .sidebar-form input[type="text"], +.skin-blue-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-blue-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue-light .sidebar-form input[type="text"]:focus, +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +.skin-blue-light .main-footer { + border-top-color: #d2d6de; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue-light.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue-light.min.css new file mode 100755 index 00000000..033834e2 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue-light.min.css @@ -0,0 +1 @@ +.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .main-sidebar{border-right:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a,.skin-blue-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue.css new file mode 100755 index 00000000..582d5549 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue.css @@ -0,0 +1,142 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue .main-header .navbar .nav > li > a:hover, +.skin-blue .main-header .navbar .nav > li > a:active, +.skin-blue .main-header .navbar .nav > li > a:focus, +.skin-blue .main-header .navbar .nav .open > a, +.skin-blue .main-header .navbar .nav .open > a:hover, +.skin-blue .main-header .navbar .nav .open > a:focus, +.skin-blue .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue .main-header .logo { + background-color: #367fa9; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue .main-header .logo:hover { + background-color: #357ca5; +} +.skin-blue .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue .content-header { + background: transparent; +} +.skin-blue .wrapper, +.skin-blue .main-sidebar, +.skin-blue .left-side { + background-color: #222d32; +} +.skin-blue .user-panel > .info, +.skin-blue .user-panel > .info > a { + color: #fff; +} +.skin-blue .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-blue .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-blue .sidebar-menu > li:hover > a, +.skin-blue .sidebar-menu > li.active > a, +.skin-blue .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-blue .sidebar-menu > li.active > a { + border-left-color: #3c8dbc; +} +.skin-blue .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-blue .sidebar a { + color: #b8c7ce; +} +.skin-blue .sidebar a:hover { + text-decoration: none; +} +.skin-blue .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-blue .sidebar-menu .treeview-menu > li.active > a, +.skin-blue .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-blue .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-blue .sidebar-form input[type="text"], +.skin-blue .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-blue .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue .sidebar-form input[type="text"]:focus, +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue.min.css new file mode 100755 index 00000000..c2219cd9 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-blue.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green-light.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green-light.css new file mode 100755 index 00000000..a2ba6219 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green-light.css @@ -0,0 +1,152 @@ +/* + * Skin: Green + * ----------- + */ +.skin-green-light .main-header .navbar { + background-color: #00a65a; +} +.skin-green-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green-light .main-header .navbar .nav > li > a:hover, +.skin-green-light .main-header .navbar .nav > li > a:active, +.skin-green-light .main-header .navbar .nav > li > a:focus, +.skin-green-light .main-header .navbar .nav .open > a, +.skin-green-light .main-header .navbar .nav .open > a:hover, +.skin-green-light .main-header .navbar .nav .open > a:focus, +.skin-green-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green-light .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green-light .main-header .logo { + background-color: #00a65a; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green-light .main-header .logo:hover { + background-color: #00a157; +} +.skin-green-light .main-header li.user-header { + background-color: #00a65a; +} +.skin-green-light .content-header { + background: transparent; +} +.skin-green-light .wrapper, +.skin-green-light .main-sidebar, +.skin-green-light .left-side { + background-color: #f9fafc; +} +.skin-green-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-green-light .user-panel > .info, +.skin-green-light .user-panel > .info > a { + color: #444444; +} +.skin-green-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-green-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-green-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-green-light .sidebar-menu > li:hover > a, +.skin-green-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-green-light .sidebar-menu > li.active { + border-left-color: #00a65a; +} +.skin-green-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-green-light .sidebar a { + color: #444444; +} +.skin-green-light .sidebar a:hover { + text-decoration: none; +} +.skin-green-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-green-light .sidebar-menu .treeview-menu > li.active > a, +.skin-green-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-green-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-green-light .sidebar-form input[type="text"], +.skin-green-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-green-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green-light .sidebar-form input[type="text"]:focus, +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green-light.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green-light.min.css new file mode 100755 index 00000000..e86660bc --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green-light.min.css @@ -0,0 +1 @@ +.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green.css new file mode 100755 index 00000000..4222107a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green.css @@ -0,0 +1,134 @@ +/* + * Skin: Green + * ----------- + */ +.skin-green .main-header .navbar { + background-color: #00a65a; +} +.skin-green .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green .main-header .navbar .nav > li > a:hover, +.skin-green .main-header .navbar .nav > li > a:active, +.skin-green .main-header .navbar .nav > li > a:focus, +.skin-green .main-header .navbar .nav .open > a, +.skin-green .main-header .navbar .nav .open > a:hover, +.skin-green .main-header .navbar .nav .open > a:focus, +.skin-green .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green .main-header .logo { + background-color: #008d4c; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green .main-header .logo:hover { + background-color: #008749; +} +.skin-green .main-header li.user-header { + background-color: #00a65a; +} +.skin-green .content-header { + background: transparent; +} +.skin-green .wrapper, +.skin-green .main-sidebar, +.skin-green .left-side { + background-color: #222d32; +} +.skin-green .user-panel > .info, +.skin-green .user-panel > .info > a { + color: #fff; +} +.skin-green .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-green .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-green .sidebar-menu > li:hover > a, +.skin-green .sidebar-menu > li.active > a, +.skin-green .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-green .sidebar-menu > li.active > a { + border-left-color: #00a65a; +} +.skin-green .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-green .sidebar a { + color: #b8c7ce; +} +.skin-green .sidebar a:hover { + text-decoration: none; +} +.skin-green .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-green .sidebar-menu .treeview-menu > li.active > a, +.skin-green .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-green .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-green .sidebar-form input[type="text"], +.skin-green .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-green .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green .sidebar-form input[type="text"]:focus, +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green.min.css new file mode 100755 index 00000000..18e1a845 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-green.min.css @@ -0,0 +1 @@ +.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple-light.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple-light.css new file mode 100755 index 00000000..2609787e --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple-light.css @@ -0,0 +1,152 @@ +/* + * Skin: Purple + * ------------ + */ +.skin-purple-light .main-header .navbar { + background-color: #605ca8; +} +.skin-purple-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .nav > li > a:hover, +.skin-purple-light .main-header .navbar .nav > li > a:active, +.skin-purple-light .main-header .navbar .nav > li > a:focus, +.skin-purple-light .main-header .navbar .nav .open > a, +.skin-purple-light .main-header .navbar .nav .open > a:hover, +.skin-purple-light .main-header .navbar .nav .open > a:focus, +.skin-purple-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple-light .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple-light .main-header .logo { + background-color: #605ca8; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple-light .main-header .logo:hover { + background-color: #5d59a6; +} +.skin-purple-light .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple-light .content-header { + background: transparent; +} +.skin-purple-light .wrapper, +.skin-purple-light .main-sidebar, +.skin-purple-light .left-side { + background-color: #f9fafc; +} +.skin-purple-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-purple-light .user-panel > .info, +.skin-purple-light .user-panel > .info > a { + color: #444444; +} +.skin-purple-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-purple-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-purple-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li:hover > a, +.skin-purple-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-purple-light .sidebar-menu > li.active { + border-left-color: #605ca8; +} +.skin-purple-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-purple-light .sidebar a { + color: #444444; +} +.skin-purple-light .sidebar a:hover { + text-decoration: none; +} +.skin-purple-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-purple-light .sidebar-menu .treeview-menu > li.active > a, +.skin-purple-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-purple-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-purple-light .sidebar-form input[type="text"], +.skin-purple-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-purple-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple-light .sidebar-form input[type="text"]:focus, +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple-light.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple-light.min.css new file mode 100755 index 00000000..b2e43fec --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple-light.min.css @@ -0,0 +1 @@ +.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .main-sidebar{border-right:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a,.skin-purple-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple.css new file mode 100755 index 00000000..b5ec71b6 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple.css @@ -0,0 +1,134 @@ +/* + * Skin: Purple + * ------------ + */ +.skin-purple .main-header .navbar { + background-color: #605ca8; +} +.skin-purple .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple .main-header .navbar .nav > li > a:hover, +.skin-purple .main-header .navbar .nav > li > a:active, +.skin-purple .main-header .navbar .nav > li > a:focus, +.skin-purple .main-header .navbar .nav .open > a, +.skin-purple .main-header .navbar .nav .open > a:hover, +.skin-purple .main-header .navbar .nav .open > a:focus, +.skin-purple .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple .main-header .logo { + background-color: #555299; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple .main-header .logo:hover { + background-color: #545096; +} +.skin-purple .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple .content-header { + background: transparent; +} +.skin-purple .wrapper, +.skin-purple .main-sidebar, +.skin-purple .left-side { + background-color: #222d32; +} +.skin-purple .user-panel > .info, +.skin-purple .user-panel > .info > a { + color: #fff; +} +.skin-purple .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-purple .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-purple .sidebar-menu > li:hover > a, +.skin-purple .sidebar-menu > li.active > a, +.skin-purple .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-purple .sidebar-menu > li.active > a { + border-left-color: #605ca8; +} +.skin-purple .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-purple .sidebar a { + color: #b8c7ce; +} +.skin-purple .sidebar a:hover { + text-decoration: none; +} +.skin-purple .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-purple .sidebar-menu .treeview-menu > li.active > a, +.skin-purple .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-purple .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-purple .sidebar-form input[type="text"], +.skin-purple .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-purple .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple .sidebar-form input[type="text"]:focus, +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple.min.css new file mode 100755 index 00000000..8491fe1a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-purple.min.css @@ -0,0 +1 @@ +.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red-light.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red-light.css new file mode 100755 index 00000000..17ea0a70 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red-light.css @@ -0,0 +1,152 @@ +/* + * Skin: Red + * --------- + */ +.skin-red-light .main-header .navbar { + background-color: #dd4b39; +} +.skin-red-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red-light .main-header .navbar .nav > li > a:hover, +.skin-red-light .main-header .navbar .nav > li > a:active, +.skin-red-light .main-header .navbar .nav > li > a:focus, +.skin-red-light .main-header .navbar .nav .open > a, +.skin-red-light .main-header .navbar .nav .open > a:hover, +.skin-red-light .main-header .navbar .nav .open > a:focus, +.skin-red-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red-light .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red-light .main-header .logo { + background-color: #dd4b39; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red-light .main-header .logo:hover { + background-color: #dc4735; +} +.skin-red-light .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red-light .content-header { + background: transparent; +} +.skin-red-light .wrapper, +.skin-red-light .main-sidebar, +.skin-red-light .left-side { + background-color: #f9fafc; +} +.skin-red-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-red-light .user-panel > .info, +.skin-red-light .user-panel > .info > a { + color: #444444; +} +.skin-red-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-red-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-red-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-red-light .sidebar-menu > li:hover > a, +.skin-red-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-red-light .sidebar-menu > li.active { + border-left-color: #dd4b39; +} +.skin-red-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-red-light .sidebar a { + color: #444444; +} +.skin-red-light .sidebar a:hover { + text-decoration: none; +} +.skin-red-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-red-light .sidebar-menu .treeview-menu > li.active > a, +.skin-red-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-red-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-red-light .sidebar-form input[type="text"], +.skin-red-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-red-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red-light .sidebar-form input[type="text"]:focus, +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red-light.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red-light.min.css new file mode 100755 index 00000000..2de97a8a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red-light.min.css @@ -0,0 +1 @@ +.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red.css new file mode 100755 index 00000000..d4d71135 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red.css @@ -0,0 +1,134 @@ +/* + * Skin: Red + * --------- + */ +.skin-red .main-header .navbar { + background-color: #dd4b39; +} +.skin-red .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red .main-header .navbar .nav > li > a:hover, +.skin-red .main-header .navbar .nav > li > a:active, +.skin-red .main-header .navbar .nav > li > a:focus, +.skin-red .main-header .navbar .nav .open > a, +.skin-red .main-header .navbar .nav .open > a:hover, +.skin-red .main-header .navbar .nav .open > a:focus, +.skin-red .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red .main-header .logo { + background-color: #d73925; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red .main-header .logo:hover { + background-color: #d33724; +} +.skin-red .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red .content-header { + background: transparent; +} +.skin-red .wrapper, +.skin-red .main-sidebar, +.skin-red .left-side { + background-color: #222d32; +} +.skin-red .user-panel > .info, +.skin-red .user-panel > .info > a { + color: #fff; +} +.skin-red .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-red .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-red .sidebar-menu > li:hover > a, +.skin-red .sidebar-menu > li.active > a, +.skin-red .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-red .sidebar-menu > li.active > a { + border-left-color: #dd4b39; +} +.skin-red .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-red .sidebar a { + color: #b8c7ce; +} +.skin-red .sidebar a:hover { + text-decoration: none; +} +.skin-red .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-red .sidebar-menu .treeview-menu > li.active > a, +.skin-red .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-red .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-red .sidebar-form input[type="text"], +.skin-red .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-red .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red .sidebar-form input[type="text"]:focus, +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red.min.css new file mode 100755 index 00000000..791b8412 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-red.min.css @@ -0,0 +1 @@ +.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow-light.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow-light.css new file mode 100755 index 00000000..5beaab0a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow-light.css @@ -0,0 +1,152 @@ +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow-light .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .nav > li > a:hover, +.skin-yellow-light .main-header .navbar .nav > li > a:active, +.skin-yellow-light .main-header .navbar .nav > li > a:focus, +.skin-yellow-light .main-header .navbar .nav .open > a, +.skin-yellow-light .main-header .navbar .nav .open > a:hover, +.skin-yellow-light .main-header .navbar .nav .open > a:focus, +.skin-yellow-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow-light .main-header .logo { + background-color: #f39c12; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow-light .main-header .logo:hover { + background-color: #f39a0d; +} +.skin-yellow-light .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow-light .content-header { + background: transparent; +} +.skin-yellow-light .wrapper, +.skin-yellow-light .main-sidebar, +.skin-yellow-light .left-side { + background-color: #f9fafc; +} +.skin-yellow-light .main-sidebar { + border-right: 1px solid #d2d6de; +} +.skin-yellow-light .user-panel > .info, +.skin-yellow-light .user-panel > .info > a { + color: #444444; +} +.skin-yellow-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-yellow-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-yellow-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li:hover > a, +.skin-yellow-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-yellow-light .sidebar-menu > li.active { + border-left-color: #f39c12; +} +.skin-yellow-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-yellow-light .sidebar a { + color: #444444; +} +.skin-yellow-light .sidebar a:hover { + text-decoration: none; +} +.skin-yellow-light .sidebar-menu .treeview-menu > li > a { + color: #777777; +} +.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a, +.skin-yellow-light .sidebar-menu .treeview-menu > li > a:hover { + color: #000000; +} +.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-yellow-light .sidebar-form input[type="text"], +.skin-yellow-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; +} +.skin-yellow-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus, +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow-light.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow-light.min.css new file mode 100755 index 00000000..16d78d87 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow-light.min.css @@ -0,0 +1 @@ +.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .main-sidebar{border-right:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a,.skin-yellow-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow.css new file mode 100755 index 00000000..3eb1e013 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow.css @@ -0,0 +1,134 @@ +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow .main-header .navbar .nav > li > a:hover, +.skin-yellow .main-header .navbar .nav > li > a:active, +.skin-yellow .main-header .navbar .nav > li > a:focus, +.skin-yellow .main-header .navbar .nav .open > a, +.skin-yellow .main-header .navbar .nav .open > a:hover, +.skin-yellow .main-header .navbar .nav .open > a:focus, +.skin-yellow .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow .main-header .logo { + background-color: #e08e0b; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow .main-header .logo:hover { + background-color: #db8b0b; +} +.skin-yellow .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow .content-header { + background: transparent; +} +.skin-yellow .wrapper, +.skin-yellow .main-sidebar, +.skin-yellow .left-side { + background-color: #222d32; +} +.skin-yellow .user-panel > .info, +.skin-yellow .user-panel > .info > a { + color: #fff; +} +.skin-yellow .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-yellow .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-yellow .sidebar-menu > li:hover > a, +.skin-yellow .sidebar-menu > li.active > a, +.skin-yellow .sidebar-menu > li.menu-open > a { + color: #ffffff; + background: #1e282c; +} +.skin-yellow .sidebar-menu > li.active > a { + border-left-color: #f39c12; +} +.skin-yellow .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-yellow .sidebar a { + color: #b8c7ce; +} +.skin-yellow .sidebar a:hover { + text-decoration: none; +} +.skin-yellow .sidebar-menu .treeview-menu > li > a { + color: #8aa4af; +} +.skin-yellow .sidebar-menu .treeview-menu > li.active > a, +.skin-yellow .sidebar-menu .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-yellow .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-yellow .sidebar-form input[type="text"], +.skin-yellow .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; +} +.skin-yellow .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow .sidebar-form input[type="text"]:focus, +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow.min.css b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow.min.css new file mode 100755 index 00000000..d4ed5e2d --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/css/skins/skin-yellow.min.css @@ -0,0 +1 @@ +.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/avatar.png b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar.png new file mode 100755 index 00000000..55d63064 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/avatar04.png b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar04.png new file mode 100755 index 00000000..ef35fecc Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar04.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/avatar2.png b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar2.png new file mode 100755 index 00000000..26a4d22d Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar2.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/avatar3.png b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar3.png new file mode 100755 index 00000000..c3bf8a57 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar3.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/avatar5.png b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar5.png new file mode 100755 index 00000000..c561fc16 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/avatar5.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/boxed-bg.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/boxed-bg.jpg new file mode 100755 index 00000000..e47586ab Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/boxed-bg.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/boxed-bg.png b/hera-admin/src/main/resources/static/adminlte/dist/img/boxed-bg.png new file mode 100755 index 00000000..e5411f4a Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/boxed-bg.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/credit/american-express.png b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/american-express.png new file mode 100755 index 00000000..fe01a2dc Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/american-express.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/credit/cirrus.png b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/cirrus.png new file mode 100755 index 00000000..643a7d52 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/cirrus.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/credit/mastercard.png b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/mastercard.png new file mode 100755 index 00000000..de112cc3 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/mastercard.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/credit/mestro.png b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/mestro.png new file mode 100755 index 00000000..09adda74 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/mestro.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/credit/paypal.png b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/paypal.png new file mode 100755 index 00000000..bb1e8bad Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/paypal.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/credit/paypal2.png b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/paypal2.png new file mode 100755 index 00000000..3bdf1ed5 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/paypal2.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/credit/visa.png b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/visa.png new file mode 100755 index 00000000..2ef83fb6 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/credit/visa.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/default-50x50.gif b/hera-admin/src/main/resources/static/adminlte/dist/img/default-50x50.gif new file mode 100755 index 00000000..2f5a14a5 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/default-50x50.gif differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/icons.png b/hera-admin/src/main/resources/static/adminlte/dist/img/icons.png new file mode 100755 index 00000000..d47bc150 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/icons.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/photo1.png b/hera-admin/src/main/resources/static/adminlte/dist/img/photo1.png new file mode 100755 index 00000000..c1922b46 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/photo1.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/photo2.png b/hera-admin/src/main/resources/static/adminlte/dist/img/photo2.png new file mode 100755 index 00000000..f4c3b007 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/photo2.png differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/photo3.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/photo3.jpg new file mode 100755 index 00000000..63daa811 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/photo3.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/photo4.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/photo4.jpg new file mode 100755 index 00000000..c700ef36 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/photo4.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user1-128x128.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user1-128x128.jpg new file mode 100755 index 00000000..b0ae99a3 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user1-128x128.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user2-160x160.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user2-160x160.jpg new file mode 100755 index 00000000..aec74cb2 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user2-160x160.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user3-128x128.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user3-128x128.jpg new file mode 100755 index 00000000..caf5f966 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user3-128x128.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user4-128x128.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user4-128x128.jpg new file mode 100755 index 00000000..eb8e2bb7 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user4-128x128.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user5-128x128.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user5-128x128.jpg new file mode 100755 index 00000000..b637aad7 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user5-128x128.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user6-128x128.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user6-128x128.jpg new file mode 100755 index 00000000..3ac24681 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user6-128x128.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user7-128x128.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user7-128x128.jpg new file mode 100755 index 00000000..97febc29 Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user7-128x128.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/img/user8-128x128.jpg b/hera-admin/src/main/resources/static/adminlte/dist/img/user8-128x128.jpg new file mode 100755 index 00000000..6e717b4a Binary files /dev/null and b/hera-admin/src/main/resources/static/adminlte/dist/img/user8-128x128.jpg differ diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/adminlte.js b/hera-admin/src/main/resources/static/adminlte/dist/js/adminlte.js new file mode 100755 index 00000000..54116ed2 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/adminlte.js @@ -0,0 +1,996 @@ +/*! AdminLTE app.js +* ================ +* Main JS application file for AdminLTE v2. This file +* should be included in all pages. It controls some layout +* options and implements exclusive AdminLTE plugins. +* +* @Author Almsaeed Studio +* @Support +* @Email +* @version 2.4.0 +* @repository git://github.com/almasaeed2010/AdminLTE.git +* @license MIT +*/ + +// Make sure jQuery has been loaded +if (typeof jQuery === 'undefined') { +throw new Error('AdminLTE requires jQuery') +} + +/* Layout() + * ======== + * Implements AdminLTE layout. + * Fixes the layout height in case min-height fails. + * + * @usage activated automatically upon window load. + * Configure any options by passing data-option="value" + * to the body tag. + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.layout' + + var Default = { + slimscroll : true, + resetHeight: true + } + + var Selector = { + wrapper : '.wrapper', + contentWrapper: '.content-wrapper', + layoutBoxed : '.layout-boxed', + mainFooter : '.main-footer', + mainHeader : '.main-header', + sidebar : '.sidebar', + controlSidebar: '.control-sidebar', + fixed : '.fixed', + sidebarMenu : '.sidebar-menu' + } + + var ClassName = { + fixed : 'fixed', + holdTransition: 'hold-transition' + } + + var Layout = function (options) { + this.options = options + this.bindedResize = false + this.activate() + } + + Layout.prototype.activate = function () { + this.fix() + this.fixSidebar() + + $('body').removeClass(ClassName.holdTransition) + + if (this.options.resetHeight) { + $('body, html, ' + Selector.wrapper).css({ + 'height' : 'auto', + 'min-height': '100%' + }) + } + + if (!this.bindedResize) { + $(window).resize(function () { + this.fix() + this.fixSidebar() + }.bind(this)) + this.bindedResize = true + } + + $(Selector.sidebarMenu).on('expanded.tree', function () { + this.fix() + this.fixSidebar() + }.bind(this)) + + $(Selector.sidebarMenu).on('collapsed.tree', function () { + this.fix() + this.fixSidebar() + }.bind(this)) + } + + Layout.prototype.fix = function () { + // Remove overflow from .wrapper if layout-boxed exists + $(Selector.layoutBoxed + ' > ' + Selector.wrapper).css('overflow', 'hidden') + + // Get window height and the wrapper height + var footerHeight = $(Selector.mainFooter).outerHeight() || 0 + var neg = $(Selector.mainHeader).outerHeight() + footerHeight + var windowHeight = $(window).height() + var sidebarHeight = $(Selector.sidebar).height() || 0 + + // Set the min-height of the content and sidebar based on the + // the height of the document. + if ($('body').hasClass(ClassName.fixed)) { + $(Selector.contentWrapper).css('min-height', windowHeight - footerHeight) + } else { + var postSetWidth + + if (windowHeight >= sidebarHeight) { + $(Selector.contentWrapper).css('min-height', windowHeight - neg) + postSetWidth = windowHeight - neg + } else { + $(Selector.contentWrapper).css('min-height', sidebarHeight) + postSetWidth = sidebarHeight + } + + // Fix for the control sidebar height + var $controlSidebar = $(Selector.controlSidebar) + if (typeof $controlSidebar !== 'undefined') { + if ($controlSidebar.height() > postSetWidth) + $(Selector.contentWrapper).css('min-height', $controlSidebar.height()) + } + } + } + + Layout.prototype.fixSidebar = function () { + // Make sure the body tag has the .fixed class + if (!$('body').hasClass(ClassName.fixed)) { + if (typeof $.fn.slimScroll !== 'undefined') { + $(Selector.sidebar).slimScroll({ destroy: true }).height('auto') + } + return + } + + // Enable slimscroll for fixed layout + if (this.options.slimscroll) { + if (typeof $.fn.slimScroll !== 'undefined') { + // Destroy if it exists + $(Selector.sidebar).slimScroll({ destroy: true }).height('auto') + + // Add slimscroll + $(Selector.sidebar).slimScroll({ + height: ($(window).height() - $(Selector.mainHeader).height()) + 'px', + color : 'rgba(0,0,0,0.2)', + size : '3px' + }) + } + } + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option === 'object' && option) + $this.data(DataKey, (data = new Layout(options))) + } + + if (typeof option === 'string') { + if (typeof data[option] === 'undefined') { + throw new Error('No method named ' + option) + } + data[option]() + } + }) + } + + var old = $.fn.layout + + $.fn.layout = Plugin + $.fn.layout.Constuctor = Layout + + // No conflict mode + // ================ + $.fn.layout.noConflict = function () { + $.fn.layout = old + return this + } + + // Layout DATA-API + // =============== + $(window).on('load', function () { + Plugin.call($('body')) + }) +}(jQuery) + + +/* PushMenu() + * ========== + * Adds the push menu functionality to the sidebar. + * + * @usage: $('.btn').pushMenu(options) + * or add [data-toggle="push-menu"] to any toggle button + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.pushmenu' + + var Default = { + collapseScreenSize : 767, + expandOnHover : false, + expandTransitionDelay: 200 + } + + var Selector = { + collapsed : '.sidebar-collapse', + open : '.sidebar-open', + mainSidebar : '.main-sidebar', + contentWrapper: '.content-wrapper', + searchInput : '.sidebar-form .form-control', + button : '[data-toggle="push-menu"]', + mini : '.sidebar-mini', + expanded : '.sidebar-expanded-on-hover', + layoutFixed : '.fixed' + } + + var ClassName = { + collapsed : 'sidebar-collapse', + open : 'sidebar-open', + mini : 'sidebar-mini', + expanded : 'sidebar-expanded-on-hover', + expandFeature: 'sidebar-mini-expand-feature', + layoutFixed : 'fixed' + } + + var Event = { + expanded : 'expanded.pushMenu', + collapsed: 'collapsed.pushMenu' + } + + // PushMenu Class Definition + // ========================= + var PushMenu = function (options) { + this.options = options + this.init() + } + + PushMenu.prototype.init = function () { + if (this.options.expandOnHover + || ($('body').is(Selector.mini + Selector.layoutFixed))) { + this.expandOnHover() + $('body').addClass(ClassName.expandFeature) + } + + $(Selector.contentWrapper).click(function () { + // Enable hide menu when clicking on the content-wrapper on small screens + if ($(window).width() <= this.options.collapseScreenSize && $('body').hasClass(ClassName.open)) { + this.close() + } + }.bind(this)) + + // __Fix for android devices + $(Selector.searchInput).click(function (e) { + e.stopPropagation() + }) + } + + PushMenu.prototype.toggle = function () { + var windowWidth = $(window).width() + var isOpen = !$('body').hasClass(ClassName.collapsed) + + if (windowWidth <= this.options.collapseScreenSize) { + isOpen = $('body').hasClass(ClassName.open) + } + + if (!isOpen) { + this.open() + } else { + this.close() + } + } + + PushMenu.prototype.open = function () { + var windowWidth = $(window).width() + + if (windowWidth > this.options.collapseScreenSize) { + $('body').removeClass(ClassName.collapsed) + .trigger($.Event(Event.expanded)) + } + else { + $('body').addClass(ClassName.open) + .trigger($.Event(Event.expanded)) + } + } + + PushMenu.prototype.close = function () { + var windowWidth = $(window).width() + if (windowWidth > this.options.collapseScreenSize) { + $('body').addClass(ClassName.collapsed) + .trigger($.Event(Event.collapsed)) + } else { + $('body').removeClass(ClassName.open + ' ' + ClassName.collapsed) + .trigger($.Event(Event.collapsed)) + } + } + + PushMenu.prototype.expandOnHover = function () { + $(Selector.mainSidebar).hover(function () { + if ($('body').is(Selector.mini + Selector.collapsed) + && $(window).width() > this.options.collapseScreenSize) { + this.expand() + } + }.bind(this), function () { + if ($('body').is(Selector.expanded)) { + this.collapse() + } + }.bind(this)) + } + + PushMenu.prototype.expand = function () { + setTimeout(function () { + $('body').removeClass(ClassName.collapsed) + .addClass(ClassName.expanded) + }, this.options.expandTransitionDelay) + } + + PushMenu.prototype.collapse = function () { + setTimeout(function () { + $('body').removeClass(ClassName.expanded) + .addClass(ClassName.collapsed) + }, this.options.expandTransitionDelay) + } + + // PushMenu Plugin Definition + // ========================== + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new PushMenu(options))) + } + + if (option == 'toggle') data.toggle() + }) + } + + var old = $.fn.pushMenu + + $.fn.pushMenu = Plugin + $.fn.pushMenu.Constructor = PushMenu + + // No Conflict Mode + // ================ + $.fn.pushMenu.noConflict = function () { + $.fn.pushMenu = old + return this + } + + // Data API + // ======== + $(document).on('click', Selector.button, function (e) { + e.preventDefault() + Plugin.call($(this), 'toggle') + }) + $(window).on('load', function () { + Plugin.call($(Selector.button)) + }) +}(jQuery) + + +/* Tree() + * ====== + * Converts a nested list into a multilevel + * tree view menu. + * + * @Usage: $('.my-menu').tree(options) + * or add [data-widget="tree"] to the ul element + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.tree' + + var Default = { + animationSpeed: 500, + accordion : true, + followLink : false, + trigger : '.treeview a' + } + + var Selector = { + tree : '.tree', + treeview : '.treeview', + treeviewMenu: '.treeview-menu', + open : '.menu-open, .active', + li : 'li', + data : '[data-widget="tree"]', + active : '.active' + } + + var ClassName = { + open: 'menu-open', + tree: 'tree' + } + + var Event = { + collapsed: 'collapsed.tree', + expanded : 'expanded.tree' + } + + // Tree Class Definition + // ===================== + var Tree = function (element, options) { + this.element = element + this.options = options + + $(this.element).addClass(ClassName.tree) + + $(Selector.treeview + Selector.active, this.element).addClass(ClassName.open) + + this._setUpListeners() + } + + Tree.prototype.toggle = function (link, event) { + var treeviewMenu = link.next(Selector.treeviewMenu) + var parentLi = link.parent() + var isOpen = parentLi.hasClass(ClassName.open) + + if (!parentLi.is(Selector.treeview)) { + return + } + + if (!this.options.followLink || link.attr('href') == '#') { + event.preventDefault() + } + + if (isOpen) { + this.collapse(treeviewMenu, parentLi) + } else { + this.expand(treeviewMenu, parentLi) + } + } + + Tree.prototype.expand = function (tree, parent) { + var expandedEvent = $.Event(Event.expanded) + + if (this.options.accordion) { + var openMenuLi = parent.siblings(Selector.open) + var openTree = openMenuLi.children(Selector.treeviewMenu) + this.collapse(openTree, openMenuLi) + } + + parent.addClass(ClassName.open) + tree.slideDown(this.options.animationSpeed, function () { + $(this.element).trigger(expandedEvent) + }) + } + + Tree.prototype.collapse = function (tree, parentLi) { + var collapsedEvent = $.Event(Event.collapsed) + + tree.find(Selector.open).removeClass(ClassName.open) + parentLi.removeClass(ClassName.open) + tree.slideUp(this.options.animationSpeed, function () { + tree.find(Selector.open + ' > ' + Selector.treeview).slideUp() + $(this.element).trigger(collapsedEvent) + }) + } + + // Private + + Tree.prototype._setUpListeners = function () { + var that = this + + $(this.element).on('click', this.options.trigger, function (event) { + that.toggle($(this), event) + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, new Tree($this, options)) + } + }) + } + + var old = $.fn.tree + + $.fn.tree = Plugin + $.fn.tree.Constructor = Tree + + // No Conflict Mode + // ================ + $.fn.tree.noConflict = function () { + $.fn.tree = old + return this + } + + // Tree Data API + // ============= + $(window).on('load', function () { + $(Selector.data).each(function () { + Plugin.call($(this)) + }) + }) + +}(jQuery) + + +/* ControlSidebar() + * =============== + * Toggles the state of the control sidebar + * + * @Usage: $('#control-sidebar-trigger').controlSidebar(options) + * or add [data-toggle="control-sidebar"] to the trigger + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.controlsidebar' + + var Default = { + slide: true + } + + var Selector = { + sidebar: '.control-sidebar', + data : '[data-toggle="control-sidebar"]', + open : '.control-sidebar-open', + bg : '.control-sidebar-bg', + wrapper: '.wrapper', + content: '.content-wrapper', + boxed : '.layout-boxed' + } + + var ClassName = { + open : 'control-sidebar-open', + fixed: 'fixed' + } + + var Event = { + collapsed: 'collapsed.controlsidebar', + expanded : 'expanded.controlsidebar' + } + + // ControlSidebar Class Definition + // =============================== + var ControlSidebar = function (element, options) { + this.element = element + this.options = options + this.hasBindedResize = false + + this.init() + } + + ControlSidebar.prototype.init = function () { + // Add click listener if the element hasn't been + // initialized using the data API + if (!$(this.element).is(Selector.data)) { + $(this).on('click', this.toggle) + } + + this.fix() + $(window).resize(function () { + this.fix() + }.bind(this)) + } + + ControlSidebar.prototype.toggle = function (event) { + if (event) event.preventDefault() + + this.fix() + + if (!$(Selector.sidebar).is(Selector.open) && !$('body').is(Selector.open)) { + this.expand() + } else { + this.collapse() + } + } + + ControlSidebar.prototype.expand = function () { + if (!this.options.slide) { + $('body').addClass(ClassName.open) + } else { + $(Selector.sidebar).addClass(ClassName.open) + } + + $(this.element).trigger($.Event(Event.expanded)) + } + + ControlSidebar.prototype.collapse = function () { + $('body, ' + Selector.sidebar).removeClass(ClassName.open) + $(this.element).trigger($.Event(Event.collapsed)) + } + + ControlSidebar.prototype.fix = function () { + if ($('body').is(Selector.boxed)) { + this._fixForBoxed($(Selector.bg)) + } + } + + // Private + + ControlSidebar.prototype._fixForBoxed = function (bg) { + bg.css({ + position: 'absolute', + height : $(Selector.wrapper).height() + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new ControlSidebar($this, options))) + } + + if (typeof option == 'string') data.toggle() + }) + } + + var old = $.fn.controlSidebar + + $.fn.controlSidebar = Plugin + $.fn.controlSidebar.Constructor = ControlSidebar + + // No Conflict Mode + // ================ + $.fn.controlSidebar.noConflict = function () { + $.fn.controlSidebar = old + return this + } + + // ControlSidebar Data API + // ======================= + $(document).on('click', Selector.data, function (event) { + if (event) event.preventDefault() + Plugin.call($(this), 'toggle') + }) + +}(jQuery) + + +/* BoxWidget() + * ====== + * Adds box widget functions to boxes. + * + * @Usage: $('.my-box').boxWidget(options) + * or add [data-widget="box-widget"] to the ul element + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.boxwidget' + + var Default = { + animationSpeed : 500, + collapseTrigger: '[data-widget="collapse"]', + removeTrigger : '[data-widget="remove"]', + collapseIcon : 'fa-minus', + expandIcon : 'fa-plus', + removeIcon : 'fa-times' + } + + var Selector = { + data : '.box', + collapsed: '.collapsed-box', + body : '.box-body', + footer : '.box-footer', + tools : '.box-tools' + } + + var ClassName = { + collapsed: 'collapsed-box' + } + + var Event = { + collapsed: 'collapsed.boxwidget', + expanded : 'expanded.boxwidget', + removed : 'removed.boxwidget' + } + + // BoxWidget Class Definition + // ===================== + var BoxWidget = function (element, options) { + this.element = element + this.options = options + + this._setUpListeners() + } + + BoxWidget.prototype.toggle = function () { + var isOpen = !$(this.element).is(Selector.collapsed) + + if (isOpen) { + this.collapse() + } else { + this.expand() + } + } + + BoxWidget.prototype.expand = function () { + var expandedEvent = $.Event(Event.expanded) + var collapseIcon = this.options.collapseIcon + var expandIcon = this.options.expandIcon + + $(this.element).removeClass(ClassName.collapsed) + + $(Selector.tools) + .find('.' + expandIcon) + .removeClass(expandIcon) + .addClass(collapseIcon) + + $(this.element).find(Selector.body + ', ' + Selector.footer) + .slideDown(this.options.animationSpeed, function () { + $(this.element).trigger(expandedEvent) + }.bind(this)) + } + + BoxWidget.prototype.collapse = function () { + var collapsedEvent = $.Event(Event.collapsed) + var collapseIcon = this.options.collapseIcon + var expandIcon = this.options.expandIcon + + $(Selector.tools) + .find('.' + collapseIcon) + .removeClass(collapseIcon) + .addClass(expandIcon) + + $(this.element).find(Selector.body + ', ' + Selector.footer) + .slideUp(this.options.animationSpeed, function () { + $(this.element).addClass(ClassName.collapsed) + $(this.element).trigger(collapsedEvent) + }.bind(this)) + } + + BoxWidget.prototype.remove = function () { + var removedEvent = $.Event(Event.removed) + + $(this.element).slideUp(this.options.animationSpeed, function () { + $(this.element).trigger(removedEvent) + $(this.element).remove() + }.bind(this)) + } + + // Private + + BoxWidget.prototype._setUpListeners = function () { + var that = this + + $(this.element).on('click', this.options.collapseTrigger, function (event) { + if (event) event.preventDefault() + that.toggle($(this)) + }) + + $(this.element).on('click', this.options.removeTrigger, function (event) { + if (event) event.preventDefault() + that.remove($(this)) + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new BoxWidget($this, options))) + } + + if (typeof option == 'string') { + if (typeof data[option] == 'undefined') { + throw new Error('No method named ' + option) + } + data[option]() + } + }) + } + + var old = $.fn.boxWidget + + $.fn.boxWidget = Plugin + $.fn.boxWidget.Constructor = BoxWidget + + // No Conflict Mode + // ================ + $.fn.boxWidget.noConflict = function () { + $.fn.boxWidget = old + return this + } + + // BoxWidget Data API + // ================== + $(window).on('load', function () { + $(Selector.data).each(function () { + Plugin.call($(this)) + }) + }) + +}(jQuery) + + +/* TodoList() + * ========= + * Converts a list into a todoList. + * + * @Usage: $('.my-list').todoList(options) + * or add [data-widget="todo-list"] to the ul element + * Pass any option as data-option="value" + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.todolist' + + var Default = { + iCheck : false, + onCheck : function () { + }, + onUnCheck: function () { + } + } + + var Selector = { + data: '[data-widget="todo-list"]' + } + + var ClassName = { + done: 'done' + } + + // TodoList Class Definition + // ========================= + var TodoList = function (element, options) { + this.element = element + this.options = options + + this._setUpListeners() + } + + TodoList.prototype.toggle = function (item) { + item.parents(Selector.li).first().toggleClass(ClassName.done) + if (!item.prop('checked')) { + this.unCheck(item) + return + } + + this.check(item) + } + + TodoList.prototype.check = function (item) { + this.options.onCheck.call(item) + } + + TodoList.prototype.unCheck = function (item) { + this.options.onUnCheck.call(item) + } + + // Private + + TodoList.prototype._setUpListeners = function () { + var that = this + $(this.element).on('change ifChanged', 'input:checkbox', function () { + that.toggle($(this)) + }) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) + $this.data(DataKey, (data = new TodoList($this, options))) + } + + if (typeof data == 'string') { + if (typeof data[option] == 'undefined') { + throw new Error('No method named ' + option) + } + data[option]() + } + }) + } + + var old = $.fn.todoList + + $.fn.todoList = Plugin + $.fn.todoList.Constructor = TodoList + + // No Conflict Mode + // ================ + $.fn.todoList.noConflict = function () { + $.fn.todoList = old + return this + } + + // TodoList Data API + // ================= + $(window).on('load', function () { + $(Selector.data).each(function () { + Plugin.call($(this)) + }) + }) + +}(jQuery) + + +/* DirectChat() + * =============== + * Toggles the state of the control sidebar + * + * @Usage: $('#my-chat-box').directChat() + * or add [data-widget="direct-chat"] to the trigger + */ ++function ($) { + 'use strict' + + var DataKey = 'lte.directchat' + + var Selector = { + data: '[data-widget="chat-pane-toggle"]', + box : '.direct-chat' + } + + var ClassName = { + open: 'direct-chat-contacts-open' + } + + // DirectChat Class Definition + // =========================== + var DirectChat = function (element) { + this.element = element + } + + DirectChat.prototype.toggle = function ($trigger) { + $trigger.parents(Selector.box).first().toggleClass(ClassName.open) + } + + // Plugin Definition + // ================= + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data(DataKey) + + if (!data) { + $this.data(DataKey, (data = new DirectChat($this))) + } + + if (typeof option == 'string') data.toggle($this) + }) + } + + var old = $.fn.directChat + + $.fn.directChat = Plugin + $.fn.directChat.Constructor = DirectChat + + // No Conflict Mode + // ================ + $.fn.directChat.noConflict = function () { + $.fn.directChat = old + return this + } + + // DirectChat Data API + // =================== + $(document).on('click', Selector.data, function (event) { + if (event) event.preventDefault() + Plugin.call($(this), 'toggle') + }) + +}(jQuery) diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/adminlte.min.js b/hera-admin/src/main/resources/static/adminlte/dist/js/adminlte.min.js new file mode 100755 index 00000000..7be5e93a --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/adminlte.min.js @@ -0,0 +1,456 @@ +/*! AdminLTE app.js + * ================ + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support + * @Email + * @version 2.4.0 + * @repository git://github.com/almasaeed2010/AdminLTE.git + * @license MIT + */ +if ("undefined" == typeof jQuery) throw new Error("AdminLTE requires jQuery"); + function(a) { + "use strict"; + + function b(b) { + return this.each(function() { + var e = a(this), + f = e.data(c); + if (!f) { + var h = a.extend({}, d, e.data(), "object" == typeof b && b); + e.data(c, f = new g(h)) + } + if ("string" == typeof b) { + if ("undefined" == typeof f[b]) throw new Error("No method named " + b); + f[b]() + } + }) + } + var c = "lte.layout", + d = { + slimscroll: !0, + resetHeight: !0 + }, e = { + wrapper: ".wrapper", + contentWrapper: ".content-wrapper", + layoutBoxed: ".layout-boxed", + mainFooter: ".main-footer", + mainHeader: ".main-header", + sidebar: ".sidebar", + controlSidebar: ".control-sidebar", + fixed: ".fixed", + sidebarMenu: ".sidebar-menu" + }, f = { + fixed: "fixed", + holdTransition: "hold-transition" + }, g = function(a) { + this.options = a, this.bindedResize = !1, this.activate() + }; + g.prototype.activate = function() { + this.fix(), this.fixSidebar(), a("body").removeClass(f.holdTransition), this.options.resetHeight && a("body, html, " + e.wrapper).css({ + height: "auto", + "min-height": "100%" + }), this.bindedResize || (a(window).resize(function() { + this.fix(), this.fixSidebar() + }.bind(this)), this.bindedResize = !0), a(e.sidebarMenu).on("expanded.tree", function() { + this.fix(), this.fixSidebar() + }.bind(this)), a(e.sidebarMenu).on("collapsed.tree", function() { + this.fix(), this.fixSidebar() + }.bind(this)) + }, g.prototype.fix = function() { + a(e.layoutBoxed + " > " + e.wrapper).css("overflow", "hidden"); + var b = a(e.mainFooter).outerHeight() || 0, + c = a(e.mainHeader).outerHeight() + b, + d = a(window).height(), + g = a(e.sidebar).height() || 0; + if (a("body").hasClass(f.fixed)) a(e.contentWrapper).css("min-height", d - b); + else { + var h; + d >= g ? (a(e.contentWrapper).css("min-height", d - c), h = d - c) : (a(e.contentWrapper).css("min-height", g), h = g); + var i = a(e.controlSidebar); + "undefined" != typeof i && i.height() > h && a(e.contentWrapper).css("min-height", i.height()) + } + }, g.prototype.fixSidebar = function() { + return a("body").hasClass(f.fixed) ? void(this.options.slimscroll && "undefined" != typeof a.fn.slimScroll && (a(e.sidebar).slimScroll({ + destroy: !0 + }).height("auto"), a(e.sidebar).slimScroll({ + height: a(window).height() - a(e.mainHeader).height() + "px", + color: "rgba(0,0,0,0.2)", + size: "3px" + }))) : void("undefined" != typeof a.fn.slimScroll && a(e.sidebar).slimScroll({ + destroy: !0 + }).height("auto")) + }; + var h = a.fn.layout; + a.fn.layout = b, a.fn.layout.Constuctor = g, a.fn.layout.noConflict = function() { + return a.fn.layout = h, this + }, a(window).on("load", function() { + b.call(a("body")) + }) +}(jQuery) + function(a) { + "use strict"; + + function b(b) { + return this.each(function() { + var e = a(this), + f = e.data(c); + if (!f) { + var g = a.extend({}, d, e.data(), "object" == typeof b && b); + e.data(c, f = new h(g)) + } + "toggle" == b && f.toggle() + }) + } + var c = "lte.pushmenu", + d = { + collapseScreenSize: 767, + expandOnHover: !1, + expandTransitionDelay: 200 + }, e = { + collapsed: ".sidebar-collapse", + open: ".sidebar-open", + mainSidebar: ".main-sidebar", + contentWrapper: ".content-wrapper", + searchInput: ".sidebar-form .form-control", + button: '[data-toggle="push-menu"]', + mini: ".sidebar-mini", + expanded: ".sidebar-expanded-on-hover", + layoutFixed: ".fixed" + }, f = { + collapsed: "sidebar-collapse", + open: "sidebar-open", + mini: "sidebar-mini", + expanded: "sidebar-expanded-on-hover", + expandFeature: "sidebar-mini-expand-feature", + layoutFixed: "fixed" + }, g = { + expanded: "expanded.pushMenu", + collapsed: "collapsed.pushMenu" + }, h = function(a) { + this.options = a, this.init() + }; + h.prototype.init = function() { + (this.options.expandOnHover || a("body").is(e.mini + e.layoutFixed)) && (this.expandOnHover(), a("body").addClass(f.expandFeature)), a(e.contentWrapper).click(function() { + a(window).width() <= this.options.collapseScreenSize && a("body").hasClass(f.open) && this.close() + }.bind(this)), a(e.searchInput).click(function(a) { + a.stopPropagation() + }) + }, h.prototype.toggle = function() { + var b = a(window).width(), + c = !a("body").hasClass(f.collapsed); + b <= this.options.collapseScreenSize && (c = a("body").hasClass(f.open)), c ? this.close() : this.open() + }, h.prototype.open = function() { + var b = a(window).width(); + b > this.options.collapseScreenSize ? a("body").removeClass(f.collapsed).trigger(a.Event(g.expanded)) : a("body").addClass(f.open).trigger(a.Event(g.expanded)) + }, h.prototype.close = function() { + var b = a(window).width(); + b > this.options.collapseScreenSize ? a("body").addClass(f.collapsed).trigger(a.Event(g.collapsed)) : a("body").removeClass(f.open + " " + f.collapsed).trigger(a.Event(g.collapsed)) + }, h.prototype.expandOnHover = function() { + a(e.mainSidebar).hover(function() { + a("body").is(e.mini + e.collapsed) && a(window).width() > this.options.collapseScreenSize && this.expand() + }.bind(this), function() { + a("body").is(e.expanded) && this.collapse() + }.bind(this)) + }, h.prototype.expand = function() { + setTimeout(function() { + a("body").removeClass(f.collapsed).addClass(f.expanded) + }, this.options.expandTransitionDelay) + }, h.prototype.collapse = function() { + setTimeout(function() { + a("body").removeClass(f.expanded).addClass(f.collapsed) + }, this.options.expandTransitionDelay) + }; + var i = a.fn.pushMenu; + a.fn.pushMenu = b, a.fn.pushMenu.Constructor = h, a.fn.pushMenu.noConflict = function() { + return a.fn.pushMenu = i, this + }, a(document).on("click", e.button, function(c) { + c.preventDefault(), b.call(a(this), "toggle") + }), a(window).on("load", function() { + b.call(a(e.button)) + }) +}(jQuery) + function(a) { + "use strict"; + + function b(b) { + return this.each(function() { + var e = a(this), + f = e.data(c); + if (!f) { + var g = a.extend({}, d, e.data(), "object" == typeof b && b); + e.data(c, new h(e, g)) + } + }) + } + var c = "lte.tree", + d = { + animationSpeed: 500, + accordion: !0, + followLink: !1, + trigger: ".treeview a" + }, e = { + tree: ".tree", + treeview: ".treeview", + treeviewMenu: ".treeview-menu", + open: ".menu-open, .active", + li: "li", + data: '[data-widget="tree"]', + active: ".active" + }, f = { + open: "menu-open", + tree: "tree" + }, g = { + collapsed: "collapsed.tree", + expanded: "expanded.tree" + }, h = function(b, c) { + this.element = b, this.options = c, a(this.element).addClass(f.tree), a(e.treeview + e.active, this.element).addClass(f.open), this._setUpListeners() + }; + h.prototype.toggle = function(a, b) { + var c = a.next(e.treeviewMenu), + d = a.parent(), + g = d.hasClass(f.open); + d.is(e.treeview) && (this.options.followLink && "#" != a.attr("href") || b.preventDefault(), g ? this.collapse(c, d) : this.expand(c, d)) + }, h.prototype.expand = function(b, c) { + var d = a.Event(g.expanded); + if (this.options.accordion) { + var h = c.siblings(e.open), + i = h.children(e.treeviewMenu); + this.collapse(i, h) + } + c.addClass(f.open), b.slideDown(this.options.animationSpeed, function() { + a(this.element).trigger(d) + }) + }, h.prototype.collapse = function(b, c) { + var d = a.Event(g.collapsed); + b.find(e.open).removeClass(f.open), c.removeClass(f.open), b.slideUp(this.options.animationSpeed, function() { + b.find(e.open + " > " + e.treeview).slideUp(), a(this.element).trigger(d) + }) + }, h.prototype._setUpListeners = function() { + var b = this; + a(this.element).on("click", this.options.trigger, function(c) { + b.toggle(a(this), c) + }) + }; + var i = a.fn.tree; + a.fn.tree = b, a.fn.tree.Constructor = h, a.fn.tree.noConflict = function() { + return a.fn.tree = i, this + }, a(window).on("load", function() { + a(e.data).each(function() { + b.call(a(this)) + }) + }) +}(jQuery) + function(a) { + "use strict"; + + function b(b) { + return this.each(function() { + var e = a(this), + f = e.data(c); + if (!f) { + var g = a.extend({}, d, e.data(), "object" == typeof b && b); + e.data(c, f = new h(e, g)) + } + "string" == typeof b && f.toggle() + }) + } + var c = "lte.controlsidebar", + d = { + slide: !0 + }, e = { + sidebar: ".control-sidebar", + data: '[data-toggle="control-sidebar"]', + open: ".control-sidebar-open", + bg: ".control-sidebar-bg", + wrapper: ".wrapper", + content: ".content-wrapper", + boxed: ".layout-boxed" + }, f = { + open: "control-sidebar-open", + fixed: "fixed" + }, g = { + collapsed: "collapsed.controlsidebar", + expanded: "expanded.controlsidebar" + }, h = function(a, b) { + this.element = a, this.options = b, this.hasBindedResize = !1, this.init() + }; + h.prototype.init = function() { + a(this.element).is(e.data) || a(this).on("click", this.toggle), this.fix(), a(window).resize(function() { + this.fix() + }.bind(this)) + }, h.prototype.toggle = function(b) { + b && b.preventDefault(), this.fix(), a(e.sidebar).is(e.open) || a("body").is(e.open) ? this.collapse() : this.expand() + }, h.prototype.expand = function() { + this.options.slide ? a(e.sidebar).addClass(f.open) : a("body").addClass(f.open), a(this.element).trigger(a.Event(g.expanded)) + }, h.prototype.collapse = function() { + a("body, " + e.sidebar).removeClass(f.open), a(this.element).trigger(a.Event(g.collapsed)) + }, h.prototype.fix = function() { + a("body").is(e.boxed) && this._fixForBoxed(a(e.bg)) + }, h.prototype._fixForBoxed = function(b) { + b.css({ + position: "absolute", + height: a(e.wrapper).height() + }) + }; + var i = a.fn.controlSidebar; + a.fn.controlSidebar = b, a.fn.controlSidebar.Constructor = h, a.fn.controlSidebar.noConflict = function() { + return a.fn.controlSidebar = i, this + }, a(document).on("click", e.data, function(c) { + c && c.preventDefault(), b.call(a(this), "toggle") + }) +}(jQuery) + function(a) { + "use strict"; + + function b(b) { + return this.each(function() { + var e = a(this), + f = e.data(c); + if (!f) { + var g = a.extend({}, d, e.data(), "object" == typeof b && b); + e.data(c, f = new h(e, g)) + } + if ("string" == typeof b) { + if ("undefined" == typeof f[b]) throw new Error("No method named " + b); + f[b]() + } + }) + } + var c = "lte.boxwidget", + d = { + animationSpeed: 500, + collapseTrigger: '[data-widget="collapse"]', + removeTrigger: '[data-widget="remove"]', + collapseIcon: "fa-minus", + expandIcon: "fa-plus", + removeIcon: "fa-times" + }, e = { + data: ".box", + collapsed: ".collapsed-box", + body: ".box-body", + footer: ".box-footer", + tools: ".box-tools" + }, f = { + collapsed: "collapsed-box" + }, g = { + collapsed: "collapsed.boxwidget", + expanded: "expanded.boxwidget", + removed: "removed.boxwidget" + }, h = function(a, b) { + this.element = a, this.options = b, this._setUpListeners() + }; + h.prototype.toggle = function() { + var b = !a(this.element).is(e.collapsed); + b ? this.collapse() : this.expand() + }, h.prototype.expand = function() { + var b = a.Event(g.expanded), + c = this.options.collapseIcon, + d = this.options.expandIcon; + a(this.element).removeClass(f.collapsed), a(e.tools).find("." + d).removeClass(d).addClass(c), a(this.element).find(e.body + ", " + e.footer).slideDown(this.options.animationSpeed, function() { + a(this.element).trigger(b) + }.bind(this)) + }, h.prototype.collapse = function() { + var b = a.Event(g.collapsed), + c = this.options.collapseIcon, + d = this.options.expandIcon; + a(e.tools).find("." + c).removeClass(c).addClass(d), a(this.element).find(e.body + ", " + e.footer).slideUp(this.options.animationSpeed, function() { + a(this.element).addClass(f.collapsed), a(this.element).trigger(b) + }.bind(this)) + }, h.prototype.remove = function() { + var b = a.Event(g.removed); + a(this.element).slideUp(this.options.animationSpeed, function() { + a(this.element).trigger(b), a(this.element).remove() + }.bind(this)) + }, h.prototype._setUpListeners = function() { + var b = this; + a(this.element).on("click", this.options.collapseTrigger, function(c) { + c && c.preventDefault(), b.toggle(a(this)) + }), a(this.element).on("click", this.options.removeTrigger, function(c) { + c && c.preventDefault(), b.remove(a(this)) + }) + }; + var i = a.fn.boxWidget; + a.fn.boxWidget = b, a.fn.boxWidget.Constructor = h, a.fn.boxWidget.noConflict = function() { + return a.fn.boxWidget = i, this + }, a(window).on("load", function() { + a(e.data).each(function() { + b.call(a(this)) + }) + }) +}(jQuery) + function(a) { + "use strict"; + + function b(b) { + return this.each(function() { + var e = a(this), + f = e.data(c); + if (!f) { + var h = a.extend({}, d, e.data(), "object" == typeof b && b); + e.data(c, f = new g(e, h)) + } + if ("string" == typeof f) { + if ("undefined" == typeof f[b]) throw new Error("No method named " + b); + f[b]() + } + }) + } + var c = "lte.todolist", + d = { + iCheck: !1, + onCheck: function() {}, + onUnCheck: function() {} + }, e = { + data: '[data-widget="todo-list"]' + }, f = { + done: "done" + }, g = function(a, b) { + this.element = a, this.options = b, this._setUpListeners() + }; + g.prototype.toggle = function(a) { + return a.parents(e.li).first().toggleClass(f.done), a.prop("checked") ? void this.check(a) : void this.unCheck(a) + }, g.prototype.check = function(a) { + this.options.onCheck.call(a) + }, g.prototype.unCheck = function(a) { + this.options.onUnCheck.call(a) + }, g.prototype._setUpListeners = function() { + var b = this; + a(this.element).on("change ifChanged", "input:checkbox", function() { + b.toggle(a(this)) + }) + }; + var h = a.fn.todoList; + a.fn.todoList = b, a.fn.todoList.Constructor = g, a.fn.todoList.noConflict = function() { + return a.fn.todoList = h, this + }, a(window).on("load", function() { + a(e.data).each(function() { + b.call(a(this)) + }) + }) +}(jQuery) + function(a) { + "use strict"; + + function b(b) { + return this.each(function() { + var d = a(this), + e = d.data(c); + e || d.data(c, e = new f(d)), "string" == typeof b && e.toggle(d) + }) + } + var c = "lte.directchat", + d = { + data: '[data-widget="chat-pane-toggle"]', + box: ".direct-chat" + }, e = { + open: "direct-chat-contacts-open" + }, f = function(a) { + this.element = a + }; + f.prototype.toggle = function(a) { + a.parents(d.box).first().toggleClass(e.open) + }; + var g = a.fn.directChat; + a.fn.directChat = b, a.fn.directChat.Constructor = f, a.fn.directChat.noConflict = function() { + return a.fn.directChat = g, this + }, a(document).on("click", d.data, function(c) { + c && c.preventDefault(), b.call(a(this), "toggle") + }) +}(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/app.js b/hera-admin/src/main/resources/static/adminlte/dist/js/app.js new file mode 100755 index 00000000..72259a7f --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/app.js @@ -0,0 +1,774 @@ +/*! (DEPRECATED) AdminLTE app.js + * ============================= + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support + * @Email + * @version 2.3.12 + * @license MIT + * @deprecated since 2.3.11 + */ +/* jshint ignore:start */ +// jscs:disable +//Make sure jQuery has been loaded before app.js +if (typeof jQuery === "undefined") { + throw new Error("AdminLTE requires jQuery"); +} + +/* AdminLTE + * + * @type Object + * @description $.AdminLTE is the main object for the template's app. + * It's used for implementing functions and options related + * to the template. Keeping everything wrapped in an object + * prevents conflict with other plugins and is a better + * way to organize our code. + */ +$.AdminLTE = {}; + +/* -------------------- + * - AdminLTE Options - + * -------------------- + * Modify these options to suit your implementation + */ +$.AdminLTE.options = { + //Add slimscroll to navbar menus + //This requires you to load the slimscroll plugin + //in every page before app.js + navbarMenuSlimscroll: true, + navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar + navbarMenuHeight: "200px", //The height of the inner menu + //General animation speed for JS animated elements such as box collapse/expand and + //sidebar treeview slide up/down. This option accepts an integer as milliseconds, + //'fast', 'normal', or 'slow' + animationSpeed: 500, + //Sidebar push menu toggle button selector + sidebarToggleSelector: "[data-toggle='offcanvas']", + //Activate sidebar push menu + sidebarPushMenu: true, + //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin) + sidebarSlimScroll: true, + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: false, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true, + BSTooltipSelector: "[data-toggle='tooltip']", + //Enable Fast Click. Fastclick.js creates a more + //native touch experience with touch devices. If you + //choose to enable the plugin, make sure you load the script + //before AdminLTE's app.js + enableFastclick: false, + //Control Sidebar Tree views + enableControlTreeView: true, + //Control Sidebar Options + enableControlSidebar: true, + controlSidebarOptions: { + //Which button should trigger the open/close event + toggleBtnSelector: "[data-toggle='control-sidebar']", + //The sidebar selector + selector: ".control-sidebar", + //Enable slide over content + slide: true + }, + //Box Widget Plugin. Enable this plugin + //to allow boxes to be collapsed and/or removed + enableBoxWidget: true, + //Box Widget plugin options + boxWidgetOptions: { + boxWidgetIcons: { + //Collapse icon + collapse: 'fa-minus', + //Open icon + open: 'fa-plus', + //Remove icon + remove: 'fa-times' + }, + boxWidgetSelectors: { + //Remove button selector + remove: '[data-widget="remove"]', + //Collapse button selector + collapse: '[data-widget="collapse"]' + } + }, + //Direct Chat plugin options + directChat: { + //Enable direct chat by default + enable: true, + //The button to open and close the chat contacts pane + contactToggleSelector: '[data-widget="chat-pane-toggle"]' + }, + //Define the set of colors to use globally around the website + colors: { + lightBlue: "#3c8dbc", + red: "#f56954", + green: "#00a65a", + aqua: "#00c0ef", + yellow: "#f39c12", + blue: "#0073b7", + navy: "#001F3F", + teal: "#39CCCC", + olive: "#3D9970", + lime: "#01FF70", + orange: "#FF851B", + fuchsia: "#F012BE", + purple: "#8E24AA", + maroon: "#D81B60", + black: "#222222", + gray: "#d2d6de" + }, + //The standard screen sizes that bootstrap uses. + //If you change these in the variables.less file, change + //them here too. + screenSizes: { + xs: 480, + sm: 768, + md: 992, + lg: 1200 + } +}; + +/* ------------------ + * - Implementation - + * ------------------ + * The next block of code implements AdminLTE's + * functions and plugins as specified by the + * options above. + */ +$(function () { + "use strict"; + + //Fix for IE page transitions + $("body").removeClass("hold-transition"); + + //Extend options if external options exist + if (typeof AdminLTEOptions !== "undefined") { + $.extend(true, + $.AdminLTE.options, + AdminLTEOptions); + } + + //Easy access to options + var o = $.AdminLTE.options; + + //Set up the object + _init(); + + //Activate the layout maker + $.AdminLTE.layout.activate(); + + //Enable sidebar tree view controls + if (o.enableControlTreeView) { + $.AdminLTE.tree('.sidebar'); + } + + //Enable control sidebar + if (o.enableControlSidebar) { + $.AdminLTE.controlSidebar.activate(); + } + + //Add slimscroll to navbar dropdown + if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') { + $(".navbar .menu").slimscroll({ + height: o.navbarMenuHeight, + alwaysVisible: false, + size: o.navbarMenuSlimscrollWidth + }).css("width", "100%"); + } + + //Activate sidebar push menu + if (o.sidebarPushMenu) { + $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector); + } + + //Activate Bootstrap tooltip + if (o.enableBSToppltip) { + $('body').tooltip({ + selector: o.BSTooltipSelector, + container: 'body' + }); + } + + //Activate box widget + if (o.enableBoxWidget) { + $.AdminLTE.boxWidget.activate(); + } + + //Activate fast click + if (o.enableFastclick && typeof FastClick != 'undefined') { + FastClick.attach(document.body); + } + + //Activate direct chat widget + if (o.directChat.enable) { + $(document).on('click', o.directChat.contactToggleSelector, function () { + var box = $(this).parents('.direct-chat').first(); + box.toggleClass('direct-chat-contacts-open'); + }); + } + + /* + * INITIALIZE BUTTON TOGGLE + * ------------------------ + */ + $('.btn-group[data-toggle="btn-toggle"]').each(function () { + var group = $(this); + $(this).find(".btn").on('click', function (e) { + group.find(".btn.active").removeClass("active"); + $(this).addClass("active"); + e.preventDefault(); + }); + + }); +}); + +/* ---------------------------------- + * - Initialize the AdminLTE Object - + * ---------------------------------- + * All AdminLTE functions are implemented below. + */ +function _init() { + 'use strict'; + /* Layout + * ====== + * Fixes the layout height in case min-height fails. + * + * @type Object + * @usage $.AdminLTE.layout.activate() + * $.AdminLTE.layout.fix() + * $.AdminLTE.layout.fixSidebar() + */ + $.AdminLTE.layout = { + activate: function () { + var _this = this; + _this.fix(); + _this.fixSidebar(); + $('body, html, .wrapper').css('height', 'auto'); + $(window, ".wrapper").resize(function () { + _this.fix(); + _this.fixSidebar(); + }); + }, + fix: function () { + // Remove overflow from .wrapper if layout-boxed exists + $(".layout-boxed > .wrapper").css('overflow', 'hidden'); + //Get window height and the wrapper height + var footer_height = $('.main-footer').outerHeight() || 0; + var neg = $('.main-header').outerHeight() + footer_height; + var window_height = $(window).height(); + var sidebar_height = $(".sidebar").height() || 0; + //Set the min-height of the content and sidebar based on the + //the height of the document. + if ($("body").hasClass("fixed")) { + $(".content-wrapper, .right-side").css('min-height', window_height - footer_height); + } else { + var postSetWidth; + if (window_height >= sidebar_height) { + $(".content-wrapper, .right-side").css('min-height', window_height - neg); + postSetWidth = window_height - neg; + } else { + $(".content-wrapper, .right-side").css('min-height', sidebar_height); + postSetWidth = sidebar_height; + } + + //Fix for the control sidebar height + var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector); + if (typeof controlSidebar !== "undefined") { + if (controlSidebar.height() > postSetWidth) + $(".content-wrapper, .right-side").css('min-height', controlSidebar.height()); + } + + } + }, + fixSidebar: function () { + //Make sure the body tag has the .fixed class + if (!$("body").hasClass("fixed")) { + if (typeof $.fn.slimScroll != 'undefined') { + $(".sidebar").slimScroll({destroy: true}).height("auto"); + } + return; + } else if (typeof $.fn.slimScroll == 'undefined' && window.console) { + window.console.error("Error: the fixed layout requires the slimscroll plugin!"); + } + //Enable slimscroll for fixed layout + if ($.AdminLTE.options.sidebarSlimScroll) { + if (typeof $.fn.slimScroll != 'undefined') { + //Destroy if it exists + $(".sidebar").slimScroll({destroy: true}).height("auto"); + //Add slimscroll + $(".sidebar").slimScroll({ + height: ($(window).height() - $(".main-header").height()) + "px", + color: "rgba(0,0,0,0.2)", + size: "3px" + }); + } + } + } + }; + + /* PushMenu() + * ========== + * Adds the push menu functionality to the sidebar. + * + * @type Function + * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']") + */ + $.AdminLTE.pushMenu = { + activate: function (toggleBtn) { + //Get the screen sizes + var screenSizes = $.AdminLTE.options.screenSizes; + + //Enable sidebar toggle + $(document).on('click', toggleBtn, function (e) { + e.preventDefault(); + + //Enable sidebar push menu + if ($(window).width() > (screenSizes.sm - 1)) { + if ($("body").hasClass('sidebar-collapse')) { + $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu'); + } else { + $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } + } + //Handle sidebar push menu for small screens + else { + if ($("body").hasClass('sidebar-open')) { + $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } else { + $("body").addClass('sidebar-open').trigger('expanded.pushMenu'); + } + } + }); + + $(".content-wrapper").click(function () { + //Enable hide menu when clicking on the content-wrapper on small screens + if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) { + $("body").removeClass('sidebar-open'); + } + }); + + //Enable expand on hover for sidebar mini + if ($.AdminLTE.options.sidebarExpandOnHover + || ($('body').hasClass('fixed') + && $('body').hasClass('sidebar-mini'))) { + this.expandOnHover(); + } + }, + expandOnHover: function () { + var _this = this; + var screenWidth = $.AdminLTE.options.screenSizes.sm - 1; + //Expand sidebar on hover + $('.main-sidebar').hover(function () { + if ($('body').hasClass('sidebar-mini') + && $("body").hasClass('sidebar-collapse') + && $(window).width() > screenWidth) { + _this.expand(); + } + }, function () { + if ($('body').hasClass('sidebar-mini') + && $('body').hasClass('sidebar-expanded-on-hover') + && $(window).width() > screenWidth) { + _this.collapse(); + } + }); + }, + expand: function () { + $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover'); + }, + collapse: function () { + if ($('body').hasClass('sidebar-expanded-on-hover')) { + $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse'); + } + } + }; + + /* Tree() + * ====== + * Converts the sidebar into a multilevel + * tree view menu. + * + * @type Function + * @Usage: $.AdminLTE.tree('.sidebar') + */ + $.AdminLTE.tree = function (menu) { + var _this = this; + var animationSpeed = $.AdminLTE.options.animationSpeed; + $(document).off('click', menu + ' li a') + .on('click', menu + ' li a', function (e) { + //Get the clicked link and the next element + var $this = $(this); + var checkElement = $this.next(); + + //Check if the next element is a menu and is visible + if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible')) && (!$('body').hasClass('sidebar-collapse'))) { + //Close the menu + checkElement.slideUp(animationSpeed, function () { + checkElement.removeClass('menu-open'); + //Fix the layout in case the sidebar stretches over the height of the window + //_this.layout.fix(); + }); + checkElement.parent("li").removeClass("active"); + } + //If the menu is not visible + else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) { + //Get the parent menu + var parent = $this.parents('ul').first(); + //Close all open menus within the parent + var ul = parent.find('ul:visible').slideUp(animationSpeed); + //Remove the menu-open class from the parent + ul.removeClass('menu-open'); + //Get the parent li + var parent_li = $this.parent("li"); + + //Open the target menu and add the menu-open class + checkElement.slideDown(animationSpeed, function () { + //Add the class active to the parent li + checkElement.addClass('menu-open'); + parent.find('li.active').removeClass('active'); + parent_li.addClass('active'); + //Fix the layout in case the sidebar stretches over the height of the window + _this.layout.fix(); + }); + } + //if this isn't a link, prevent the page from being redirected + if (checkElement.is('.treeview-menu')) { + e.preventDefault(); + } + }); + }; + + /* ControlSidebar + * ============== + * Adds functionality to the right sidebar + * + * @type Object + * @usage $.AdminLTE.controlSidebar.activate(options) + */ + $.AdminLTE.controlSidebar = { + //instantiate the object + activate: function () { + //Get the object + var _this = this; + //Update options + var o = $.AdminLTE.options.controlSidebarOptions; + //Get the sidebar + var sidebar = $(o.selector); + //The toggle button + var btn = $(o.toggleBtnSelector); + + //Listen to the click event + btn.on('click', function (e) { + e.preventDefault(); + //If the sidebar is not open + if (!sidebar.hasClass('control-sidebar-open') + && !$('body').hasClass('control-sidebar-open')) { + //Open the sidebar + _this.open(sidebar, o.slide); + } else { + _this.close(sidebar, o.slide); + } + }); + + //If the body has a boxed layout, fix the sidebar bg position + var bg = $(".control-sidebar-bg"); + _this._fix(bg); + + //If the body has a fixed layout, make the control sidebar fixed + if ($('body').hasClass('fixed')) { + _this._fixForFixed(sidebar); + } else { + //If the content height is less than the sidebar's height, force max height + if ($('.content-wrapper, .right-side').height() < sidebar.height()) { + _this._fixForContent(sidebar); + } + } + }, + //Open the control sidebar + open: function (sidebar, slide) { + //Slide over content + if (slide) { + sidebar.addClass('control-sidebar-open'); + } else { + //Push the content by adding the open class to the body instead + //of the sidebar itself + $('body').addClass('control-sidebar-open'); + } + }, + //Close the control sidebar + close: function (sidebar, slide) { + if (slide) { + sidebar.removeClass('control-sidebar-open'); + } else { + $('body').removeClass('control-sidebar-open'); + } + }, + _fix: function (sidebar) { + var _this = this; + if ($("body").hasClass('layout-boxed')) { + sidebar.css('position', 'absolute'); + sidebar.height($(".wrapper").height()); + if (_this.hasBindedResize) { + return; + } + $(window).resize(function () { + _this._fix(sidebar); + }); + _this.hasBindedResize = true; + } else { + sidebar.css({ + 'position': 'fixed', + 'height': 'auto' + }); + } + }, + _fixForFixed: function (sidebar) { + sidebar.css({ + 'position': 'fixed', + 'max-height': '100%', + 'overflow': 'auto', + 'padding-bottom': '50px' + }); + }, + _fixForContent: function (sidebar) { + $(".content-wrapper, .right-side").css('min-height', sidebar.height()); + } + }; + + /* BoxWidget + * ========= + * BoxWidget is a plugin to handle collapsing and + * removing boxes from the screen. + * + * @type Object + * @usage $.AdminLTE.boxWidget.activate() + * Set all your options in the main $.AdminLTE.options object + */ + $.AdminLTE.boxWidget = { + selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors, + icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons, + animationSpeed: $.AdminLTE.options.animationSpeed, + activate: function (_box) { + var _this = this; + if (!_box) { + _box = document; // activate all boxes per default + } + //Listen for collapse event triggers + $(_box).on('click', _this.selectors.collapse, function (e) { + e.preventDefault(); + _this.collapse($(this)); + }); + + //Listen for remove event triggers + $(_box).on('click', _this.selectors.remove, function (e) { + e.preventDefault(); + _this.remove($(this)); + }); + }, + collapse: function (element) { + var _this = this; + //Find the box parent + var box = element.parents(".box").first(); + //Find the body and the footer + var box_content = box.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer"); + if (!box.hasClass("collapsed-box")) { + //Convert minus into plus + element.children(":first") + .removeClass(_this.icons.collapse) + .addClass(_this.icons.open); + //Hide the content + box_content.slideUp(_this.animationSpeed, function () { + box.addClass("collapsed-box"); + }); + } else { + //Convert plus into minus + element.children(":first") + .removeClass(_this.icons.open) + .addClass(_this.icons.collapse); + //Show the content + box_content.slideDown(_this.animationSpeed, function () { + box.removeClass("collapsed-box"); + }); + } + }, + remove: function (element) { + //Find the box parent + var box = element.parents(".box").first(); + box.slideUp(this.animationSpeed); + } + }; +} + +/* ------------------ + * - Custom Plugins - + * ------------------ + * All custom plugins are defined below. + */ + +/* + * BOX REFRESH BUTTON + * ------------------ + * This is a custom plugin to use with the component BOX. It allows you to add + * a refresh button to the box. It converts the box's state to a loading state. + * + * @type plugin + * @usage $("#box-widget").boxRefresh( options ); + */ +(function ($) { + + "use strict"; + + $.fn.boxRefresh = function (options) { + + // Render options + var settings = $.extend({ + //Refresh button selector + trigger: ".refresh-btn", + //File source to be loaded (e.g: ajax/src.php) + source: "", + //Callbacks + onLoadStart: function (box) { + return box; + }, //Right after the button has been clicked + onLoadDone: function (box) { + return box; + } //When the source has been loaded + + }, options); + + //The overlay + var overlay = $('
          '); + + return this.each(function () { + //if a source is specified + if (settings.source === "") { + if (window.console) { + window.console.log("Please specify a source first - boxRefresh()"); + } + return; + } + //the box + var box = $(this); + //the button + var rBtn = box.find(settings.trigger).first(); + + //On trigger click + rBtn.on('click', function (e) { + e.preventDefault(); + //Add loading overlay + start(box); + + //Perform ajax call + box.find(".box-body").load(settings.source, function () { + done(box); + }); + }); + }); + + function start(box) { + //Add overlay and loading img + box.append(overlay); + + settings.onLoadStart.call(box); + } + + function done(box) { + //Remove overlay and loading img + box.find(overlay).remove(); + + settings.onLoadDone.call(box); + } + + }; + +})(jQuery); + +/* + * EXPLICIT BOX CONTROLS + * ----------------------- + * This is a custom plugin to use with the component BOX. It allows you to activate + * a box inserted in the DOM after the app.js was loaded, toggle and remove box. + * + * @type plugin + * @usage $("#box-widget").activateBox(); + * @usage $("#box-widget").toggleBox(); + * @usage $("#box-widget").removeBox(); + */ +(function ($) { + + 'use strict'; + + $.fn.activateBox = function () { + $.AdminLTE.boxWidget.activate(this); + }; + + $.fn.toggleBox = function () { + var button = $($.AdminLTE.boxWidget.selectors.collapse, this); + $.AdminLTE.boxWidget.collapse(button); + }; + + $.fn.removeBox = function () { + var button = $($.AdminLTE.boxWidget.selectors.remove, this); + $.AdminLTE.boxWidget.remove(button); + }; + +})(jQuery); + +/* + * TODO LIST CUSTOM PLUGIN + * ----------------------- + * This plugin depends on iCheck plugin for checkbox and radio inputs + * + * @type plugin + * @usage $("#todo-widget").todolist( options ); + */ +(function ($) { + + 'use strict'; + + $.fn.todolist = function (options) { + // Render options + var settings = $.extend({ + //When the user checks the input + onCheck: function (ele) { + return ele; + }, + //When the user unchecks the input + onUncheck: function (ele) { + return ele; + } + }, options); + + return this.each(function () { + + if (typeof $.fn.iCheck != 'undefined') { + $('input', this).on('ifChecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onCheck.call(ele); + }); + + $('input', this).on('ifUnchecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onUncheck.call(ele); + }); + } else { + $('input', this).on('change', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + if ($('input', ele).is(":checked")) { + settings.onCheck.call(ele); + } else { + settings.onUncheck.call(ele); + } + }); + } + }); + }; +}(jQuery)); diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/app.min.js b/hera-admin/src/main/resources/static/adminlte/dist/js/app.min.js new file mode 100755 index 00000000..c6fd32c7 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/app.min.js @@ -0,0 +1,14 @@ +/*! (DEPRECATED) AdminLTE app.js + * ============================= + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support + * @Email + * @version 2.3.12 + * @license MIT + * @deprecated since 2.3.11 + */ +function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$("body, html, .wrapper").css("height","auto"),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){$(".layout-boxed > .wrapper").css("overflow","hidden");var a=$(".main-footer").outerHeight()||0,b=$(".main-header").outerHeight()+a,c=$(window).height(),d=$(".sidebar").height()||0;if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",c-a);else{var e;c>=d?($(".content-wrapper, .right-side").css("min-height",c-b),e=c-b):($(".content-wrapper, .right-side").css("min-height",d),e=d);var f=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof f&&f.height()>e&&$(".content-wrapper, .right-side").css("min-height",f.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&window.console&&window.console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slimScroll({destroy:!0}).height("auto"),$(".sidebar").slimScroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(document).on("click",a,function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").hasClass("sidebar-collapse")?$("body").removeClass("sidebar-collapse").trigger("expanded.pushMenu"):$("body").addClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").hasClass("sidebar-open")?$("body").removeClass("sidebar-open").removeClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").addClass("sidebar-open").trigger("expanded.pushMenu")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this,c=$.AdminLTE.options.animationSpeed;$(document).off("click",a+" li a").on("click",a+" li a",function(a){var d=$(this),e=d.next();if(e.is(".treeview-menu")&&e.is(":visible")&&!$("body").hasClass("sidebar-collapse"))e.slideUp(c,function(){e.removeClass("menu-open")}),e.parent("li").removeClass("active");else if(e.is(".treeview-menu")&&!e.is(":visible")){var f=d.parents("ul").first(),g=f.find("ul:visible").slideUp(c);g.removeClass("menu-open");var h=d.parent("li");e.slideDown(c,function(){e.addClass("menu-open"),f.find("li.active").removeClass("active"),h.addClass("active"),b.layout.fix()})}e.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height() .box-body, > .box-footer, > form >.box-body, > form > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(b.animationSpeed,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(b.animationSpeed,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp(this.animationSpeed)}}}if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",animationSpeed:500,sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!1,enableControlTreeView:!0,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F012BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"use strict";$("body").removeClass("hold-transition"),"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),a.enableControlTreeView&&$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector,container:"body"}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(document).on("click",a.directChat.contactToggleSelector,function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-open")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){"use strict";a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){return a},onLoadDone:function(a){return a}},b),f=a('
          ');return this.each(function(){if(""===e.source)return void(window.console&&window.console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){"use strict";a.fn.activateBox=function(){a.AdminLTE.boxWidget.activate(this)},a.fn.toggleBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.collapse,this);a.AdminLTE.boxWidget.collapse(b)},a.fn.removeBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.remove,this);a.AdminLTE.boxWidget.remove(b)}}(jQuery),function(a){"use strict";a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){return a},onUncheck:function(a){return a}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input",this).on("ifChecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onCheck.call(b)}),a("input",this).on("ifUnchecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onUncheck.call(b)})):a("input",this).on("change",function(){var b=a(this).parents("li").first();b.toggleClass("done"),a("input",b).is(":checked")?c.onCheck.call(b):c.onUncheck.call(b)})})}}(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/demo.js b/hera-admin/src/main/resources/static/adminlte/dist/js/demo.js new file mode 100755 index 00000000..24e54bd4 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/demo.js @@ -0,0 +1,349 @@ +/** + * AdminLTE Demo Menu + * ------------------ + * You should not use this file in production. + * This file is for demo purposes only. + */ +$(function () { + 'use strict' + + /** + * Get access to plugins + */ + + $('[data-toggle="control-sidebar"]').controlSidebar() + $('[data-toggle="push-menu"]').pushMenu() + + var $pushMenu = $('[data-toggle="push-menu"]').data('lte.pushmenu') + var $controlSidebar = $('[data-toggle="control-sidebar"]').data('lte.controlsidebar') + var $layout = $('body').data('lte.layout') + + /** + * List of all the available skins + * + * @type Array + */ + var mySkins = [ + 'skin-blue', + 'skin-black', + 'skin-red', + 'skin-yellow', + 'skin-purple', + 'skin-green', + 'skin-blue-light', + 'skin-black-light', + 'skin-red-light', + 'skin-yellow-light', + 'skin-purple-light', + 'skin-green-light' + ] + + /** + * Get a prestored setting + * + * @param String name Name of of the setting + * @returns String The value of the setting | null + */ + function get(name) { + if (typeof (Storage) !== 'undefined') { + return localStorage.getItem(name) + } else { + window.alert('Please use a modern browser to properly view this template!') + } + } + + /** + * Store a new settings in the browser + * + * @param String name Name of the setting + * @param String val Value of the setting + * @returns void + */ + function store(name, val) { + if (typeof (Storage) !== 'undefined') { + localStorage.setItem(name, val) + } else { + window.alert('Please use a modern browser to properly view this template!') + } + } + + /** + * Toggles layout classes + * + * @param String cls the layout class to toggle + * @returns void + */ + function changeLayout(cls) { + $('body').toggleClass(cls) + $layout.fixSidebar() + if ($('body').hasClass('fixed') && cls == 'fixed') { + $pushMenu.expandOnHover() + $layout.activate() + } + $controlSidebar.fix() + } + + /** + * Replaces the old skin with the new skin + * @param String cls the new skin class + * @returns Boolean false to prevent link's default action + */ + function changeSkin(cls) { + $.each(mySkins, function (i) { + $('body').removeClass(mySkins[i]) + }) + + $('body').addClass(cls) + store('skin', cls) + return false + } + + /** + * Retrieve default settings and apply them to the template + * + * @returns void + */ + function setup() { + var tmp = get('skin') + if (tmp && $.inArray(tmp, mySkins)) + changeSkin(tmp) + + // Add the change skin listener + $('[data-skin]').on('click', function (e) { + if ($(this).hasClass('knob')) + return + e.preventDefault() + changeSkin($(this).data('skin')) + }) + + // Add the layout manager + $('[data-layout]').on('click', function () { + changeLayout($(this).data('layout')) + }) + + $('[data-controlsidebar]').on('click', function () { + changeLayout($(this).data('controlsidebar')) + var slide = !$controlSidebar.options.slide + + $controlSidebar.options.slide = slide + if (!slide) + $('.control-sidebar').removeClass('control-sidebar-open') + }) + + $('[data-sidebarskin="toggle"]').on('click', function () { + var $sidebar = $('.control-sidebar') + if ($sidebar.hasClass('control-sidebar-dark')) { + $sidebar.removeClass('control-sidebar-dark') + $sidebar.addClass('control-sidebar-light') + } else { + $sidebar.removeClass('control-sidebar-light') + $sidebar.addClass('control-sidebar-dark') + } + }) + + $('[data-enable="expandOnHover"]').on('click', function () { + $(this).attr('disabled', true) + $pushMenu.expandOnHover() + if (!$('body').hasClass('sidebar-collapse')) + $('[data-layout="sidebar-collapse"]').click() + }) + + // Reset options + if ($('body').hasClass('fixed')) { + $('[data-layout="fixed"]').attr('checked', 'checked') + } + if ($('body').hasClass('layout-boxed')) { + $('[data-layout="layout-boxed"]').attr('checked', 'checked') + } + if ($('body').hasClass('sidebar-collapse')) { + $('[data-layout="sidebar-collapse"]').attr('checked', 'checked') + } + + } + + // Create the new tab + var $tabPane = $('
          ', { + 'id' : 'control-sidebar-theme-demo-options-tab', + 'class': 'tab-pane active' + }) + + // Create the tab button + var $tabButton = $('
        3. ', { 'class': 'active' }) + .html('' + + '' + + '') + + // Add the tab button to the right sidebar tabs + $('[href="#control-sidebar-home-tab"]') + .parent() + .before($tabButton) + + // Create the menu + var $demoSettings = $('
          ') + + // Layout options + $demoSettings.append( + '

          ' + + 'Layout Options' + + '

          ' + // Fixed layout + + '
          ' + + '' + + '

          Activate the fixed layout. You can\'t use fixed and boxed layouts together

          ' + + '
          ' + // Boxed layout + + '
          ' + + '' + + '

          Activate the boxed layout

          ' + + '
          ' + // Sidebar Toggle + + '
          ' + + '' + + '

          Toggle the left sidebar\'s state (open or collapse)

          ' + + '
          ' + // Sidebar mini expand on hover toggle + + '
          ' + + '' + + '

          Let the sidebar mini expand on hover

          ' + + '
          ' + // Control Sidebar Toggle + + '
          ' + + '' + + '

          Toggle between slide over content and push content effects

          ' + + '
          ' + // Control Sidebar Skin Toggle + + '
          ' + + '' + + '

          Toggle between dark and light skins for the right sidebar

          ' + + '
          ' + ) + var $skinsList = $('
            ', { 'class': 'list-unstyled clearfix' }) + + // Dark sidebar skins + var $skinBlue = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Blue

            ') + $skinsList.append($skinBlue) + var $skinBlack = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Black

            ') + $skinsList.append($skinBlack) + var $skinPurple = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Purple

            ') + $skinsList.append($skinPurple) + var $skinGreen = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Green

            ') + $skinsList.append($skinGreen) + var $skinRed = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Red

            ') + $skinsList.append($skinRed) + var $skinYellow = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Yellow

            ') + $skinsList.append($skinYellow) + + // Light sidebar skins + var $skinBlueLight = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Blue Light

            ') + $skinsList.append($skinBlueLight) + var $skinBlackLight = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Black Light

            ') + $skinsList.append($skinBlackLight) + var $skinPurpleLight = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Purple Light

            ') + $skinsList.append($skinPurpleLight) + var $skinGreenLight = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Green Light

            ') + $skinsList.append($skinGreenLight) + var $skinRedLight = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Red Light

            ') + $skinsList.append($skinRedLight) + var $skinYellowLight = + $('
          • ', { style: 'float:left; width: 33.33333%; padding: 5px;' }) + .append('' + + '
            ' + + '
            ' + + '
            ' + + '

            Yellow Light

            ') + $skinsList.append($skinYellowLight) + + $demoSettings.append('

            Skins

            ') + $demoSettings.append($skinsList) + + $tabPane.append($demoSettings) + $('#control-sidebar-home-tab').after($tabPane) + + setup() + + $('[data-toggle="tooltip"]').tooltip() +}) diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/html5shiv.min.js b/hera-admin/src/main/resources/static/adminlte/dist/js/html5shiv.min.js new file mode 100755 index 00000000..e3f1245e --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** + * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed + */ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/pages/dashboard.js b/hera-admin/src/main/resources/static/adminlte/dist/js/pages/dashboard.js new file mode 100755 index 00000000..75e77b9f --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/pages/dashboard.js @@ -0,0 +1,210 @@ +/* + * Author: Abdullah A Almsaeed + * Date: 4 Jan 2014 + * Description: + * This is a demo file used only for the main dashboard (index.html) + **/ + +$(function () { + + 'use strict'; + + // Make the dashboard widgets sortable Using jquery UI + $('.connectedSortable').sortable({ + placeholder : 'sort-highlight', + connectWith : '.connectedSortable', + handle : '.box-header, .nav-tabs', + forcePlaceholderSize: true, + zIndex : 999999 + }); + $('.connectedSortable .box-header, .connectedSortable .nav-tabs-custom').css('cursor', 'move'); + + // jQuery UI sortable for the todo list + $('.todo-list').sortable({ + placeholder : 'sort-highlight', + handle : '.handle', + forcePlaceholderSize: true, + zIndex : 999999 + }); + + // bootstrap WYSIHTML5 - text editor + $('.textarea').wysihtml5(); + + $('.daterange').daterangepicker({ + ranges : { + 'Today' : [moment(), moment()], + 'Yesterday' : [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days' : [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month' : [moment().startOf('month'), moment().endOf('month')], + 'Last Month' : [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate : moment() + }, function (start, end) { + window.alert('You chose: ' + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + }); + + /* jQueryKnob */ + $('.knob').knob(); + + // jvectormap data + var visitorsData = { + US: 398, // USA + SA: 400, // Saudi Arabia + CA: 1000, // Canada + DE: 500, // Germany + FR: 760, // France + CN: 300, // China + AU: 700, // Australia + BR: 600, // Brazil + IN: 800, // India + GB: 320, // Great Britain + RU: 3000 // Russia + }; + // World map by jvectormap + $('#world-map').vectorMap({ + map : 'world_mill_en', + backgroundColor : 'transparent', + regionStyle : { + initial: { + fill : '#e4e4e4', + 'fill-opacity' : 1, + stroke : 'none', + 'stroke-width' : 0, + 'stroke-opacity': 1 + } + }, + series : { + regions: [ + { + values : visitorsData, + scale : ['#92c1dc', '#ebf4f9'], + normalizeFunction: 'polynomial' + } + ] + }, + onRegionLabelShow: function (e, el, code) { + if (typeof visitorsData[code] != 'undefined') + el.html(el.html() + ': ' + visitorsData[code] + ' new visitors'); + } + }); + + // Sparkline charts + var myvalues = [1000, 1200, 920, 927, 931, 1027, 819, 930, 1021]; + $('#sparkline-1').sparkline(myvalues, { + type : 'line', + lineColor: '#92c1dc', + fillColor: '#ebf4f9', + height : '50', + width : '80' + }); + myvalues = [515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921]; + $('#sparkline-2').sparkline(myvalues, { + type : 'line', + lineColor: '#92c1dc', + fillColor: '#ebf4f9', + height : '50', + width : '80' + }); + myvalues = [15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21]; + $('#sparkline-3').sparkline(myvalues, { + type : 'line', + lineColor: '#92c1dc', + fillColor: '#ebf4f9', + height : '50', + width : '80' + }); + + // The Calender + $('#calendar').datepicker(); + + // SLIMSCROLL FOR CHAT WIDGET + $('#chat-box').slimScroll({ + height: '250px' + }); + + /* Morris.js Charts */ + // Sales chart + var area = new Morris.Area({ + element : 'revenue-chart', + resize : true, + data : [ + { y: '2011 Q1', item1: 2666, item2: 2666 }, + { y: '2011 Q2', item1: 2778, item2: 2294 }, + { y: '2011 Q3', item1: 4912, item2: 1969 }, + { y: '2011 Q4', item1: 3767, item2: 3597 }, + { y: '2012 Q1', item1: 6810, item2: 1914 }, + { y: '2012 Q2', item1: 5670, item2: 4293 }, + { y: '2012 Q3', item1: 4820, item2: 3795 }, + { y: '2012 Q4', item1: 15073, item2: 5967 }, + { y: '2013 Q1', item1: 10687, item2: 4460 }, + { y: '2013 Q2', item1: 8432, item2: 5713 } + ], + xkey : 'y', + ykeys : ['item1', 'item2'], + labels : ['Item 1', 'Item 2'], + lineColors: ['#a0d0e0', '#3c8dbc'], + hideHover : 'auto' + }); + var line = new Morris.Line({ + element : 'line-chart', + resize : true, + data : [ + { y: '2011 Q1', item1: 2666 }, + { y: '2011 Q2', item1: 2778 }, + { y: '2011 Q3', item1: 4912 }, + { y: '2011 Q4', item1: 3767 }, + { y: '2012 Q1', item1: 6810 }, + { y: '2012 Q2', item1: 5670 }, + { y: '2012 Q3', item1: 4820 }, + { y: '2012 Q4', item1: 15073 }, + { y: '2013 Q1', item1: 10687 }, + { y: '2013 Q2', item1: 8432 } + ], + xkey : 'y', + ykeys : ['item1'], + labels : ['Item 1'], + lineColors : ['#efefef'], + lineWidth : 2, + hideHover : 'auto', + gridTextColor : '#fff', + gridStrokeWidth : 0.4, + pointSize : 4, + pointStrokeColors: ['#efefef'], + gridLineColor : '#efefef', + gridTextFamily : 'Open Sans', + gridTextSize : 10 + }); + + // Donut Chart + var donut = new Morris.Donut({ + element : 'sales-chart', + resize : true, + colors : ['#3c8dbc', '#f56954', '#00a65a'], + data : [ + { label: 'Download Sales', value: 12 }, + { label: 'In-Store Sales', value: 30 }, + { label: 'Mail-Order Sales', value: 20 } + ], + hideHover: 'auto' + }); + + // Fix for charts under tabs + $('.box ul.nav a').on('shown.bs.tab', function () { + area.redraw(); + donut.redraw(); + line.redraw(); + }); + + /* The todo list plugin */ + $('.todo-list').todoList({ + onCheck : function () { + window.console.log($(this), 'The element has been checked'); + }, + onUnCheck: function () { + window.console.log($(this), 'The element has been unchecked'); + } + }); + +}); diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/pages/dashboard2.js b/hera-admin/src/main/resources/static/adminlte/dist/js/pages/dashboard2.js new file mode 100755 index 00000000..2b8d9b44 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/pages/dashboard2.js @@ -0,0 +1,274 @@ +$(function () { + + 'use strict'; + + /* ChartJS + * ------- + * Here we will create a few charts using ChartJS + */ + + // ----------------------- + // - MONTHLY SALES CHART - + // ----------------------- + + // Get context with jQuery - using jQuery's .get() method. + var salesChartCanvas = $('#salesChart').get(0).getContext('2d'); + // This will get the first returned node in the jQuery collection. + var salesChart = new Chart(salesChartCanvas); + + var salesChartData = { + labels : ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + datasets: [ + { + label : 'Electronics', + fillColor : 'rgb(210, 214, 222)', + strokeColor : 'rgb(210, 214, 222)', + pointColor : 'rgb(210, 214, 222)', + pointStrokeColor : '#c1c7d1', + pointHighlightFill : '#fff', + pointHighlightStroke: 'rgb(220,220,220)', + data : [65, 59, 80, 81, 56, 55, 40] + }, + { + label : 'Digital Goods', + fillColor : 'rgba(60,141,188,0.9)', + strokeColor : 'rgba(60,141,188,0.8)', + pointColor : '#3b8bba', + pointStrokeColor : 'rgba(60,141,188,1)', + pointHighlightFill : '#fff', + pointHighlightStroke: 'rgba(60,141,188,1)', + data : [28, 48, 40, 19, 86, 27, 90] + } + ] + }; + + var salesChartOptions = { + // Boolean - If we should show the scale at all + showScale : true, + // Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : false, + // String - Colour of the grid lines + scaleGridLineColor : 'rgba(0,0,0,.05)', + // Number - Width of the grid lines + scaleGridLineWidth : 1, + // Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + // Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines : true, + // Boolean - Whether the line is curved between points + bezierCurve : true, + // Number - Tension of the bezier curve between points + bezierCurveTension : 0.3, + // Boolean - Whether to show a dot for each point + pointDot : false, + // Number - Radius of each point dot in pixels + pointDotRadius : 4, + // Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + // Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + // Boolean - Whether to show a stroke for datasets + datasetStroke : true, + // Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + // Boolean - Whether to fill the dataset with a color + datasetFill : true, + // String - A legend template + legendTemplate : '
              -legend\'><% for (var i=0; i
            • \'><%=datasets[i].label%>
            • <%}%>
            ', + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio : true, + // Boolean - whether to make the chart responsive to window resizing + responsive : true + }; + + // Create the line chart + salesChart.Line(salesChartData, salesChartOptions); + + // --------------------------- + // - END MONTHLY SALES CHART - + // --------------------------- + + // ------------- + // - PIE CHART - + // ------------- + // Get context with jQuery - using jQuery's .get() method. + var pieChartCanvas = $('#pieChart').get(0).getContext('2d'); + var pieChart = new Chart(pieChartCanvas); + var PieData = [ + { + value : 700, + color : '#f56954', + highlight: '#f56954', + label : 'Chrome' + }, + { + value : 500, + color : '#00a65a', + highlight: '#00a65a', + label : 'IE' + }, + { + value : 400, + color : '#f39c12', + highlight: '#f39c12', + label : 'FireFox' + }, + { + value : 600, + color : '#00c0ef', + highlight: '#00c0ef', + label : 'Safari' + }, + { + value : 300, + color : '#3c8dbc', + highlight: '#3c8dbc', + label : 'Opera' + }, + { + value : 100, + color : '#d2d6de', + highlight: '#d2d6de', + label : 'Navigator' + } + ]; + var pieOptions = { + // Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + // String - The colour of each segment stroke + segmentStrokeColor : '#fff', + // Number - The width of each segment stroke + segmentStrokeWidth : 1, + // Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout: 50, // This is 0 for Pie charts + // Number - Amount of animation steps + animationSteps : 100, + // String - Animation easing effect + animationEasing : 'easeOutBounce', + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + // Boolean - whether to make the chart responsive to window resizing + responsive : true, + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio : false, + // String - A legend template + legendTemplate : '
              -legend\'><% for (var i=0; i
            • \'><%if(segments[i].label){%><%=segments[i].label%><%}%>
            • <%}%>
            ', + // String - A tooltip template + tooltipTemplate : '<%=value %> <%=label%> users' + }; + // Create pie or douhnut chart + // You can switch between pie and douhnut using the method below. + pieChart.Doughnut(PieData, pieOptions); + // ----------------- + // - END PIE CHART - + // ----------------- + + /* jVector Maps + * ------------ + * Create a world map with markers + */ + $('#world-map-markers').vectorMap({ + map : 'world_mill_en', + normalizeFunction: 'polynomial', + hoverOpacity : 0.7, + hoverColor : false, + backgroundColor : 'transparent', + regionStyle : { + initial : { + fill : 'rgba(210, 214, 222, 1)', + 'fill-opacity' : 1, + stroke : 'none', + 'stroke-width' : 0, + 'stroke-opacity': 1 + }, + hover : { + 'fill-opacity': 0.7, + cursor : 'pointer' + }, + selected : { + fill: 'yellow' + }, + selectedHover: {} + }, + markerStyle : { + initial: { + fill : '#00a65a', + stroke: '#111' + } + }, + markers : [ + { latLng: [41.90, 12.45], name: 'Vatican City' }, + { latLng: [43.73, 7.41], name: 'Monaco' }, + { latLng: [-0.52, 166.93], name: 'Nauru' }, + { latLng: [-8.51, 179.21], name: 'Tuvalu' }, + { latLng: [43.93, 12.46], name: 'San Marino' }, + { latLng: [47.14, 9.52], name: 'Liechtenstein' }, + { latLng: [7.11, 171.06], name: 'Marshall Islands' }, + { latLng: [17.3, -62.73], name: 'Saint Kitts and Nevis' }, + { latLng: [3.2, 73.22], name: 'Maldives' }, + { latLng: [35.88, 14.5], name: 'Malta' }, + { latLng: [12.05, -61.75], name: 'Grenada' }, + { latLng: [13.16, -61.23], name: 'Saint Vincent and the Grenadines' }, + { latLng: [13.16, -59.55], name: 'Barbados' }, + { latLng: [17.11, -61.85], name: 'Antigua and Barbuda' }, + { latLng: [-4.61, 55.45], name: 'Seychelles' }, + { latLng: [7.35, 134.46], name: 'Palau' }, + { latLng: [42.5, 1.51], name: 'Andorra' }, + { latLng: [14.01, -60.98], name: 'Saint Lucia' }, + { latLng: [6.91, 158.18], name: 'Federated States of Micronesia' }, + { latLng: [1.3, 103.8], name: 'Singapore' }, + { latLng: [1.46, 173.03], name: 'Kiribati' }, + { latLng: [-21.13, -175.2], name: 'Tonga' }, + { latLng: [15.3, -61.38], name: 'Dominica' }, + { latLng: [-20.2, 57.5], name: 'Mauritius' }, + { latLng: [26.02, 50.55], name: 'Bahrain' }, + { latLng: [0.33, 6.73], name: 'São Tomé and Príncipe' } + ] + }); + + /* SPARKLINE CHARTS + * ---------------- + * Create a inline charts with spark line + */ + + // ----------------- + // - SPARKLINE BAR - + // ----------------- + $('.sparkbar').each(function () { + var $this = $(this); + $this.sparkline('html', { + type : 'bar', + height : $this.data('height') ? $this.data('height') : '30', + barColor: $this.data('color') + }); + }); + + // ----------------- + // - SPARKLINE PIE - + // ----------------- + $('.sparkpie').each(function () { + var $this = $(this); + $this.sparkline('html', { + type : 'pie', + height : $this.data('height') ? $this.data('height') : '90', + sliceColors: $this.data('color') + }); + }); + + // ------------------ + // - SPARKLINE LINE - + // ------------------ + $('.sparkline').each(function () { + var $this = $(this); + $this.sparkline('html', { + type : 'line', + height : $this.data('height') ? $this.data('height') : '90', + width : '100%', + lineColor: $this.data('linecolor'), + fillColor: $this.data('fillcolor'), + spotColor: $this.data('spotcolor') + }); + }); +}); diff --git a/hera-admin/src/main/resources/static/adminlte/dist/js/respond.min.js b/hera-admin/src/main/resources/static/adminlte/dist/js/respond.min.js new file mode 100755 index 00000000..80a7b69d --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/dist/js/respond.min.js @@ -0,0 +1,5 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl + * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT + * */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b.btn{border-radius:4px 0 0 4px}.kv-rtl .input-group .form-control:first-child{border-radius:0 4px 4px 0}.kv-rtl .btn-file input[type=file]{right:auto;left:0;text-align:left;background:100% 0 none} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/fileinput.min.css b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/fileinput.min.css new file mode 100755 index 00000000..d391a79b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/fileinput.min.css @@ -0,0 +1,12 @@ +/*! + * bootstrap-fileinput v4.4.8 + * http://plugins.krajee.com/file-input + * + * Krajee default styling for bootstrap-fileinput. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD 3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */.file-loading input[type=file],input[type=file].file-loading{width:0;height:0}.file-caption-icon,.file-input-ajax-new .fileinput-remove-button,.file-input-ajax-new .fileinput-upload-button,.file-input-ajax-new .no-browse .input-group-btn,.file-input-new .close,.file-input-new .file-preview,.file-input-new .fileinput-remove-button,.file-input-new .fileinput-upload-button,.file-input-new .glyphicon-file,.file-input-new .no-browse .input-group-btn,.file-zoom-dialog .modal-header:after,.file-zoom-dialog .modal-header:before,.hide-content .kv-file-content,.kv-hidden{display:none}.btn-file input[type=file],.file-caption-icon,.file-preview .fileinput-remove,.file-zoom-dialog .btn-navigate,.file-zoom-dialog .floating-buttons,.krajee-default .file-thumb-progress{position:absolute}.btn-file,.file-caption,.file-loading:before,.file-preview,.file-zoom-dialog .modal-dialog,.krajee-default .file-thumbnail-footer,.krajee-default.file-preview-frame{position:relative}.file-error-message pre,.file-error-message ul,.krajee-default .file-actions,.krajee-default .file-other-error{text-align:left}.file-error-message pre,.file-error-message ul{margin:0}.krajee-default .file-drag-handle,.krajee-default .file-upload-indicator{float:left;margin:5px 0 -5px;width:16px;height:16px}.krajee-default .file-thumb-progress .progress,.krajee-default .file-thumb-progress .progress-bar{height:11px;font-size:9px;line-height:10px}.krajee-default .file-caption-info,.krajee-default .file-size-info{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:160px;height:15px;margin:auto}.file-zoom-content>.file-object.type-flash,.file-zoom-content>.file-object.type-image,.file-zoom-content>.file-object.type-video{max-width:100%;max-height:100%;width:auto}.file-zoom-content>.file-object.type-flash,.file-zoom-content>.file-object.type-video{height:100%}.file-zoom-content>.file-object.type-default,.file-zoom-content>.file-object.type-html,.file-zoom-content>.file-object.type-pdf,.file-zoom-content>.file-object.type-text{width:100%}.rotate-2{transform:rotateY(180deg)}.rotate-3{transform:rotate(180deg)}.rotate-4{transform:rotate(180deg) rotateY(180deg)}.rotate-5{transform:rotate(270deg) rotateY(180deg)}.rotate-6{transform:rotate(90deg)}.rotate-7{transform:rotate(90deg) rotateY(180deg)}.rotate-8{transform:rotate(270deg)}.file-loading:before{content:" Loading...";display:inline-block;padding-left:20px;line-height:16px;font-size:13px;font-variant:small-caps;color:#999;background:url(../img/loading.gif) top left no-repeat}.file-object{margin:0 0 -5px;padding:0}.btn-file{overflow:hidden}.btn-file input[type=file]{top:0;right:0;min-width:100%;min-height:100%;text-align:right;opacity:0;background:none;cursor:inherit;display:block}.btn-file ::-ms-browse{font-size:10000px;width:100%;height:100%}.file-caption .file-caption-name{width:100%;margin:0;padding:0;box-shadow:none;border:none;background:0 0;outline:0}.file-caption.icon-visible .file-caption-icon{display:inline-block}.file-caption.icon-visible .file-caption-name{padding-left:15px}.file-caption-icon{line-height:1;left:8px}.file-error-message{color:#a94442;background-color:#f2dede;margin:5px;border:1px solid #ebccd1;border-radius:4px;padding:15px}.file-error-message pre{margin:5px 0}.file-caption-disabled{background-color:#eee;cursor:not-allowed;opacity:1}.file-preview{border-radius:5px;border:1px solid #ddd;padding:8px;width:100%;margin-bottom:5px}.file-preview .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.file-preview .fileinput-remove{top:1px;right:1px;line-height:10px}.file-preview .clickable{cursor:pointer}.file-preview-image{font:40px Impact,Charcoal,sans-serif;color:green}.krajee-default.file-preview-frame{margin:8px;border:1px solid #ddd;box-shadow:1px 1px 5px 0 #a2958a;padding:6px;float:left;text-align:center}.krajee-default.file-preview-frame .kv-file-content{width:213px;height:160px}.krajee-default.file-preview-frame .file-thumbnail-footer{height:70px}.krajee-default.file-preview-frame:not(.file-preview-error):hover{box-shadow:3px 3px 5px 0 #333}.krajee-default .file-preview-text{display:block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.krajee-default .file-preview-html{border:1px solid #ddd;padding:8px;overflow:auto}.krajee-default .file-other-icon{font-size:6em}.krajee-default .file-footer-buttons{float:right}.krajee-default .file-footer-caption{display:block;text-align:center;padding-top:4px;font-size:11px;color:#777;margin-bottom:15px}.krajee-default .file-preview-error{opacity:.65;box-shadow:none}.krajee-default .file-thumb-progress{height:11px;top:37px;left:0;right:0}.krajee-default.kvsortable-ghost{background:#e1edf7;border:2px solid #a1abff}.krajee-default .file-preview-other:hover{opacity:.8}.krajee-default .file-preview-frame:not(.file-preview-error) .file-footer-caption:hover{color:#000}.kv-upload-progress .progress{height:20px;line-height:20px;margin:10px 0;overflow:hidden}.kv-upload-progress .progress-bar{height:20px;line-height:20px}.file-zoom-dialog .file-other-icon{font-size:22em;font-size:50vmin}.file-zoom-dialog .modal-dialog{width:auto}.file-zoom-dialog .modal-header{display:flex;align-items:center;justify-content:space-between}.file-zoom-dialog .btn-navigate{padding:0;margin:0;background:0 0;text-decoration:none;outline:0;opacity:.7;top:45%;font-size:4em;color:#1c94c4}.file-zoom-dialog .btn-navigate:not([disabled]):hover{outline:0;box-shadow:none;opacity:.6}.file-zoom-dialog .floating-buttons{top:5px;right:10px}.file-zoom-dialog .btn-navigate[disabled]{opacity:.3}.file-zoom-dialog .btn-prev{left:1px}.file-zoom-dialog .btn-next{right:1px}.file-zoom-dialog .kv-zoom-title{font-weight:300;color:#999;max-width:50%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-input-ajax-new .no-browse .form-control,.file-input-new .no-browse .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.file-caption-main{width:100%}.file-thumb-loading{background:url(../img/loading.gif) center center no-repeat content-box!important}.file-drop-zone{border:1px dashed #aaa;border-radius:4px;height:100%;text-align:center;vertical-align:middle;margin:12px 15px 12px 12px;padding:5px}.file-drop-zone.clickable:hover{border:2px dashed #999}.file-drop-zone.clickable:focus{border:2px solid #5acde2}.file-drop-zone .file-preview-thumbnails{cursor:default}.file-drop-zone-title{color:#aaa;font-size:1.6em;padding:85px 10px;cursor:default}.file-highlighted{border:2px dashed #999!important;background-color:#eee}.file-uploading{background:url(../img/loading-sm.gif) center bottom 10px no-repeat;opacity:.65}@media (min-width:576px){.file-zoom-dialog .modal-dialog{max-width:500px}}@media (min-width:992px){.file-zoom-dialog .modal-lg{max-width:800px}}.file-zoom-fullscreen.modal{position:fixed;top:0;right:0;bottom:0;left:0}.file-zoom-fullscreen .modal-dialog{position:fixed;margin:0;padding:0;width:100%;height:100%;max-width:100%;max-height:100%}.file-zoom-fullscreen .modal-content{border-radius:0;box-shadow:none}.file-zoom-fullscreen .modal-body{overflow-y:auto}.floating-buttons{z-index:3000}.floating-buttons .btn-kv{margin-left:3px;z-index:3000}.file-zoom-content{height:480px;text-align:center}.file-zoom-content .file-preview-image,.file-zoom-content .file-preview-video{max-height:100%}.file-zoom-content .is-portrait-gt4{margin-top:60px}.file-zoom-content>.file-object.type-image{height:auto;min-height:inherit}.file-zoom-content>.file-object.type-audio{width:auto;height:30px}@media screen and (max-width:767px){.file-preview-thumbnails{display:flex;justify-content:center;align-items:center;flex-direction:column}.file-zoom-dialog .modal-header{flex-direction:column}}@media screen and (max-width:350px){.krajee-default.file-preview-frame .kv-file-content{width:160px}}.file-loading[dir=rtl]:before{background:url(../img/loading.gif) top right no-repeat;padding-left:0;padding-right:20px}.file-sortable .file-drag-handle{cursor:move;opacity:1}.file-sortable .file-drag-handle:hover{opacity:.7}.clickable .file-drop-zone-title{cursor:pointer}.kv-zoom-actions .btn-kv{margin-left:3px}.file-preview-initial.sortable-chosen{background-color:#d9edf7} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/fileinput.min.js b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/fileinput.min.js new file mode 100755 index 00000000..1a09a967 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/fileinput.min.js @@ -0,0 +1,12 @@ +/*! + * bootstrap-fileinput v4.4.8 + * http://plugins.krajee.com/file-input + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD 3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=e(require("jquery")):e(window.jQuery)}(function(e){"use strict";e.fn.fileinputLocales={},e.fn.fileinputThemes={},String.prototype.setTokens=function(e){var t,i,a=this.toString();for(t in e)e.hasOwnProperty(t)&&(i=new RegExp("{"+t+"}","g"),a=a.replace(i,e[t]));return a};var t,i;t={FRAMES:".kv-preview-thumb",SORT_CSS:"file-sortable",OBJECT_PARAMS:'\n\n\n\n\n\n',DEFAULT_PREVIEW:'
            \n{previewFileIcon}\n
            ',MODAL_ID:"kvFileinputModal",MODAL_EVENTS:["show","shown","hide","hidden","loaded"],objUrl:window.URL||window.webkitURL,compare:function(e,t,i){return void 0!==e&&(i?e===t:e.match(t))},isIE:function(e){if("Microsoft Internet Explorer"!==navigator.appName)return!1;if(10===e)return new RegExp("msie\\s"+e,"i").test(navigator.userAgent);var t,i=document.createElement("div");return i.innerHTML="",t=i.getElementsByTagName("i").length,document.body.appendChild(i),i.parentNode.removeChild(i),t},initModal:function(t){var i=e("body");i.length&&t.appendTo(i)},isEmpty:function(t,i){return void 0===t||null===t||0===t.length||i&&""===e.trim(t)},isArray:function(e){return Array.isArray(e)||"[object Array]"===Object.prototype.toString.call(e)},ifSet:function(e,t,i){return i=i||"",t&&"object"==typeof t&&e in t?t[e]:i},cleanArray:function(e){return e instanceof Array||(e=[]),e.filter(function(e){return void 0!==e&&null!==e})},spliceArray:function(t,i,a){var r,n,o=0,l=[];if(!(t instanceof Array))return[];for(n=e.extend(!0,[],t),a&&n.reverse(),r=0;r=0?atob(e.split(",")[1]):decodeURIComponent(e.split(",")[1]),a=new ArrayBuffer(i.length),r=new Uint8Array(a),n=0;nl;)switch(i=n[l++],i>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:o+=String.fromCharCode(i);break;case 12:case 13:a=n[l++],o+=String.fromCharCode((31&i)<<6|63&a);break;case 14:a=n[l++],r=n[l++],o+=String.fromCharCode((15&i)<<12|(63&a)<<6|(63&r)<<0)}return o},isHtml:function(e){var t=document.createElement("div");t.innerHTML=e;for(var i=t.childNodes,a=i.length;a--;)if(1===i[a].nodeType)return!0;return!1},isSvg:function(e){return e.match(/^\s*<\?xml/i)&&(e.match(//g,">").replace(/"/g,""").replace(/'/g,"'")},replaceTags:function(t,i){var a=t;return i?(e.each(i,function(e,t){"function"==typeof t&&(t=t()),a=a.split(e).join(t)}),a):a},cleanMemory:function(e){var i=e.is("img")?e.attr("src"):e.find("source").attr("src");t.objUrl.revokeObjectURL(i)},findFileName:function(e){var t=e.lastIndexOf("/");return-1===t&&(t=e.lastIndexOf("\\")),e.split(e.substring(t,t+1)).pop()},checkFullScreen:function(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement},toggleFullScreen:function(e){var i=document,a=i.documentElement;a&&e&&!t.checkFullScreen()?a.requestFullscreen?a.requestFullscreen():a.msRequestFullscreen?a.msRequestFullscreen():a.mozRequestFullScreen?a.mozRequestFullScreen():a.webkitRequestFullscreen&&a.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):i.exitFullscreen?i.exitFullscreen():i.msExitFullscreen?i.msExitFullscreen():i.mozCancelFullScreen?i.mozCancelFullScreen():i.webkitExitFullscreen&&i.webkitExitFullscreen()},moveArray:function(t,i,a,r){var n=e.extend(!0,[],t);if(r&&n.reverse(),a>=n.length)for(var o=a-n.length;o--+1;)n.push(void 0);return n.splice(a,0,n.splice(i,1)[0]),r&&n.reverse(),n},cleanZoomCache:function(e){var t=e.closest(".kv-zoom-cache-theme");t.length||(t=e.closest(".kv-zoom-cache")),t.remove()},setOrientation:function(e,t){var i,a,r,n=new DataView(e),o=0,l=1;if(65496!==n.getUint16(o)||e.length<2)return void(t&&t());for(o+=2,i=n.byteLength;i-2>o;)switch(a=n.getUint16(o),o+=2,a){case 65505:r=n.getUint16(o),i=r-o,o+=2;break;case 274:l=n.getUint16(o+6,!1),i=0}t&&t(l)},validateOrientation:function(e,i){if(window.FileReader&&window.DataView){var a,r=new FileReader;r.onloadend=function(){a=r.result,t.setOrientation(a,i)},r.readAsArrayBuffer(e)}},adjustOrientedImage:function(e,t){var i,a,r;if(e.hasClass("is-portrait-gt4")){if(t)return void e.css({width:e.parent().height()});e.css({height:"auto",width:e.height()}),i=e.parent().offset().top,a=e.offset().top,r=i-a,e.css("margin-top",r)}},closeButton:function(e){return e=e?"close "+e:"close",''}},i=function(i,a){var r=this;r.$element=e(i),r.$parent=r.$element.parent(),r._validate()&&(r.isPreviewable=t.hasFileAPISupport(),r.isIE9=t.isIE(9),r.isIE10=t.isIE(10),(r.isPreviewable||r.isIE9)&&(r._init(a),r._listen()),r.$element.removeClass("file-loading"))},i.prototype={constructor:i,_cleanup:function(){var e=this;e.reader=null,e.formdata={},e.uploadCount=0,e.uploadStatus={},e.uploadLog=[],e.uploadAsyncCount=0,e.loadedImages=[],e.totalImagesCount=0,e.ajaxRequests=[],e.clearStack(),e.fileInputCleared=!1,e.fileBatchCompleted=!0,e.isPreviewable||(e.showPreview=!1),e.isError=!1,e.ajaxAborted=!1,e.cancelling=!1},_init:function(i,a){var r,n,o,l,s=this,d=s.$element;s.options=i,e.each(i,function(e,i){switch(e){case"minFileCount":case"maxFileCount":case"minFileSize":case"maxFileSize":case"maxFilePreviewSize":case"resizeImageQuality":case"resizeIfSizeMoreThan":case"progressUploadThreshold":case"initialPreviewCount":case"zoomModalHeight":case"minImageHeight":case"maxImageHeight":case"minImageWidth":case"maxImageWidth":s[e]=t.getNum(i);break;default:s[e]=i}}),s.rtl&&(l=s.previewZoomButtonIcons.prev,s.previewZoomButtonIcons.prev=s.previewZoomButtonIcons.next,s.previewZoomButtonIcons.next=l),a||s._cleanup(),s.$form=d.closest("form"),s._initTemplateDefaults(),s.uploadFileAttr=t.isEmpty(d.attr("name"))?"file_data":d.attr("name"),o=s._getLayoutTemplate("progress"),s.progressTemplate=o.replace("{class}",s.progressClass),s.progressCompleteTemplate=o.replace("{class}",s.progressCompleteClass),s.progressErrorTemplate=o.replace("{class}",s.progressErrorClass),s.dropZoneEnabled=t.hasDragDropSupport()&&s.dropZoneEnabled,s.isDisabled=d.attr("disabled")||d.attr("readonly"),s.isDisabled&&d.attr("disabled",!0),s.isAjaxUpload=t.hasFileUploadSupport()&&!t.isEmpty(s.uploadUrl),s.isClickable=s.browseOnZoneClick&&s.showPreview&&(s.isAjaxUpload&&s.dropZoneEnabled||!t.isEmpty(s.defaultPreviewContent)),s.slug="function"==typeof i.slugCallback?i.slugCallback:s._slugDefault,s.mainTemplate=s.showCaption?s._getLayoutTemplate("main1"):s._getLayoutTemplate("main2"),s.captionTemplate=s._getLayoutTemplate("caption"),s.previewGenericTemplate=s._getPreviewTemplate("generic"),!s.imageCanvas&&s.resizeImage&&(s.maxImageWidth||s.maxImageHeight)&&(s.imageCanvas=document.createElement("canvas"),s.imageCanvasContext=s.imageCanvas.getContext("2d")),t.isEmpty(d.attr("id"))&&d.attr("id",t.uniqId()),s.namespace=".fileinput_"+d.attr("id").replace(/-/g,"_"),void 0===s.$container?s.$container=s._createContainer():s._refreshContainer(),n=s.$container,s.$dropZone=n.find(".file-drop-zone"),s.$progress=n.find(".kv-upload-progress"),s.$btnUpload=n.find(".fileinput-upload"),s.$captionContainer=t.getElement(i,"elCaptionContainer",n.find(".file-caption")),s.$caption=t.getElement(i,"elCaptionText",n.find(".file-caption-name")),t.isEmpty(s.msgPlaceholder)||(r=d.attr("multiple")?s.filePlural:s.fileSingle,s.$caption.attr("placeholder",s.msgPlaceholder.replace("{files}",r))),s.$captionIcon=s.$captionContainer.find(".file-caption-icon"),s.$previewContainer=t.getElement(i,"elPreviewContainer",n.find(".file-preview")),s.$preview=t.getElement(i,"elPreviewImage",n.find(".file-preview-thumbnails")),s.$previewStatus=t.getElement(i,"elPreviewStatus",n.find(".file-preview-status")),s.$errorContainer=t.getElement(i,"elErrorContainer",s.$previewContainer.find(".kv-fileinput-error")),s._validateDisabled(),t.isEmpty(s.msgErrorClass)||t.addCss(s.$errorContainer,s.msgErrorClass),a||(s.$errorContainer.hide(),s.previewInitId="preview-"+t.uniqId(),s._initPreviewCache(),s._initPreview(!0),s._initPreviewActions(),s._setFileDropZoneTitle(),s.$parent.hasClass("file-loading")&&(s.$container.insertBefore(s.$parent),s.$parent.remove())),d.attr("disabled")&&s.disable(),s._initZoom(),s.hideThumbnailContent&&t.addCss(s.$preview,"hide-content")},_initTemplateDefaults:function(){var i,a,r,n,o,l,s,d,c,p,u,f,m,v,g,h,w,_,b,C,y,x,T,E,S,k,F,P,I,A,z,D,$,j,U,B,O,R,L,M=this;i='{preview}\n
            \n
            \n {caption}\n
            \n {remove}\n {cancel}\n {upload}\n {browse}\n
            \n
            ',a='{preview}\n
            \n
            \n{remove}\n{cancel}\n{upload}\n{browse}\n',r='
            \n {close}
            \n
            \n
            \n
            \n
            \n
            \n
            ',o=t.closeButton("fileinput-remove"),n='',l='
            \n \n \n
            ',s='',d='{icon} {label}',c='
            {icon} {label}
            ',p='',u='\n',f='
            \n
            \n {status}\n
            \n
            ',m=" ({sizeText})",v='',g='
            \n \n
            \n{drag}\n
            ',h='\n',w='',_='{downloadIcon}',b='',C='{dragIcon}',y='
            {indicator}
            ',x='
            \n',E=x+' title="{caption}">
            \n',S="
            {footer}\n
            \n",k="{content}\n",O=" {style}",F='
            {data}
            \n",P='{caption}\n",I='\n",A='",z='\n",D='\n",$='\n",U='\n",j='\n\n'+t.OBJECT_PARAMS+" "+t.DEFAULT_PREVIEW+"\n\n",B='
            \n"+t.DEFAULT_PREVIEW+"\n
            \n",R='',L={width:"100%",height:"100%","min-height":"480px"},M.defaults={layoutTemplates:{main1:i,main2:a,preview:r,close:o,fileIcon:n,caption:l,modalMain:p,modal:u,progress:f,size:m,footer:v,indicator:y,actions:g,actionDelete:h,actionUpload:w,actionDownload:_,actionZoom:b,actionDrag:C,btnDefault:s,btnLink:d,btnBrowse:c,zoomCache:R},previewMarkupTags:{tagBefore1:T,tagBefore2:E,tagAfter:S},previewContentTemplates:{generic:k,html:F,image:P,text:I,office:A,video:z,audio:D,flash:$,object:j,pdf:U,other:B},allowedPreviewTypes:["image","html","text","video","audio","flash","pdf","object"],previewTemplates:{},previewSettings:{image:{width:"auto",height:"auto","max-width":"100%","max-height":"100%"},html:{width:"213px",height:"160px"},text:{width:"213px",height:"160px"},office:{width:"213px",height:"160px"},video:{width:"213px",height:"160px"},audio:{width:"100%",height:"30px"},flash:{width:"213px",height:"160px"},object:{width:"213px",height:"160px"},pdf:{width:"213px",height:"160px"},other:{width:"213px",height:"160px"}},previewSettingsSmall:{image:{width:"auto",height:"auto","max-width":"100%","max-height":"100%"},html:{width:"100%",height:"160px"},text:{width:"100%",height:"160px"},office:{width:"100%",height:"160px"},video:{width:"100%",height:"auto"},audio:{width:"100%",height:"30px"},flash:{width:"100%",height:"auto"},object:{width:"100%",height:"auto"},pdf:{width:"100%",height:"160px"},other:{width:"100%",height:"160px"}},previewZoomSettings:{image:{width:"auto",height:"auto","max-width":"100%","max-height":"100%"},html:L,text:L,office:{width:"100%",height:"100%","max-width":"100%","min-height":"480px"},video:{width:"auto",height:"100%","max-width":"100%"},audio:{width:"100%",height:"30px"},flash:{width:"auto",height:"480px"},object:{width:"auto",height:"100%","max-width":"100%","min-height":"480px"},pdf:L,other:{width:"auto",height:"100%","min-height":"480px"}},fileTypeSettings:{image:function(e,i){return t.compare(e,"image.*")&&!t.compare(e,/(tiff?|wmf)$/i)||t.compare(i,/\.(gif|png|jpe?g)$/i)},html:function(e,i){return t.compare(e,"text/html")||t.compare(i,/\.(htm|html)$/i)},office:function(e,i){return t.compare(e,/(word|excel|powerpoint|office|iwork-pages|tiff?)$/i)||t.compare(i,/\.(rtf|docx?|xlsx?|pptx?|pps|potx?|ods|odt|pages|ai|dxf|ttf|tiff?|wmf|e?ps)$/i)},text:function(e,i){return t.compare(e,"text.*")||t.compare(i,/\.(xml|javascript)$/i)||t.compare(i,/\.(txt|md|csv|nfo|ini|json|php|js|css)$/i)},video:function(e,i){return t.compare(e,"video.*")&&(t.compare(e,/(ogg|mp4|mp?g|mov|webm|3gp)$/i)||t.compare(i,/\.(og?|mp4|webm|mp?g|mov|3gp)$/i))},audio:function(e,i){return t.compare(e,"audio.*")&&(t.compare(i,/(ogg|mp3|mp?g|wav)$/i)||t.compare(i,/\.(og?|mp3|mp?g|wav)$/i))},flash:function(e,i){return t.compare(e,"application/x-shockwave-flash",!0)||t.compare(i,/\.(swf)$/i)},pdf:function(e,i){return t.compare(e,"application/pdf",!0)||t.compare(i,/\.(pdf)$/i)},object:function(){return!0},other:function(){return!0}},fileActionSettings:{showRemove:!0,showUpload:!0,showDownload:!0,showZoom:!0,showDrag:!0,removeIcon:'',removeClass:"btn btn-sm btn-kv btn-default btn-outline-secondary",removeErrorClass:"btn btn-sm btn-kv btn-danger",removeTitle:"Remove file",uploadIcon:'',uploadClass:"btn btn-sm btn-kv btn-default btn-outline-secondary",uploadTitle:"Upload file",uploadRetryIcon:'',uploadRetryTitle:"Retry upload",downloadIcon:'',downloadClass:"btn btn-sm btn-kv btn-default btn-outline-secondary",downloadTitle:"Download file",zoomIcon:'',zoomClass:"btn btn-sm btn-kv btn-default btn-outline-secondary",zoomTitle:"View Details",dragIcon:'',dragClass:"text-info",dragTitle:"Move / Rearrange",dragSettings:{},indicatorNew:'',indicatorSuccess:'',indicatorError:'',indicatorLoading:'',indicatorNewTitle:"Not uploaded yet",indicatorSuccessTitle:"Uploaded",indicatorErrorTitle:"Upload Error",indicatorLoadingTitle:"Uploading ..."}},e.each(M.defaults,function(t,i){return"allowedPreviewTypes"===t?void(void 0===M.allowedPreviewTypes&&(M.allowedPreviewTypes=i)):void(M[t]=e.extend(!0,{},i,M[t]))}),M._initPreviewTemplates()},_initPreviewTemplates:function(){var i,a=this,r=a.defaults,n=a.previewMarkupTags,o=n.tagAfter;e.each(r.previewContentTemplates,function(e,r){t.isEmpty(a.previewTemplates[e])&&(i=n.tagBefore2,"generic"!==e&&"image"!==e&&"html"!==e&&"text"!==e||(i=n.tagBefore1),a.previewTemplates[e]=i+r+o)})},_initPreviewCache:function(){var i=this;i.previewCache={data:{},init:function(){var e=i.initialPreview;e.length>0&&!t.isArray(e)&&(e=e.split(i.initialPreviewDelimiter)),i.previewCache.data={content:e,config:i.initialPreviewConfig,tags:i.initialPreviewThumbTags}},count:function(){return i.previewCache.data&&i.previewCache.data.content?i.previewCache.data.content.length:0},get:function(a,r){var n,o,l,s,d,c,p,u="init_"+a,f=i.previewCache.data,m=f.config[a],v=f.content[a],g=i.previewInitId+"-"+u,h=t.ifSet("previewAsData",m,i.initialPreviewAsData),w=function(e,a,r,n,o,l,s,d,c){return d=" file-preview-initial "+t.SORT_CSS+(d?" "+d:""),i._generatePreviewTemplate(e,a,r,n,o,!1,null,d,l,s,c)};return v?(r=void 0===r?!0:r,l=t.ifSet("type",m,i.initialPreviewFileType||"generic"),d=t.ifSet("filename",m,t.ifSet("caption",m)),c=t.ifSet("filetype",m,l),s=i.previewCache.footer(a,r,m&&m.size||null),p=t.ifSet("frameClass",m),n=h?w(l,v,d,c,g,s,u,p):w("generic",v,d,c,g,s,u,p,l).setTokens({content:f.content[a]}),f.tags.length&&f.tags[a]&&(n=t.replaceTags(n,f.tags[a])),t.isEmpty(m)||t.isEmpty(m.frameAttr)||(o=e(document.createElement("div")).html(n),o.find(".file-preview-initial").attr(m.frameAttr),n=o.html(),o.remove()),n):""},add:function(e,a,r,n){var o,l=i.previewCache.data;return t.isArray(e)||(e=e.split(i.initialPreviewDelimiter)),n?(o=l.content.push(e)-1,l.config[o]=a,l.tags[o]=r):(o=e.length-1,l.content=e,l.config=a,l.tags=r),i.previewCache.data=l,o},set:function(e,a,r,n){var o,l,s=i.previewCache.data;if(e&&e.length&&(t.isArray(e)||(e=e.split(i.initialPreviewDelimiter)),l=e.filter(function(e){return null!==e}),l.length)){if(void 0===s.content&&(s.content=[]),void 0===s.config&&(s.config=[]),void 0===s.tags&&(s.tags=[]),n){for(o=0;ot;t++)a=i.previewCache.get(t),r=i.reversePreviewOrder?a+r:r+a;return e=i._getMsgSelected(n),{content:r,caption:e}},footer:function(e,a,r){var n=i.previewCache.data||{};if(t.isEmpty(n.content))return"";(t.isEmpty(n.config)||t.isEmpty(n.config[e]))&&(n.config[e]={}),a=void 0===a?!0:a;var o,l=n.config[e],s=t.ifSet("caption",l),d=t.ifSet("width",l,"auto"),c=t.ifSet("url",l,!1),p=t.ifSet("key",l,null),u=i.fileActionSettings,f=i.initialPreviewShowDelete||!1,m=l.downloadUrl||i.initialPreviewDownloadUrl||"",v=l.filename||l.caption||"",g=!!m,h=t.ifSet("showRemove",l,t.ifSet("showRemove",u,f)),w=t.ifSet("showDownload",l,t.ifSet("showDownload",u,g)),_=t.ifSet("showZoom",l,t.ifSet("showZoom",u,!0)),b=t.ifSet("showDrag",l,t.ifSet("showDrag",u,!0)),C=c===!1&&a;return w=w&&l.downloadUrl!==!1&&!!m,o=i._renderFileActions(!1,w,h,_,b,C,c,p,!0,m,v),i._getLayoutTemplate("footer").setTokens({progress:i._renderThumbProgress(),actions:o,caption:s,size:i._getSize(r),width:d,indicator:""})}},i.previewCache.init()},_handler:function(e,t,i){var a=this,r=a.namespace,n=t.split(" ").join(r+" ")+r;e&&e.length&&e.off(n).on(n,i)},_log:function(e){var t=this,i=t.$element.attr("id");i&&(e='"'+i+'": '+e),"undefined"!=typeof window.console.log?window.console.log(e):window.alert(e)},_validate:function(){var e=this,t="file"===e.$element.attr("type");return t||e._log('The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.'),t},_errorsExist:function(){var t,i=this,a=i.$errorContainer.find("li");return a.length?!0:(t=e(document.createElement("div")).html(i.$errorContainer.html()),t.find(".kv-error-close").remove(),t.find("ul").remove(),!!e.trim(t.text()).length)},_errorHandler:function(e,t){var i=this,a=e.target.error,r=function(e){i._showError(e.replace("{name}",t))};r(a.code===a.NOT_FOUND_ERR?i.msgFileNotFound:a.code===a.SECURITY_ERR?i.msgFileSecured:a.code===a.NOT_READABLE_ERR?i.msgFileNotReadable:a.code===a.ABORT_ERR?i.msgFilePreviewAborted:i.msgFilePreviewError)},_addError:function(e){var t=this,i=t.$errorContainer;e&&i.length&&(i.html(t.errorCloseButton+e),t._handler(i.find(".kv-error-close"),"click",function(){setTimeout(function(){t.showPreview&&!t.getFrames().length&&t.clear(),i.fadeOut("slow")},10)}))},_setValidationError:function(e){var i=this;e=(e?e+" ":"")+"has-error",i.$container.removeClass(e).addClass("has-error"),t.addCss(i.$captionContainer,"is-invalid")},_resetErrors:function(e){var t=this,i=t.$errorContainer;t.isError=!1,t.$container.removeClass("has-error"),t.$captionContainer.removeClass("is-invalid"),i.html(""),e?i.fadeOut("slow"):i.hide()},_showFolderError:function(e){var t,i=this,a=i.$errorContainer;e&&(t=i.msgFoldersNotAllowed.replace("{n}",e),i._addError(t),i._setValidationError(),a.fadeIn(800),i._raise("filefoldererror",[e,t]))},_showUploadError:function(e,t,i){var a=this,r=a.$errorContainer,n=i||"fileuploaderror",o=t&&t.id?'
          • '+e+"
          • ":"
          • "+e+"
          • ";return 0===r.find("ul").length?a._addError("
              "+o+"
            "):r.find("ul").append(o),r.fadeIn(800),a._raise(n,[t,e]),a._setValidationError("file-input-new"),!0},_showError:function(e,t,i){var a=this,r=a.$errorContainer,n=i||"fileerror";return t=t||{},t.reader=a.reader,a._addError(e),r.fadeIn(800),a._raise(n,[t,e]),a.isAjaxUpload||a._clearFileInput(),a._setValidationError("file-input-new"),a.$btnUpload.attr("disabled",!0),!0},_noFilesError:function(e){var t=this,i=t.minFileCount>1?t.filePlural:t.fileSingle,a=t.msgFilesTooLess.replace("{n}",t.minFileCount).replace("{files}",i),r=t.$errorContainer;t._addError(a),t.isError=!0,t._updateFileDetails(0),r.fadeIn(800),t._raise("fileerror",[e,a]),t._clearFileInput(),t._setValidationError()},_parseError:function(t,i,a,r){var n,o=this,l=e.trim(a+""),s=void 0!==i.responseJSON&&void 0!==i.responseJSON.error?i.responseJSON.error:i.responseText;return o.cancelling&&o.msgUploadAborted&&(l=o.msgUploadAborted),o.showAjaxErrorDetails&&s&&(s=e.trim(s.replace(/\n\s*\n/g,"\n")),n=s.length?"
            "+s+"
            ":"",l+=l?n:s),l||(l=o.msgAjaxError.replace("{operation}",t)),o.cancelling=!1,r?""+r+": "+l:l},_parseFileType:function(e,i){var a,r,n,o,l=this,s=l.allowedPreviewTypes||[];if("application/text-plain"===e)return"text";for(o=0;o-1&&(i=t.split(".").pop(),a.previewFileIconSettings&&(r=a.previewFileIconSettings[i]||a.previewFileIconSettings[i.toLowerCase()]||null),a.previewFileExtSettings&&e.each(a.previewFileExtSettings,function(e,t){return a.previewFileIconSettings[e]&&t(i)?void(r=a.previewFileIconSettings[e]):void 0})),r},_parseFilePreviewIcon:function(e,t){var i=this,a=i._getPreviewIcon(t)||i.previewFileIcon,r=e;return r.indexOf("{previewFileIcon}")>-1&&(r=r.setTokens({previewFileIconClass:i.previewFileIconClass,previewFileIcon:a})),r},_raise:function(t,i){var a=this,r=e.Event(t);if(void 0!==i?a.$element.trigger(r,i):a.$element.trigger(r),r.isDefaultPrevented()||r.result===!1)return!1;switch(t){case"filebatchuploadcomplete":case"filebatchuploadsuccess":case"fileuploaded":case"fileclear":case"filecleared":case"filereset":case"fileerror":case"filefoldererror":case"fileuploaderror":case"filebatchuploaderror":case"filedeleteerror":case"filecustomerror":case"filesuccessremove":break;default:a.ajaxAborted||(a.ajaxAborted=r.result)}return!0},_listenFullScreen:function(e){var t,i,a=this,r=a.$modal;r&&r.length&&(t=r&&r.find(".btn-fullscreen"),i=r&&r.find(".btn-borderless"),t.length&&i.length&&(t.removeClass("active").attr("aria-pressed","false"),i.removeClass("active").attr("aria-pressed","false"),e?t.addClass("active").attr("aria-pressed","true"):i.addClass("active").attr("aria-pressed","true"),r.hasClass("file-zoom-fullscreen")?a._maximizeZoomDialog():e?a._maximizeZoomDialog():i.removeClass("active").attr("aria-pressed","false")))},_listen:function(){var i,a=this,r=a.$element,n=a.$form,o=a.$container;a._handler(r,"change",e.proxy(a._change,a)),a.showBrowse&&a._handler(a.$btnFile,"click",e.proxy(a._browse,a)),a._handler(o.find(".fileinput-remove:not([disabled])"),"click",e.proxy(a.clear,a)),a._handler(o.find(".fileinput-cancel"),"click",e.proxy(a.cancel,a)),a._initDragDrop(),a._handler(n,"reset",e.proxy(a.clear,a)),a.isAjaxUpload||a._handler(n,"submit",e.proxy(a._submitForm,a)),a._handler(a.$container.find(".fileinput-upload"),"click",e.proxy(a._uploadClick,a)),a._handler(e(window),"resize",function(){a._listenFullScreen(screen.width===window.innerWidth&&screen.height===window.innerHeight)}),i="webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange",a._handler(e(document),i,function(){a._listenFullScreen(t.checkFullScreen())}),a._autoFitContent(),a._initClickable()},_autoFitContent:function(){var t,i=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,a=this,r=400>i?a.previewSettingsSmall||a.defaults.previewSettingsSmall:a.previewSettings||a.defaults.previewSettings;e.each(r,function(e,i){t=".file-preview-frame .file-preview-"+e,a.$preview.find(t+".kv-preview-data,"+t+" .kv-preview-data").css(i)})},_initClickable:function(){var i,a=this;a.isClickable&&(i=a.isAjaxUpload?a.$dropZone:a.$preview.find(".file-default-preview"),t.addCss(i,"clickable"),i.attr("tabindex",-1),a._handler(i,"click",function(t){var r=e(t.target);i.find(".kv-fileinput-error:visible").length||r.parents(".file-preview-thumbnails").length&&!r.parents(".file-default-preview").length||(a.$element.trigger("click"),i.blur())}))},_initDragDrop:function(){var t=this,i=t.$dropZone;t.isAjaxUpload&&t.dropZoneEnabled&&t.showPreview&&(t._handler(i,"dragenter dragover",e.proxy(t._zoneDragEnter,t)),t._handler(i,"dragleave",e.proxy(t._zoneDragLeave,t)),t._handler(i,"drop",e.proxy(t._zoneDrop,t)),t._handler(e(document),"dragenter dragover drop",t._zoneDragDropInit))},_zoneDragDropInit:function(e){e.stopPropagation(),e.preventDefault()},_zoneDragEnter:function(i){var a=this,r=e.inArray("Files",i.originalEvent.dataTransfer.types)>-1;return a._zoneDragDropInit(i),a.isDisabled||!r?(i.originalEvent.dataTransfer.effectAllowed="none",void(i.originalEvent.dataTransfer.dropEffect="none")):void t.addCss(a.$dropZone,"file-highlighted")},_zoneDragLeave:function(e){var t=this;t._zoneDragDropInit(e), +t.isDisabled||t.$dropZone.removeClass("file-highlighted")},_zoneDrop:function(e){var i=this;e.preventDefault(),i.isDisabled||t.isEmpty(e.originalEvent.dataTransfer.files)||(i._change(e,"dragdrop"),i.$dropZone.removeClass("file-highlighted"))},_uploadClick:function(e){var i,a=this,r=a.$container.find(".fileinput-upload"),n=!r.hasClass("disabled")&&t.isEmpty(r.attr("disabled"));if(!e||!e.isDefaultPrevented()){if(!a.isAjaxUpload)return void(n&&"submit"!==r.attr("type")&&(i=r.closest("form"),i.length&&i.trigger("submit"),e.preventDefault()));e.preventDefault(),n&&a.upload()}},_submitForm:function(){var e=this;return e._isFileSelectionValid()&&!e._abort({})},_clearPreview:function(){var i=this,a=i.$preview,r=i.showUploadedThumbs?i.getFrames(":not(.file-preview-success)"):i.getFrames();r.each(function(){var i=e(this);i.remove(),t.cleanZoomCache(a.find("#zoom-"+i.attr("id")))}),i.getFrames().length&&i.showPreview||i._resetUpload(),i._validateDefaultPreview()},_initSortable:function(){var i,a=this,r=a.$preview,n="."+t.SORT_CSS,o=a.reversePreviewOrder;window.KvSortable&&0!==r.find(n).length&&(i={handle:".drag-handle-init",dataIdAttr:"data-preview-id",scroll:!1,draggable:n,onSort:function(i){var r=i.oldIndex,n=i.newIndex,l=0;a.initialPreview=t.moveArray(a.initialPreview,r,n,o),a.initialPreviewConfig=t.moveArray(a.initialPreviewConfig,r,n,o),a.previewCache.init(),a.getFrames(".file-preview-initial").each(function(){e(this).attr("data-fileindex","init_"+l),l++}),a._raise("filesorted",{previewId:e(i.item).attr("id"),oldIndex:r,newIndex:n,stack:a.initialPreviewConfig})}},r.data("kvsortable")&&r.kvsortable("destroy"),e.extend(!0,i,a.fileActionSettings.dragSettings),r.kvsortable(i))},_setPreviewContent:function(e){var t=this;t.$preview.html(e),t._autoFitContent()},_initPreview:function(e){var i,a=this,r=a.initialCaption||"";return a.previewCache.count()?(i=a.previewCache.out(),r=e&&a.initialCaption?a.initialCaption:i.caption,a._setPreviewContent(i.content),a._setInitThumbAttr(),a._setCaption(r),a._initSortable(),void(t.isEmpty(i.content)||a.$container.removeClass("file-input-new"))):(a._clearPreview(),void(e?a._setCaption(r):a._initCaption()))},_getZoomButton:function(e){var t=this,i=t.previewZoomButtonIcons[e],a=t.previewZoomButtonClasses[e],r=' title="'+(t.previewZoomButtonTitles[e]||"")+'" ',n=r+("close"===e?' data-dismiss="modal" aria-hidden="true"':"");return"fullscreen"!==e&&"borderless"!==e&&"toggleheader"!==e||(n+=' data-toggle="button" aria-pressed="false" autocomplete="off"'),'"},_getModalContent:function(){var e=this;return e._getLayoutTemplate("modal").setTokens({rtl:e.rtl?" kv-rtl":"",zoomFrameClass:e.frameClass,heading:e.msgZoomModalHeading,prev:e._getZoomButton("prev"),next:e._getZoomButton("next"),toggleheader:e._getZoomButton("toggleheader"),fullscreen:e._getZoomButton("fullscreen"),borderless:e._getZoomButton("borderless"),close:e._getZoomButton("close")})},_listenModalEvent:function(e){var i=this,a=i.$modal,r=function(e){return{sourceEvent:e,previewId:a.data("previewId"),modal:a}};a.on(e+".bs.modal",function(n){var o=a.find(".btn-fullscreen"),l=a.find(".btn-borderless");i._raise("filezoom"+e,r(n)),"shown"===e&&(l.removeClass("active").attr("aria-pressed","false"),o.removeClass("active").attr("aria-pressed","false"),a.hasClass("file-zoom-fullscreen")&&(i._maximizeZoomDialog(),t.checkFullScreen()?o.addClass("active").attr("aria-pressed","true"):l.addClass("active").attr("aria-pressed","true")))})},_initZoom:function(){var i,a=this,r=a._getLayoutTemplate("modalMain"),n="#"+t.MODAL_ID;a.showPreview&&(a.$modal=e(n),a.$modal&&a.$modal.length||(i=e(document.createElement("div")).html(r).insertAfter(a.$container),a.$modal=e(n).insertBefore(i),i.remove()),t.initModal(a.$modal),a.$modal.html(a._getModalContent()),e.each(t.MODAL_EVENTS,function(e,t){a._listenModalEvent(t)}))},_initZoomButtons:function(){var t,i,a=this,r=a.$modal.data("previewId")||"",n=a.getFrames().toArray(),o=n.length,l=a.$modal.find(".btn-prev"),s=a.$modal.find(".btn-next");return n.length<2?(l.hide(),void s.hide()):(l.show(),s.show(),void(o&&(t=e(n[0]),i=e(n[o-1]),l.removeAttr("disabled"),s.removeAttr("disabled"),t.length&&t.attr("id")===r&&l.attr("disabled",!0),i.length&&i.attr("id")===r&&s.attr("disabled",!0))))},_maximizeZoomDialog:function(){var t=this,i=t.$modal,a=i.find(".modal-header:visible"),r=i.find(".modal-footer:visible"),n=i.find(".modal-body"),o=e(window).height(),l=0;i.addClass("file-zoom-fullscreen"),a&&a.length&&(o-=a.outerHeight(!0)),r&&r.length&&(o-=r.outerHeight(!0)),n&&n.length&&(l=n.outerHeight(!0)-n.height(),o-=l),i.find(".kv-zoom-body").height(o)},_resizeZoomDialog:function(e){var i=this,a=i.$modal,r=a.find(".btn-fullscreen"),n=a.find(".btn-borderless");if(a.hasClass("file-zoom-fullscreen"))t.toggleFullScreen(!1),e?r.hasClass("active")||(a.removeClass("file-zoom-fullscreen"),i._resizeZoomDialog(!0),n.hasClass("active")&&n.removeClass("active").attr("aria-pressed","false")):r.hasClass("active")?r.removeClass("active").attr("aria-pressed","false"):(a.removeClass("file-zoom-fullscreen"),i.$modal.find(".kv-zoom-body").css("height",i.zoomModalHeight));else{if(!e)return void i._maximizeZoomDialog();t.toggleFullScreen(!0)}a.focus()},_setZoomContent:function(i,a){var r,n,o,l,s,d,c,p,u,f,m=this,v=i.attr("id"),g=m.$modal,h=g.find(".btn-prev"),w=g.find(".btn-next"),_=g.find(".btn-fullscreen"),b=g.find(".btn-borderless"),C=g.find(".btn-toggleheader"),y=m.$preview.find("#zoom-"+v);n=y.attr("data-template")||"generic",r=y.find(".kv-file-content"),o=r.length?r.html():"",u=i.data("caption")||"",f=i.data("size")||"",l=u+" "+f,g.find(".kv-zoom-title").attr("title",e("
            ").html(l).text()).html(l),s=g.find(".kv-zoom-body"),g.removeClass("kv-single-content"),a?(p=s.addClass("file-thumb-loading").clone().insertAfter(s),s.html(o).hide(),p.fadeOut("fast",function(){s.fadeIn("fast",function(){s.removeClass("file-thumb-loading")}),p.remove()})):s.html(o),c=m.previewZoomSettings[n],c&&(d=s.find(".kv-preview-data"),t.addCss(d,"file-zoom-detail"),e.each(c,function(e,t){d.css(e,t),(d.attr("width")&&"width"===e||d.attr("height")&&"height"===e)&&d.removeAttr(e)})),g.data("previewId",v);var x=s.find("img");x.length&&t.adjustOrientedImage(x,!0),m._handler(h,"click",function(){m._zoomSlideShow("prev",v)}),m._handler(w,"click",function(){m._zoomSlideShow("next",v)}),m._handler(_,"click",function(){m._resizeZoomDialog(!0)}),m._handler(b,"click",function(){m._resizeZoomDialog(!1)}),m._handler(C,"click",function(){var e,t=g.find(".modal-header"),i=g.find(".modal-body .floating-buttons"),a=t.find(".kv-zoom-actions"),r=function(e){var i=m.$modal.find(".kv-zoom-body"),a=m.zoomModalHeight;g.hasClass("file-zoom-fullscreen")&&(a=i.outerHeight(!0),e||(a-=t.outerHeight(!0))),i.css("height",e?a+e:a)};t.is(":visible")?(e=t.outerHeight(!0),t.slideUp("slow",function(){a.find(".btn").appendTo(i),r(e)})):(i.find(".btn").appendTo(a),t.slideDown("slow",function(){r()})),g.focus()}),m._handler(g,"keydown",function(e){var t=e.which||e.keyCode;37!==t||h.attr("disabled")||m._zoomSlideShow("prev",v),39!==t||w.attr("disabled")||m._zoomSlideShow("next",v)})},_zoomPreview:function(e){var i,a=this,r=a.$modal;if(!e.length)throw"Cannot zoom to detailed preview!";t.initModal(r),r.html(a._getModalContent()),i=e.closest(t.FRAMES),a._setZoomContent(i),r.modal("show"),a._initZoomButtons()},_zoomSlideShow:function(t,i){var a,r,n,o=this,l=o.$modal.find(".kv-zoom-actions .btn-"+t),s=o.getFrames().toArray(),d=s.length;if(!l.attr("disabled")){for(r=0;d>r;r++)if(e(s[r]).attr("id")===i){n="prev"===t?r-1:r+1;break}0>n||n>=d||!s[n]||(a=e(s[n]),a.length&&o._setZoomContent(a,!0),o._initZoomButtons(),o._raise("filezoom"+t,{previewId:i,modal:o.$modal}))}},_initZoomButton:function(){var t=this;t.$preview.find(".kv-file-zoom").each(function(){var i=e(this);t._handler(i,"click",function(){t._zoomPreview(i)})})},_clearObjects:function(t){t.find("video audio").each(function(){this.pause(),e(this).remove()}),t.find("img object div").each(function(){e(this).remove()})},_clearFileInput:function(){var i,a,r,n=this,o=n.$element;n.fileInputCleared=!0,t.isEmpty(o.val())||(n.isIE9||n.isIE10?(i=o.closest("form"),a=e(document.createElement("form")),r=e(document.createElement("div")),o.before(r),i.length?i.after(a):r.after(a),a.append(o).trigger("reset"),r.before(o).remove(),a.remove()):o.val(""))},_resetUpload:function(){var e=this;e.uploadCache={content:[],config:[],tags:[],append:!0},e.uploadCount=0,e.uploadStatus={},e.uploadLog=[],e.uploadAsyncCount=0,e.loadedImages=[],e.totalImagesCount=0,e.$btnUpload.removeAttr("disabled"),e._setProgress(0),e.$progress.hide(),e._resetErrors(!1),e.ajaxAborted=!1,e.ajaxRequests=[],e._resetCanvas(),e.cacheInitialPreview={},e.overwriteInitial&&(e.initialPreview=[],e.initialPreviewConfig=[],e.initialPreviewThumbTags=[],e.previewCache.data={content:[],config:[],tags:[]})},_resetCanvas:function(){var e=this;e.canvas&&e.imageCanvasContext&&e.imageCanvasContext.clearRect(0,0,e.canvas.width,e.canvas.height)},_hasInitialPreview:function(){var e=this;return!e.overwriteInitial&&e.previewCache.count()},_resetPreview:function(){var e,t,i=this;i.previewCache.count()?(e=i.previewCache.out(),i._setPreviewContent(e.content),i._setInitThumbAttr(),t=i.initialCaption?i.initialCaption:e.caption,i._setCaption(t)):(i._clearPreview(),i._initCaption()),i.showPreview&&(i._initZoom(),i._initSortable())},_clearDefaultPreview:function(){var e=this;e.$preview.find(".file-default-preview").remove()},_validateDefaultPreview:function(){var e=this;e.showPreview&&!t.isEmpty(e.defaultPreviewContent)&&(e._setPreviewContent('
            '+e.defaultPreviewContent+"
            "),e.$container.removeClass("file-input-new"),e._initClickable())},_resetPreviewThumbs:function(e){var t,i=this;return e?(i._clearPreview(),void i.clearStack()):void(i._hasInitialPreview()?(t=i.previewCache.out(),i._setPreviewContent(t.content),i._setInitThumbAttr(),i._setCaption(t.caption),i._initPreviewActions()):i._clearPreview())},_getLayoutTemplate:function(e){var i=this,a=i.layoutTemplates[e];return t.isEmpty(i.customLayoutTags)?a:t.replaceTags(a,i.customLayoutTags)},_getPreviewTemplate:function(e){var i=this,a=i.previewTemplates[e];return t.isEmpty(i.customPreviewTags)?a:t.replaceTags(a,i.customPreviewTags)},_getOutData:function(e,t,i){var a=this;return e=e||{},t=t||{},i=i||a.filestack.slice(0)||{},{form:a.formdata,files:i,filenames:a.filenames,filescount:a.getFilesCount(),extra:a._getExtraData(),response:t,reader:a.reader,jqXHR:e}},_getMsgSelected:function(e){var t=this,i=1===e?t.fileSingle:t.filePlural;return e>0?t.msgSelected.replace("{n}",e).replace("{files}",i):t.msgNoFilesSelected},_getFrame:function(t){var i=this,a=e("#"+t);return a.length?a:(i._log('Invalid thumb frame with id: "'+t+'".'),null)},_getThumbs:function(e){return e=e||"",this.getFrames(":not(.file-preview-initial)"+e)},_getExtraData:function(e,t){var i=this,a=i.uploadExtraData;return"function"==typeof i.uploadExtraData&&(a=i.uploadExtraData(e,t)),a},_initXhr:function(e,t,i){var a=this;return e.upload&&e.upload.addEventListener("progress",function(e){var r=0,n=e.total,o=e.loaded||e.position;e.lengthComputable&&(r=Math.floor(o/n*100)),t?a._setAsyncUploadStatus(t,r,i):a._setProgress(r)},!1),e},_mergeAjaxCallback:function(e,t,i){var a,r=this,n=r.ajaxSettings,o=r.mergeAjaxCallbacks;"delete"===i&&(n=r.ajaxDeleteSettings,o=r.mergeAjaxDeleteCallbacks),a=n[e],o&&"function"==typeof a?"before"===o?n[e]=function(){a.apply(this,arguments),t.apply(this,arguments)}:n[e]=function(){t.apply(this,arguments),a.apply(this,arguments)}:n[e]=t,"delete"===i?r.ajaxDeleteSettings=n:r.ajaxSettings=n},_ajaxSubmit:function(t,i,a,r,n,o){var l,s=this;s._raise("filepreajax",[n,o])&&(s._uploadExtra(n,o),s._mergeAjaxCallback("beforeSend",t),s._mergeAjaxCallback("success",i),s._mergeAjaxCallback("complete",a),s._mergeAjaxCallback("error",r),l=e.extend(!0,{},{xhr:function(){var t=e.ajaxSettings.xhr();return s._initXhr(t,n,s.getFileStack().length)},url:o&&s.uploadUrlThumb?s.uploadUrlThumb:s.uploadUrl,type:"POST",dataType:"json",data:s.formdata,cache:!1,processData:!1,contentType:!1},s.ajaxSettings),s.ajaxRequests.push(e.ajax(l)))},_mergeArray:function(e,i){var a=this,r=t.cleanArray(a[e]),n=t.cleanArray(i);a[e]=r.concat(n)},_initUploadSuccess:function(i,a,r){var n,o,l,s,d,c,p,u,f,m=this;m.showPreview&&"object"==typeof i&&!e.isEmptyObject(i)&&void 0!==i.initialPreview&&i.initialPreview.length>0&&(m.hasInitData=!0,c=i.initialPreview||[],p=i.initialPreviewConfig||[],u=i.initialPreviewThumbTags||[],n=void 0===i.append||i.append,c.length>0&&!t.isArray(c)&&(c=c.split(m.initialPreviewDelimiter)),m._mergeArray("initialPreview",c),m._mergeArray("initialPreviewConfig",p),m._mergeArray("initialPreviewThumbTags",u),void 0!==a?r?(f=a.attr("data-fileindex"),m.uploadCache.content[f]=c[0],m.uploadCache.config[f]=p[0]||[],m.uploadCache.tags[f]=u[0]||[],m.uploadCache.append=n):(l=m.previewCache.add(c,p[0],u[0],n),o=m.previewCache.get(l,!1),s=e(document.createElement("div")).html(o).hide().insertAfter(a),d=s.find(".kv-zoom-cache"),d&&d.length&&d.insertAfter(a),a.fadeOut("slow",function(){var e=s.find(".file-preview-frame");e&&e.length&&e.insertBefore(a).fadeIn("slow").css("display:inline-block"),m._initPreviewActions(),m._clearFileInput(),t.cleanZoomCache(m.$preview.find("#zoom-"+a.attr("id"))),a.remove(),s.remove(),m._initSortable()})):(m.previewCache.set(c,p,u,n),m._initPreview(),m._initPreviewActions()))},_initSuccessThumbs:function(){var i=this;i.showPreview&&i._getThumbs(t.FRAMES+".file-preview-success").each(function(){var a=e(this),r=i.$preview,n=a.find(".kv-file-remove");n.removeAttr("disabled"),i._handler(n,"click",function(){var e=a.attr("id"),n=i._raise("filesuccessremove",[e,a.attr("data-fileindex")]);t.cleanMemory(a),n!==!1&&a.fadeOut("slow",function(){t.cleanZoomCache(r.find("#zoom-"+e)),a.remove(),i.getFrames().length||i.reset()})})})},_checkAsyncComplete:function(){var t,i,a=this;for(i=0;i0||!e.isEmptyObject(v.uploadExtraData),b=e("#"+w).find(".file-thumb-progress"),C={id:w,index:i};v.formdata=h,v.showPreview&&(n=e("#"+w+":not(.file-preview-initial)"),l=n.find(".kv-file-upload"),s=n.find(".kv-file-remove"),b.show()),0===g||!_||l&&l.hasClass("disabled")||v._abort(C)||(m=function(e,t){d||v.updateStack(e,void 0),v.uploadLog.push(t),v._checkAsyncComplete()&&(v.fileBatchCompleted=!0)},o=function(){var e,i,a,r=v.uploadCache,n=0,o=v.cacheInitialPreview;v.fileBatchCompleted&&(o&&o.content&&(n=o.content.length),setTimeout(function(){var l=0===v.getFileStack(!0).length;if(v.showPreview){if(v.previewCache.set(r.content,r.config,r.tags,r.append),n){for(i=0;i0||!e.isEmptyObject(l.uploadExtraData);l.formdata=new FormData,0!==d&&p&&!l._abort(c)&&(o=function(){e.each(s,function(e){l.updateStack(e,void 0)}),l._clearFileInput()},i=function(i){l.lock();var a=l._getOutData(i);l.ajaxAborted=!1,l.showPreview&&l._getThumbs().each(function(){var i=e(this),a=i.find(".kv-file-upload"),r=i.find(".kv-file-remove");i.hasClass("file-preview-success")||(l._setThumbStatus(i,"Loading"),t.addCss(i,"file-uploading")),a.attr("disabled",!0),r.attr("disabled",!0)}),l._raise("filebatchpreupload",[a]),l._abort(a)&&(i.abort(),l._getThumbs().each(function(){var t=e(this),i=t.find(".kv-file-upload"),a=t.find(".kv-file-remove");t.hasClass("file-preview-loading")&&(l._setThumbStatus(t,"New"),t.removeClass("file-uploading")),i.removeAttr("disabled"),a.removeAttr("disabled")}),l._setProgressCancelled())},a=function(i,a,r){var n=l._getOutData(r,i),s=0,d=l._getThumbs(":not(.file-preview-success)"),c=t.isEmpty(i)||t.isEmpty(i.errorkeys)?[]:i.errorkeys;t.isEmpty(i)||t.isEmpty(i.error)?(l._raise("filebatchuploadsuccess",[n]),o(),l.showPreview?(d.each(function(){var t=e(this);l._setThumbStatus(t,"Success"),t.removeClass("file-uploading"),t.find(".kv-file-upload").hide().removeAttr("disabled")}),l._initUploadSuccess(i)):l.reset(),l._setProgress(101)):(l.showPreview&&(d.each(function(){var t=e(this),i=t.attr("data-fileindex");t.removeClass("file-uploading"),t.find(".kv-file-upload").removeAttr("disabled"),t.find(".kv-file-remove").removeAttr("disabled"),0===c.length||-1!==e.inArray(s,c)?(l._setPreviewError(t,i,l.filestack[i],l.retryErrorUploads),l.retryErrorUploads||(t.find(".kv-file-upload").hide(),l.updateStack(i,void 0))):(t.find(".kv-file-upload").hide(),l._setThumbStatus(t,"Success"),l.updateStack(i,void 0)),t.hasClass("file-preview-error")&&!l.retryErrorUploads||s++}),l._initUploadSuccess(i)),l._showUploadError(i.error,n,"filebatchuploaderror"),l._setProgress(101,l.$progress,l.msgUploadError))},n=function(){l.unlock(),l._initSuccessThumbs(),l._clearFileInput(),l._raise("filebatchuploadcomplete",[l.filestack,l._getExtraData()])},r=function(t,i,a){var r=l._getOutData(t),n=l.ajaxOperations.uploadBatch,o=l._parseError(n,t,a);l._showUploadError(o,r,"filebatchuploaderror"),l.uploadFileCount=d-1,l.showPreview&&(l._getThumbs().each(function(){var t=e(this),i=t.attr("data-fileindex");t.removeClass("file-uploading"),void 0!==l.filestack[i]&&l._setPreviewError(t)}),l._getThumbs().removeClass("file-uploading"),l._getThumbs(" .kv-file-upload").removeAttr("disabled"),l._getThumbs(" .kv-file-delete").removeAttr("disabled"),l._setProgress(101,l.$progress,l.msgAjaxProgressError.replace("{operation}",n)))},e.each(s,function(e,i){t.isEmpty(s[e])||l.formdata.append(l.uploadFileAttr,i,l.filenames[e])}),l._ajaxSubmit(i,a,n,r))},_uploadExtraOnly:function(){var e,i,a,r,n=this,o={};n.formdata=new FormData,n._abort(o)||(e=function(e){n.lock();var t=n._getOutData(e);n._raise("filebatchpreupload",[t]),n._setProgress(50),o.data=t,o.xhr=e,n._abort(o)&&(e.abort(),n._setProgressCancelled())},i=function(e,i,a){var r=n._getOutData(a,e);t.isEmpty(e)||t.isEmpty(e.error)?(n._raise("filebatchuploadsuccess",[r]),n._clearFileInput(),n._initUploadSuccess(e),n._setProgress(101)):n._showUploadError(e.error,r,"filebatchuploaderror")},a=function(){n.unlock(),n._clearFileInput(),n._raise("filebatchuploadcomplete",[n.filestack,n._getExtraData()])},r=function(e,t,i){var a=n._getOutData(e),r=n.ajaxOperations.uploadExtra,l=n._parseError(r,e,i);o.data=a,n._showUploadError(l,a,"filebatchuploaderror"),n._setProgress(101,n.$progress,n.msgAjaxProgressError.replace("{operation}",r))},n._ajaxSubmit(e,i,a,r))},_deleteFileIndex:function(i){var a=this,r=i.attr("data-fileindex"),n=a.reversePreviewOrder;"init_"===r.substring(0,5)&&(r=parseInt(r.replace("init_","")),a.initialPreview=t.spliceArray(a.initialPreview,r,n),a.initialPreviewConfig=t.spliceArray(a.initialPreviewConfig,r,n),a.initialPreviewThumbTags=t.spliceArray(a.initialPreviewThumbTags,r,n),a.getFrames().each(function(){var t=e(this),i=t.attr("data-fileindex");"init_"===i.substring(0,5)&&(i=parseInt(i.replace("init_","")),i>r&&(i--,t.attr("data-fileindex","init_"+i)))}),a.uploadAsync&&(a.cacheInitialPreview=a.getPreview()))},_initFileActions:function(){var i=this,a=i.$preview;i.showPreview&&(i._initZoomButton(),i.getFrames(" .kv-file-remove").each(function(){var r,n,o,l,s=e(this),d=s.closest(t.FRAMES),c=d.attr("id"),p=d.attr("data-fileindex");i._handler(s,"click",function(){return l=i._raise("filepreremove",[c,p]),l!==!1&&i._validateMinCount()?(r=d.hasClass("file-preview-error"),t.cleanMemory(d),void d.fadeOut("slow",function(){t.cleanZoomCache(a.find("#zoom-"+c)),i.updateStack(p,void 0),i._clearObjects(d),d.remove(),c&&r&&i.$errorContainer.find('li[data-file-id="'+c+'"]').fadeOut("fast",function(){e(this).remove(),i._errorsExist()||i._resetErrors()}),i._clearFileInput();var l=i.getFileStack(!0),s=i.previewCache.count(),u=l.length,f=i.showPreview&&i.getFrames().length;0!==u||0!==s||f?(n=s+u,o=n>1?i._getMsgSelected(n):l[0]?i._getFileNames()[0]:"",i._setCaption(o)):i.reset(),i._raise("fileremoved",[c,p])})):!1})}),i.getFrames(" .kv-file-upload").each(function(){var a=e(this);i._handler(a,"click",function(){var e=a.closest(t.FRAMES),r=e.attr("data-fileindex");i.$progress.hide(),e.hasClass("file-preview-error")&&!i.retryErrorUploads||i._uploadSingle(r,!1)})}))},_initPreviewActions:function(){var i=this,a=i.$preview,r=i.deleteExtraData||{},n=t.FRAMES+" .kv-file-remove",o=i.fileActionSettings,l=o.removeClass,s=o.removeErrorClass,d=function(){var e=i.isAjaxUpload?i.previewCache.count():i.$element.get(0).files.length;a.find(t.FRAMES).length||e||(i._setCaption(""),i.reset(),i.initialCaption="")};i._initZoomButton(),a.find(n).each(function(){var n,o,c,p=e(this),u=p.data("url")||i.deleteUrl,f=p.data("key");if(!t.isEmpty(u)&&void 0!==f){var m,v,g,h,w=p.closest(t.FRAMES),_=i.previewCache.data,b=w.attr("data-fileindex");b=parseInt(b.replace("init_","")),g=t.isEmpty(_.config)&&t.isEmpty(_.config[b])?null:_.config[b],h=t.isEmpty(g)||t.isEmpty(g.extra)?r:g.extra,"function"==typeof h&&(h=h()),v={id:p.attr("id"),key:f,extra:h},n=function(e){i.ajaxAborted=!1,i._raise("filepredelete",[f,e,h]),i._abort()?e.abort():(p.removeClass(s),t.addCss(w,"file-uploading"),t.addCss(p,"disabled "+l))},o=function(e,r,n){var o,c;return t.isEmpty(e)||t.isEmpty(e.error)?(w.removeClass("file-uploading").addClass("file-deleted"),void w.fadeOut("slow",function(){b=parseInt(w.attr("data-fileindex").replace("init_","")),i.previewCache.unset(b),i._deleteFileIndex(w),o=i.previewCache.count(),c=o>0?i._getMsgSelected(o):"",i._setCaption(c),i._raise("filedeleted",[f,n,h]),t.cleanZoomCache(a.find("#zoom-"+w.attr("id"))),i._clearObjects(w),w.remove(),d()})):(v.jqXHR=n,v.response=e,i._showError(e.error,v,"filedeleteerror"),w.removeClass("file-uploading"),p.removeClass("disabled "+l).addClass(s),void d())},c=function(e,t,a){var r=i.ajaxOperations.deleteThumb,n=i._parseError(r,e,a);v.jqXHR=e,v.response={},i._showError(n,v,"filedeleteerror"),w.removeClass("file-uploading"),p.removeClass("disabled "+l).addClass(s),d()},i._mergeAjaxCallback("beforeSend",n,"delete"),i._mergeAjaxCallback("success",o,"delete"),i._mergeAjaxCallback("error",c,"delete"),m=e.extend(!0,{},{url:u,type:"POST",dataType:"json",data:e.extend(!0,{},{key:f},h)},i.ajaxDeleteSettings),i._handler(p,"click",function(){return i._validateMinCount()?(i.ajaxAborted=!1,i._raise("filebeforedelete",[f,h]),void(i.ajaxAborted instanceof Promise?i.ajaxAborted.then(function(t){t||e.ajax(m)}):i.ajaxAborted||e.ajax(m))):!1})}})},_hideFileIcon:function(){var e=this;e.overwriteInitial&&e.$captionContainer.removeClass("icon-visible")},_showFileIcon:function(){var e=this;t.addCss(e.$captionContainer,"icon-visible")},_getSize:function(t){var i,a,r,n=this,o=parseFloat(t),l=n.fileSizeGetter;return e.isNumeric(t)&&e.isNumeric(o)?("function"==typeof l?r=l(o):0===o?r="0.00 B":(i=Math.floor(Math.log(o)/Math.log(1024)),a=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],r=1*(o/Math.pow(1024,i)).toFixed(2)+" "+a[i]),n._getLayoutTemplate("size").replace("{sizeText}",r)):""},_generatePreviewTemplate:function(i,a,r,n,o,l,s,d,c,p,u){var f,m,v=this,g=v.slug(r),h="",w="",_=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b=400>_?v.previewSettingsSmall[i]||v.defaults.previewSettingsSmall[i]:v.previewSettings[i]||v.defaults.previewSettings[i],C=c||v._renderFileFooter(g,s,"auto",l),y=v._getPreviewIcon(r),x="type-default",T=y&&v.preferIconicPreview,E=y&&v.preferIconicZoomPreview;return b&&e.each(b,function(e,t){w+=e+":"+t+";"}),m=function(a,l,s,c){var f=s?"zoom-"+o:o,m=v._getPreviewTemplate(a),h=(d||"")+" "+c;return v.frameClass&&(h=v.frameClass+" "+h),s&&(h=h.replace(" "+t.SORT_CSS,"")),m=v._parseFilePreviewIcon(m,r),"text"===a&&(l=t.htmlEncode(l)),"object"!==i||n||e.each(v.defaults.fileTypeSettings,function(e,t){"object"!==e&&"other"!==e&&t(r,n)&&(x="type-"+e)}),m.setTokens({previewId:f,caption:g,frameClass:h,type:n,fileindex:p,typeCss:x,footer:C,data:l,template:u||i,style:w?'style="'+w+'"':""})},p=p||o.slice(o.lastIndexOf("-")+1),v.fileActionSettings.showZoom&&(h=m(E?"other":i,a,!0,"kv-zoom-thumb")),h="\n"+v._getLayoutTemplate("zoomCache").replace("{zoomContent}",h),f=m(T?"other":i,a,!1,"kv-preview-thumb"),f+h},_addToPreview:function(e,t){var i=this;return i.reversePreviewOrder?e.prepend(t):e.append(t)},_previewDefault:function(i,a,r){var n=this,o=n.$preview;if(n.showPreview){var l,s=i?i.name:"",d=i?i.type:"",c=i.size||0,p=n.slug(s),u=r===!0&&!n.isAjaxUpload,f=t.objUrl.createObjectURL(i);n._clearDefaultPreview(),l=n._generatePreviewTemplate("other",f,s,d,a,u,c),n._addToPreview(o,l),n._setThumbAttr(a,p,c),r===!0&&n.isAjaxUpload&&n._setThumbStatus(e("#"+a),"Error")}},_previewFile:function(e,i,a,r,n,o){if(this.showPreview){var l,s=this,d=i?i.name:"",c=o.type,p=o.name,u=s._parseFileType(c,d),f=s.allowedPreviewTypes,m=s.allowedPreviewMimeTypes,v=s.$preview,g=i.size||0,h=f&&f.indexOf(u)>=0,w=m&&-1!==m.indexOf(c),_="text"===u||"html"===u||"image"===u?a.target.result:n;if("html"===u&&s.purifyHtml&&window.DOMPurify&&(_=window.DOMPurify.sanitize(_)),h||w){l=s._generatePreviewTemplate(u,_,d,c,r,!1,g),s._clearDefaultPreview(),s._addToPreview(v,l);var b=v.find("#"+r+" img");b.length&&s.autoOrientImage?t.validateOrientation(i,function(e){if(!e)return void s._validateImage(r,p,c,g,_);var a=v.find("#zoom-"+r+" img"),n="rotate-"+e;e>4&&(n+=b.width()>b.height()?" is-portrait-gt4":" is-landscape-gt4"),t.addCss(b,n),t.addCss(a,n),s._raise("fileimageoriented",{$img:b,file:i}),s._validateImage(r,p,c,g,_),t.adjustOrientedImage(b)}):s._validateImage(r,p,c,g,_)}else s._previewDefault(i,r);s._setThumbAttr(r,p,g),s._initSortable()}},_setThumbAttr:function(t,i,a){var r=this,n=e("#"+t);n.length&&(a=a&&a>0?r._getSize(a):"",n.data({caption:i,size:a}))},_setInitThumbAttr:function(){var e,i,a,r,n=this,o=n.previewCache.data,l=n.previewCache.count();if(0!==l)for(var s=0;l>s;s++)e=o.config[s],r=n.previewInitId+"-init_"+s,i=t.ifSet("caption",e,t.ifSet("filename",e)),a=t.ifSet("size",e),n._setThumbAttr(r,i,a)},_slugDefault:function(e){return t.isEmpty(e)?"":String(e).replace(/[\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g,"_")},_updateFileDetails:function(e){var i=this,a=i.$element,r=i.getFileStack(),n=t.isIE(9)&&t.findFileName(a.val())||a[0].files[0]&&a[0].files[0].name||r.length&&r[0].name||"",o=i.slug(n),l=i.isAjaxUpload?r.length:e,s=i.previewCache.count()+l,d=1===l?o:i._getMsgSelected(s);i.isError?(i.$previewContainer.removeClass("file-thumb-loading"),i.$previewStatus.html(""),i.$captionContainer.removeClass("icon-visible")):i._showFileIcon(),i._setCaption(d,i.isError),i.$container.removeClass("file-input-new file-input-ajax-new"),1===arguments.length&&i._raise("fileselect",[e,o]),i.previewCache.count()&&i._initPreviewActions()},_setThumbStatus:function(e,t){var i=this;if(i.showPreview){var a="indicator"+t,r=a+"Title",n="file-preview-"+t.toLowerCase(),o=e.find(".file-upload-indicator"),l=i.fileActionSettings;e.removeClass("file-preview-success file-preview-error file-preview-loading"),"Success"===t&&e.find(".file-drag-handle").remove(),o.html(l[a]),o.attr("title",l[r]),e.addClass(n),"Error"!==t||i.retryErrorUploads||e.find(".kv-file-upload").attr("disabled",!0)}},_setProgressCancelled:function(){var e=this;e._setProgress(101,e.$progress,e.msgCancelled)},_setProgress:function(e,i,a){var r,n=this,o=Math.min(e,100),l=n.progressUploadThreshold,s=100>=e?n.progressTemplate:n.progressCompleteTemplate,d=100>o?n.progressTemplate:a?n.progressErrorTemplate:s;i=i||n.$progress,t.isEmpty(d)||(r=l&&o>l&&100>=e?d.setTokens({percent:l,status:n.msgUploadThreshold}):d.setTokens({percent:o,status:e>100?n.msgUploadEnd:o+"%"}),i.html(r),a&&i.find('[role="progressbar"]').html(a))},_setFileDropZoneTitle:function(){var e,i=this,a=i.$container.find(".file-drop-zone"),r=i.dropZoneTitle;i.isClickable&&(e=t.isEmpty(i.$element.attr("multiple"))?i.fileSingle:i.filePlural,r+=i.dropZoneClickTitle.replace("{files}",e)),a.find("."+i.dropZoneTitleClass).remove(),i.isAjaxUpload&&i.showPreview&&0!==a.length&&!(i.getFileStack().length>0)&&i.dropZoneEnabled&&(0===a.find(t.FRAMES).length&&t.isEmpty(i.defaultPreviewContent)&&a.prepend('
            '+r+"
            "),i.$container.removeClass("file-input-new"),t.addCss(i.$container,"file-input-ajax-new"))},_setAsyncUploadStatus:function(t,i,a){var r=this,n=0;r._setProgress(i,e("#"+t).find(".file-thumb-progress")),r.uploadStatus[t]=i,e.each(r.uploadStatus,function(e,t){n+=t}),r._setProgress(Math.floor(n/a))},_validateMinCount:function(){var e=this,t=e.isAjaxUpload?e.getFileStack().length:e.$element.get(0).files.length;return e.validateInitialCount&&e.minFileCount>0&&e._getFileCount(t-1)=m:m>=d,p||(s=u["msgImage"+o+i].setTokens({name:n,size:m}),u._showUploadError(s,l),u._setPreviewError(r,e,null)))},_validateImage:function(t,i,a,r,n){var o,l,s,d,c=this,p=c.$preview,u=p.find("#"+t),f=u.attr("data-fileindex"),m=u.find("img");i=i||"Untitled",m.one("load",function(){l=u.width(),s=p.width(),l>s&&m.css("width","100%"),o={ind:f,id:t},c._checkDimensions(f,"Small",m,u,i,"Width",o),c._checkDimensions(f,"Small",m,u,i,"Height",o),c.resizeImage||(c._checkDimensions(f,"Large",m,u,i,"Width",o),c._checkDimensions(f,"Large",m,u,i,"Height",o)),c._raise("fileimageloaded",[t]);try{d=window.piexif?window.piexif.load(n):null}catch(e){d=null}c.loadedImages.push({ind:f,img:m,thumb:u,pid:t,typ:a,siz:r,validated:!1,imgData:n,exifObj:d}),u.data("exif",d),c._validateAllImages()}).one("error",function(){c._raise("fileimageloaderror",[t])}).each(function(){this.complete?e(this).trigger("load"):this.error&&e(this).trigger("error")})},_validateAllImages:function(){var e,t,i,a=this,r={val:0},n=a.loadedImages.length,o=a.resizeIfSizeMoreThan;if(n===a.totalImagesCount&&(a._raise("fileimagesloaded"),a.resizeImage))for(e=0;e1e3*o&&a._getResizedImage(t,r,n),a.loadedImages[e].validated=!0)},_getResizedImage:function(i,a,r){var n,o,l,s,d,c,p,u=this,f=e(i.img)[0],m=f.naturalWidth,v=f.naturalHeight,g=1,h=u.maxImageWidth||m,w=u.maxImageHeight||v,_=!(!m||!v),b=u.imageCanvas,C=u.imageCanvasContext,y=i.typ,x=i.pid,T=i.ind,E=i.thumb,S=i.exifObj;if(d=function(e,t,i){u.isAjaxUpload?u._showUploadError(e,t,i):u._showError(e,t,i),u._setPreviewError(E,T)},(!u.filestack[T]||!_||h>=m&&w>=v)&&(_&&u.filestack[T]&&u._raise("fileimageresized",[x,T]),a.val++,a.val===r&&u._raise("fileimagesresized"),!_))return void d(u.msgImageResizeError,{id:x,index:T},"fileimageresizeerror");y=y||u.resizeDefaultImageType,o=m>h,l=v>w,g="width"===u.resizePreference?o?h/m:l?w/v:1:l?w/v:o?h/m:1,u._resetCanvas(),m*=g,v*=g,b.width=m,b.height=v;try{C.drawImage(f,0,0,m,v),s=b.toDataURL(y,u.resizeQuality),S&&(p=window.piexif.dump(S),s=window.piexif.insert(p,s)),n=t.dataURI2Blob(s),u.filestack[T]=n,u._raise("fileimageresized",[x,T]),a.val++,a.val===r&&u._raise("fileimagesresized",[void 0,void 0]),n instanceof Blob||d(u.msgImageResizeError,{id:x,index:T},"fileimageresizeerror")}catch(k){a.val++,a.val===r&&u._raise("fileimagesresized",[void 0,void 0]),c=u.msgImageResizeException.replace("{errors}",k.message),d(c,{id:x,index:T},"fileimageresizeexception")}},_initBrowse:function(e){var t=this;t.showBrowse?(t.$btnFile=e.find(".btn-file"),t.$btnFile.append(t.$element)):t.$element.hide()},_initCaption:function(){var e=this,i=e.initialCaption||"";return e.overwriteInitial||t.isEmpty(i)?(e.$caption.val(""),!1):(e._setCaption(i),!0)},_setCaption:function(i,a){var r,n,o,l,s,d=this,c=d.getFileStack();if(d.$caption.length){if(d.$captionContainer.removeClass("icon-visible"),a)r=e("
            "+d.msgValidationError+"
            ").text(),l=c.length,s=l?1===l&&c[0]?d._getFileNames()[0]:d._getMsgSelected(l):d._getMsgSelected(d.msgNo),n=t.isEmpty(i)?s:i,o=''+d.msgValidationErrorIcon+"";else{if(t.isEmpty(i))return;r=e("
            "+i+"
            ").text(),n=r,o=d._getLayoutTemplate("fileIcon")}d.$captionContainer.addClass("icon-visible"),d.$caption.attr("title",r).val(n),d.$captionIcon.html(o)}},_createContainer:function(){var t=this,i={"class":"file-input file-input-new"+(t.rtl?" kv-rtl":"")},a=e(document.createElement("div")).attr(i).html(t._renderMain());return t.$element.before(a),t._initBrowse(a),t.theme&&a.addClass("theme-"+t.theme),a},_refreshContainer:function(){var e=this,t=e.$container;t.before(e.$element),t.html(e._renderMain()),e._initBrowse(t),e._validateDisabled()},_validateDisabled:function(){var e=this;e.$caption.attr({readonly:e.isDisabled})},_renderMain:function(){var e=this,t=e.isAjaxUpload&&e.dropZoneEnabled?" file-drop-zone":"file-drop-disabled",i=e.showClose?e._getLayoutTemplate("close"):"",a=e.showPreview?e._getLayoutTemplate("preview").setTokens({"class":e.previewClass,dropClass:t}):"",r=e.isDisabled?e.captionClass+" file-caption-disabled":e.captionClass,n=e.captionTemplate.setTokens({"class":r+" kv-fileinput-caption"});return e.mainTemplate.setTokens({"class":e.mainClass+(!e.showBrowse&&e.showCaption?" no-browse":""),preview:a,close:i,caption:n,upload:e._renderButton("upload"),remove:e._renderButton("remove"),cancel:e._renderButton("cancel"),browse:e._renderButton("browse")})},_renderButton:function(e){var i=this,a=i._getLayoutTemplate("btnDefault"),r=i[e+"Class"],n=i[e+"Title"],o=i[e+"Icon"],l=i[e+"Label"],s=i.isDisabled?" disabled":"",d="button";switch(e){case"remove":if(!i.showRemove)return"";break;case"cancel":if(!i.showCancel)return"";r+=" kv-hidden";break;case"upload":if(!i.showUpload)return"";i.isAjaxUpload&&!i.isDisabled?a=i._getLayoutTemplate("btnLink").replace("{href}",i.uploadUrl):d="submit";break;case"browse":if(!i.showBrowse)return"";a=i._getLayoutTemplate("btnBrowse");break;default:return""}return r+="browse"===e?" btn-file":" fileinput-"+e+" fileinput-"+e+"-button",t.isEmpty(l)||(l=' '+l+""),a.setTokens({type:d,css:r,title:n,status:s,icon:o,label:l})},_renderThumbProgress:function(){var e=this;return'
            '+e.progressTemplate.setTokens({percent:"0",status:e.msgUploadBegin})+"
            "},_renderFileFooter:function(e,i,a,r){var n,o=this,l=o.fileActionSettings,s=l.showRemove,d=l.showDrag,c=l.showUpload,p=l.showZoom,u=o._getLayoutTemplate("footer"),f=o._getLayoutTemplate("indicator"),m=r?l.indicatorError:l.indicatorNew,v=r?l.indicatorErrorTitle:l.indicatorNewTitle,g=f.setTokens({indicator:m,indicatorTitle:v});return i=o._getSize(i),n=o.isAjaxUpload?u.setTokens({actions:o._renderFileActions(c,!1,s,p,d,!1,!1,!1),caption:e,size:i,width:a,progress:o._renderThumbProgress(),indicator:g}):u.setTokens({actions:o._renderFileActions(!1,!1,!1,p,d,!1,!1,!1),caption:e,size:i,width:a,progress:"",indicator:g}),n=t.replaceTags(n,o.previewThumbTags)},_renderFileActions:function(e,t,i,a,r,n,o,l,s,d,c){if(!(e||t||i||a||r))return"";var p,u=this,f=o===!1?"":' data-url="'+o+'"',m=l===!1?"":' data-key="'+l+'"',v="",g="",h="",w="",_="",b=u._getLayoutTemplate("actions"),C=u.fileActionSettings,y=u.otherActionButtons.setTokens({dataKey:m,key:l}),x=n?C.removeClass+" disabled":C.removeClass;return i&&(v=u._getLayoutTemplate("actionDelete").setTokens({removeClass:x,removeIcon:C.removeIcon,removeTitle:C.removeTitle,dataUrl:f,dataKey:m,key:l})),e&&(g=u._getLayoutTemplate("actionUpload").setTokens({uploadClass:C.uploadClass,uploadIcon:C.uploadIcon,uploadTitle:C.uploadTitle})),t&&(h=u._getLayoutTemplate("actionDownload").setTokens({downloadClass:C.downloadClass,downloadIcon:C.downloadIcon,downloadTitle:C.downloadTitle,downloadUrl:d||u.initialPreviewDownloadUrl}),h=h.setTokens({filename:c,key:l})),a&&(w=u._getLayoutTemplate("actionZoom").setTokens({zoomClass:C.zoomClass,zoomIcon:C.zoomIcon,zoomTitle:C.zoomTitle})),r&&s&&(p="drag-handle-init "+C.dragClass,_=u._getLayoutTemplate("actionDrag").setTokens({dragClass:p,dragTitle:C.dragTitle,dragIcon:C.dragIcon})),b.setTokens({"delete":v,upload:g,download:h,zoom:w,drag:_,other:y})},_browse:function(e){var t=this;t._raise("filebrowse"),e&&e.isDefaultPrevented()||(t.isError&&!t.isAjaxUpload&&t.clear(),t.$captionContainer.focus())},_filterDuplicate:function(e,t,i){var a=this,r=a._getFileId(e);r&&i&&i.indexOf(r)>-1||(i||(i=[]),t.push(e),i.push(r))},_change:function(i){var a=this,r=a.$element;if(!a.isAjaxUpload&&t.isEmpty(r.val())&&a.fileInputCleared)return void(a.fileInputCleared=!1);a.fileInputCleared=!1;var n,o,l,s,d=[],c=arguments.length>1,p=a.isAjaxUpload,u=c?i.originalEvent.dataTransfer.files:r.get(0).files,f=a.filestack.length,m=t.isEmpty(r.attr("multiple")),v=m&&f>0,g=0,h=a._getFileIds(),w=function(t,i,r,n){var o=e.extend(!0,{},a._getOutData({},{},u),{id:r,index:n}),l={id:r,index:n,file:i,files:u};return a.isAjaxUpload?a._showUploadError(t,o):a._showError(t,l)};if(a.reader=null,a._resetUpload(),a._hideFileIcon(),a.isAjaxUpload&&a.$container.find(".file-drop-zone ."+a.dropZoneTitleClass).remove(),c?e.each(u,function(e,t){t&&!t.type&&void 0!==t.size&&t.size%4096===0?g++:a._filterDuplicate(t,d,h)}):(u=i.target&&void 0===i.target.files?i.target.value?[{name:i.target.value.replace(/^.+\\/,"")}]:[]:i.target.files||{},p?e.each(u,function(e,t){a._filterDuplicate(t,d,h)}):d=u),t.isEmpty(d)||0===d.length)return p||a.clear(),a._showFolderError(g),void a._raise("fileselectnone");if(a._resetErrors(),s=d.length,o=a._getFileCount(a.isAjaxUpload?a.getFileStack().length+s:s),a.maxFileCount>0&&o>a.maxFileCount){if(!a.autoReplace||s>a.maxFileCount)return l=a.autoReplace&&s>a.maxFileCount?s:o,n=a.msgFilesTooMany.replace("{m}",a.maxFileCount).replace("{n}",l),a.isError=w(n,null,null,null),a.$captionContainer.removeClass("icon-visible"),a._setCaption("",!0),void a.$container.removeClass("file-input-new file-input-ajax-new");o>a.maxFileCount&&a._resetPreviewThumbs(p)}else!p||v?(a._resetPreviewThumbs(!1),v&&a.clearStack()):!p||0!==f||a.previewCache.count()&&!a.overwriteInitial||a._resetPreviewThumbs(!0);a.isPreviewable?a.readFiles(d):a._updateFileDetails(1),a._showFolderError(g)},_abort:function(t){var i,a=this;return a.ajaxAborted&&"object"==typeof a.ajaxAborted&&void 0!==a.ajaxAborted.message?(i=e.extend(!0,{},a._getOutData(),t),i.abortData=a.ajaxAborted.data||{},i.abortMessage=a.ajaxAborted.message,a._setProgress(101,a.$progress,a.msgCancelled),a._showUploadError(a.ajaxAborted.message,i,"filecustomerror"),a.cancel(),!0):!!a.ajaxAborted},_resetFileStack:function(){var i=this,a=0,r=[],n=[],o=[];i._getThumbs().each(function(){var l,s=e(this),d=s.attr("data-fileindex"),c=i.filestack[d],p=s.attr("id");"-1"!==d&&-1!==d&&(void 0!==c?(r[a]=c,n[a]=i._getFileName(c),o[a]=i._getFileId(c),s.attr({id:i.previewInitId+"-"+a,"data-fileindex":a}),a++):(l="uploaded-"+t.uniqId(),s.attr({id:l,"data-fileindex":"-1"}),i.$preview.find("#zoom-"+p).attr("id","zoom-"+l)))}),i.filestack=r,i.filenames=n,i.fileids=o},_isFileSelectionValid:function(e){var t=this;return e=e||0,t.required&&!t.getFilesCount()?(t.$errorContainer.html(""),t._showUploadError(t.msgFileRequired),!1):t.minFileCount>0&&t._getFileCount(e)=f)return r.isAjaxUpload&&r.filestack.length>0?r._raise("filebatchselected",[r.getFileStack()]):r._raise("filebatchselected",[i]),s.removeClass("file-thumb-loading"),void d.html("");var T,E,S,k,F,P,I,A,z,D,$,j,U=v+x,B=u+"-"+U,O=i[x],R=m.text,L=m.image,M=m.html,Z=O.name?r.slug(O.name):"",N=(O.size||0)/1e3,H="",V=t.objUrl.createObjectURL(O),W=0,q="",K=0,Y=function(){var e=p.setTokens({index:x+1,files:f,percent:50,name:Z});setTimeout(function(){d.html(e),r._updateFileDetails(f),a(x+1)},100),r._raise("fileloaded",[O,B,x,l])};if(h>0)for(E=0;h>E;E++)P=g[E],I=r.msgFileTypes[P]||P,q+=0===E?I:", "+I;if(Z===!1)return void a(x+1);if(0===Z.length)return S=r.msgInvalidFileName.replace("{name}",t.htmlEncode(O.name)),void y(S,O,B,x);if(t.isEmpty(w)||(H=new RegExp("\\.("+w.join("|")+")$","i")),T=N.toFixed(2),r.maxFileSize>0&&N>r.maxFileSize)return S=r.msgSizeTooLarge.setTokens({name:Z,size:T,maxSize:r.maxFileSize}),void y(S,O,B,x);if(null!==r.minFileSize&&N<=t.getNum(r.minFileSize))return S=r.msgSizeTooSmall.setTokens({name:Z,size:T,minSize:r.minFileSize}),void y(S,O,B,x);if(!t.isEmpty(g)&&t.isArray(g)){for(E=0;Eb?(r.addToStack(O),s.addClass("file-thumb-loading"),r._previewDefault(O,B),r._initFileActions(),r._updateFileDetails(f),void a(x+1)):(o.length&&void 0!==FileReader?(z=R(O.type,Z),D=M(O.type,Z),$=L(O.type,Z),d.html(c.replace("{index}",x+1).replace("{files}",f)),s.addClass("file-thumb-loading"),l.onerror=function(e){r._errorHandler(e,Z)},l.onload=function(i){var a,n,o,s,d,c,p=[],u=function(e){var t=new FileReader;t.onerror=function(e){r._errorHandler(e,Z)},t.onload=function(e){r._previewFile(x,O,e,B,V,n),r._initFileActions(),Y()},e?t.readAsText(O,r.textEncoding):t.readAsDataURL(O)};if(n={name:Z,type:O.type},e.each(m,function(e,t){"object"!==e&&"other"!==e&&t(O.type,Z)&&K++}),0===K){for(o=new Uint8Array(i.target.result),E=0;E0)for(t=0;r>t;t+=1)i.cancelling=!0,a[t].abort();return i._setProgressCancelled(),i._getThumbs().each(function(){var t=e(this),a=t.attr("data-fileindex");t.removeClass("file-uploading"),void 0!==i.filestack[a]&&(t.find(".kv-file-upload").removeClass("disabled").removeAttr("disabled"),t.find(".kv-file-remove").removeClass("disabled").removeAttr("disabled")),i.unlock()}),i.$element},clear:function(){var i,a=this;if(a._raise("fileclear"))return a.$btnUpload.removeAttr("disabled"),a._getThumbs().find("video,audio,img").each(function(){t.cleanMemory(e(this))}),a._resetUpload(),a.clearStack(),a._clearFileInput(),a._resetErrors(!0),a._hasInitialPreview()?(a._showFileIcon(),a._resetPreview(),a._initPreviewActions(),a.$container.removeClass("file-input-new")):(a._getThumbs().each(function(){a._clearObjects(e(this))}),a.isAjaxUpload&&(a.previewCache.data={}),a.$preview.html(""),i=!a.overwriteInitial&&a.initialCaption.length>0?a.initialCaption:"",a.$caption.attr("title","").val(i),t.addCss(a.$container,"file-input-new"),a._validateDefaultPreview()),0===a.$container.find(t.FRAMES).length&&(a._initCaption()||a.$captionContainer.removeClass("icon-visible")),a._hideFileIcon(),a._raise("filecleared"),a.$captionContainer.focus(),a._setFileDropZoneTitle(),a.$element},reset:function(){var e=this;if(e._raise("filereset"))return e._resetPreview(),e.$container.find(".fileinput-filename").text(""),t.addCss(e.$container,"file-input-new"),(e.getFrames().length||e.isAjaxUpload&&e.dropZoneEnabled)&&e.$container.removeClass("file-input-new"),e.clearStack(),e.formdata={},e._setFileDropZoneTitle(),e.$element},disable:function(){var e=this;return e.isDisabled=!0,e._raise("filedisabled"),e.$element.attr("disabled","disabled"),e.$container.find(".kv-fileinput-caption").addClass("file-caption-disabled"),e.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").attr("disabled",!0),t.addCss(e.$container.find(".btn-file"),"disabled"),e._initDragDrop(),e.$element},enable:function(){var e=this;return e.isDisabled=!1,e._raise("fileenabled"),e.$element.removeAttr("disabled"),e.$container.find(".kv-fileinput-caption").removeClass("file-caption-disabled"),e.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").removeAttr("disabled"),e.$container.find(".btn-file").removeClass("disabled"),e._initDragDrop(),e.$element},upload:function(){var i,a,r,n=this,o=n.getFileStack().length,l=!e.isEmptyObject(n._getExtraData());if(n.isAjaxUpload&&!n.isDisabled&&n._isFileSelectionValid(o)){if(n._resetUpload(),0===o&&!l)return void n._showUploadError(n.msgUploadEmpty);if(n.$progress.show(),n.uploadCount=0,n.uploadStatus={},n.uploadLog=[],n.lock(),n._setProgress(2),0===o&&l)return void n._uploadExtraOnly();if(r=n.filestack.length,n.hasInitData=!1,!n.uploadAsync)return n._uploadBatch(),n.$element;for(a=n._getOutData(),n._raise("filebatchpreupload",[a]),n.fileBatchCompleted=!1,n.uploadCache={content:[],config:[],tags:[],append:!0},n.uploadAsyncCount=n.getFileStack().length,i=0;r>i;i++)n.uploadCache.content[i]=null,n.uploadCache.config[i]=null,n.uploadCache.tags[i]=null;for(n.$preview.find(".file-preview-initial").removeClass(t.SORT_CSS),n._initSortable(),n.cacheInitialPreview=n.getPreview(),i=0;r>i;i++)n.filestack[i]&&n._uploadSingle(i,!0)}},destroy:function(){var t=this,i=t.$form,a=t.$container,r=t.$element,n=t.namespace;return e(document).off(n),e(window).off(n),i&&i.length&&i.off(n),t.isAjaxUpload&&t._clearFileInput(),t._cleanup(),t._initPreviewCache(),r.insertBefore(a).off(n).removeData(),a.off().remove(),r},refresh:function(i,a){var r=this,n=r.$element;return i="object"!=typeof i||t.isEmpty(i)?r.options:e.extend(!0,{},r.options,i),r._init(i,!0),r._listen(),a&&n.trigger("change"+r.namespace),n},zoom:function(e){var i=this,a=i._getFrame(e),r=i.$modal;a&&(t.initModal(r),r.html(i._getModalContent()),i._setZoomContent(a),r.modal("show"),i._initZoomButtons())},getExif:function(e){var t=this,i=t._getFrame(e);return i&&i.data("exif")||null},getFrames:function(i){var a,r=this;return i=i||"",a=r.$preview.find(t.FRAMES+i),r.reversePreviewOrder&&(a=e(a.get().reverse())),a},getPreview:function(){var e=this;return{content:e.initialPreview,config:e.initialPreviewConfig,tags:e.initialPreviewThumbTags}}},e.fn.fileinput=function(a){if(t.hasFileAPISupport()||t.isIE(9)){var r=Array.apply(null,arguments),n=[];switch(r.shift(),this.each(function(){var o,l=e(this),s=l.data("fileinput"),d="object"==typeof a&&a,c=d.theme||l.data("theme"),p={},u={},f=d.language||l.data("language")||e.fn.fileinput.defaults.language||"en";s||(c&&(u=e.fn.fileinputThemes[c]||{}),"en"===f||t.isEmpty(e.fn.fileinputLocales[f])||(p=e.fn.fileinputLocales[f]||{}),o=e.extend(!0,{},e.fn.fileinput.defaults,u,e.fn.fileinputLocales.en,p,d,l.data()),s=new i(this,o),l.data("fileinput",s)),"string"==typeof a&&n.push(s[a].apply(s,r))}),n.length){case 0:return this;case 1:return n[0];default:return n}}},e.fn.fileinput.defaults={language:"en",showCaption:!0,showBrowse:!0,showPreview:!0,showRemove:!0,showUpload:!0,showCancel:!0,showClose:!0,showUploadedThumbs:!0,browseOnZoneClick:!1,autoReplace:!1,autoOrientImage:!0,required:!1,rtl:!1,hideThumbnailContent:!1,generateFileId:null,previewClass:"",captionClass:"",frameClass:"krajee-default",mainClass:"file-caption-main",mainTemplate:null,purifyHtml:!0,fileSizeGetter:null,initialCaption:"",initialPreview:[],initialPreviewDelimiter:"*$$*",initialPreviewAsData:!1,initialPreviewFileType:"image",initialPreviewConfig:[],initialPreviewThumbTags:[],previewThumbTags:{},initialPreviewShowDelete:!0,initialPreviewDownloadUrl:"",removeFromPreviewOnError:!1,deleteUrl:"",deleteExtraData:{},overwriteInitial:!0,previewZoomButtonIcons:{prev:'',next:'',toggleheader:'',fullscreen:'',borderless:'',close:''},previewZoomButtonClasses:{prev:"btn btn-navigate",next:"btn btn-navigate",toggleheader:"btn btn-sm btn-kv btn-default btn-outline-secondary",fullscreen:"btn btn-sm btn-kv btn-default btn-outline-secondary",borderless:"btn btn-sm btn-kv btn-default btn-outline-secondary",close:"btn btn-sm btn-kv btn-default btn-outline-secondary"},preferIconicPreview:!1,preferIconicZoomPreview:!1,allowedPreviewTypes:void 0,allowedPreviewMimeTypes:null,allowedFileTypes:null,allowedFileExtensions:null,defaultPreviewContent:null,customLayoutTags:{},customPreviewTags:{},previewFileIcon:'',previewFileIconClass:"file-other-icon",previewFileIconSettings:{},previewFileExtSettings:{},buttonLabelClass:"hidden-xs",browseIcon:' ',browseClass:"btn btn-primary",removeIcon:'',removeClass:"btn btn-default btn-secondary",cancelIcon:'',cancelClass:"btn btn-default btn-secondary",uploadIcon:'',uploadClass:"btn btn-default btn-secondary",uploadUrl:null,uploadUrlThumb:null,uploadAsync:!0,uploadExtraData:{},zoomModalHeight:480,minImageWidth:null,minImageHeight:null,maxImageWidth:null,maxImageHeight:null,resizeImage:!1,resizePreference:"width",resizeQuality:.92,resizeDefaultImageType:"image/jpeg",resizeIfSizeMoreThan:0,minFileSize:0,maxFileSize:0,maxFilePreviewSize:25600,minFileCount:0,maxFileCount:0,validateInitialCount:!1,msgValidationErrorClass:"text-danger",msgValidationErrorIcon:' ',msgErrorClass:"file-error-message",progressThumbClass:"progress-bar bg-success progress-bar-success progress-bar-striped active",progressClass:"progress-bar bg-success progress-bar-success progress-bar-striped active",progressCompleteClass:"progress-bar bg-success progress-bar-success",progressErrorClass:"progress-bar bg-danger progress-bar-danger",progressUploadThreshold:99,previewFileType:"image",elCaptionContainer:null,elCaptionText:null,elPreviewContainer:null,elPreviewImage:null,elPreviewStatus:null,elErrorContainer:null,errorCloseButton:t.closeButton("kv-error-close"),slugCallback:null,dropZoneEnabled:!0,dropZoneTitleClass:"file-drop-zone-title",fileActionSettings:{},otherActionButtons:"",textEncoding:"UTF-8",ajaxSettings:{},ajaxDeleteSettings:{},showAjaxErrorDetails:!0,mergeAjaxCallbacks:!1,mergeAjaxDeleteCallbacks:!1,retryErrorUploads:!0,reversePreviewOrder:!1},e.fn.fileinputLocales.en={fileSingle:"file",filePlural:"files",browseLabel:"Browse …",removeLabel:"Remove",removeTitle:"Clear selected files",cancelLabel:"Cancel",cancelTitle:"Abort ongoing upload",uploadLabel:"Upload",uploadTitle:"Upload selected files",msgNo:"No",msgNoFilesSelected:"No files selected",msgCancelled:"Cancelled",msgPlaceholder:"Select {files}...",msgZoomModalHeading:"Detailed Preview",msgFileRequired:"You must select a file to upload.",msgSizeTooSmall:'File "{name}" ({size} KB) is too small and must be larger than {minSize} KB.',msgSizeTooLarge:'File "{name}" ({size} KB) exceeds maximum allowed upload size of {maxSize} KB.',msgFilesTooLess:"You must select at least {n} {files} to upload.",msgFilesTooMany:"Number of files selected for upload ({n}) exceeds maximum allowed limit of {m}.",msgFileNotFound:'File "{name}" not found!',msgFileSecured:'Security restrictions prevent reading the file "{name}".',msgFileNotReadable:'File "{name}" is not readable.',msgFilePreviewAborted:'File preview aborted for "{name}".',msgFilePreviewError:'An error occurred while reading the file "{name}".',msgInvalidFileName:'Invalid or unsupported characters in file name "{name}".',msgInvalidFileType:'Invalid type for file "{name}". Only "{types}" files are supported.',msgInvalidFileExtension:'Invalid extension for file "{name}". Only "{extensions}" files are supported.',msgFileTypes:{image:"image",html:"HTML",text:"text",video:"video",audio:"audio",flash:"flash",pdf:"PDF",object:"object"},msgUploadAborted:"The file upload was aborted",msgUploadThreshold:"Processing...",msgUploadBegin:"Initializing...",msgUploadEnd:"Done",msgUploadEmpty:"No valid data available for upload.",msgUploadError:"Error",msgValidationError:"Validation Error",msgLoading:"Loading file {index} of {files} …",msgProgress:"Loading file {index} of {files} - {name} - {percent}% completed.",msgSelected:"{n} {files} selected",msgFoldersNotAllowed:"Drag & drop files only! {n} folder(s) dropped were skipped.",msgImageWidthSmall:'Width of image file "{name}" must be at least {size} px.',msgImageHeightSmall:'Height of image file "{name}" must be at least {size} px.',msgImageWidthLarge:'Width of image file "{name}" cannot exceed {size} px.',msgImageHeightLarge:'Height of image file "{name}" cannot exceed {size} px.',msgImageResizeError:"Could not get the image dimensions to resize.",msgImageResizeException:"Error while resizing the image.
            {errors}
            ",msgAjaxError:"Something went wrong with the {operation} operation. Please try again later!",msgAjaxProgressError:"{operation} failed",ajaxOperations:{deleteThumb:"file delete",uploadThumb:"file upload",uploadBatch:"batch file upload",uploadExtra:"form data upload"},dropZoneTitle:"Drag & drop files here …",dropZoneClickTitle:"
            (or click to select {files})",previewZoomButtonTitles:{prev:"View previous file",next:"View next file",toggleheader:"Toggle header",fullscreen:"Toggle full screen",borderless:"Toggle borderless mode",close:"Close detailed preview"}},e.fn.fileinput.Constructor=i,e(document).ready(function(){var t=e("input.file[type=file]");t.length&&t.fileinput()})}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/zh.min.js b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/zh.min.js new file mode 100755 index 00000000..469fa380 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-fileinput/zh.min.js @@ -0,0 +1,101 @@ +/*! + * FileInput Chinese Translations + * + * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or + * any HTML markup tags in the messages must not be converted or translated. + * + * @see http://github.com/kartik-v/bootstrap-fileinput + * @author kangqf + * + * NOTE: this file must be saved in UTF-8 encoding. + */ +(function ($) { + "use strict"; + + $.fn.fileinputLocales['zh'] = { + fileSingle: '文件', + filePlural: '个文件', + browseLabel: '选择 …', + removeLabel: '移除', + removeTitle: '清除选中文件', + cancelLabel: '取消', + cancelTitle: '取消进行中的上传', + uploadLabel: '上传', + uploadTitle: '上传选中文件', + msgNo: '没有', + msgNoFilesSelected: '未选择文件', + msgCancelled: '取消', + msgPlaceholder: '选择 {files}...', + msgZoomModalHeading: '详细预览', + msgFileRequired: '必须选择一个文件上传.', + msgSizeTooSmall: '文件 "{name}" ({size} KB) 必须大于限定大小 {minSize} KB.', + msgSizeTooLarge: '文件 "{name}" ({size} KB) 超过了允许大小 {maxSize} KB.', + msgFilesTooLess: '你必须选择最少 {n} {files} 来上传. ', + msgFilesTooMany: '选择的上传文件个数 ({n}) 超出最大文件的限制个数 {m}.', + msgFileNotFound: '文件 "{name}" 未找到!', + msgFileSecured: '安全限制,为了防止读取文件 "{name}".', + msgFileNotReadable: '文件 "{name}" 不可读.', + msgFilePreviewAborted: '取消 "{name}" 的预览.', + msgFilePreviewError: '读取 "{name}" 时出现了一个错误.', + msgInvalidFileName: '文件名 "{name}" 包含非法字符.', + msgInvalidFileType: '不正确的类型 "{name}". 只支持 "{types}" 类型的文件.', + msgInvalidFileExtension: '不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.', + msgFileTypes: { + 'image': 'image', + 'html': 'HTML', + 'text': 'text', + 'video': 'video', + 'audio': 'audio', + 'flash': 'flash', + 'pdf': 'PDF', + 'object': 'object' + }, + msgUploadAborted: '该文件上传被中止', + msgUploadThreshold: '处理中...', + msgUploadBegin: '正在初始化...', + msgUploadEnd: '完成', + msgUploadEmpty: '无效的文件上传.', + msgUploadError: '上传出错', + msgValidationError: '验证错误', + msgLoading: '加载第 {index} 文件 共 {files} …', + msgProgress: '加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.', + msgSelected: '{n} {files} 选中', + msgFoldersNotAllowed: '只支持拖拽文件! 跳过 {n} 拖拽的文件夹.', + msgImageWidthSmall: '图像文件的"{name}"的宽度必须是至少{size}像素.', + msgImageHeightSmall: '图像文件的"{name}"的高度必须至少为{size}像素.', + msgImageWidthLarge: '图像文件"{name}"的宽度不能超过{size}像素.', + msgImageHeightLarge: '图像文件"{name}"的高度不能超过{size}像素.', + msgImageResizeError: '无法获取的图像尺寸调整。', + msgImageResizeException: '调整图像大小时发生错误。
            {errors}
            ', + msgAjaxError: '{operation} 发生错误. 请重试!', + msgAjaxProgressError: '{operation} 失败', + ajaxOperations: { + deleteThumb: '删除文件', + uploadThumb: '上传文件', + uploadBatch: '批量上传', + uploadExtra: '表单数据上传' + }, + dropZoneTitle: '拖拽文件到这里 …
            支持多文件同时上传', + dropZoneClickTitle: '
            (或点击{files}按钮选择文件)', + fileActionSettings: { + removeTitle: '删除文件', + uploadTitle: '上传文件', + downloadTitle: '下载文件', + uploadRetryTitle: '重试', + zoomTitle: '查看详情', + dragTitle: '移动 / 重置', + indicatorNewTitle: '没有上传', + indicatorSuccessTitle: '上传', + indicatorErrorTitle: '上传错误', + indicatorLoadingTitle: '上传 ...' + }, + previewZoomButtonTitles: { + prev: '预览上一个文件', + next: '预览下一个文件', + toggleheader: '缩放', + fullscreen: '全屏', + borderless: '无边界模式', + close: '关闭当前预览' + } + }; +})(window.jQuery); diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-select/bootstrap-select.min.css b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-select/bootstrap-select.min.css new file mode 100755 index 00000000..76f2ab17 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-select/bootstrap-select.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap-select v1.7.2 (http://silviomoreto.github.io/bootstrap-select) + * + * Copyright 2013-2015 bootstrap-select + * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE) + */.bootstrap-select{width:220px \0}.bootstrap-select>.dropdown-toggle{width:100%;padding-right:25px}.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle{border-color:#b94a48}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none}.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{z-index:auto}.bootstrap-select.btn-group:not(.input-group-btn),.bootstrap-select.btn-group[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.btn-group.dropdown-menu-right,.bootstrap-select.btn-group[class*=col-].dropdown-menu-right,.row .bootstrap-select.btn-group[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select.btn-group,.form-horizontal .bootstrap-select.btn-group,.form-inline .bootstrap-select.btn-group{margin-bottom:0}.form-group-lg .bootstrap-select.btn-group.form-control,.form-group-sm .bootstrap-select.btn-group.form-control{padding:0}.form-inline .bootstrap-select.btn-group .form-control{width:100%}.bootstrap-select.btn-group.disabled,.bootstrap-select.btn-group>.disabled{cursor:not-allowed}.bootstrap-select.btn-group.disabled:focus,.bootstrap-select.btn-group>.disabled:focus{outline:0!important}.bootstrap-select.btn-group .dropdown-toggle .filter-option{display:inline-block;overflow:hidden;width:100%;text-align:left}.bootstrap-select.btn-group .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select.btn-group[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select.btn-group .dropdown-menu{min-width:100%;z-index:1035;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select.btn-group .dropdown-menu li{position:relative}.bootstrap-select.btn-group .dropdown-menu li.active small{color:#fff}.bootstrap-select.btn-group .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select.btn-group .dropdown-menu li a{cursor:pointer}.bootstrap-select.btn-group .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select.btn-group .dropdown-menu li a span.check-mark{display:none}.bootstrap-select.btn-group .dropdown-menu li a span.text{display:inline-block}.bootstrap-select.btn-group .dropdown-menu li small{padding-left:.5em}.bootstrap-select.btn-group .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option{position:static}.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark{position:absolute;display:inline-block;right:15px;margin-top:5px}.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle{z-index:1036}.bootstrap-select.show-menu-arrow .dropdown-toggle:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%}select.bs-select-hidden,select.selectpicker{display:none!important}select.mobile-device{position:absolute!important;top:0;left:0;display:block!important;width:100%;height:100%!important;opacity:0} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-select/bootstrap-select.min.js b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-select/bootstrap-select.min.js new file mode 100755 index 00000000..63356aed --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-select/bootstrap-select.min.js @@ -0,0 +1,8 @@ +/*! + * Bootstrap-select v1.7.2 (http://silviomoreto.github.io/bootstrap-select) + * + * Copyright 2013-2015 bootstrap-select + * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE) + */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){"use strict";function b(b){var c=[{re:/[\xC0-\xC6]/g,ch:"A"},{re:/[\xE0-\xE6]/g,ch:"a"},{re:/[\xC8-\xCB]/g,ch:"E"},{re:/[\xE8-\xEB]/g,ch:"e"},{re:/[\xCC-\xCF]/g,ch:"I"},{re:/[\xEC-\xEF]/g,ch:"i"},{re:/[\xD2-\xD6]/g,ch:"O"},{re:/[\xF2-\xF6]/g,ch:"o"},{re:/[\xD9-\xDC]/g,ch:"U"},{re:/[\xF9-\xFC]/g,ch:"u"},{re:/[\xC7-\xE7]/g,ch:"c"},{re:/[\xD1]/g,ch:"N"},{re:/[\xF1]/g,ch:"n"}];return a.each(c,function(){b=b.replace(this.re,this.ch)}),b}function c(a){var b={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},c="(?:"+Object.keys(b).join("|")+")",d=new RegExp(c),e=new RegExp(c,"g"),f=null==a?"":""+a;return d.test(f)?f.replace(e,function(a){return b[a]}):f}function d(b,c){var d=arguments,f=b,g=c;[].shift.apply(d);var h,i=this.each(function(){var b=a(this);if(b.is("select")){var c=b.data("selectpicker"),i="object"==typeof f&&f;if(c){if(i)for(var j in i)i.hasOwnProperty(j)&&(c.options[j]=i[j])}else{var k=a.extend({},e.DEFAULTS,a.fn.selectpicker.defaults||{},b.data(),i);b.data("selectpicker",c=new e(this,k,g))}"string"==typeof f&&(h=c[f]instanceof Function?c[f].apply(c,d):c.options[f])}});return"undefined"!=typeof h?h:i}String.prototype.includes||!function(){var a={}.toString,b=function(){try{var a={},b=Object.defineProperty,c=b(a,a,a)&&b}catch(d){}return c}(),c="".indexOf,d=function(b){if(null==this)throw TypeError();var d=String(this);if(b&&"[object RegExp]"==a.call(b))throw TypeError();var e=d.length,f=String(b),g=f.length,h=arguments.length>1?arguments[1]:void 0,i=h?Number(h):0;i!=i&&(i=0);var j=Math.min(Math.max(i,0),e);return g+j>e?!1:-1!=c.call(d,f,i)};b?b(String.prototype,"includes",{value:d,configurable:!0,writable:!0}):String.prototype.includes=d}(),String.prototype.startsWith||!function(){var a=function(){try{var a={},b=Object.defineProperty,c=b(a,a,a)&&b}catch(d){}return c}(),b={}.toString,c=function(a){if(null==this)throw TypeError();var c=String(this);if(a&&"[object RegExp]"==b.call(a))throw TypeError();var d=c.length,e=String(a),f=e.length,g=arguments.length>1?arguments[1]:void 0,h=g?Number(g):0;h!=h&&(h=0);var i=Math.min(Math.max(h,0),d);if(f+i>d)return!1;for(var j=-1;++j'+this.options.header+"
            ":"",g=this.options.liveSearch?'":"",h=this.multiple&&this.options.actionsBox?'
            ":"",i=this.multiple&&this.options.doneButton?'
            ":"",j='
            ";return a(j)},createView:function(){var a=this.createDropdown(),b=this.createLi();return a.find("ul")[0].innerHTML=b,a},reloadLi:function(){this.destroyLi();var a=this.createLi();this.$menuInner[0].innerHTML=a},destroyLi:function(){this.$menu.find("li").remove()},createLi:function(){var d=this,e=[],f=0,g=document.createElement("option"),h=-1,i=function(a,b,c,d){return""+a+""},j=function(a,e,f,g){return'"+a+''};if(this.options.title&&!this.multiple&&(h--,!this.$element.find(".bs-title-option").length)){var k=this.$element[0];g.className="bs-title-option",g.appendChild(document.createTextNode(this.options.title)),g.value="",k.insertBefore(g,k.firstChild),null===k.options[k.selectedIndex].getAttribute("selected")&&(g.selected=!0)}return this.$element.find("option").each(function(b){var c=a(this);if(h++,!c.hasClass("bs-title-option")){var g=this.className||"",k=this.style.cssText,l=c.data("content")?c.data("content"):c.html(),m=c.data("tokens")?c.data("tokens"):null,n="undefined"!=typeof c.data("subtext")?''+c.data("subtext")+"":"",o="undefined"!=typeof c.data("icon")?' ':"",p=this.disabled||"OPTGROUP"===this.parentElement.tagName&&this.parentElement.disabled;if(""!==o&&p&&(o=""+o+""),d.options.hideDisabled&&p)return void h--;if(c.data("content")||(l=o+''+l+n+""),"OPTGROUP"===this.parentElement.tagName&&c.data("divider")!==!0){if(0===c.index()){f+=1;var q=this.parentElement.label,r="undefined"!=typeof c.parent().data("subtext")?''+c.parent().data("subtext")+"":"",s=c.parent().data("icon")?' ':"",t=" "+this.parentElement.className||"";q=s+''+q+r+"",0!==b&&e.length>0&&(h++,e.push(i("",null,"divider",f+"div"))),h++,e.push(i(q,null,"dropdown-header"+t,f))}e.push(i(j(l,"opt "+g+t,k,m),b,"",f))}else c.data("divider")===!0?e.push(i("",b,"divider")):c.data("hidden")===!0?e.push(i(j(l,g,k,m),b,"hidden is-hidden")):(this.previousElementSibling&&"OPTGROUP"===this.previousElementSibling.tagName&&(h++,e.push(i("",null,"divider",f+"div"))),e.push(i(j(l,g,k,m),b)));d.liObj[b]=h}}),this.multiple||0!==this.$element.find("option:selected").length||this.options.title||this.$element.find("option").eq(0).prop("selected",!0).attr("selected","selected"),e.join("")},findLis:function(){return null==this.$lis&&(this.$lis=this.$menu.find("li")),this.$lis},render:function(b){var c,d=this;b!==!1&&this.$element.find("option").each(function(a){var b=d.findLis().eq(d.liObj[a]);d.setDisabled(a,this.disabled||"OPTGROUP"===this.parentElement.tagName&&this.parentElement.disabled,b),d.setSelected(a,this.selected,b)}),this.tabIndex();var e=this.$element.find("option").map(function(){if(this.selected){if(d.options.hideDisabled&&(this.disabled||"OPTGROUP"===this.parentElement.tagName&&this.parentElement.disabled))return!1;var b,c=a(this),e=c.data("icon")&&d.options.showIcon?' ':"";return b=d.options.showSubtext&&c.data("subtext")&&!d.multiple?' '+c.data("subtext")+"":"","undefined"!=typeof c.attr("title")?c.attr("title"):c.data("content")&&d.options.showContent?c.data("content"):e+c.html()+b}}).toArray(),f=this.multiple?e.join(this.options.multipleSeparator):e[0];if(this.multiple&&this.options.selectedTextFormat.indexOf("count")>-1){var g=this.options.selectedTextFormat.split(">");if(g.length>1&&e.length>g[1]||1==g.length&&e.length>=2){c=this.options.hideDisabled?", [disabled]":"";var h=this.$element.find("option").not('[data-divider="true"], [data-hidden="true"]'+c).length,i="function"==typeof this.options.countSelectedText?this.options.countSelectedText(e.length,h):this.options.countSelectedText;f=i.replace("{0}",e.length.toString()).replace("{1}",h.toString())}}void 0==this.options.title&&(this.options.title=this.$element.attr("title")),"static"==this.options.selectedTextFormat&&(f=this.options.title),f||(f="undefined"!=typeof this.options.title?this.options.title:this.options.noneSelectedText),this.$button.attr("title",a.trim(f.replace(/<[^>]*>?/g,""))),this.$button.children(".filter-option").html(f),this.$element.trigger("rendered.bs.select")},setStyle:function(a,b){this.$element.attr("class")&&this.$newElement.addClass(this.$element.attr("class").replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi,""));var c=a?a:this.options.style;"add"==b?this.$button.addClass(c):"remove"==b?this.$button.removeClass(c):(this.$button.removeClass(this.options.style),this.$button.addClass(c))},liHeight:function(b){if(b||this.options.size!==!1&&!this.sizeInfo){var c=document.createElement("div"),d=document.createElement("div"),e=document.createElement("ul"),f=document.createElement("li"),g=document.createElement("li"),h=document.createElement("a"),i=document.createElement("span"),j=this.options.header?this.$menu.find(".popover-title")[0].cloneNode(!0):null,k=this.options.liveSearch?document.createElement("div"):null,l=this.options.actionsBox&&this.multiple?this.$menu.find(".bs-actionsbox")[0].cloneNode(!0):null,m=this.options.doneButton&&this.multiple?this.$menu.find(".bs-donebutton")[0].cloneNode(!0):null;if(i.className="text",c.className=this.$menu[0].parentNode.className+" open",d.className="dropdown-menu open",e.className="dropdown-menu inner",f.className="divider",i.appendChild(document.createTextNode("Inner text")),h.appendChild(i),g.appendChild(h),e.appendChild(g),e.appendChild(f),j&&d.appendChild(j),k){var n=document.createElement("span");k.className="bs-searchbox",n.className="form-control",k.appendChild(n),d.appendChild(k)}l&&d.appendChild(l),d.appendChild(e),m&&d.appendChild(m),c.appendChild(d),document.body.appendChild(c);var o=h.offsetHeight,p=j?j.offsetHeight:0,q=k?k.offsetHeight:0,r=l?l.offsetHeight:0,s=m?m.offsetHeight:0,t=a(f).outerHeight(!0),u=getComputedStyle?getComputedStyle(d):!1,v=u?a(d):null,w=parseInt(u?u.paddingTop:v.css("paddingTop"))+parseInt(u?u.paddingBottom:v.css("paddingBottom"))+parseInt(u?u.borderTopWidth:v.css("borderTopWidth"))+parseInt(u?u.borderBottomWidth:v.css("borderBottomWidth")),x=w+parseInt(u?u.marginTop:v.css("marginTop"))+parseInt(u?u.marginBottom:v.css("marginBottom"))+2;document.body.removeChild(c),this.sizeInfo={liHeight:o,headerHeight:p,searchHeight:q,actionsHeight:r,doneButtonHeight:s,dividerHeight:t,menuPadding:w,menuExtras:x}}},setSize:function(){this.findLis(),this.liHeight();var b,c,d,e,f=this,g=this.$menu,h=this.$menuInner,i=a(window),j=this.$newElement[0].offsetHeight,k=this.sizeInfo.liHeight,l=this.sizeInfo.headerHeight,m=this.sizeInfo.searchHeight,n=this.sizeInfo.actionsHeight,o=this.sizeInfo.doneButtonHeight,p=this.sizeInfo.dividerHeight,q=this.sizeInfo.menuPadding,r=this.sizeInfo.menuExtras,s=this.options.hideDisabled?".disabled":"",t=function(){d=f.$newElement.offset().top-i.scrollTop(),e=i.height()-d-j};if(t(),this.options.header&&g.css("padding-top",0),"auto"===this.options.size){var u=function(){var i,j=function(b,c){return function(d){return c?d.classList?d.classList.contains(b):a(d).hasClass(b):!(d.classList?d.classList.contains(b):a(d).hasClass(b))}},p=f.$menuInner[0].getElementsByTagName("li"),s=Array.prototype.filter?Array.prototype.filter.call(p,j("hidden",!1)):f.$lis.not(".hidden"),u=Array.prototype.filter?Array.prototype.filter.call(s,j("dropdown-header",!0)):s.filter(".dropdown-header");t(),b=e-r,f.options.container?(g.data("height")||g.data("height",g.height()),c=g.data("height")):c=g.height(),f.options.dropupAuto&&f.$newElement.toggleClass("dropup",d>e&&c>b-r),f.$newElement.hasClass("dropup")&&(b=d-r),i=s.length+u.length>3?3*k+r-2:0,g.css({"max-height":b+"px",overflow:"hidden","min-height":i+l+m+n+o+"px"}),h.css({"max-height":b-l-m-n-o-q+"px","overflow-y":"auto","min-height":Math.max(i-q,0)+"px"})};u(),this.$searchbox.off("input.getSize propertychange.getSize").on("input.getSize propertychange.getSize",u),i.off("resize.getSize scroll.getSize").on("resize.getSize scroll.getSize",u)}else if(this.options.size&&"auto"!=this.options.size&&this.$lis.not(s).length>this.options.size){var v=this.$lis.not(".divider").not(s).children().slice(0,this.options.size).last().parent().index(),w=this.$lis.slice(0,v+1).filter(".divider").length;b=k*this.options.size+w*p+q,f.options.container?(g.data("height")||g.data("height",g.height()),c=g.data("height")):c=g.height(),f.options.dropupAuto&&this.$newElement.toggleClass("dropup",d>e&&c>b-r),g.css({"max-height":b+l+m+n+o+"px",overflow:"hidden","min-height":""}),h.css({"max-height":b-q+"px","overflow-y":"auto","min-height":""})}},setWidth:function(){if("auto"===this.options.width){this.$menu.css("min-width","0");var a=this.$menu.parent().clone().appendTo("body"),b=this.options.container?this.$newElement.clone().appendTo("body"):a,c=a.children(".dropdown-menu").outerWidth(),d=b.css("width","auto").children("button").outerWidth();a.remove(),b.remove(),this.$newElement.css("width",Math.max(c,d)+"px")}else"fit"===this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width","").addClass("fit-width")):this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width",this.options.width)):(this.$menu.css("min-width",""),this.$newElement.css("width",""));this.$newElement.hasClass("fit-width")&&"fit"!==this.options.width&&this.$newElement.removeClass("fit-width")},selectPosition:function(){var b,c,d=this,e="
            ",f=a(e),g=function(a){f.addClass(a.attr("class").replace(/form-control|fit-width/gi,"")).toggleClass("dropup",a.hasClass("dropup")),b=a.offset(),c=a.hasClass("dropup")?0:a[0].offsetHeight,f.css({top:b.top+c,left:b.left,width:a[0].offsetWidth,position:"absolute"})};this.$newElement.on("click",function(){d.isDisabled()||(g(a(this)),f.appendTo(d.options.container),f.toggleClass("open",!a(this).hasClass("open")),f.append(d.$menu))}),a(window).on("resize scroll",function(){g(d.$newElement)}),this.$element.on("hide.bs.select",function(){d.$menu.data("height",d.$menu.height()),f.detach()})},setSelected:function(a,b,c){if(!c)var c=this.findLis().eq(this.liObj[a]);c.toggleClass("selected",b)},setDisabled:function(a,b,c){if(!c)var c=this.findLis().eq(this.liObj[a]);b?c.addClass("disabled").children("a").attr("href","#").attr("tabindex",-1):c.removeClass("disabled").children("a").removeAttr("href").attr("tabindex",0)},isDisabled:function(){return this.$element[0].disabled},checkDisabled:function(){var a=this;this.isDisabled()?(this.$newElement.addClass("disabled"),this.$button.addClass("disabled").attr("tabindex",-1)):(this.$button.hasClass("disabled")&&(this.$newElement.removeClass("disabled"),this.$button.removeClass("disabled")),-1!=this.$button.attr("tabindex")||this.$element.data("tabindex")||this.$button.removeAttr("tabindex")),this.$button.click(function(){return!a.isDisabled()})},tabIndex:function(){this.$element.is("[tabindex]")&&(this.$element.data("tabindex",this.$element.attr("tabindex")),this.$button.attr("tabindex",this.$element.data("tabindex")))},clickListener:function(){var b=this,c=a(document);this.$newElement.on("touchstart.dropdown",".dropdown-menu",function(a){a.stopPropagation()}),c.data("spaceSelect",!1),this.$button.on("keyup",function(a){/(32)/.test(a.keyCode.toString(10))&&c.data("spaceSelect")&&(a.preventDefault(),c.data("spaceSelect",!1))}),this.$newElement.on("click",function(){b.setSize(),b.$element.on("shown.bs.select",function(){if(b.options.liveSearch||b.multiple){if(!b.multiple){var a=b.liObj[b.$element[0].selectedIndex];if("number"!=typeof a)return;var c=b.$lis.eq(a)[0].offsetTop-b.$menuInner[0].offsetTop;c=c-b.$menuInner[0].offsetHeight/2+b.sizeInfo.liHeight/2,b.$menuInner[0].scrollTop=c}}else b.$menu.find(".selected a").focus()})}),this.$menu.on("click","li a",function(c){var d=a(this),e=d.parent().data("originalIndex"),f=b.$element.val(),g=b.$element.prop("selectedIndex");if(b.multiple&&c.stopPropagation(),c.preventDefault(),!b.isDisabled()&&!d.parent().hasClass("disabled")){var h=b.$element.find("option"),i=h.eq(e),j=i.prop("selected"),k=i.parent("optgroup"),l=b.options.maxOptions,m=k.data("maxOptions")||!1;if(b.multiple){if(i.prop("selected",!j),b.setSelected(e,!j),d.blur(),l!==!1||m!==!1){var n=l
            ');q[2]&&(r=r.replace("{var}",q[2][l>1?0:1]),s=s.replace("{var}",q[2][m>1?0:1])),i.prop("selected",!1),b.$menu.append(t),l&&n&&(t.append(a("
            "+r+"
            ")),b.$element.trigger("maxReached.bs.select")),m&&o&&(t.append(a("
            "+s+"
            ")),b.$element.trigger("maxReachedGrp.bs.select")),setTimeout(function(){b.setSelected(e,!1)},10),t.delay(750).fadeOut(300,function(){a(this).remove()})}}}else h.prop("selected",!1),i.prop("selected",!0),b.$menu.find(".selected").removeClass("selected"),b.setSelected(e,!0);b.multiple?b.options.liveSearch&&b.$searchbox.focus():b.$button.focus(),(f!=b.$element.val()&&b.multiple||g!=b.$element.prop("selectedIndex")&&!b.multiple)&&(b.$element.change(),b.$element.trigger("changed.bs.select",[e,i.prop("selected"),j]))}}),this.$menu.on("click","li.disabled a, .popover-title, .popover-title :not(.close)",function(c){c.currentTarget==this&&(c.preventDefault(),c.stopPropagation(),b.options.liveSearch&&!a(c.target).hasClass("close")?b.$searchbox.focus():b.$button.focus())}),this.$menu.on("click","li.divider, li.dropdown-header",function(a){a.preventDefault(),a.stopPropagation(),b.options.liveSearch?b.$searchbox.focus():b.$button.focus()}),this.$menu.on("click",".popover-title .close",function(){b.$button.click()}),this.$searchbox.on("click",function(a){a.stopPropagation()}),this.$menu.on("click",".actions-btn",function(c){b.options.liveSearch?b.$searchbox.focus():b.$button.focus(),c.preventDefault(),c.stopPropagation(),a(this).hasClass("bs-select-all")?b.selectAll():b.deselectAll(),b.$element.change()}),this.$element.change(function(){b.render(!1)})},liveSearchListener:function(){var d=this,e=a('
          • ');this.$newElement.on("click.dropdown.data-api touchstart.dropdown.data-api",function(){d.$menuInner.find(".active").removeClass("active"),d.$searchbox.val()&&(d.$searchbox.val(""),d.$lis.not(".is-hidden").removeClass("hidden"),e.parent().length&&e.remove()),d.multiple||d.$menuInner.find(".selected").addClass("active"),setTimeout(function(){d.$searchbox.focus()},10)}),this.$searchbox.on("click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api",function(a){a.stopPropagation()}),this.$searchbox.on("input propertychange",function(){if(d.$searchbox.val()){var f=d.$lis.not(".is-hidden").removeClass("hidden").children("a");f=d.options.liveSearchNormalize?f.not(":a"+d._searchStyle()+"("+b(d.$searchbox.val())+")"):f.not(":"+d._searchStyle()+"("+d.$searchbox.val()+")"),f.parent().addClass("hidden"),d.$lis.filter(".dropdown-header").each(function(){var b=a(this),c=b.data("optgroup");0===d.$lis.filter("[data-optgroup="+c+"]").not(b).not(".hidden").length&&(b.addClass("hidden"),d.$lis.filter("[data-optgroup="+c+"div]").addClass("hidden"))});var g=d.$lis.not(".hidden");g.each(function(b){var c=a(this);c.hasClass("divider")&&(c.index()===g.eq(0).index()||c.index()===g.last().index()||g.eq(b+1).hasClass("divider"))&&c.addClass("hidden")}),d.$lis.not(".hidden, .no-results").length?e.parent().length&&e.remove():(e.parent().length&&e.remove(),e.html(d.options.noneResultsText.replace("{0}",'"'+c(d.$searchbox.val())+'"')).show(),d.$menuInner.append(e))}else d.$lis.not(".is-hidden").removeClass("hidden"),e.parent().length&&e.remove();d.$lis.filter(".active").removeClass("active"),d.$lis.not(".hidden, .divider, .dropdown-header").eq(0).addClass("active").children("a").focus(),a(this).focus()})},_searchStyle:function(){var a="icontains";switch(this.options.liveSearchStyle){case"begins":case"startsWith":a="ibegins";break;case"contains":}return a},val:function(a){return"undefined"!=typeof a?(this.$element.val(a),this.render(),this.$element):this.$element.val()},selectAll:function(){this.findLis(),this.$element.find("option:enabled").not("[data-divider], [data-hidden]").prop("selected",!0),this.$lis.not(".divider, .dropdown-header, .disabled, .hidden").addClass("selected"),this.render(!1)},deselectAll:function(){this.findLis(),this.$element.find("option:enabled").not("[data-divider], [data-hidden]").prop("selected",!1),this.$lis.not(".divider, .dropdown-header, .disabled, .hidden").removeClass("selected"),this.render(!1)},keydown:function(c){var d,e,f,g,h,i,j,k,l,m=a(this),n=m.is("input")?m.parent().parent():m.parent(),o=n.data("this"),p=":not(.disabled, .hidden, .dropdown-header, .divider)",q={32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"};if(o.options.liveSearch&&(n=m.parent().parent()),o.options.container&&(n=o.$menu),d=a("[role=menu] li a",n),l=o.$menu.parent().hasClass("open"),!l&&(c.keyCode>=48&&c.keyCode<=57||event.keyCode>=65&&event.keyCode<=90)&&(o.options.container?o.$newElement.trigger("click"):(o.setSize(),o.$menu.parent().addClass("open"),l=!0),o.$searchbox.focus()),o.options.liveSearch&&(/(^9$|27)/.test(c.keyCode.toString(10))&&l&&0===o.$menu.find(".active").length&&(c.preventDefault(),o.$menu.parent().removeClass("open"),o.options.container&&o.$newElement.removeClass("open"),o.$button.focus()),d=a("[role=menu] li:not(.disabled, .hidden, .dropdown-header, .divider)",n),m.val()||/(38|40)/.test(c.keyCode.toString(10))||0===d.filter(".active").length&&(d=o.$newElement.find("li"),d=o.options.liveSearchNormalize?d.filter(":a"+o._searchStyle()+"("+b(q[c.keyCode])+")"):d.filter(":"+o._searchStyle()+"("+q[c.keyCode]+")"))),d.length){if(/(38|40)/.test(c.keyCode.toString(10)))e=d.index(d.filter(":focus")),g=d.parent(p).first().data("originalIndex"),h=d.parent(p).last().data("originalIndex"),f=d.eq(e).parent().nextAll(p).eq(0).data("originalIndex"),i=d.eq(e).parent().prevAll(p).eq(0).data("originalIndex"),j=d.eq(f).parent().prevAll(p).eq(0).data("originalIndex"),o.options.liveSearch&&(d.each(function(b){a(this).hasClass("disabled")||a(this).data("index",b)}),e=d.index(d.filter(".active")),g=d.first().data("index"),h=d.last().data("index"),f=d.eq(e).nextAll().eq(0).data("index"),i=d.eq(e).prevAll().eq(0).data("index"),j=d.eq(f).prevAll().eq(0).data("index")),k=m.data("prevIndex"),38==c.keyCode?(o.options.liveSearch&&(e-=1),e!=j&&e>i&&(e=i),g>e&&(e=g),e==k&&(e=h)):40==c.keyCode&&(o.options.liveSearch&&(e+=1),-1==e&&(e=0),e!=j&&f>e&&(e=f),e>h&&(e=h),e==k&&(e=g)),m.data("prevIndex",e),o.options.liveSearch?(c.preventDefault(),m.hasClass("dropdown-toggle")||(d.removeClass("active").eq(e).addClass("active").children("a").focus(),m.focus())):d.eq(e).focus();else if(!m.is("input")){var r,s,t=[];d.each(function(){a(this).parent().hasClass("disabled")||a.trim(a(this).text().toLowerCase()).substring(0,1)==q[c.keyCode]&&t.push(a(this).parent().index())}),r=a(document).data("keycount"),r++,a(document).data("keycount",r),s=a.trim(a(":focus").text().toLowerCase()).substring(0,1),s!=q[c.keyCode]?(r=1,a(document).data("keycount",r)):r>=t.length&&(a(document).data("keycount",0),r>t.length&&(r=1)),d.eq(t[r-1]).focus()}if((/(13|32)/.test(c.keyCode.toString(10))||/(^9$)/.test(c.keyCode.toString(10))&&o.options.selectOnTab)&&l){if(/(32)/.test(c.keyCode.toString(10))||c.preventDefault(),o.options.liveSearch)/(32)/.test(c.keyCode.toString(10))||(o.$menu.find(".active a").click(),m.focus());else{var u=a(":focus");u.click(),u.focus(),c.preventDefault(),a(document).data("spaceSelect",!0)}a(document).data("keycount",0)}(/(^9$|27)/.test(c.keyCode.toString(10))&&l&&(o.multiple||o.options.liveSearch)||/(27)/.test(c.keyCode.toString(10))&&!l)&&(o.$menu.parent().removeClass("open"),o.options.container&&o.$newElement.removeClass("open"),o.$button.focus())}},mobile:function(){this.$element.addClass("mobile-device").appendTo(this.$newElement),this.options.container&&this.$menu.hide()},refresh:function(){this.$lis=null,this.reloadLi(),this.render(),this.checkDisabled(),this.liHeight(!0),this.setStyle(),this.setWidth(),this.$lis&&this.$searchbox.trigger("propertychange"),this.$element.trigger("refreshed.bs.select")},hide:function(){this.$newElement.hide()},show:function(){this.$newElement.show()},remove:function(){this.$newElement.remove(),this.$element.remove()}};var f=a.fn.selectpicker;a.fn.selectpicker=d,a.fn.selectpicker.Constructor=e,a.fn.selectpicker.noConflict=function(){return a.fn.selectpicker=f,this},a(document).data("keycount",0).on("keydown",'.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="menu"], .bs-searchbox input',e.prototype.keydown).on("focusin.modal",'.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="menu"], .bs-searchbox input',function(a){a.stopPropagation()}),a(window).on("load.bs.select.data-api",function(){a(".selectpicker").each(function(){var b=a(this);d.call(b,b.data())})})}(jQuery)}); +//# sourceMappingURL=bootstrap-select.js.map \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-slider/bootstrap-slider.js b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-slider/bootstrap-slider.js new file mode 100755 index 00000000..3a0e464e --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-slider/bootstrap-slider.js @@ -0,0 +1,1576 @@ +/*! ========================================================= + * bootstrap-slider.js + * + * Maintainers: + * Kyle Kemp + * - Twitter: @seiyria + * - Github: seiyria + * Rohit Kalkur + * - Twitter: @Rovolutionary + * - Github: rovolution + * + * ========================================================= + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +/** + * Bridget makes jQuery widgets + * v1.0.1 + * MIT license + */ + +(function(root, factory) { + if(typeof define === "function" && define.amd) { + define(["jquery"], factory); + } + else if(typeof module === "object" && module.exports) { + var jQuery; + try { + jQuery = require("jquery"); + } + catch (err) { + jQuery = null; + } + module.exports = factory(jQuery); + } + else { + root.Slider = factory(root.jQuery); + } +}(this, function($) { + // Reference to Slider constructor + var Slider; + + + (function( $ ) { + + 'use strict'; + + // -------------------------- utils -------------------------- // + + var slice = Array.prototype.slice; + + function noop() {} + + // -------------------------- definition -------------------------- // + + function defineBridget( $ ) { + + // bail if no jQuery + if ( !$ ) { + return; + } + + // -------------------------- addOptionMethod -------------------------- // + + /** + * adds option method -> $().plugin('option', {...}) + * @param {Function} PluginClass - constructor class + */ + function addOptionMethod( PluginClass ) { + // don't overwrite original option method + if ( PluginClass.prototype.option ) { + return; + } + + // option setter + PluginClass.prototype.option = function( opts ) { + // bail out if not an object + if ( !$.isPlainObject( opts ) ){ + return; + } + this.options = $.extend( true, this.options, opts ); + }; + } + + + // -------------------------- plugin bridge -------------------------- // + + // helper function for logging errors + // $.error breaks jQuery chaining + var logError = typeof console === 'undefined' ? noop : + function( message ) { + console.error( message ); + }; + + /** + * jQuery plugin bridge, access methods like $elem.plugin('method') + * @param {String} namespace - plugin name + * @param {Function} PluginClass - constructor class + */ + function bridge( namespace, PluginClass ) { + // add to jQuery fn namespace + $.fn[ namespace ] = function( options ) { + if ( typeof options === 'string' ) { + // call plugin method when first argument is a string + // get arguments for method + var args = slice.call( arguments, 1 ); + + for ( var i=0, len = this.length; i < len; i++ ) { + var elem = this[i]; + var instance = $.data( elem, namespace ); + if ( !instance ) { + logError( "cannot call methods on " + namespace + " prior to initialization; " + + "attempted to call '" + options + "'" ); + continue; + } + if ( !$.isFunction( instance[options] ) || options.charAt(0) === '_' ) { + logError( "no such method '" + options + "' for " + namespace + " instance" ); + continue; + } + + // trigger method with arguments + var returnValue = instance[ options ].apply( instance, args); + + // break look and return first value if provided + if ( returnValue !== undefined && returnValue !== instance) { + return returnValue; + } + } + // return this if no return value + return this; + } else { + var objects = this.map( function() { + var instance = $.data( this, namespace ); + if ( instance ) { + // apply options & init + instance.option( options ); + instance._init(); + } else { + // initialize new instance + instance = new PluginClass( this, options ); + $.data( this, namespace, instance ); + } + return $(this); + }); + + if(!objects || objects.length > 1) { + return objects; + } else { + return objects[0]; + } + } + }; + + } + + // -------------------------- bridget -------------------------- // + + /** + * converts a Prototypical class into a proper jQuery plugin + * the class must have a ._init method + * @param {String} namespace - plugin name, used in $().pluginName + * @param {Function} PluginClass - constructor class + */ + $.bridget = function( namespace, PluginClass ) { + addOptionMethod( PluginClass ); + bridge( namespace, PluginClass ); + }; + + return $.bridget; + + } + + // get jquery from browser global + defineBridget( $ ); + + })( $ ); + + + /************************************************* + + BOOTSTRAP-SLIDER SOURCE CODE + + **************************************************/ + + (function($) { + + var ErrorMsgs = { + formatInvalidInputErrorMsg : function(input) { + return "Invalid input value '" + input + "' passed in"; + }, + callingContextNotSliderInstance : "Calling context element does not have instance of Slider bound to it. Check your code to make sure the JQuery object returned from the call to the slider() initializer is calling the method" + }; + + var SliderScale = { + linear: { + toValue: function(percentage) { + var rawValue = percentage/100 * (this.options.max - this.options.min); + if (this.options.ticks_positions.length > 0) { + var minv, maxv, minp, maxp = 0; + for (var i = 0; i < this.options.ticks_positions.length; i++) { + if (percentage <= this.options.ticks_positions[i]) { + minv = (i > 0) ? this.options.ticks[i-1] : 0; + minp = (i > 0) ? this.options.ticks_positions[i-1] : 0; + maxv = this.options.ticks[i]; + maxp = this.options.ticks_positions[i]; + + break; + } + } + if (i > 0) { + var partialPercentage = (percentage - minp) / (maxp - minp); + rawValue = minv + partialPercentage * (maxv - minv); + } + } + + var value = this.options.min + Math.round(rawValue / this.options.step) * this.options.step; + if (value < this.options.min) { + return this.options.min; + } else if (value > this.options.max) { + return this.options.max; + } else { + return value; + } + }, + toPercentage: function(value) { + if (this.options.max === this.options.min) { + return 0; + } + + if (this.options.ticks_positions.length > 0) { + var minv, maxv, minp, maxp = 0; + for (var i = 0; i < this.options.ticks.length; i++) { + if (value <= this.options.ticks[i]) { + minv = (i > 0) ? this.options.ticks[i-1] : 0; + minp = (i > 0) ? this.options.ticks_positions[i-1] : 0; + maxv = this.options.ticks[i]; + maxp = this.options.ticks_positions[i]; + + break; + } + } + if (i > 0) { + var partialPercentage = (value - minv) / (maxv - minv); + return minp + partialPercentage * (maxp - minp); + } + } + + return 100 * (value - this.options.min) / (this.options.max - this.options.min); + } + }, + + logarithmic: { + /* Based on http://stackoverflow.com/questions/846221/logarithmic-slider */ + toValue: function(percentage) { + var min = (this.options.min === 0) ? 0 : Math.log(this.options.min); + var max = Math.log(this.options.max); + var value = Math.exp(min + (max - min) * percentage / 100); + value = this.options.min + Math.round((value - this.options.min) / this.options.step) * this.options.step; + /* Rounding to the nearest step could exceed the min or + * max, so clip to those values. */ + if (value < this.options.min) { + return this.options.min; + } else if (value > this.options.max) { + return this.options.max; + } else { + return value; + } + }, + toPercentage: function(value) { + if (this.options.max === this.options.min) { + return 0; + } else { + var max = Math.log(this.options.max); + var min = this.options.min === 0 ? 0 : Math.log(this.options.min); + var v = value === 0 ? 0 : Math.log(value); + return 100 * (v - min) / (max - min); + } + } + } + }; + + + /************************************************* + + CONSTRUCTOR + + **************************************************/ + Slider = function(element, options) { + createNewSlider.call(this, element, options); + return this; + }; + + function createNewSlider(element, options) { + + /* + The internal state object is used to store data about the current 'state' of slider. + + This includes values such as the `value`, `enabled`, etc... + */ + this._state = { + value: null, + enabled: null, + offset: null, + size: null, + percentage: null, + inDrag: false, + over: false + }; + + + if(typeof element === "string") { + this.element = document.querySelector(element); + } else if(element instanceof HTMLElement) { + this.element = element; + } + + /************************************************* + + Process Options + + **************************************************/ + options = options ? options : {}; + var optionTypes = Object.keys(this.defaultOptions); + + for(var i = 0; i < optionTypes.length; i++) { + var optName = optionTypes[i]; + + // First check if an option was passed in via the constructor + var val = options[optName]; + // If no data attrib, then check data atrributes + val = (typeof val !== 'undefined') ? val : getDataAttrib(this.element, optName); + // Finally, if nothing was specified, use the defaults + val = (val !== null) ? val : this.defaultOptions[optName]; + + // Set all options on the instance of the Slider + if(!this.options) { + this.options = {}; + } + this.options[optName] = val; + } + + /* + Validate `tooltip_position` against 'orientation` + - if `tooltip_position` is incompatible with orientation, swith it to a default compatible with specified `orientation` + -- default for "vertical" -> "right" + -- default for "horizontal" -> "left" + */ + if(this.options.orientation === "vertical" && (this.options.tooltip_position === "top" || this.options.tooltip_position === "bottom")) { + + this.options.tooltip_position = "right"; + + } + else if(this.options.orientation === "horizontal" && (this.options.tooltip_position === "left" || this.options.tooltip_position === "right")) { + + this.options.tooltip_position = "top"; + + } + + function getDataAttrib(element, optName) { + var dataName = "data-slider-" + optName.replace(/_/g, '-'); + var dataValString = element.getAttribute(dataName); + + try { + return JSON.parse(dataValString); + } + catch(err) { + return dataValString; + } + } + + /************************************************* + + Create Markup + + **************************************************/ + + var origWidth = this.element.style.width; + var updateSlider = false; + var parent = this.element.parentNode; + var sliderTrackSelection; + var sliderTrackLow, sliderTrackHigh; + var sliderMinHandle; + var sliderMaxHandle; + + if (this.sliderElem) { + updateSlider = true; + } else { + /* Create elements needed for slider */ + this.sliderElem = document.createElement("div"); + this.sliderElem.className = "slider"; + + /* Create slider track elements */ + var sliderTrack = document.createElement("div"); + sliderTrack.className = "slider-track"; + + sliderTrackLow = document.createElement("div"); + sliderTrackLow.className = "slider-track-low"; + + sliderTrackSelection = document.createElement("div"); + sliderTrackSelection.className = "slider-selection"; + + sliderTrackHigh = document.createElement("div"); + sliderTrackHigh.className = "slider-track-high"; + + sliderMinHandle = document.createElement("div"); + sliderMinHandle.className = "slider-handle min-slider-handle"; + sliderMinHandle.setAttribute('role', 'slider'); + sliderMinHandle.setAttribute('aria-valuemin', this.options.min); + sliderMinHandle.setAttribute('aria-valuemax', this.options.max); + + sliderMaxHandle = document.createElement("div"); + sliderMaxHandle.className = "slider-handle max-slider-handle"; + sliderMaxHandle.setAttribute('role', 'slider'); + sliderMaxHandle.setAttribute('aria-valuemin', this.options.min); + sliderMaxHandle.setAttribute('aria-valuemax', this.options.max); + + sliderTrack.appendChild(sliderTrackLow); + sliderTrack.appendChild(sliderTrackSelection); + sliderTrack.appendChild(sliderTrackHigh); + + /* Add aria-labelledby to handle's */ + var isLabelledbyArray = Array.isArray(this.options.labelledby); + if (isLabelledbyArray && this.options.labelledby[0]) { + sliderMinHandle.setAttribute('aria-labelledby', this.options.labelledby[0]); + } + if (isLabelledbyArray && this.options.labelledby[1]) { + sliderMaxHandle.setAttribute('aria-labelledby', this.options.labelledby[1]); + } + if (!isLabelledbyArray && this.options.labelledby) { + sliderMinHandle.setAttribute('aria-labelledby', this.options.labelledby); + sliderMaxHandle.setAttribute('aria-labelledby', this.options.labelledby); + } + + /* Create ticks */ + this.ticks = []; + if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) { + for (i = 0; i < this.options.ticks.length; i++) { + var tick = document.createElement('div'); + tick.className = 'slider-tick'; + + this.ticks.push(tick); + sliderTrack.appendChild(tick); + } + + sliderTrackSelection.className += " tick-slider-selection"; + } + + sliderTrack.appendChild(sliderMinHandle); + sliderTrack.appendChild(sliderMaxHandle); + + this.tickLabels = []; + if (Array.isArray(this.options.ticks_labels) && this.options.ticks_labels.length > 0) { + this.tickLabelContainer = document.createElement('div'); + this.tickLabelContainer.className = 'slider-tick-label-container'; + + for (i = 0; i < this.options.ticks_labels.length; i++) { + var label = document.createElement('div'); + var noTickPositionsSpecified = this.options.ticks_positions.length === 0; + var tickLabelsIndex = (this.options.reversed && noTickPositionsSpecified) ? (this.options.ticks_labels.length - (i + 1)) : i; + label.className = 'slider-tick-label'; + label.innerHTML = this.options.ticks_labels[tickLabelsIndex]; + + this.tickLabels.push(label); + this.tickLabelContainer.appendChild(label); + } + } + + + var createAndAppendTooltipSubElements = function(tooltipElem) { + var arrow = document.createElement("div"); + arrow.className = "tooltip-arrow"; + + var inner = document.createElement("div"); + inner.className = "tooltip-inner"; + + tooltipElem.appendChild(arrow); + tooltipElem.appendChild(inner); + + }; + + /* Create tooltip elements */ + var sliderTooltip = document.createElement("div"); + sliderTooltip.className = "tooltip tooltip-main"; + sliderTooltip.setAttribute('role', 'presentation'); + createAndAppendTooltipSubElements(sliderTooltip); + + var sliderTooltipMin = document.createElement("div"); + sliderTooltipMin.className = "tooltip tooltip-min"; + sliderTooltipMin.setAttribute('role', 'presentation'); + createAndAppendTooltipSubElements(sliderTooltipMin); + + var sliderTooltipMax = document.createElement("div"); + sliderTooltipMax.className = "tooltip tooltip-max"; + sliderTooltipMax.setAttribute('role', 'presentation'); + createAndAppendTooltipSubElements(sliderTooltipMax); + + + /* Append components to sliderElem */ + this.sliderElem.appendChild(sliderTrack); + this.sliderElem.appendChild(sliderTooltip); + this.sliderElem.appendChild(sliderTooltipMin); + this.sliderElem.appendChild(sliderTooltipMax); + + if (this.tickLabelContainer) { + this.sliderElem.appendChild(this.tickLabelContainer); + } + + /* Append slider element to parent container, right before the original element */ + parent.insertBefore(this.sliderElem, this.element); + + /* Hide original element */ + this.element.style.display = "none"; + } + /* If JQuery exists, cache JQ references */ + if($) { + this.$element = $(this.element); + this.$sliderElem = $(this.sliderElem); + } + + /************************************************* + + Setup + + **************************************************/ + this.eventToCallbackMap = {}; + this.sliderElem.id = this.options.id; + + this.touchCapable = 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch); + + this.tooltip = this.sliderElem.querySelector('.tooltip-main'); + this.tooltipInner = this.tooltip.querySelector('.tooltip-inner'); + + this.tooltip_min = this.sliderElem.querySelector('.tooltip-min'); + this.tooltipInner_min = this.tooltip_min.querySelector('.tooltip-inner'); + + this.tooltip_max = this.sliderElem.querySelector('.tooltip-max'); + this.tooltipInner_max= this.tooltip_max.querySelector('.tooltip-inner'); + + if (SliderScale[this.options.scale]) { + this.options.scale = SliderScale[this.options.scale]; + } + + if (updateSlider === true) { + // Reset classes + this._removeClass(this.sliderElem, 'slider-horizontal'); + this._removeClass(this.sliderElem, 'slider-vertical'); + this._removeClass(this.tooltip, 'hide'); + this._removeClass(this.tooltip_min, 'hide'); + this._removeClass(this.tooltip_max, 'hide'); + + // Undo existing inline styles for track + ["left", "top", "width", "height"].forEach(function(prop) { + this._removeProperty(this.trackLow, prop); + this._removeProperty(this.trackSelection, prop); + this._removeProperty(this.trackHigh, prop); + }, this); + + // Undo inline styles on handles + [this.handle1, this.handle2].forEach(function(handle) { + this._removeProperty(handle, 'left'); + this._removeProperty(handle, 'top'); + }, this); + + // Undo inline styles and classes on tooltips + [this.tooltip, this.tooltip_min, this.tooltip_max].forEach(function(tooltip) { + this._removeProperty(tooltip, 'left'); + this._removeProperty(tooltip, 'top'); + this._removeProperty(tooltip, 'margin-left'); + this._removeProperty(tooltip, 'margin-top'); + + this._removeClass(tooltip, 'right'); + this._removeClass(tooltip, 'top'); + }, this); + } + + if(this.options.orientation === 'vertical') { + this._addClass(this.sliderElem,'slider-vertical'); + this.stylePos = 'top'; + this.mousePos = 'pageY'; + this.sizePos = 'offsetHeight'; + } else { + this._addClass(this.sliderElem, 'slider-horizontal'); + this.sliderElem.style.width = origWidth; + this.options.orientation = 'horizontal'; + this.stylePos = 'left'; + this.mousePos = 'pageX'; + this.sizePos = 'offsetWidth'; + + } + this._setTooltipPosition(); + /* In case ticks are specified, overwrite the min and max bounds */ + if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) { + this.options.max = Math.max.apply(Math, this.options.ticks); + this.options.min = Math.min.apply(Math, this.options.ticks); + } + + if (Array.isArray(this.options.value)) { + this.options.range = true; + this._state.value = this.options.value; + } + else if (this.options.range) { + // User wants a range, but value is not an array + this._state.value = [this.options.value, this.options.max]; + } + else { + this._state.value = this.options.value; + } + + this.trackLow = sliderTrackLow || this.trackLow; + this.trackSelection = sliderTrackSelection || this.trackSelection; + this.trackHigh = sliderTrackHigh || this.trackHigh; + + if (this.options.selection === 'none') { + this._addClass(this.trackLow, 'hide'); + this._addClass(this.trackSelection, 'hide'); + this._addClass(this.trackHigh, 'hide'); + } + + this.handle1 = sliderMinHandle || this.handle1; + this.handle2 = sliderMaxHandle || this.handle2; + + if (updateSlider === true) { + // Reset classes + this._removeClass(this.handle1, 'round triangle'); + this._removeClass(this.handle2, 'round triangle hide'); + + for (i = 0; i < this.ticks.length; i++) { + this._removeClass(this.ticks[i], 'round triangle hide'); + } + } + + var availableHandleModifiers = ['round', 'triangle', 'custom']; + var isValidHandleType = availableHandleModifiers.indexOf(this.options.handle) !== -1; + if (isValidHandleType) { + this._addClass(this.handle1, this.options.handle); + this._addClass(this.handle2, this.options.handle); + + for (i = 0; i < this.ticks.length; i++) { + this._addClass(this.ticks[i], this.options.handle); + } + } + + this._state.offset = this._offset(this.sliderElem); + this._state.size = this.sliderElem[this.sizePos]; + this.setValue(this._state.value); + + /****************************************** + + Bind Event Listeners + + ******************************************/ + + // Bind keyboard handlers + this.handle1Keydown = this._keydown.bind(this, 0); + this.handle1.addEventListener("keydown", this.handle1Keydown, false); + + this.handle2Keydown = this._keydown.bind(this, 1); + this.handle2.addEventListener("keydown", this.handle2Keydown, false); + + this.mousedown = this._mousedown.bind(this); + if (this.touchCapable) { + // Bind touch handlers + this.sliderElem.addEventListener("touchstart", this.mousedown, false); + } + this.sliderElem.addEventListener("mousedown", this.mousedown, false); + + + // Bind tooltip-related handlers + if(this.options.tooltip === 'hide') { + this._addClass(this.tooltip, 'hide'); + this._addClass(this.tooltip_min, 'hide'); + this._addClass(this.tooltip_max, 'hide'); + } + else if(this.options.tooltip === 'always') { + this._showTooltip(); + this._alwaysShowTooltip = true; + } + else { + this.showTooltip = this._showTooltip.bind(this); + this.hideTooltip = this._hideTooltip.bind(this); + + this.sliderElem.addEventListener("mouseenter", this.showTooltip, false); + this.sliderElem.addEventListener("mouseleave", this.hideTooltip, false); + + this.handle1.addEventListener("focus", this.showTooltip, false); + this.handle1.addEventListener("blur", this.hideTooltip, false); + + this.handle2.addEventListener("focus", this.showTooltip, false); + this.handle2.addEventListener("blur", this.hideTooltip, false); + } + + if(this.options.enabled) { + this.enable(); + } else { + this.disable(); + } + } + + + + /************************************************* + + INSTANCE PROPERTIES/METHODS + + - Any methods bound to the prototype are considered + part of the plugin's `public` interface + + **************************************************/ + Slider.prototype = { + _init: function() {}, // NOTE: Must exist to support bridget + + constructor: Slider, + + defaultOptions: { + id: "", + min: 0, + max: 10, + step: 1, + precision: 0, + orientation: 'horizontal', + value: 5, + range: false, + selection: 'before', + tooltip: 'show', + tooltip_split: false, + handle: 'round', + reversed: false, + enabled: true, + formatter: function(val) { + if (Array.isArray(val)) { + return val[0] + " : " + val[1]; + } else { + return val; + } + }, + natural_arrow_keys: false, + ticks: [], + ticks_positions: [], + ticks_labels: [], + ticks_snap_bounds: 0, + scale: 'linear', + focus: false, + tooltip_position: null, + labelledby: null + }, + + getElement: function() { + return this.sliderElem; + }, + + getValue: function() { + if (this.options.range) { + return this._state.value; + } + else { + return this._state.value[0]; + } + }, + + setValue: function(val, triggerSlideEvent, triggerChangeEvent) { + if (!val) { + val = 0; + } + var oldValue = this.getValue(); + this._state.value = this._validateInputValue(val); + var applyPrecision = this._applyPrecision.bind(this); + + if (this.options.range) { + this._state.value[0] = applyPrecision(this._state.value[0]); + this._state.value[1] = applyPrecision(this._state.value[1]); + + this._state.value[0] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[0])); + this._state.value[1] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[1])); + } + else { + this._state.value = applyPrecision(this._state.value); + this._state.value = [ Math.max(this.options.min, Math.min(this.options.max, this._state.value))]; + this._addClass(this.handle2, 'hide'); + if (this.options.selection === 'after') { + this._state.value[1] = this.options.max; + } else { + this._state.value[1] = this.options.min; + } + } + + if (this.options.max > this.options.min) { + this._state.percentage = [ + this._toPercentage(this._state.value[0]), + this._toPercentage(this._state.value[1]), + this.options.step * 100 / (this.options.max - this.options.min) + ]; + } else { + this._state.percentage = [0, 0, 100]; + } + + this._layout(); + var newValue = this.options.range ? this._state.value : this._state.value[0]; + + if(triggerSlideEvent === true) { + this._trigger('slide', newValue); + } + if( (oldValue !== newValue) && (triggerChangeEvent === true) ) { + this._trigger('change', { + oldValue: oldValue, + newValue: newValue + }); + } + this._setDataVal(newValue); + + return this; + }, + + destroy: function(){ + // Remove event handlers on slider elements + this._removeSliderEventHandlers(); + + // Remove the slider from the DOM + this.sliderElem.parentNode.removeChild(this.sliderElem); + /* Show original element */ + this.element.style.display = ""; + + // Clear out custom event bindings + this._cleanUpEventCallbacksMap(); + + // Remove data values + this.element.removeAttribute("data"); + + // Remove JQuery handlers/data + if($) { + this._unbindJQueryEventHandlers(); + this.$element.removeData('slider'); + } + }, + + disable: function() { + this._state.enabled = false; + this.handle1.removeAttribute("tabindex"); + this.handle2.removeAttribute("tabindex"); + this._addClass(this.sliderElem, 'slider-disabled'); + this._trigger('slideDisabled'); + + return this; + }, + + enable: function() { + this._state.enabled = true; + this.handle1.setAttribute("tabindex", 0); + this.handle2.setAttribute("tabindex", 0); + this._removeClass(this.sliderElem, 'slider-disabled'); + this._trigger('slideEnabled'); + + return this; + }, + + toggle: function() { + if(this._state.enabled) { + this.disable(); + } else { + this.enable(); + } + return this; + }, + + isEnabled: function() { + return this._state.enabled; + }, + + on: function(evt, callback) { + this._bindNonQueryEventHandler(evt, callback); + return this; + }, + + off: function(evt, callback) { + if($) { + this.$element.off(evt, callback); + this.$sliderElem.off(evt, callback); + } else { + this._unbindNonQueryEventHandler(evt, callback); + } + }, + + getAttribute: function(attribute) { + if(attribute) { + return this.options[attribute]; + } else { + return this.options; + } + }, + + setAttribute: function(attribute, value) { + this.options[attribute] = value; + return this; + }, + + refresh: function() { + this._removeSliderEventHandlers(); + createNewSlider.call(this, this.element, this.options); + if($) { + // Bind new instance of slider to the element + $.data(this.element, 'slider', this); + } + return this; + }, + + relayout: function() { + this._layout(); + return this; + }, + + /******************************+ + + HELPERS + + - Any method that is not part of the public interface. + - Place it underneath this comment block and write its signature like so: + + _fnName : function() {...} + + ********************************/ + _removeSliderEventHandlers: function() { + // Remove keydown event listeners + this.handle1.removeEventListener("keydown", this.handle1Keydown, false); + this.handle2.removeEventListener("keydown", this.handle2Keydown, false); + + if (this.showTooltip) { + this.handle1.removeEventListener("focus", this.showTooltip, false); + this.handle2.removeEventListener("focus", this.showTooltip, false); + } + if (this.hideTooltip) { + this.handle1.removeEventListener("blur", this.hideTooltip, false); + this.handle2.removeEventListener("blur", this.hideTooltip, false); + } + + // Remove event listeners from sliderElem + if (this.showTooltip) { + this.sliderElem.removeEventListener("mouseenter", this.showTooltip, false); + } + if (this.hideTooltip) { + this.sliderElem.removeEventListener("mouseleave", this.hideTooltip, false); + } + this.sliderElem.removeEventListener("touchstart", this.mousedown, false); + this.sliderElem.removeEventListener("mousedown", this.mousedown, false); + }, + _bindNonQueryEventHandler: function(evt, callback) { + if(this.eventToCallbackMap[evt] === undefined) { + this.eventToCallbackMap[evt] = []; + } + this.eventToCallbackMap[evt].push(callback); + }, + _unbindNonQueryEventHandler: function(evt, callback) { + var callbacks = this.eventToCallbackMap[evt]; + if(callbacks !== undefined) { + for (var i = 0; i < callbacks.length; i++) { + if (callbacks[i] === callback) { + callbacks.splice(i, 1); + break; + } + } + } + }, + _cleanUpEventCallbacksMap: function() { + var eventNames = Object.keys(this.eventToCallbackMap); + for(var i = 0; i < eventNames.length; i++) { + var eventName = eventNames[i]; + this.eventToCallbackMap[eventName] = null; + } + }, + _showTooltip: function() { + if (this.options.tooltip_split === false ){ + this._addClass(this.tooltip, 'in'); + this.tooltip_min.style.display = 'none'; + this.tooltip_max.style.display = 'none'; + } else { + this._addClass(this.tooltip_min, 'in'); + this._addClass(this.tooltip_max, 'in'); + this.tooltip.style.display = 'none'; + } + this._state.over = true; + }, + _hideTooltip: function() { + if (this._state.inDrag === false && this.alwaysShowTooltip !== true) { + this._removeClass(this.tooltip, 'in'); + this._removeClass(this.tooltip_min, 'in'); + this._removeClass(this.tooltip_max, 'in'); + } + this._state.over = false; + }, + _layout: function() { + var positionPercentages; + + if(this.options.reversed) { + positionPercentages = [ 100 - this._state.percentage[0], this.options.range ? 100 - this._state.percentage[1] : this._state.percentage[1]]; + } + else { + positionPercentages = [ this._state.percentage[0], this._state.percentage[1] ]; + } + + this.handle1.style[this.stylePos] = positionPercentages[0]+'%'; + this.handle1.setAttribute('aria-valuenow', this._state.value[0]); + + this.handle2.style[this.stylePos] = positionPercentages[1]+'%'; + this.handle2.setAttribute('aria-valuenow', this._state.value[1]); + + /* Position ticks and labels */ + if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) { + + var styleSize = this.options.orientation === 'vertical' ? 'height' : 'width'; + var styleMargin = this.options.orientation === 'vertical' ? 'marginTop' : 'marginLeft'; + var labelSize = this._state.size / (this.options.ticks.length - 1); + + if (this.tickLabelContainer) { + var extraMargin = 0; + if (this.options.ticks_positions.length === 0) { + if (this.options.orientation !== 'vertical') { + this.tickLabelContainer.style[styleMargin] = -labelSize/2 + 'px'; + } + + extraMargin = this.tickLabelContainer.offsetHeight; + } else { + /* Chidren are position absolute, calculate height by finding the max offsetHeight of a child */ + for (i = 0 ; i < this.tickLabelContainer.childNodes.length; i++) { + if (this.tickLabelContainer.childNodes[i].offsetHeight > extraMargin) { + extraMargin = this.tickLabelContainer.childNodes[i].offsetHeight; + } + } + } + if (this.options.orientation === 'horizontal') { + this.sliderElem.style.marginBottom = extraMargin + 'px'; + } + } + for (var i = 0; i < this.options.ticks.length; i++) { + + var percentage = this.options.ticks_positions[i] || this._toPercentage(this.options.ticks[i]); + + if (this.options.reversed) { + percentage = 100 - percentage; + } + + this.ticks[i].style[this.stylePos] = percentage + '%'; + + /* Set class labels to denote whether ticks are in the selection */ + this._removeClass(this.ticks[i], 'in-selection'); + if (!this.options.range) { + if (this.options.selection === 'after' && percentage >= positionPercentages[0]){ + this._addClass(this.ticks[i], 'in-selection'); + } else if (this.options.selection === 'before' && percentage <= positionPercentages[0]) { + this._addClass(this.ticks[i], 'in-selection'); + } + } else if (percentage >= positionPercentages[0] && percentage <= positionPercentages[1]) { + this._addClass(this.ticks[i], 'in-selection'); + } + + if (this.tickLabels[i]) { + this.tickLabels[i].style[styleSize] = labelSize + 'px'; + + if (this.options.orientation !== 'vertical' && this.options.ticks_positions[i] !== undefined) { + this.tickLabels[i].style.position = 'absolute'; + this.tickLabels[i].style[this.stylePos] = percentage + '%'; + this.tickLabels[i].style[styleMargin] = -labelSize/2 + 'px'; + } else if (this.options.orientation === 'vertical') { + this.tickLabels[i].style['marginLeft'] = this.sliderElem.offsetWidth + 'px'; + this.tickLabelContainer.style['marginTop'] = this.sliderElem.offsetWidth / 2 * -1 + 'px'; + } + } + } + } + + var formattedTooltipVal; + + if (this.options.range) { + formattedTooltipVal = this.options.formatter(this._state.value); + this._setText(this.tooltipInner, formattedTooltipVal); + this.tooltip.style[this.stylePos] = (positionPercentages[1] + positionPercentages[0])/2 + '%'; + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px'); + } + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px'); + } + + var innerTooltipMinText = this.options.formatter(this._state.value[0]); + this._setText(this.tooltipInner_min, innerTooltipMinText); + + var innerTooltipMaxText = this.options.formatter(this._state.value[1]); + this._setText(this.tooltipInner_max, innerTooltipMaxText); + + this.tooltip_min.style[this.stylePos] = positionPercentages[0] + '%'; + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip_min, 'margin-top', -this.tooltip_min.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip_min, 'margin-left', -this.tooltip_min.offsetWidth / 2 + 'px'); + } + + this.tooltip_max.style[this.stylePos] = positionPercentages[1] + '%'; + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip_max, 'margin-top', -this.tooltip_max.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip_max, 'margin-left', -this.tooltip_max.offsetWidth / 2 + 'px'); + } + } else { + formattedTooltipVal = this.options.formatter(this._state.value[0]); + this._setText(this.tooltipInner, formattedTooltipVal); + + this.tooltip.style[this.stylePos] = positionPercentages[0] + '%'; + if (this.options.orientation === 'vertical') { + this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px'); + } + } + + if (this.options.orientation === 'vertical') { + this.trackLow.style.top = '0'; + this.trackLow.style.height = Math.min(positionPercentages[0], positionPercentages[1]) +'%'; + + this.trackSelection.style.top = Math.min(positionPercentages[0], positionPercentages[1]) +'%'; + this.trackSelection.style.height = Math.abs(positionPercentages[0] - positionPercentages[1]) +'%'; + + this.trackHigh.style.bottom = '0'; + this.trackHigh.style.height = (100 - Math.min(positionPercentages[0], positionPercentages[1]) - Math.abs(positionPercentages[0] - positionPercentages[1])) +'%'; + } + else { + this.trackLow.style.left = '0'; + this.trackLow.style.width = Math.min(positionPercentages[0], positionPercentages[1]) +'%'; + + this.trackSelection.style.left = Math.min(positionPercentages[0], positionPercentages[1]) +'%'; + this.trackSelection.style.width = Math.abs(positionPercentages[0] - positionPercentages[1]) +'%'; + + this.trackHigh.style.right = '0'; + this.trackHigh.style.width = (100 - Math.min(positionPercentages[0], positionPercentages[1]) - Math.abs(positionPercentages[0] - positionPercentages[1])) +'%'; + + var offset_min = this.tooltip_min.getBoundingClientRect(); + var offset_max = this.tooltip_max.getBoundingClientRect(); + + if (offset_min.right > offset_max.left) { + this._removeClass(this.tooltip_max, 'top'); + this._addClass(this.tooltip_max, 'bottom'); + this.tooltip_max.style.top = 18 + 'px'; + } else { + this._removeClass(this.tooltip_max, 'bottom'); + this._addClass(this.tooltip_max, 'top'); + this.tooltip_max.style.top = this.tooltip_min.style.top; + } + } + }, + _removeProperty: function(element, prop) { + if (element.style.removeProperty) { + element.style.removeProperty(prop); + } else { + element.style.removeAttribute(prop); + } + }, + _mousedown: function(ev) { + if(!this._state.enabled) { + return false; + } + + this._state.offset = this._offset(this.sliderElem); + this._state.size = this.sliderElem[this.sizePos]; + + var percentage = this._getPercentage(ev); + + if (this.options.range) { + var diff1 = Math.abs(this._state.percentage[0] - percentage); + var diff2 = Math.abs(this._state.percentage[1] - percentage); + this._state.dragged = (diff1 < diff2) ? 0 : 1; + } else { + this._state.dragged = 0; + } + + this._state.percentage[this._state.dragged] = percentage; + this._layout(); + + if (this.touchCapable) { + document.removeEventListener("touchmove", this.mousemove, false); + document.removeEventListener("touchend", this.mouseup, false); + } + + if(this.mousemove){ + document.removeEventListener("mousemove", this.mousemove, false); + } + if(this.mouseup){ + document.removeEventListener("mouseup", this.mouseup, false); + } + + this.mousemove = this._mousemove.bind(this); + this.mouseup = this._mouseup.bind(this); + + if (this.touchCapable) { + // Touch: Bind touch events: + document.addEventListener("touchmove", this.mousemove, false); + document.addEventListener("touchend", this.mouseup, false); + } + // Bind mouse events: + document.addEventListener("mousemove", this.mousemove, false); + document.addEventListener("mouseup", this.mouseup, false); + + this._state.inDrag = true; + var newValue = this._calculateValue(); + + this._trigger('slideStart', newValue); + + this._setDataVal(newValue); + this.setValue(newValue, false, true); + + this._pauseEvent(ev); + + if (this.options.focus) { + this._triggerFocusOnHandle(this._state.dragged); + } + + return true; + }, + _triggerFocusOnHandle: function(handleIdx) { + if(handleIdx === 0) { + this.handle1.focus(); + } + if(handleIdx === 1) { + this.handle2.focus(); + } + }, + _keydown: function(handleIdx, ev) { + if(!this._state.enabled) { + return false; + } + + var dir; + switch (ev.keyCode) { + case 37: // left + case 40: // down + dir = -1; + break; + case 39: // right + case 38: // up + dir = 1; + break; + } + if (!dir) { + return; + } + + // use natural arrow keys instead of from min to max + if (this.options.natural_arrow_keys) { + var ifVerticalAndNotReversed = (this.options.orientation === 'vertical' && !this.options.reversed); + var ifHorizontalAndReversed = (this.options.orientation === 'horizontal' && this.options.reversed); + + if (ifVerticalAndNotReversed || ifHorizontalAndReversed) { + dir = -dir; + } + } + + var val = this._state.value[handleIdx] + dir * this.options.step; + if (this.options.range) { + val = [ (!handleIdx) ? val : this._state.value[0], + ( handleIdx) ? val : this._state.value[1]]; + } + + this._trigger('slideStart', val); + this._setDataVal(val); + this.setValue(val, true, true); + + this._setDataVal(val); + this._trigger('slideStop', val); + this._layout(); + + this._pauseEvent(ev); + + return false; + }, + _pauseEvent: function(ev) { + if(ev.stopPropagation) { + ev.stopPropagation(); + } + if(ev.preventDefault) { + ev.preventDefault(); + } + ev.cancelBubble=true; + ev.returnValue=false; + }, + _mousemove: function(ev) { + if(!this._state.enabled) { + return false; + } + + var percentage = this._getPercentage(ev); + this._adjustPercentageForRangeSliders(percentage); + this._state.percentage[this._state.dragged] = percentage; + this._layout(); + + var val = this._calculateValue(true); + this.setValue(val, true, true); + + return false; + }, + _adjustPercentageForRangeSliders: function(percentage) { + if (this.options.range) { + var precision = this._getNumDigitsAfterDecimalPlace(percentage); + precision = precision ? precision - 1 : 0; + var percentageWithAdjustedPrecision = this._applyToFixedAndParseFloat(percentage, precision); + if (this._state.dragged === 0 && this._applyToFixedAndParseFloat(this._state.percentage[1], precision) < percentageWithAdjustedPrecision) { + this._state.percentage[0] = this._state.percentage[1]; + this._state.dragged = 1; + } else if (this._state.dragged === 1 && this._applyToFixedAndParseFloat(this._state.percentage[0], precision) > percentageWithAdjustedPrecision) { + this._state.percentage[1] = this._state.percentage[0]; + this._state.dragged = 0; + } + } + }, + _mouseup: function() { + if(!this._state.enabled) { + return false; + } + if (this.touchCapable) { + // Touch: Unbind touch event handlers: + document.removeEventListener("touchmove", this.mousemove, false); + document.removeEventListener("touchend", this.mouseup, false); + } + // Unbind mouse event handlers: + document.removeEventListener("mousemove", this.mousemove, false); + document.removeEventListener("mouseup", this.mouseup, false); + + this._state.inDrag = false; + if (this._state.over === false) { + this._hideTooltip(); + } + var val = this._calculateValue(true); + + this._layout(); + this._setDataVal(val); + this._trigger('slideStop', val); + + return false; + }, + _calculateValue: function(snapToClosestTick) { + var val; + if (this.options.range) { + val = [this.options.min,this.options.max]; + if (this._state.percentage[0] !== 0){ + val[0] = this._toValue(this._state.percentage[0]); + val[0] = this._applyPrecision(val[0]); + } + if (this._state.percentage[1] !== 100){ + val[1] = this._toValue(this._state.percentage[1]); + val[1] = this._applyPrecision(val[1]); + } + } else { + val = this._toValue(this._state.percentage[0]); + val = parseFloat(val); + val = this._applyPrecision(val); + } + + if (snapToClosestTick) { + var min = [val, Infinity]; + for (var i = 0; i < this.options.ticks.length; i++) { + var diff = Math.abs(this.options.ticks[i] - val); + if (diff <= min[1]) { + min = [this.options.ticks[i], diff]; + } + } + if (min[1] <= this.options.ticks_snap_bounds) { + return min[0]; + } + } + + return val; + }, + _applyPrecision: function(val) { + var precision = this.options.precision || this._getNumDigitsAfterDecimalPlace(this.options.step); + return this._applyToFixedAndParseFloat(val, precision); + }, + _getNumDigitsAfterDecimalPlace: function(num) { + var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + if (!match) { return 0; } + return Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)); + }, + _applyToFixedAndParseFloat: function(num, toFixedInput) { + var truncatedNum = num.toFixed(toFixedInput); + return parseFloat(truncatedNum); + }, + /* + Credits to Mike Samuel for the following method! + Source: http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number + */ + _getPercentage: function(ev) { + if (this.touchCapable && (ev.type === 'touchstart' || ev.type === 'touchmove')) { + ev = ev.touches[0]; + } + + var eventPosition = ev[this.mousePos]; + var sliderOffset = this._state.offset[this.stylePos]; + var distanceToSlide = eventPosition - sliderOffset; + // Calculate what percent of the length the slider handle has slid + var percentage = (distanceToSlide / this._state.size) * 100; + percentage = Math.round(percentage / this._state.percentage[2]) * this._state.percentage[2]; + if (this.options.reversed) { + percentage = 100 - percentage; + } + + // Make sure the percent is within the bounds of the slider. + // 0% corresponds to the 'min' value of the slide + // 100% corresponds to the 'max' value of the slide + return Math.max(0, Math.min(100, percentage)); + }, + _validateInputValue: function(val) { + if (typeof val === 'number') { + return val; + } else if (Array.isArray(val)) { + this._validateArray(val); + return val; + } else { + throw new Error( ErrorMsgs.formatInvalidInputErrorMsg(val) ); + } + }, + _validateArray: function(val) { + for(var i = 0; i < val.length; i++) { + var input = val[i]; + if (typeof input !== 'number') { throw new Error( ErrorMsgs.formatInvalidInputErrorMsg(input) ); } + } + }, + _setDataVal: function(val) { + this.element.setAttribute('data-value', val); + this.element.setAttribute('value', val); + this.element.value = val; + }, + _trigger: function(evt, val) { + val = (val || val === 0) ? val : undefined; + + var callbackFnArray = this.eventToCallbackMap[evt]; + if(callbackFnArray && callbackFnArray.length) { + for(var i = 0; i < callbackFnArray.length; i++) { + var callbackFn = callbackFnArray[i]; + callbackFn(val); + } + } + + /* If JQuery exists, trigger JQuery events */ + if($) { + this._triggerJQueryEvent(evt, val); + } + }, + _triggerJQueryEvent: function(evt, val) { + var eventData = { + type: evt, + value: val + }; + this.$element.trigger(eventData); + this.$sliderElem.trigger(eventData); + }, + _unbindJQueryEventHandlers: function() { + this.$element.off(); + this.$sliderElem.off(); + }, + _setText: function(element, text) { + if(typeof element.innerText !== "undefined") { + element.innerText = text; + } else if(typeof element.textContent !== "undefined") { + element.textContent = text; + } + }, + _removeClass: function(element, classString) { + var classes = classString.split(" "); + var newClasses = element.className; + + for(var i = 0; i < classes.length; i++) { + var classTag = classes[i]; + var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)"); + newClasses = newClasses.replace(regex, " "); + } + + element.className = newClasses.trim(); + }, + _addClass: function(element, classString) { + var classes = classString.split(" "); + var newClasses = element.className; + + for(var i = 0; i < classes.length; i++) { + var classTag = classes[i]; + var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)"); + var ifClassExists = regex.test(newClasses); + + if(!ifClassExists) { + newClasses += " " + classTag; + } + } + + element.className = newClasses.trim(); + }, + _offsetLeft: function(obj){ + return obj.getBoundingClientRect().left; + }, + _offsetTop: function(obj){ + var offsetTop = obj.offsetTop; + while((obj = obj.offsetParent) && !isNaN(obj.offsetTop)){ + offsetTop += obj.offsetTop; + } + return offsetTop; + }, + _offset: function (obj) { + return { + left: this._offsetLeft(obj), + top: this._offsetTop(obj) + }; + }, + _css: function(elementRef, styleName, value) { + if ($) { + $.style(elementRef, styleName, value); + } else { + var style = styleName.replace(/^-ms-/, "ms-").replace(/-([\da-z])/gi, function (all, letter) { + return letter.toUpperCase(); + }); + elementRef.style[style] = value; + } + }, + _toValue: function(percentage) { + return this.options.scale.toValue.apply(this, [percentage]); + }, + _toPercentage: function(value) { + return this.options.scale.toPercentage.apply(this, [value]); + }, + _setTooltipPosition: function(){ + var tooltips = [this.tooltip, this.tooltip_min, this.tooltip_max]; + if (this.options.orientation === 'vertical'){ + var tooltipPos = this.options.tooltip_position || 'right'; + var oppositeSide = (tooltipPos === 'left') ? 'right' : 'left'; + tooltips.forEach(function(tooltip){ + this._addClass(tooltip, tooltipPos); + tooltip.style[oppositeSide] = '100%'; + }.bind(this)); + } else if(this.options.tooltip_position === 'bottom') { + tooltips.forEach(function(tooltip){ + this._addClass(tooltip, 'bottom'); + tooltip.style.top = 22 + 'px'; + }.bind(this)); + } else { + tooltips.forEach(function(tooltip){ + this._addClass(tooltip, 'top'); + tooltip.style.top = -this.tooltip.outerHeight - 14 + 'px'; + }.bind(this)); + } + } + }; + + /********************************* + + Attach to global namespace + + *********************************/ + if($) { + var namespace = $.fn.slider ? 'bootstrapSlider' : 'slider'; + $.bridget(namespace, Slider); + } + + })( $ ); + + return Slider; +})); diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-slider/slider.css b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-slider/slider.css new file mode 100755 index 00000000..3a649288 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-slider/slider.css @@ -0,0 +1,282 @@ +/*! + * Slider for Bootstrap + * + * Copyright 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.slider { + display: block; + vertical-align: middle; + position: relative; + +} +.slider.slider-horizontal { + width: 100%; + height: 20px; + margin-bottom: 20px; +} +.slider.slider-horizontal:last-of-type { + margin-bottom: 0; +} +.slider.slider-horizontal .slider-track { + height: 10px; + width: 100%; + margin-top: -5px; + top: 50%; + left: 0; +} +.slider.slider-horizontal .slider-selection, +.slider.slider-horizontal .slider-track-low, +.slider.slider-horizontal .slider-track-high { + height: 100%; + top: 0; + bottom: 0; +} +.slider.slider-horizontal .slider-tick, +.slider.slider-horizontal .slider-handle { + margin-left: -10px; + margin-top: -5px; +} +.slider.slider-horizontal .slider-tick.triangle, +.slider.slider-horizontal .slider-handle.triangle { + border-width: 0 10px 10px 10px; + width: 0; + height: 0; + border-bottom-color: #0480be; + margin-top: 0; +} +.slider.slider-horizontal .slider-tick-label-container { + white-space: nowrap; + margin-top: 20px; +} +.slider.slider-horizontal .slider-tick-label-container .slider-tick-label { + padding-top: 4px; + display: inline-block; + text-align: center; +} +.slider.slider-vertical { + height: 230px; + width: 20px; + margin-right: 20px; + display: inline-block; +} +.slider.slider-vertical:last-of-type { + margin-right: 0; +} +.slider.slider-vertical .slider-track { + width: 10px; + height: 100%; + margin-left: -5px; + left: 50%; + top: 0; +} +.slider.slider-vertical .slider-selection { + width: 100%; + left: 0; + top: 0; + bottom: 0; +} +.slider.slider-vertical .slider-track-low, +.slider.slider-vertical .slider-track-high { + width: 100%; + left: 0; + right: 0; +} +.slider.slider-vertical .slider-tick, +.slider.slider-vertical .slider-handle { + margin-left: -5px; + margin-top: -10px; +} +.slider.slider-vertical .slider-tick.triangle, +.slider.slider-vertical .slider-handle.triangle { + border-width: 10px 0 10px 10px; + width: 1px; + height: 1px; + border-left-color: #0480be; + margin-left: 0; +} +.slider.slider-vertical .slider-tick-label-container { + white-space: nowrap; +} +.slider.slider-vertical .slider-tick-label-container .slider-tick-label { + padding-left: 4px; +} +.slider.slider-disabled .slider-handle { + background-image: -webkit-linear-gradient(top, #dfdfdf 0%, #bebebe 100%); + background-image: -o-linear-gradient(top, #dfdfdf 0%, #bebebe 100%); + background-image: linear-gradient(to bottom, #dfdfdf 0%, #bebebe 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdfdfdf', endColorstr='#ffbebebe', GradientType=0); +} +.slider.slider-disabled .slider-track { + background-image: -webkit-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%); + background-image: -o-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%); + background-image: linear-gradient(to bottom, #e5e5e5 0%, #e9e9e9 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe5e5e5', endColorstr='#ffe9e9e9', GradientType=0); + cursor: not-allowed; +} +.slider input { + display: none; +} +.slider .tooltip.top { + margin-top: -36px; +} +.slider .tooltip-inner { + white-space: nowrap; +} +.slider .hide { + display: none; +} +.slider-track { + position: absolute; + cursor: pointer; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f0f0f0, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f0f0f0), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f0f0f0, #f9f9f9); + background-image: -o-linear-gradient(top, #f0f0f0, #f9f9f9); + background-image: linear-gradient(to bottom, #f0f0f0, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0f0f0', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.slider-selection { + position: absolute; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f9f9f9, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #f9f9f9, #f5f5f5); + background-image: -o-linear-gradient(top, #f9f9f9, #f5f5f5); + background-image: linear-gradient(to bottom, #f9f9f9, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.slider-selection.tick-slider-selection { + background-image: -webkit-linear-gradient(top, #89cdef 0%, #81bfde 100%); + background-image: -o-linear-gradient(top, #89cdef 0%, #81bfde 100%); + background-image: linear-gradient(to bottom, #89cdef 0%, #81bfde 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff89cdef', endColorstr='#ff81bfde', GradientType=0); +} +.slider-track-low, +.slider-track-high { + position: absolute; + background: transparent; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 4px; +} +.slider-handle { + position: absolute; + width: 20px; + height: 20px; + background-color: #444; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + opacity: 1; + border: 0px solid transparent; +} +.slider-handle.round { + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; +} +.slider-handle.triangle { + background: transparent none; +} +.slider-handle.custom { + background: transparent none; +} +.slider-handle.custom::before { + line-height: 20px; + font-size: 20px; + content: '\2605'; + color: #726204; +} +.slider-tick { + position: absolute; + width: 20px; + height: 20px; + background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #f9f9f9 0%, #f5f5f5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + filter: none; + opacity: 0.8; + border: 0px solid transparent; +} +.slider-tick.round { + border-radius: 50%; +} +.slider-tick.triangle { + background: transparent none; +} +.slider-tick.custom { + background: transparent none; +} +.slider-tick.custom::before { + line-height: 20px; + font-size: 20px; + content: '\2605'; + color: #726204; +} +.slider-tick.in-selection { + background-image: -webkit-linear-gradient(top, #89cdef 0%, #81bfde 100%); + background-image: -o-linear-gradient(top, #89cdef 0%, #81bfde 100%); + background-image: linear-gradient(to bottom, #89cdef 0%, #81bfde 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff89cdef', endColorstr='#ff81bfde', GradientType=0); + opacity: 1; +} +.slider-disabled .slider-selection { + opacity: 0.5; +} + +#red .slider-selection { + background: #f56954; +} + +#blue .slider-selection { + background: #3c8dbc; +} + +#green .slider-selection { + background: #00a65a; +} + +#yellow .slider-selection { + background: #f39c12; +} + +#aqua .slider-selection { + background: #00c0ef; +} + +#purple .slider-selection { + background: #932ab6; +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table-zh-CN.min.js b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table-zh-CN.min.js new file mode 100755 index 00000000..cf3e01ef --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table-zh-CN.min.js @@ -0,0 +1,9 @@ +/* + * bootstrap-table - v1.9.1 - 2015-10-25 + * https://github.com/wenzhixin/bootstrap-table + * Copyright (c) 2015 zhixin wen + * Licensed MIT License + */ +!function(a){"use strict";a.fn.bootstrapTable.locales["zh-CN"]={formatLoadingMessage:function(){return"正在努力地加载数据中,请稍候……"},formatRecordsPerPage:function(a){return"每页显示 "+a+" 条记录"},formatShowingRows:function(a,b,c){return"显示第 "+a+" 到第 "+b+" 条记录,总共 "+c+" 条记录"},formatSearch:function(){return"搜索"},formatNoMatches:function(){return"没有找到匹配的记录"},formatPaginationSwitch:function(){return"隐藏/显示分页"},formatRefresh:function(){return"刷新"},formatToggle:function(){return"切换"},formatColumns:function(){return"列"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["zh-CN"])}(jQuery);/** + * Created by ch on 2017/9/6. + */ diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table.min.css b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table.min.css new file mode 100755 index 00000000..5ab17e4b --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table.min.css @@ -0,0 +1 @@ +.fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table:not(.table-condensed),.bootstrap-table .table:not(.table-condensed)>tbody>tr>td,.bootstrap-table .table:not(.table-condensed)>tbody>tr>th,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>td,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>th,.bootstrap-table .table:not(.table-condensed)>thead>tr>td{padding:8px!important}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0}.pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table.min.js b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table.min.js new file mode 100755 index 00000000..6ce33801 --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-table/bootstrap-table.min.js @@ -0,0 +1,1320 @@ +/** + * Created by ch on 2017/9/6. + */ +/* + * bootstrap-table - v1.9.1 - 2015-10-25 + * https://github.com/wenzhixin/bootstrap-table + * Copyright (c) 2015 zhixin wen + * Licensed MIT License + */ +! + function(a) { + "use strict"; + var b = null, + c = function(a) { + var b = arguments, + c = !0, + d = 1; + return a = a.replace(/%s/g, + function() { + var a = b[d++]; + return "undefined" == typeof a ? (c = !1, "") : a + }), + c ? a: "" + }, + d = function(b, c, d, e) { + var f = ""; + return a.each(b, + function(a, b) { + return b[c] === e ? (f = b[d], !1) : !0 + }), + f + }, + e = function(b, c) { + var d = -1; + return a.each(b, + function(a, b) { + return b.field === c ? (d = a, !1) : !0 + }), + d + }, + f = function(b) { + var c, d, e, f = 0, + g = []; + for (c = 0; c < b[0].length; c++) f += b[0][c].colspan || 1; + for (c = 0; c < b.length; c++) for (g[c] = [], d = 0; f > d; d++) g[c][d] = !1; + for (c = 0; c < b.length; c++) for (d = 0; d < b[c].length; d++) { + var h = b[c][d], + i = h.rowspan || 1, + j = h.colspan || 1, + k = a.inArray(!1, g[c]); + for (1 === j && (h.fieldIndex = k, "undefined" == typeof h.field && (h.field = k)), e = 0; i > e; e++) g[c + e][k] = !0; + for (e = 0; j > e; e++) g[c][k + e] = !0 + } + }, + g = function() { + if (null === b) { + var c, d, e = a("

            ").addClass("fixed-table-scroll-inner"), + f = a("

            ").addClass("fixed-table-scroll-outer"); + f.append(e), + a("body").append(f), + c = e[0].offsetWidth, + f.css("overflow", "scroll"), + d = e[0].offsetWidth, + c === d && (d = f[0].clientWidth), + f.remove(), + b = c - d + } + return b + }, + h = function(b, d, e, f) { + var g = d; + if ("string" == typeof d) { + var h = d.split("."); + h.length > 1 ? (g = window, a.each(h, + function(a, b) { + g = g[b] + })) : g = window[d] + } + return "object" == typeof g ? g: "function" == typeof g ? g.apply(b, e) : !g && "string" == typeof d && c.apply(this, [d].concat(e)) ? c.apply(this, [d].concat(e)) : f + }, + i = function(b, c, d) { + var e = Object.getOwnPropertyNames(b), + f = Object.getOwnPropertyNames(c), + g = ""; + if (d && e.length !== f.length) return ! 1; + for (var h = 0; h < e.length; h++) if (g = e[h], a.inArray(g, f) > -1 && b[g] !== c[g]) return ! 1; + return ! 0 + }, + j = function(a) { + return "string" == typeof a ? a.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'") : a + }, + k = function(b) { + var c = 0; + return b.children().each(function() { + c < a(this).outerHeight(!0) && (c = a(this).outerHeight(!0)) + }), + c + }, + l = function(a) { + for (var b in a) { + var c = b.split(/(?=[A-Z])/).join("-").toLowerCase(); + c !== b && (a[c] = a[b], delete a[b]) + } + return a + }, + m = function(a, b) { + var c = a; + if ("string" != typeof b || a.hasOwnProperty(b)) return a[b]; + var d = b.split("."); + for (var e in d) c = c[d[e]]; + return c + }, + n = function(b, c) { + this.options = c, + this.$el = a(b), + this.$el_ = this.$el.clone(), + this.timeoutId_ = 0, + this.timeoutFooter_ = 0, + this.init() + }; + n.DEFAULTS = { + classes: "table table-hover", + locale: void 0, + height: void 0, + undefinedText: "-", + sortName: void 0, + sortOrder: "asc", + striped: !1, + columns: [[]], + data: [], + dataField: "rows", + method: "get", + url: void 0, + ajax: void 0, + cache: !0, + contentType: "application/json", + dataType: "json", + ajaxOptions: {}, + queryParams: function(a) { + return a + }, + queryParamsType: "limit", + responseHandler: function(a) { + return a + }, + pagination: !1, + onlyInfoPagination: !1, + sidePagination: "client", + totalRows: 0, + pageNumber: 1, + pageSize: 10, + pageList: [10, 25, 50, 100], + paginationHAlign: "right", + paginationVAlign: "bottom", + paginationDetailHAlign: "left", + paginationFirstText: "«", + paginationPreText: "‹", + paginationNextText: "›", + paginationLastText: "»", + search: !1, + strictSearch: !1, + searchAlign: "right", + selectItemName: "btSelectItem", + showHeader: !0, + showFooter: !1, + showColumns: !1, + showPaginationSwitch: !1, + showRefresh: !1, + showToggle: !1, + buttonsAlign: "right", + smartDisplay: !0, + minimumCountColumns: 1, + idField: void 0, + uniqueId: void 0, + cardView: !1, + detailView: !1, + detailFormatter: function() { + return "" + }, + trimOnSearch: !0, + clickToSelect: !1, + singleSelect: !1, + toolbar: void 0, + toolbarAlign: "left", + checkboxHeader: !0, + sortable: !0, + silentSort: !0, + maintainSelected: !1, + searchTimeOut: 500, + searchText: "", + iconSize: void 0, + iconsPrefix: "glyphicon", + icons: { + paginationSwitchDown: "glyphicon-collapse-down icon-chevron-down", + paginationSwitchUp: "glyphicon-collapse-up icon-chevron-up", + refresh: "glyphicon-refresh icon-refresh", + toggle: "glyphicon-list-alt icon-list-alt", + columns: "glyphicon-th icon-th", + detailOpen: "glyphicon-plus icon-plus", + detailClose: "glyphicon-minus icon-minus" + }, + rowStyle: function() { + return {} + }, + rowAttributes: function() { + return {} + }, + onAll: function() { + return ! 1 + }, + onClickCell: function() { + return ! 1 + }, + onDblClickCell: function() { + return ! 1 + }, + onClickRow: function() { + return ! 1 + }, + onDblClickRow: function() { + return ! 1 + }, + onSort: function() { + return ! 1 + }, + onCheck: function() { + return ! 1 + }, + onUncheck: function() { + return ! 1 + }, + onCheckAll: function() { + return ! 1 + }, + onUncheckAll: function() { + return ! 1 + }, + onCheckSome: function() { + return ! 1 + }, + onUncheckSome: function() { + return ! 1 + }, + onLoadSuccess: function() { + return ! 1 + }, + onLoadError: function() { + return ! 1 + }, + onColumnSwitch: function() { + return ! 1 + }, + onPageChange: function() { + return ! 1 + }, + onSearch: function() { + return ! 1 + }, + onToggle: function() { + return ! 1 + }, + onPreBody: function() { + return ! 1 + }, + onPostBody: function() { + return ! 1 + }, + onPostHeader: function() { + return ! 1 + }, + onExpandRow: function() { + return ! 1 + }, + onCollapseRow: function() { + return ! 1 + }, + onRefreshOptions: function() { + return ! 1 + }, + onResetView: function() { + return ! 1 + } + }, + n.LOCALES = [], + n.LOCALES["en-US"] = n.LOCALES.en = { + formatLoadingMessage: function() { + return "Loading, please wait..." + }, + formatRecordsPerPage: function(a) { + return c("%s records per page", a) + }, + formatShowingRows: function(a, b, d) { + return c("Showing %s to %s of %s rows", a, b, d) + }, + formatDetailPagination: function(a) { + return c("Showing %s rows", a) + }, + formatSearch: function() { + return "Search" + }, + formatNoMatches: function() { + return "No matching records found" + }, + formatPaginationSwitch: function() { + return "Hide/Show pagination" + }, + formatRefresh: function() { + return "Refresh" + }, + formatToggle: function() { + return "Toggle" + }, + formatColumns: function() { + return "Columns" + }, + formatAllRows: function() { + return "All" + } + }, + a.extend(n.DEFAULTS, n.LOCALES["en-US"]), + n.COLUMN_DEFAULTS = { + radio: !1, + checkbox: !1, + checkboxEnabled: !0, + field: void 0, + title: void 0, + titleTooltip: void 0, + "class": void 0, + align: void 0, + halign: void 0, + falign: void 0, + valign: void 0, + width: void 0, + sortable: !1, + order: "asc", + visible: !0, + switchable: !0, + clickToSelect: !0, + formatter: void 0, + footerFormatter: void 0, + events: void 0, + sorter: void 0, + sortName: void 0, + cellStyle: void 0, + searchable: !0, + searchFormatter: !0, + cardVisible: !0 + }, + n.EVENTS = { + "all.bs.table": "onAll", + "click-cell.bs.table": "onClickCell", + "dbl-click-cell.bs.table": "onDblClickCell", + "click-row.bs.table": "onClickRow", + "dbl-click-row.bs.table": "onDblClickRow", + "sort.bs.table": "onSort", + "check.bs.table": "onCheck", + "uncheck.bs.table": "onUncheck", + "check-all.bs.table": "onCheckAll", + "uncheck-all.bs.table": "onUncheckAll", + "check-some.bs.table": "onCheckSome", + "uncheck-some.bs.table": "onUncheckSome", + "load-success.bs.table": "onLoadSuccess", + "load-error.bs.table": "onLoadError", + "column-switch.bs.table": "onColumnSwitch", + "page-change.bs.table": "onPageChange", + "search.bs.table": "onSearch", + "toggle.bs.table": "onToggle", + "pre-body.bs.table": "onPreBody", + "post-body.bs.table": "onPostBody", + "post-header.bs.table": "onPostHeader", + "expand-row.bs.table": "onExpandRow", + "collapse-row.bs.table": "onCollapseRow", + "refresh-options.bs.table": "onRefreshOptions", + "reset-view.bs.table": "onResetView" + }, + n.prototype.init = function() { + this.initLocale(), + this.initContainer(), + this.initTable(), + this.initHeader(), + this.initData(), + this.initFooter(), + this.initToolbar(), + this.initPagination(), + this.initBody(), + this.initSearchText(), + this.initServer() + }, + n.prototype.initLocale = function() { + if (this.options.locale) { + var b = this.options.locale.split(/-|_/); + b[0].toLowerCase(), + b[1] && b[1].toUpperCase(), + a.fn.bootstrapTable.locales[this.options.locale] ? a.extend(this.options, a.fn.bootstrapTable.locales[this.options.locale]) : a.fn.bootstrapTable.locales[b.join("-")] ? a.extend(this.options, a.fn.bootstrapTable.locales[b.join("-")]) : a.fn.bootstrapTable.locales[b[0]] && a.extend(this.options, a.fn.bootstrapTable.locales[b[0]]) + } + }, + n.prototype.initContainer = function() { + this.$container = a(['
            ', '
            ', "top" === this.options.paginationVAlign || "both" === this.options.paginationVAlign ? '
            ': "", '
            ', '
            ', '
            ', '
            ', this.options.formatLoadingMessage(), "
            ", "
            ", '', "bottom" === this.options.paginationVAlign || "both" === this.options.paginationVAlign ? '
            ': "", "
            ", "
            "].join("")), + this.$container.insertAfter(this.$el), + this.$tableContainer = this.$container.find(".fixed-table-container"), + this.$tableHeader = this.$container.find(".fixed-table-header"), + this.$tableBody = this.$container.find(".fixed-table-body"), + this.$tableLoading = this.$container.find(".fixed-table-loading"), + this.$tableFooter = this.$container.find(".fixed-table-footer"), + this.$toolbar = this.$container.find(".fixed-table-toolbar"), + this.$pagination = this.$container.find(".fixed-table-pagination"), + this.$tableBody.append(this.$el), + this.$container.after('
            '), + this.$el.addClass(this.options.classes), + this.options.striped && this.$el.addClass("table-striped"), + -1 !== a.inArray("table-no-bordered", this.options.classes.split(" ")) && this.$tableContainer.addClass("table-no-bordered") + }, + n.prototype.initTable = function() { + var b = this, + c = [], + d = []; + this.$header = this.$el.find(">thead"), + this.$header.length || (this.$header = a("").appendTo(this.$el)), + this.$header.find("tr").each(function() { + var b = []; + a(this).find("th").each(function() { + b.push(a.extend({}, + { + title: a(this).html(), + "class": a(this).attr("class"), + titleTooltip: a(this).attr("title"), + rowspan: a(this).attr("rowspan") ? +a(this).attr("rowspan") : void 0, + colspan: a(this).attr("colspan") ? +a(this).attr("colspan") : void 0 + }, + a(this).data())) + }), + c.push(b) + }), + a.isArray(this.options.columns[0]) || (this.options.columns = [this.options.columns]), + this.options.columns = a.extend(!0, [], c, this.options.columns), + this.columns = [], + f(this.options.columns), + a.each(this.options.columns, + function(c, d) { + a.each(d, + function(d, e) { + e = a.extend({}, + n.COLUMN_DEFAULTS, e), + "undefined" != typeof e.fieldIndex && (b.columns[e.fieldIndex] = e), + b.options.columns[c][d] = e + }) + }), + this.options.data.length || (this.$el.find(">tbody>tr").each(function() { + var c = {}; + c._id = a(this).attr("id"), + c._class = a(this).attr("class"), + c._data = l(a(this).data()), + a(this).find("td").each(function(d) { + var e = b.columns[d].field; + c[e] = a(this).html(), + c["_" + e + "_id"] = a(this).attr("id"), + c["_" + e + "_class"] = a(this).attr("class"), + c["_" + e + "_rowspan"] = a(this).attr("rowspan"), + c["_" + e + "_title"] = a(this).attr("title"), + c["_" + e + "_data"] = l(a(this).data()) + }), + d.push(c) + }), this.options.data = d) + }, + n.prototype.initHeader = function() { + var b = this, + d = {}, + e = []; + this.header = { + fields: [], + styles: [], + classes: [], + formatters: [], + events: [], + sorters: [], + sortNames: [], + cellStyles: [], + searchables: [] + }, + a.each(this.options.columns, + function(f, g) { + e.push(""), + 0 == f && !b.options.cardView && b.options.detailView && e.push(c('
            ', b.options.columns.length)), + a.each(g, + function(a, f) { + var g = "", + h = "", + i = "", + j = "", + k = c(' class="%s"', f["class"]), + l = (b.options.sortOrder || f.order, "px"), + m = f.width; + if (void 0 === f.width || b.options.cardView || "string" == typeof f.width && -1 !== f.width.indexOf("%") && (l = "%"), f.width && "string" == typeof f.width && (m = f.width.replace("%", "").replace("px", "")), h = c("text-align: %s; ", f.halign ? f.halign: f.align), i = c("text-align: %s; ", f.align), j = c("vertical-align: %s; ", f.valign), j += c("width: %s; ", !f.checkbox && !f.radio || m ? m ? m + l: void 0 : "36px"), "undefined" != typeof f.fieldIndex) { + if (b.header.fields[f.fieldIndex] = f.field, b.header.styles[f.fieldIndex] = i + j, b.header.classes[f.fieldIndex] = k, b.header.formatters[f.fieldIndex] = f.formatter, b.header.events[f.fieldIndex] = f.events, b.header.sorters[f.fieldIndex] = f.sorter, b.header.sortNames[f.fieldIndex] = f.sortName, b.header.cellStyles[f.fieldIndex] = f.cellStyle, b.header.searchables[f.fieldIndex] = f.searchable, !f.visible) return; + if (b.options.cardView && !f.cardVisible) return; + d[f.field] = f + } + e.push(""), + e.push(c('
            ', b.options.sortable && f.sortable ? "sortable both": "")), + g = f.title, + f.checkbox && (!b.options.singleSelect && b.options.checkboxHeader && (g = ''), b.header.stateField = f.field), + f.radio && (g = "", b.header.stateField = f.field, b.options.singleSelect = !0), + e.push(g), + e.push("
            "), + e.push('
            '), + e.push("
            "), + e.push("") + }), + e.push("") + }), + this.$header.html(e.join("")), + this.$header.find("th[data-field]").each(function() { + a(this).data(d[a(this).data("field")]) + }), + this.$container.off("click", ".th-inner").on("click", ".th-inner", + function(c) { + b.options.sortable && a(this).parent().data().sortable && b.onSort(c) + }), + this.$header.children().children().off("keypress").on("keypress", + function(c) { + if (b.options.sortable && a(this).data().sortable) { + var d = c.keyCode || c.which; + 13 == d && b.onSort(c) + } + }), + !this.options.showHeader || this.options.cardView ? (this.$header.hide(), this.$tableHeader.hide(), this.$tableLoading.css("top", 0)) : (this.$header.show(), this.$tableHeader.show(), this.$tableLoading.css("top", this.$header.outerHeight() + 1), this.getCaret()), + this.$selectAll = this.$header.find('[name="btSelectAll"]'), + this.$container.off("click", '[name="btSelectAll"]').on("click", '[name="btSelectAll"]', + function() { + var c = a(this).prop("checked"); + b[c ? "checkAll": "uncheckAll"](), + b.updateSelected() + }) + }, + n.prototype.initFooter = function() { ! this.options.showFooter || this.options.cardView ? this.$tableFooter.hide() : this.$tableFooter.show() + }, + n.prototype.initData = function(a, b) { + this.data = "append" === b ? this.data.concat(a) : "prepend" === b ? [].concat(a).concat(this.data) : a || this.options.data, + this.options.data = "append" === b ? this.options.data.concat(a) : "prepend" === b ? [].concat(a).concat(this.options.data) : this.data, + "server" !== this.options.sidePagination && this.initSort() + }, + n.prototype.initSort = function() { + var b = this, + c = this.options.sortName, + d = "desc" === this.options.sortOrder ? -1 : 1, + e = a.inArray(this.options.sortName, this.header.fields); - 1 !== e && this.data.sort(function(f, g) { + b.header.sortNames[e] && (c = b.header.sortNames[e]); + var i = m(f, c), + j = m(g, c), + k = h(b.header, b.header.sorters[e], [i, j]); + return void 0 !== k ? d * k: ((void 0 === i || null === i) && (i = ""), (void 0 === j || null === j) && (j = ""), a.isNumeric(i) && a.isNumeric(j) ? (i = parseFloat(i), j = parseFloat(j), j > i ? -1 * d: d) : i === j ? 0 : ("string" != typeof i && (i = i.toString()), -1 === i.localeCompare(j) ? -1 * d: d)) + }) + }, + n.prototype.onSort = function(b) { + var c = "keypress" === b.type ? a(b.currentTarget) : a(b.currentTarget).parent(), + d = this.$header.find("th").eq(c.index()); + return this.$header.add(this.$header_).find("span.order").remove(), + this.options.sortName === c.data("field") ? this.options.sortOrder = "asc" === this.options.sortOrder ? "desc": "asc": (this.options.sortName = c.data("field"), this.options.sortOrder = "asc" === c.data("order") ? "desc": "asc"), + this.trigger("sort", this.options.sortName, this.options.sortOrder), + c.add(d).data("order", this.options.sortOrder), + this.getCaret(), + "server" === this.options.sidePagination ? void this.initServer(this.options.silentSort) : (this.initSort(), void this.initBody()) + }, + n.prototype.initToolbar = function() { + var b, d, f = this, + g = [], + i = 0, + j = 0; + this.$toolbar.html(""), + ("string" == typeof this.options.toolbar || "object" == typeof this.options.toolbar) && a(c('
            ', this.options.toolbarAlign)).appendTo(this.$toolbar).append(a(this.options.toolbar)), + g = [c('
            ', this.options.buttonsAlign, this.options.buttonsAlign)], + "string" == typeof this.options.icons && (this.options.icons = h(null, this.options.icons)), + this.options.showPaginationSwitch && g.push(c('"), + this.options.showRefresh && g.push(c('"), + this.options.showToggle && g.push(c('"), + this.options.showColumns && (g.push(c('
            ', this.options.formatColumns()), '", '", "
            ")), + g.push("
            "), + (this.showToolbar || g.length > 2) && this.$toolbar.append(g.join("")), + this.options.showPaginationSwitch && this.$toolbar.find('button[name="paginationSwitch"]').off("click").on("click", a.proxy(this.togglePagination, this)), + this.options.showRefresh && this.$toolbar.find('button[name="refresh"]').off("click").on("click", a.proxy(this.refresh, this)), + this.options.showToggle && this.$toolbar.find('button[name="toggle"]').off("click").on("click", + function() { + f.toggleView() + }), + this.options.showColumns && (b = this.$toolbar.find(".keep-open"), j <= this.options.minimumCountColumns && b.find("input").prop("disabled", !0), b.find("li").off("click").on("click", + function(a) { + a.stopImmediatePropagation() + }), b.find("input").off("click").on("click", + function() { + var b = a(this); + f.toggleColumn(e(f.columns, a(this).data("field")), b.prop("checked"), !1), + f.trigger("column-switch", a(this).data("field"), b.prop("checked")) + })), + this.options.search && (g = [], g.push('"), this.$toolbar.append(g.join("")), d = this.$toolbar.find(".search input"), d.off("keyup drop").on("keyup drop", + function(a) { + clearTimeout(i), + i = setTimeout(function() { + f.onSearch(a) + }, + f.options.searchTimeOut) + })) + }, + n.prototype.onSearch = function(b) { + var c = a.trim(a(b.currentTarget).val()); + this.options.trimOnSearch && a(b.currentTarget).val() !== c && a(b.currentTarget).val(c), + c !== this.searchText && (this.searchText = c, this.options.pageNumber = 1, this.initSearch(), this.updatePagination(), this.trigger("search", c)), + $('#switch_off input ').bootstrapSwitch('state',false), + $('#switch_on input').bootstrapSwitch('state',true) + }, + n.prototype.initSearch = function() { + var b = this; + if ("server" !== this.options.sidePagination) { + var c = this.searchText && this.searchText.toLowerCase(), + d = a.isEmptyObject(this.filterColumns) ? null: this.filterColumns; + this.data = d ? a.grep(this.options.data, + function(b) { + for (var c in d) if (a.isArray(d[c])) { + if ( - 1 === a.inArray(b[c], d[c])) return ! 1 + } else if (b[c] !== d[c]) return ! 1; + return ! 0 + }) : this.options.data, + this.data = c ? a.grep(this.data, + function(d, f) { + for (var g in d) { + g = a.isNumeric(g) ? parseInt(g, 10) : g; + var i = d[g], + j = b.columns[e(b.columns, g)], + k = a.inArray(g, b.header.fields); + j && j.searchFormatter && (i = h(j, b.header.formatters[k], [i, d, f], i)); + var l = a.inArray(g, b.header.fields); + if ( - 1 !== l && b.header.searchables[l] && ("string" == typeof i || "number" == typeof i)) if (b.options.strictSearch) { + if ((i + "").toLowerCase() === c) return ! 0 + } else if ( - 1 !== (i + "").toLowerCase().indexOf(c)) return ! 0 + } + return ! 1 + }) : this.data + } + }, + n.prototype.initPagination = function() { + if (!this.options.pagination) return void this.$pagination.hide(); + this.$pagination.show(); + var b, d, e, f, g, h, i, j, k, l = this, + m = [], + n = !1, + o = this.getData(); + if ("server" !== this.options.sidePagination && (this.options.totalRows = o.length), this.totalPages = 0, this.options.totalRows) { + if (this.options.pageSize === this.options.formatAllRows()) this.options.pageSize = this.options.totalRows, + n = !0; + else if (this.options.pageSize === this.options.totalRows) { + var p = "string" == typeof this.options.pageList ? this.options.pageList.replace("[", "").replace("]", "").replace(/ /g, "").toLowerCase().split(",") : this.options.pageList; + a.inArray(this.options.formatAllRows().toLowerCase(), p) > -1 && (n = !0) + } + this.totalPages = ~~ ((this.options.totalRows - 1) / this.options.pageSize) + 1, + this.options.totalPages = this.totalPages + } + if (this.totalPages > 0 && this.options.pageNumber > this.totalPages && (this.options.pageNumber = this.totalPages), this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1, this.pageTo = this.options.pageNumber * this.options.pageSize, this.pageTo > this.options.totalRows && (this.pageTo = this.options.totalRows), m.push('
            ', '', this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) : this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows), ""), !this.options.onlyInfoPagination) { + m.push(''); + var q = [c('', "top" === this.options.paginationVAlign || "both" === this.options.paginationVAlign ? "dropdown": "dropup"), '", '"), m.push(this.options.formatRecordsPerPage(q.join(""))), m.push(""), m.push("
            ", '") + } + this.$pagination.html(m.join("")), + this.options.onlyInfoPagination || (f = this.$pagination.find(".page-list a"), g = this.$pagination.find(".page-first"), h = this.$pagination.find(".page-pre"), i = this.$pagination.find(".page-next"), j = this.$pagination.find(".page-last"), k = this.$pagination.find(".page-number"), this.options.pageNumber <= 1 && (g.addClass("disabled"), h.addClass("disabled")), this.options.pageNumber >= this.totalPages && (i.addClass("disabled"), j.addClass("disabled")), this.options.smartDisplay && (this.totalPages <= 1 && this.$pagination.find("div.pagination").hide(), (r.length < 2 || this.options.totalRows <= r[0]) && this.$pagination.find("span.page-list").hide(), this.$pagination[this.getData().length ? "show": "hide"]()), n && (this.options.pageSize = this.options.formatAllRows()), f.off("click").on("click", a.proxy(this.onPageListChange, this)), g.off("click").on("click", a.proxy(this.onPageFirst, this)), h.off("click").on("click", a.proxy(this.onPagePre, this)), i.off("click").on("click", a.proxy(this.onPageNext, this)), j.off("click").on("click", a.proxy(this.onPageLast, this)), k.off("click").on("click", a.proxy(this.onPageNumber, this))) + }, + n.prototype.updatePagination = function(b) { + b && a(b.currentTarget).hasClass("disabled") || (this.options.maintainSelected || this.resetRows(), this.initPagination(), "server" === this.options.sidePagination ? this.initServer() : this.initBody(), this.trigger("page-change", this.options.pageNumber, this.options.pageSize)) + }, + n.prototype.onPageListChange = function(b) { + var c = a(b.currentTarget); + c.parent().addClass("active").siblings().removeClass("active"), + this.options.pageSize = c.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ? this.options.formatAllRows() : +c.text(), + this.$toolbar.find(".page-size").text(this.options.pageSize), + this.updatePagination(b) + }, + n.prototype.onPageFirst = function(a) { + this.options.pageNumber = 1, + this.updatePagination(a) + }, + n.prototype.onPagePre = function(a) { + this.options.pageNumber--, + this.updatePagination(a) + }, + n.prototype.onPageNext = function(a) { + this.options.pageNumber++, + this.updatePagination(a) + }, + n.prototype.onPageLast = function(a) { + this.options.pageNumber = this.totalPages, + this.updatePagination(a) + }, + n.prototype.onPageNumber = function(b) { + this.options.pageNumber !== +a(b.currentTarget).text() && (this.options.pageNumber = +a(b.currentTarget).text(), this.updatePagination(b)) + }, + n.prototype.initBody = function(b) { + var f = this, + g = [], + i = this.getData(); + this.trigger("pre-body", i), + this.$body = this.$el.find(">tbody"), + this.$body.length || (this.$body = a("").appendTo(this.$el)), + this.options.pagination && "server" !== this.options.sidePagination || (this.pageFrom = 1, this.pageTo = i.length); + for (var k = this.pageFrom - 1; k < this.pageTo; k++) { + var l, n = i[k], + o = {}, + p = [], + q = "", + r = {}, + s = []; + if (o = h(this.options, this.options.rowStyle, [n, k], o), o && o.css) for (l in o.css) p.push(l + ": " + o.css[l]); + if (r = h(this.options, this.options.rowAttributes, [n, k], r)) for (l in r) s.push(c('%s="%s"', l, j(r[l]))); + n._data && !a.isEmptyObject(n._data) && a.each(n._data, + function(a, b) { + "index" !== a && (q += c(' data-%s="%s"', a, b)) + }), + g.push(""), + this.options.cardView && g.push(c('', this.header.fields.length)), + !this.options.cardView && this.options.detailView && g.push("", '', c('', this.options.iconsPrefix, this.options.icons.detailOpen), "", ""), + a.each(this.header.fields, + function(b, i) { + var j = "", + l = m(n, i), + q = "", + r = {}, + s = "", + t = f.header.classes[b], + u = "", + v = "", + w = "", + x = f.columns[e(f.columns, i)]; + if (x.visible) { + if (o = c('style="%s"', p.concat(f.header.styles[b]).join("; ")), l = h(x, f.header.formatters[b], [l, n, k], l), n["_" + i + "_id"] && (s = c(' id="%s"', n["_" + i + "_id"])), n["_" + i + "_class"] && (t = c(' class="%s"', n["_" + i + "_class"])), n["_" + i + "_rowspan"] && (v = c(' rowspan="%s"', n["_" + i + "_rowspan"])), n["_" + i + "_title"] && (w = c(' title="%s"', n["_" + i + "_title"])), r = h(f.header, f.header.cellStyles[b], [l, n, k], r), r.classes && (t = c(' class="%s"', r.classes)), r.css) { + var y = []; + for (var z in r.css) y.push(z + ": " + r.css[z]); + o = c('style="%s"', y.concat(f.header.styles[b]).join("; ")) + } + n["_" + i + "_data"] && !a.isEmptyObject(n["_" + i + "_data"]) && a.each(n["_" + i + "_data"], + function(a, b) { + "index" !== a && (u += c(' data-%s="%s"', a, b)) + }), + x.checkbox || x.radio ? (q = x.checkbox ? "checkbox": q, q = x.radio ? "radio": q, j = [f.options.cardView ? '
            ': '', "", f.header.formatters[b] && "string" == typeof l ? l: "", f.options.cardView ? "
            ": ""].join(""), n[f.header.stateField] = l === !0 || l && l.checked) : (l = "undefined" == typeof l || null === l ? f.options.undefinedText: l, j = f.options.cardView ? ['
            ', f.options.showHeader ? c('%s', o, d(f.columns, "field", "title", i)) : "", c('%s', l), "
            "].join("") : [c("", s, t, o, u, v, w), l, ""].join(""), f.options.cardView && f.options.smartDisplay && "" === l && (j = '
            ')), + g.push(j) + } + }), + this.options.cardView && g.push(""), + g.push("") + } + g.length || g.push('', c('%s', this.$header.find("th").length, this.options.formatNoMatches()), ""), + this.$body.html(g.join("")), + b || this.scrollTo(0), + this.$body.find("> tr[data-index] > td").off("click dblclick").on("click dblclick", + function(b) { + var d = a(this), + g = d.parent(), + h = f.data[g.data("index")], + i = d[0].cellIndex, + j = f.header.fields[f.options.detailView && !f.options.cardView ? i - 1 : i], + k = f.columns[e(f.columns, j)], + l = m(h, j); + if (!d.find(".detail-icon").length && (f.trigger("click" === b.type ? "click-cell": "dbl-click-cell", j, l, h, d), f.trigger("click" === b.type ? "click-row": "dbl-click-row", h, g), "click" === b.type && f.options.clickToSelect && k.clickToSelect)) { + var n = g.find(c('[name="%s"]', f.options.selectItemName)); + n.length && n[0].click() + } + }), + this.$body.find("> tr[data-index] > td > .detail-icon").off("click").on("click", + function() { + var b = a(this), + d = b.parent().parent(), + e = d.data("index"), + g = i[e]; + d.next().is("tr.detail-view") ? (b.find("i").attr("class", c("%s %s", f.options.iconsPrefix, f.options.icons.detailOpen)), d.next().remove(), f.trigger("collapse-row", e, g)) : (b.find("i").attr("class", c("%s %s", f.options.iconsPrefix, f.options.icons.detailClose)), d.after(c('%s', d.find("td").length, h(f.options, f.options.detailFormatter, [e, g], ""))), f.trigger("expand-row", e, g, d.next().find("td"))), + f.resetView() + }), + this.$selectItem = this.$body.find(c('[name="%s"]', this.options.selectItemName)), + this.$selectItem.off("click").on("click", + function(b) { + b.stopImmediatePropagation(); + var c = a(this), + d = c.prop("checked"), + e = f.data[c.data("index")]; + f.options.maintainSelected && a(this).is(":radio") && a.each(f.options.data, + function(a, b) { + b[f.header.stateField] = !1 + }), + e[f.header.stateField] = d, + f.options.singleSelect && (f.$selectItem.not(this).each(function() { + f.data[a(this).data("index")][f.header.stateField] = !1 + }), f.$selectItem.filter(":checked").not(this).prop("checked", !1)), + f.updateSelected(), + f.trigger(d ? "check": "uncheck", e, c) + }), + a.each(this.header.events, + function(b, c) { + if (c) { + "string" == typeof c && (c = h(null, c)); + var d = f.header.fields[b], + e = a.inArray(d, f.getVisibleFields()); + f.options.detailView && !f.options.cardView && (e += 1); + for (var g in c) f.$body.find(">tr:not(.no-records-found)").each(function() { + var b = a(this), + h = b.find(f.options.cardView ? ".card-view": "td").eq(e), + i = g.indexOf(" "), + j = g.substring(0, i), + k = g.substring(i + 1), + l = c[g]; + h.find(k).off(j).on(j, + function(a) { + var c = b.data("index"), + e = f.data[c], + g = e[d]; + l.apply(this, [a, g, e, c]) + }) + }) + } + }), + this.updateSelected(), + this.resetView(), + this.trigger("post-body") + }, + n.prototype.initServer = function(b, c) { + var d, e = this, + f = {}, + g = { + pageSize: this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows: this.options.pageSize, + pageNumber: this.options.pageNumber, + searchText: this.searchText, + sortName: this.options.sortName, + sortOrder: this.options.sortOrder + }; (this.options.url || this.options.ajax) && ("limit" === this.options.queryParamsType && (g = { + search: g.searchText, + sort: g.sortName, + order: g.sortOrder + }, + this.options.pagination && (g.limit = this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows: this.options.pageSize, g.offset = this.options.pageSize === this.options.formatAllRows() ? 0 : this.options.pageSize * (this.options.pageNumber - 1))), a.isEmptyObject(this.filterColumnsPartial) || (g.filter = JSON.stringify(this.filterColumnsPartial, null)), f = h(this.options, this.options.queryParams, [g], f), a.extend(f, c || {}), f !== !1 && (b || this.$tableLoading.show(), d = a.extend({}, + h(null, this.options.ajaxOptions), { + type: this.options.method, + url: this.options.url, + data: "application/json" === this.options.contentType && "post" === this.options.method ? JSON.stringify(f) : f, + cache: this.options.cache, + contentType: this.options.contentType, + dataType: this.options.dataType, + success: function(a) { + a = h(e.options, e.options.responseHandler, [a], a), + e.load(a), + e.trigger("load-success", a) + }, + error: function(a) { + e.trigger("load-error", a.status, a) + }, + complete: function() { + b || e.$tableLoading.hide() + } + }), this.options.ajax ? h(this, this.options.ajax, [d], null) : a.ajax(d))); + + }, + n.prototype.initSearchText = function() { + if (this.options.search && "" !== this.options.searchText) { + var a = this.$toolbar.find(".search input"); + a.val(this.options.searchText), + this.onSearch({ + currentTarget: a + }) + } + }, + n.prototype.getCaret = function() { + var b = this; + a.each(this.$header.find("th"), + function(c, d) { + a(d).find(".sortable").removeClass("desc asc").addClass(a(d).data("field") === b.options.sortName ? b.options.sortOrder: "both") + }) + }, + n.prototype.updateSelected = function() { + var b = this.$selectItem.filter(":enabled").length && this.$selectItem.filter(":enabled").length === this.$selectItem.filter(":enabled").filter(":checked").length; + this.$selectAll.add(this.$selectAll_).prop("checked", b), + this.$selectItem.each(function() { + a(this).closest("tr")[a(this).prop("checked") ? "addClass": "removeClass"]("selected") + }) + }, + n.prototype.updateRows = function() { + var b = this; + this.$selectItem.each(function() { + b.data[a(this).data("index")][b.header.stateField] = a(this).prop("checked") + }) + }, + n.prototype.resetRows = function() { + var b = this; + a.each(this.data, + function(a, c) { + b.$selectAll.prop("checked", !1), + b.$selectItem.prop("checked", !1), + b.header.stateField && (c[b.header.stateField] = !1) + }) + }, + n.prototype.trigger = function(b) { + var c = Array.prototype.slice.call(arguments, 1); + b += ".bs.table", + this.options[n.EVENTS[b]].apply(this.options, c), + this.$el.trigger(a.Event(b), c), + this.options.onAll(b, c), + this.$el.trigger(a.Event("all.bs.table"), [b, c]) + }, + n.prototype.resetHeader = function() { + clearTimeout(this.timeoutId_), + this.timeoutId_ = setTimeout(a.proxy(this.fitHeader, this), this.$el.is(":hidden") ? 100 : 0) + }, + n.prototype.fitHeader = function() { + var b, d, e, f, h = this; + if (h.$el.is(":hidden")) return void(h.timeoutId_ = setTimeout(a.proxy(h.fitHeader, h), 100)); + if (b = this.$tableBody.get(0), d = b.scrollWidth > b.clientWidth && b.scrollHeight > b.clientHeight + this.$header.outerHeight() ? g() : 0, this.$el.css("margin-top", -this.$header.outerHeight()), e = a(":focus"), e.length > 0) { + var i = e.parents("th"); + if (i.length > 0) { + var j = i.attr("data-field"); + if (void 0 !== j) { + var k = this.$header.find("[data-field='" + j + "']"); + k.length > 0 && k.find(":input").addClass("focus-temp") + } + } + } + this.$header_ = this.$header.clone(!0, !0), + this.$selectAll_ = this.$header_.find('[name="btSelectAll"]'), + this.$tableHeader.css({ + "margin-right": d + }).find("table").css("width", this.$el.outerWidth()).html("").attr("class", this.$el.attr("class")).append(this.$header_), + f = a(".focus-temp:visible:eq(0)"), + f.length > 0 && (f.focus(), this.$header.find(".focus-temp").removeClass("focus-temp")), + this.$header.find("th[data-field]").each(function() { + h.$header_.find(c('th[data-field="%s"]', a(this).data("field"))).data(a(this).data()) + }); + var l = this.getVisibleFields(); + this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(b) { + var d = a(this), + e = b; + h.options.detailView && !h.options.cardView && (0 === b && h.$header_.find("th.detail").find(".fht-cell").width(d.innerWidth()), e = b - 1), + h.$header_.find(c('th[data-field="%s"]', l[e])).find(".fht-cell").width(d.innerWidth()) + }), + this.$tableBody.off("scroll").on("scroll", + function() { + h.$tableHeader.scrollLeft(a(this).scrollLeft()), + h.options.showFooter && !h.options.cardView && h.$tableFooter.scrollLeft(a(this).scrollLeft()) + }), + h.trigger("post-header") + }, + n.prototype.resetFooter = function() { + var b = this, + d = b.getData(), + e = []; + this.options.showFooter && !this.options.cardView && (!this.options.cardView && this.options.detailView && e.push('
             
            '), a.each(this.columns, + function(a, f) { + var g = "", + i = "", + j = c(' class="%s"', f["class"]); + f.visible && (!b.options.cardView || f.cardVisible) && (g = c("text-align: %s; ", f.falign ? f.falign: f.align), i = c("vertical-align: %s; ", f.valign), e.push(""), e.push('
            '), e.push(h(f, f.footerFormatter, [d], " ") || " "), e.push("
            "), e.push('
            '), e.push("
          "), e.push("")) + }), this.$tableFooter.find("tr").html(e.join("")), clearTimeout(this.timeoutFooter_), this.timeoutFooter_ = setTimeout(a.proxy(this.fitFooter, this), this.$el.is(":hidden") ? 100 : 0)) + }, + n.prototype.fitFooter = function() { + var b, c, d; + return clearTimeout(this.timeoutFooter_), + this.$el.is(":hidden") ? void(this.timeoutFooter_ = setTimeout(a.proxy(this.fitFooter, this), 100)) : (c = this.$el.css("width"), d = c > this.$tableBody.width() ? g() : 0, this.$tableFooter.css({ + "margin-right": d + }).find("table").css("width", c).attr("class", this.$el.attr("class")), b = this.$tableFooter.find("td"), void this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(c) { + var d = a(this); + b.eq(c).find(".fht-cell").width(d.innerWidth()) + })) + }, + n.prototype.toggleColumn = function(a, b, d) { + if ( - 1 !== a && (this.columns[a].visible = b, this.initHeader(), this.initSearch(), this.initPagination(), this.initBody(), this.options.showColumns)) { + var e = this.$toolbar.find(".keep-open input").prop("disabled", !1); + d && e.filter(c('[value="%s"]', a)).prop("checked", b), + e.filter(":checked").length <= this.options.minimumCountColumns && e.filter(":checked").prop("disabled", !0) + } + }, + n.prototype.toggleRow = function(a, b, d) { - 1 !== a && this.$body.find("undefined" != typeof a ? c('tr[data-index="%s"]', a) : c('tr[data-uniqueid="%s"]', b))[d ? "show": "hide"]() + }, + n.prototype.getVisibleFields = function() { + var b = this, + c = []; + return a.each(this.header.fields, + function(a, d) { + var f = b.columns[e(b.columns, d)]; + f.visible && c.push(d) + }), + c + }, + n.prototype.resetView = function(a) { + var b = 0; + if (a && a.height && (this.options.height = a.height), this.$selectAll.prop("checked", this.$selectItem.length > 0 && this.$selectItem.length === this.$selectItem.filter(":checked").length), this.options.height) { + var c = k(this.$toolbar), + d = k(this.$pagination), + e = this.options.height - c - d; + this.$tableContainer.css("height", e + "px") + } + return this.options.cardView ? (this.$el.css("margin-top", "0"), void this.$tableContainer.css("padding-bottom", "0")) : (this.options.showHeader && this.options.height ? (this.$tableHeader.show(), this.resetHeader(), b += this.$header.outerHeight()) : (this.$tableHeader.hide(), this.trigger("post-header")), this.options.showFooter && (this.resetFooter(), this.options.height && (b += this.$tableFooter.outerHeight() + 1)), this.getCaret(), this.$tableContainer.css("padding-bottom", b + "px"), void this.trigger("reset-view")) + }, + n.prototype.getData = function(b) { + return ! this.searchText && a.isEmptyObject(this.filterColumns) && a.isEmptyObject(this.filterColumnsPartial) ? b ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data: b ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data + }, + n.prototype.load = function(b) { + var c = !1; + "server" === this.options.sidePagination ? (this.options.totalRows = b.total, c = b.fixedScroll, b = b[this.options.dataField]) : a.isArray(b) || (c = b.fixedScroll, b = b.data), + this.initData(b), + this.initSearch(), + this.initPagination(), + this.initBody(c) + }, + n.prototype.append = function(a) { + this.initData(a, "append"), + this.initSearch(), + this.initPagination(), + this.initBody(!0) + }, + n.prototype.prepend = function(a) { + this.initData(a, "prepend"), + this.initSearch(), + this.initPagination(), + this.initBody(!0) + }, + n.prototype.remove = function(b) { + var c, d, e = this.options.data.length; + if (b.hasOwnProperty("field") && b.hasOwnProperty("values")) { + for (c = e - 1; c >= 0; c--) d = this.options.data[c], + d.hasOwnProperty(b.field) && -1 !== a.inArray(d[b.field], b.values) && this.options.data.splice(c, 1); + e !== this.options.data.length && (this.initSearch(), this.initPagination(), this.initBody(!0)) + } + }, + n.prototype.removeAll = function() { + this.options.data.length > 0 && (this.options.data.splice(0, this.options.data.length), this.initSearch(), this.initPagination(), this.initBody(!0)) + }, + n.prototype.getRowByUniqueId = function(a) { + var b, c, d, e = this.options.uniqueId, + f = this.options.data.length, + g = null; + for (b = f - 1; b >= 0; b--) { + if (c = this.options.data[b], c.hasOwnProperty(e)) d = c[e]; + else { + if (!c._data.hasOwnProperty(e)) continue; + d = c._data[e] + } + if ("string" == typeof d ? a = a.toString() : "number" == typeof d && (Number(d) === d && d % 1 === 0 ? a = parseInt(a) : d === Number(d) && 0 !== d && (a = parseFloat(a))), d === a) { + g = c; + break + } + } + return g + }, + n.prototype.removeByUniqueId = function(a) { + var b = this.options.data.length, + c = this.getRowByUniqueId(a); + c && this.options.data.splice(this.options.data.indexOf(c), 1), + b !== this.options.data.length && (this.initSearch(), this.initPagination(), this.initBody(!0)) + }, + n.prototype.updateByUniqueId = function(b) { + var c; + b.hasOwnProperty("id") && b.hasOwnProperty("row") && (c = a.inArray(this.getRowByUniqueId(b.id), this.options.data), -1 !== c && (a.extend(this.data[c], b.row), this.initSort(), this.initBody(!0))) + }, + n.prototype.insertRow = function(a) { + a.hasOwnProperty("index") && a.hasOwnProperty("row") && (this.data.splice(a.index, 0, a.row), this.initSearch(), this.initPagination(), this.initSort(), this.initBody(!0)) + }, + n.prototype.updateRow = function(b) { + b.hasOwnProperty("index") && b.hasOwnProperty("row") && (a.extend(this.data[b.index], b.row), this.initSort(), this.initBody(!0)) + }, + n.prototype.showRow = function(a) { + a.hasOwnProperty("index") && a.hasOwnProperty("uniqueId") && this.toggleRow(a.index, a.uniqueId, !0) + }, + n.prototype.hideRow = function(a) { + a.hasOwnProperty("index") && a.hasOwnProperty("uniqueId") && this.toggleRow(a.index, a.uniqueId, !1) + }, + n.prototype.getRowsHidden = function(b) { + var c = a(this.$body[0]).children().filter(":hidden"), + d = 0; + if (b) for (; d < c.length; d++) a(c[d]).show(); + return c + }, + n.prototype.mergeCells = function(b) { + var c, d, e, f = b.index, + g = a.inArray(b.field, this.getVisibleFields()), + h = b.rowspan || 1, + i = b.colspan || 1, + j = this.$body.find(">tr"); + if (this.options.detailView && !this.options.cardView && (g += 1), e = j.eq(f).find(">td").eq(g), !(0 > f || 0 > g || f >= this.data.length)) { + for (c = f; f + h > c; c++) for (d = g; g + i > d; d++) j.eq(c).find(">td").eq(d).hide(); + e.attr("rowspan", h).attr("colspan", i).show() + } + }, + n.prototype.updateCell = function(a) { + a.hasOwnProperty("index") && a.hasOwnProperty("field") && a.hasOwnProperty("value") && (this.data[a.index][a.field] = a.value, this.initSort(), this.initBody(!0)) + }, + n.prototype.getOptions = function() { + return this.options + }, + n.prototype.getSelections = function() { + var b = this; + return a.grep(this.data, + function(a) { + return a[b.header.stateField] + }) + }, + n.prototype.getAllSelections = function() { + var b = this; + return a.grep(this.options.data, + function(a) { + return a[b.header.stateField] + }) + }, + n.prototype.checkAll = function() { + this.checkAll_(!0) + }, + n.prototype.uncheckAll = function() { + this.checkAll_(!1) + }, + n.prototype.checkAll_ = function(a) { + var b; + a || (b = this.getSelections()), + this.$selectAll.add(this.$selectAll_).prop("checked", a), + this.$selectItem.filter(":enabled").prop("checked", a), + this.updateRows(), + a && (b = this.getSelections()), + this.trigger(a ? "check-all": "uncheck-all", b) + }, + n.prototype.check = function(a) { + this.check_(!0, a) + }, + n.prototype.uncheck = function(a) { + this.check_(!1, a) + }, + n.prototype.check_ = function(a, b) { + var d = this.$selectItem.filter(c('[data-index="%s"]', b)).prop("checked", a); + this.data[b][this.header.stateField] = a, + this.updateSelected(), + this.trigger(a ? "check": "uncheck", this.data[b], d) + }, + n.prototype.checkBy = function(a) { + this.checkBy_(!0, a) + }, + n.prototype.uncheckBy = function(a) { + this.checkBy_(!1, a) + }, + n.prototype.checkBy_ = function(b, d) { + if (d.hasOwnProperty("field") && d.hasOwnProperty("values")) { + var e = this, + f = []; + a.each(this.options.data, + function(g, h) { + if (!h.hasOwnProperty(d.field)) return ! 1; + if ( - 1 !== a.inArray(h[d.field], d.values)) { + var i = e.$selectItem.filter(":enabled").filter(c('[data-index="%s"]', g)).prop("checked", b); + h[e.header.stateField] = b, + f.push(h), + e.trigger(b ? "check": "uncheck", h, i) + } + }), + this.updateSelected(), + this.trigger(b ? "check-some": "uncheck-some", f) + } + }, + n.prototype.destroy = function() { + this.$el.insertBefore(this.$container), + a(this.options.toolbar).insertBefore(this.$el), + this.$container.next().remove(), + this.$container.remove(), + this.$el.html(this.$el_.html()).css("margin-top", "0").attr("class", this.$el_.attr("class") || "") + }, + n.prototype.showLoading = function() { + this.$tableLoading.show() + }, + n.prototype.hideLoading = function() { + this.$tableLoading.hide() + }, + n.prototype.togglePagination = function() { + this.options.pagination = !this.options.pagination; + var a = this.$toolbar.find('button[name="paginationSwitch"] i'); + this.options.pagination ? a.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown) : a.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp), + this.updatePagination() + }, + n.prototype.refresh = function(a) { + a && a.url && (this.options.url = a.url, this.options.pageNumber = 1), + this.initServer(a && a.silent, a && a.query) + }, + n.prototype.resetWidth = function() { + this.options.showHeader && this.options.height && this.fitHeader(), + this.options.showFooter && this.fitFooter() + }, + n.prototype.showColumn = function(a) { + this.toggleColumn(e(this.columns, a), !0, !0) + }, + n.prototype.hideColumn = function(a) { + this.toggleColumn(e(this.columns, a), !1, !0) + }, + n.prototype.getHiddenColumns = function() { + return a.grep(this.columns, + function(a) { + return ! a.visible + }) + }, + n.prototype.filterBy = function(b) { + this.filterColumns = a.isEmptyObject(b) ? {}: b, + this.options.pageNumber = 1, + this.initSearch(), + this.updatePagination() + }, + n.prototype.scrollTo = function(a) { + return "string" == typeof a && (a = "bottom" === a ? this.$tableBody[0].scrollHeight: 0), + "number" == typeof a && this.$tableBody.scrollTop(a), + "undefined" == typeof a ? this.$tableBody.scrollTop() : void 0 + }, + n.prototype.getScrollPosition = function() { + return this.scrollTo() + }, + n.prototype.selectPage = function(a) { + a > 0 && a <= this.options.totalPages && (this.options.pageNumber = a, this.updatePagination()) + }, + n.prototype.prevPage = function() { + this.options.pageNumber > 1 && (this.options.pageNumber--, this.updatePagination()) + }, + n.prototype.nextPage = function() { + this.options.pageNumber < this.options.totalPages && (this.options.pageNumber++, this.updatePagination()) + }, + n.prototype.toggleView = function() { + this.options.cardView = !this.options.cardView, + this.initHeader(), + this.initBody(), + this.trigger("toggle", this.options.cardView) + }, + n.prototype.refreshOptions = function(b) { + i(this.options, b, !1) || (this.options = a.extend(this.options, b), this.trigger("refresh-options", this.options), this.destroy(), this.init()) + }, + n.prototype.resetSearch = function(a) { + var b = this.$toolbar.find(".search input"); + b.val(a || ""), + this.onSearch({ + currentTarget: b + }) + }, + n.prototype.expandRow_ = function(a, b) { + var d = this.$body.find(c('> tr[data-index="%s"]', b)); + d.next().is("tr.detail-view") === (a ? !1 : !0) && d.find("> td > .detail-icon").click() + }, + n.prototype.expandRow = function(a) { + this.expandRow_(!0, a) + }, + n.prototype.collapseRow = function(a) { + this.expandRow_(!1, a) + }, + n.prototype.expandAllRows = function(b) { + if (b) { + var d = this.$body.find(c('> tr[data-index="%s"]', 0)), + e = this, + f = null, + g = !1, + h = -1; + if (d.next().is("tr.detail-view") ? d.next().next().is("tr.detail-view") || (d.next().find(".detail-icon").click(), g = !0) : (d.find("> td > .detail-icon").click(), g = !0), g) try { + h = setInterval(function() { + f = e.$body.find("tr.detail-view").last().find(".detail-icon"), + f.length > 0 ? f.click() : clearInterval(h) + }, + 1) + } catch(i) { + clearInterval(h) + } + } else for (var j = this.$body.children(), k = 0; k < j.length; k++) this.expandRow_(!0, a(j[k]).data("index")) + }, + n.prototype.collapseAllRows = function(b) { + if (b) this.expandRow_(!1, 0); + else for (var c = this.$body.children(), d = 0; d < c.length; d++) this.expandRow_(!1, a(c[d]).data("index")) + }; + var o = ["getOptions", "getSelections", "getAllSelections", "getData", "load", "append", "prepend", "remove", "removeAll", "insertRow", "updateRow", "updateCell", "updateByUniqueId", "removeByUniqueId", "getRowByUniqueId", "showRow", "hideRow", "getRowsHidden", "mergeCells", "checkAll", "uncheckAll", "check", "uncheck", "checkBy", "uncheckBy", "refresh", "resetView", "resetWidth", "destroy", "showLoading", "hideLoading", "showColumn", "hideColumn", "getHiddenColumns", "filterBy", "scrollTo", "getScrollPosition", "selectPage", "prevPage", "nextPage", "togglePagination", "toggleView", "refreshOptions", "resetSearch", "expandRow", "collapseRow", "expandAllRows", "collapseAllRows"]; + + a.fn.bootstrapTable = function(b) { + var c, d = Array.prototype.slice.call(arguments, 1); + return this.each(function() { + var e = a(this), + f = e.data("bootstrap.table"), + g = a.extend({}, + n.DEFAULTS, e.data(), "object" == typeof b && b); + if ("string" == typeof b) { + if (a.inArray(b, o) < 0) throw new Error("Unknown method: " + b); + if (!f) return; + c = f[b].apply(f, d), + "destroy" === b && e.removeData("bootstrap.table") + } + f || e.data("bootstrap.table", f = new n(this, g)) + }), + "undefined" == typeof c ? this: c + }, + a.fn.bootstrapTable.Constructor = n, + a.fn.bootstrapTable.defaults = n.DEFAULTS, + a.fn.bootstrapTable.columnDefaults = n.COLUMN_DEFAULTS, + a.fn.bootstrapTable.locales = n.LOCALES, + a.fn.bootstrapTable.methods = o, + a.fn.bootstrapTable.utils = { + sprintf: c, + getFieldIndex: e, + compareObjects: i, + calculateObjectValue: h + }, + a(function() { + a('[data-toggle="table"]').bootstrapTable() + }) + + } (jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js new file mode 100755 index 00000000..acccf91e --- /dev/null +++ b/hera-admin/src/main/resources/static/adminlte/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js @@ -0,0 +1,14975 @@ +// TODO: in future try to replace most inline compability checks with polyfills for code readability + +// element.textContent polyfill. +// Unsupporting browsers: IE8 + +if (Object.defineProperty && Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(Element.prototype, "textContent") && !Object.getOwnPropertyDescriptor(Element.prototype, "textContent").get) { + (function() { + var innerText = Object.getOwnPropertyDescriptor(Element.prototype, "innerText"); + Object.defineProperty(Element.prototype, "textContent", + { + get: function() { + return innerText.get.call(this); + }, + set: function(s) { + return innerText.set.call(this, s); + } + } + ); + })(); +} + +// isArray polyfill for ie8 +if(!Array.isArray) { + Array.isArray = function(arg) { + return Object.prototype.toString.call(arg) === '[object Array]'; + }; +};/** + * @license wysihtml5x v0.4.15 + * https://github.com/Edicy/wysihtml5 + * + * Author: Christopher Blum (https://github.com/tiff) + * Secondary author of extended features: Oliver Pulges (https://github.com/pulges) + * + * Copyright (C) 2012 XING AG + * Licensed under the MIT license (MIT) + * + */ +var wysihtml5 = { + version: "0.4.15", + + // namespaces + commands: {}, + dom: {}, + quirks: {}, + toolbar: {}, + lang: {}, + selection: {}, + views: {}, + + INVISIBLE_SPACE: "\uFEFF", + + EMPTY_FUNCTION: function() {}, + + ELEMENT_NODE: 1, + TEXT_NODE: 3, + + BACKSPACE_KEY: 8, + ENTER_KEY: 13, + ESCAPE_KEY: 27, + SPACE_KEY: 32, + DELETE_KEY: 46 +}; +;/** + * Rangy, a cross-browser JavaScript range and selection library + * http://code.google.com/p/rangy/ + * + * Copyright 2014, Tim Down + * Licensed under the MIT license. + * Version: 1.3alpha.20140804 + * Build date: 4 August 2014 + */ + +(function(factory, global) { + if (typeof define == "function" && define.amd) { + // AMD. Register as an anonymous module. + define(factory); +/* + TODO: look into this properly. + + } else if (typeof exports == "object") { + // Node/CommonJS style for Browserify + module.exports = factory; +*/ + } else { + // No AMD or CommonJS support so we place Rangy in a global variable + global.rangy = factory(); + } +})(function() { + + var OBJECT = "object", FUNCTION = "function", UNDEFINED = "undefined"; + + // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START + // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113. + var domRangeProperties = ["startContainer", "startOffset", "endContainer", "endOffset", "collapsed", + "commonAncestorContainer"]; + + // Minimal set of methods required for DOM Level 2 Range compliance + var domRangeMethods = ["setStart", "setStartBefore", "setStartAfter", "setEnd", "setEndBefore", + "setEndAfter", "collapse", "selectNode", "selectNodeContents", "compareBoundaryPoints", "deleteContents", + "extractContents", "cloneContents", "insertNode", "surroundContents", "cloneRange", "toString", "detach"]; + + var textRangeProperties = ["boundingHeight", "boundingLeft", "boundingTop", "boundingWidth", "htmlText", "text"]; + + // Subset of TextRange's full set of methods that we're interested in + var textRangeMethods = ["collapse", "compareEndPoints", "duplicate", "moveToElementText", "parentElement", "select", + "setEndPoint", "getBoundingClientRect"]; + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Trio of functions taken from Peter Michaux's article: + // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting + function isHostMethod(o, p) { + var t = typeof o[p]; + return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == "unknown"; + } + + function isHostObject(o, p) { + return !!(typeof o[p] == OBJECT && o[p]); + } + + function isHostProperty(o, p) { + return typeof o[p] != UNDEFINED; + } + + // Creates a convenience function to save verbose repeated calls to tests functions + function createMultiplePropertyTest(testFunc) { + return function(o, props) { + var i = props.length; + while (i--) { + if (!testFunc(o, props[i])) { + return false; + } + } + return true; + }; + } + + // Next trio of functions are a convenience to save verbose repeated calls to previous two functions + var areHostMethods = createMultiplePropertyTest(isHostMethod); + var areHostObjects = createMultiplePropertyTest(isHostObject); + var areHostProperties = createMultiplePropertyTest(isHostProperty); + + function isTextRange(range) { + return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties); + } + + function getBody(doc) { + return isHostObject(doc, "body") ? doc.body : doc.getElementsByTagName("body")[0]; + } + + var modules = {}; + + var api = { + version: "1.3alpha.20140804", + initialized: false, + supported: true, + + util: { + isHostMethod: isHostMethod, + isHostObject: isHostObject, + isHostProperty: isHostProperty, + areHostMethods: areHostMethods, + areHostObjects: areHostObjects, + areHostProperties: areHostProperties, + isTextRange: isTextRange, + getBody: getBody + }, + + features: {}, + + modules: modules, + config: { + alertOnFail: true, + alertOnWarn: false, + preferTextRange: false, + autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize + } + }; + + function consoleLog(msg) { + if (isHostObject(window, "console") && isHostMethod(window.console, "log")) { + window.console.log(msg); + } + } + + function alertOrLog(msg, shouldAlert) { + if (shouldAlert) { + window.alert(msg); + } else { + consoleLog(msg); + } + } + + function fail(reason) { + api.initialized = true; + api.supported = false; + alertOrLog("Rangy is not supported on this page in your browser. Reason: " + reason, api.config.alertOnFail); + } + + api.fail = fail; + + function warn(msg) { + alertOrLog("Rangy warning: " + msg, api.config.alertOnWarn); + } + + api.warn = warn; + + // Add utility extend() method + if ({}.hasOwnProperty) { + api.util.extend = function(obj, props, deep) { + var o, p; + for (var i in props) { + if (props.hasOwnProperty(i)) { + o = obj[i]; + p = props[i]; + if (deep && o !== null && typeof o == "object" && p !== null && typeof p == "object") { + api.util.extend(o, p, true); + } + obj[i] = p; + } + } + // Special case for toString, which does not show up in for...in loops in IE <= 8 + if (props.hasOwnProperty("toString")) { + obj.toString = props.toString; + } + return obj; + }; + } else { + fail("hasOwnProperty not supported"); + } + + // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not + (function() { + var el = document.createElement("div"); + el.appendChild(document.createElement("span")); + var slice = [].slice; + var toArray; + try { + if (slice.call(el.childNodes, 0)[0].nodeType == 1) { + toArray = function(arrayLike) { + return slice.call(arrayLike, 0); + }; + } + } catch (e) {} + + if (!toArray) { + toArray = function(arrayLike) { + var arr = []; + for (var i = 0, len = arrayLike.length; i < len; ++i) { + arr[i] = arrayLike[i]; + } + return arr; + }; + } + + api.util.toArray = toArray; + })(); + + + // Very simple event handler wrapper function that doesn't attempt to solve issues such as "this" handling or + // normalization of event properties + var addListener; + if (isHostMethod(document, "addEventListener")) { + addListener = function(obj, eventType, listener) { + obj.addEventListener(eventType, listener, false); + }; + } else if (isHostMethod(document, "attachEvent")) { + addListener = function(obj, eventType, listener) { + obj.attachEvent("on" + eventType, listener); + }; + } else { + fail("Document does not have required addEventListener or attachEvent method"); + } + + api.util.addListener = addListener; + + var initListeners = []; + + function getErrorDesc(ex) { + return ex.message || ex.description || String(ex); + } + + // Initialization + function init() { + if (api.initialized) { + return; + } + var testRange; + var implementsDomRange = false, implementsTextRange = false; + + // First, perform basic feature tests + + if (isHostMethod(document, "createRange")) { + testRange = document.createRange(); + if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) { + implementsDomRange = true; + } + } + + var body = getBody(document); + if (!body || body.nodeName.toLowerCase() != "body") { + fail("No body element found"); + return; + } + + if (body && isHostMethod(body, "createTextRange")) { + testRange = body.createTextRange(); + if (isTextRange(testRange)) { + implementsTextRange = true; + } + } + + if (!implementsDomRange && !implementsTextRange) { + fail("Neither Range nor TextRange are available"); + return; + } + + api.initialized = true; + api.features = { + implementsDomRange: implementsDomRange, + implementsTextRange: implementsTextRange + }; + + // Initialize modules + var module, errorMessage; + for (var moduleName in modules) { + if ( (module = modules[moduleName]) instanceof Module ) { + module.init(module, api); + } + } + + // Call init listeners + for (var i = 0, len = initListeners.length; i < len; ++i) { + try { + initListeners[i](api); + } catch (ex) { + errorMessage = "Rangy init listener threw an exception. Continuing. Detail: " + getErrorDesc(ex); + consoleLog(errorMessage); + } + } + } + + // Allow external scripts to initialize this library in case it's loaded after the document has loaded + api.init = init; + + // Execute listener immediately if already initialized + api.addInitListener = function(listener) { + if (api.initialized) { + listener(api); + } else { + initListeners.push(listener); + } + }; + + var shimListeners = []; + + api.addShimListener = function(listener) { + shimListeners.push(listener); + }; + + function shim(win) { + win = win || window; + init(); + + // Notify listeners + for (var i = 0, len = shimListeners.length; i < len; ++i) { + shimListeners[i](win); + } + } + + api.shim = api.createMissingNativeApi = shim; + + function Module(name, dependencies, initializer) { + this.name = name; + this.dependencies = dependencies; + this.initialized = false; + this.supported = false; + this.initializer = initializer; + } + + Module.prototype = { + init: function() { + var requiredModuleNames = this.dependencies || []; + for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) { + moduleName = requiredModuleNames[i]; + + requiredModule = modules[moduleName]; + if (!requiredModule || !(requiredModule instanceof Module)) { + throw new Error("required module '" + moduleName + "' not found"); + } + + requiredModule.init(); + + if (!requiredModule.supported) { + throw new Error("required module '" + moduleName + "' not supported"); + } + } + + // Now run initializer + this.initializer(this); + }, + + fail: function(reason) { + this.initialized = true; + this.supported = false; + throw new Error("Module '" + this.name + "' failed to load: " + reason); + }, + + warn: function(msg) { + api.warn("Module " + this.name + ": " + msg); + }, + + deprecationNotice: function(deprecated, replacement) { + api.warn("DEPRECATED: " + deprecated + " in module " + this.name + "is deprecated. Please use " + + replacement + " instead"); + }, + + createError: function(msg) { + return new Error("Error in Rangy " + this.name + " module: " + msg); + } + }; + + function createModule(isCore, name, dependencies, initFunc) { + var newModule = new Module(name, dependencies, function(module) { + if (!module.initialized) { + module.initialized = true; + try { + initFunc(api, module); + module.supported = true; + } catch (ex) { + var errorMessage = "Module '" + name + "' failed to load: " + getErrorDesc(ex); + consoleLog(errorMessage); + } + } + }); + modules[name] = newModule; + } + + api.createModule = function(name) { + // Allow 2 or 3 arguments (second argument is an optional array of dependencies) + var initFunc, dependencies; + if (arguments.length == 2) { + initFunc = arguments[1]; + dependencies = []; + } else { + initFunc = arguments[2]; + dependencies = arguments[1]; + } + + var module = createModule(false, name, dependencies, initFunc); + + // Initialize the module immediately if the core is already initialized + if (api.initialized) { + module.init(); + } + }; + + api.createCoreModule = function(name, dependencies, initFunc) { + createModule(true, name, dependencies, initFunc); + }; + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately + + function RangePrototype() {} + api.RangePrototype = RangePrototype; + api.rangePrototype = new RangePrototype(); + + function SelectionPrototype() {} + api.selectionPrototype = new SelectionPrototype(); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Wait for document to load before running tests + + var docReady = false; + + var loadHandler = function(e) { + if (!docReady) { + docReady = true; + if (!api.initialized && api.config.autoInitialize) { + init(); + } + } + }; + + // Test whether we have window and document objects that we will need + if (typeof window == UNDEFINED) { + fail("No window found"); + return; + } + if (typeof document == UNDEFINED) { + fail("No document found"); + return; + } + + if (isHostMethod(document, "addEventListener")) { + document.addEventListener("DOMContentLoaded", loadHandler, false); + } + + // Add a fallback in case the DOMContentLoaded event isn't supported + addListener(window, "load", loadHandler); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // DOM utility methods used by Rangy + api.createCoreModule("DomUtil", [], function(api, module) { + var UNDEF = "undefined"; + var util = api.util; + + // Perform feature tests + if (!util.areHostMethods(document, ["createDocumentFragment", "createElement", "createTextNode"])) { + module.fail("document missing a Node creation method"); + } + + if (!util.isHostMethod(document, "getElementsByTagName")) { + module.fail("document missing getElementsByTagName method"); + } + + var el = document.createElement("div"); + if (!util.areHostMethods(el, ["insertBefore", "appendChild", "cloneNode"] || + !util.areHostObjects(el, ["previousSibling", "nextSibling", "childNodes", "parentNode"]))) { + module.fail("Incomplete Element implementation"); + } + + // innerHTML is required for Range's createContextualFragment method + if (!util.isHostProperty(el, "innerHTML")) { + module.fail("Element is missing innerHTML property"); + } + + var textNode = document.createTextNode("test"); + if (!util.areHostMethods(textNode, ["splitText", "deleteData", "insertData", "appendData", "cloneNode"] || + !util.areHostObjects(el, ["previousSibling", "nextSibling", "childNodes", "parentNode"]) || + !util.areHostProperties(textNode, ["data"]))) { + module.fail("Incomplete Text Node implementation"); + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been + // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that + // contains just the document as a single element and the value searched for is the document. + var arrayContains = /*Array.prototype.indexOf ? + function(arr, val) { + return arr.indexOf(val) > -1; + }:*/ + + function(arr, val) { + var i = arr.length; + while (i--) { + if (arr[i] === val) { + return true; + } + } + return false; + }; + + // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI + function isHtmlNamespace(node) { + var ns; + return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == "http://www.w3.org/1999/xhtml"); + } + + function parentElement(node) { + var parent = node.parentNode; + return (parent.nodeType == 1) ? parent : null; + } + + function getNodeIndex(node) { + var i = 0; + while( (node = node.previousSibling) ) { + ++i; + } + return i; + } + + function getNodeLength(node) { + switch (node.nodeType) { + case 7: + case 10: + return 0; + case 3: + case 8: + return node.length; + default: + return node.childNodes.length; + } + } + + function getCommonAncestor(node1, node2) { + var ancestors = [], n; + for (n = node1; n; n = n.parentNode) { + ancestors.push(n); + } + + for (n = node2; n; n = n.parentNode) { + if (arrayContains(ancestors, n)) { + return n; + } + } + + return null; + } + + function isAncestorOf(ancestor, descendant, selfIsAncestor) { + var n = selfIsAncestor ? descendant : descendant.parentNode; + while (n) { + if (n === ancestor) { + return true; + } else { + n = n.parentNode; + } + } + return false; + } + + function isOrIsAncestorOf(ancestor, descendant) { + return isAncestorOf(ancestor, descendant, true); + } + + function getClosestAncestorIn(node, ancestor, selfIsAncestor) { + var p, n = selfIsAncestor ? node : node.parentNode; + while (n) { + p = n.parentNode; + if (p === ancestor) { + return n; + } + n = p; + } + return null; + } + + function isCharacterDataNode(node) { + var t = node.nodeType; + return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment + } + + function isTextOrCommentNode(node) { + if (!node) { + return false; + } + var t = node.nodeType; + return t == 3 || t == 8 ; // Text or Comment + } + + function insertAfter(node, precedingNode) { + var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode; + if (nextNode) { + parent.insertBefore(node, nextNode); + } else { + parent.appendChild(node); + } + return node; + } + + // Note that we cannot use splitText() because it is bugridden in IE 9. + function splitDataNode(node, index, positionsToPreserve) { + var newNode = node.cloneNode(false); + newNode.deleteData(0, index); + node.deleteData(index, node.length - index); + insertAfter(newNode, node); + + // Preserve positions + if (positionsToPreserve) { + for (var i = 0, position; position = positionsToPreserve[i++]; ) { + // Handle case where position was inside the portion of node after the split point + if (position.node == node && position.offset > index) { + position.node = newNode; + position.offset -= index; + } + // Handle the case where the position is a node offset within node's parent + else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) { + ++position.offset; + } + } + } + return newNode; + } + + function getDocument(node) { + if (node.nodeType == 9) { + return node; + } else if (typeof node.ownerDocument != UNDEF) { + return node.ownerDocument; + } else if (typeof node.document != UNDEF) { + return node.document; + } else if (node.parentNode) { + return getDocument(node.parentNode); + } else { + throw module.createError("getDocument: no document found for node"); + } + } + + function getWindow(node) { + var doc = getDocument(node); + if (typeof doc.defaultView != UNDEF) { + return doc.defaultView; + } else if (typeof doc.parentWindow != UNDEF) { + return doc.parentWindow; + } else { + throw module.createError("Cannot get a window object for node"); + } + } + + function getIframeDocument(iframeEl) { + if (typeof iframeEl.contentDocument != UNDEF) { + return iframeEl.contentDocument; + } else if (typeof iframeEl.contentWindow != UNDEF) { + return iframeEl.contentWindow.document; + } else { + throw module.createError("getIframeDocument: No Document object found for iframe element"); + } + } + + function getIframeWindow(iframeEl) { + if (typeof iframeEl.contentWindow != UNDEF) { + return iframeEl.contentWindow; + } else if (typeof iframeEl.contentDocument != UNDEF) { + return iframeEl.contentDocument.defaultView; + } else { + throw module.createError("getIframeWindow: No Window object found for iframe element"); + } + } + + // This looks bad. Is it worth it? + function isWindow(obj) { + return obj && util.isHostMethod(obj, "setTimeout") && util.isHostObject(obj, "document"); + } + + function getContentDocument(obj, module, methodName) { + var doc; + + if (!obj) { + doc = document; + } + + // Test if a DOM node has been passed and obtain a document object for it if so + else if (util.isHostProperty(obj, "nodeType")) { + doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == "iframe") ? + getIframeDocument(obj) : getDocument(obj); + } + + // Test if the doc parameter appears to be a Window object + else if (isWindow(obj)) { + doc = obj.document; + } + + if (!doc) { + throw module.createError(methodName + "(): Parameter must be a Window object or DOM node"); + } + + return doc; + } + + function getRootContainer(node) { + var parent; + while ( (parent = node.parentNode) ) { + node = parent; + } + return node; + } + + function comparePoints(nodeA, offsetA, nodeB, offsetB) { + // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing + var nodeC, root, childA, childB, n; + if (nodeA == nodeB) { + // Case 1: nodes are the same + return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1; + } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) { + // Case 2: node C (container B or an ancestor) is a child node of A + return offsetA <= getNodeIndex(nodeC) ? -1 : 1; + } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) { + // Case 3: node C (container A or an ancestor) is a child node of B + return getNodeIndex(nodeC) < offsetB ? -1 : 1; + } else { + root = getCommonAncestor(nodeA, nodeB); + if (!root) { + throw new Error("comparePoints error: nodes have no common ancestor"); + } + + // Case 4: containers are siblings or descendants of siblings + childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true); + childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true); + + if (childA === childB) { + // This shouldn't be possible + throw module.createError("comparePoints got to case 4 and childA and childB are the same!"); + } else { + n = root.firstChild; + while (n) { + if (n === childA) { + return -1; + } else if (n === childB) { + return 1; + } + n = n.nextSibling; + } + } + } + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried + var crashyTextNodes = false; + + function isBrokenNode(node) { + var n; + try { + n = node.parentNode; + return false; + } catch (e) { + return true; + } + } + + (function() { + var el = document.createElement("b"); + el.innerHTML = "1"; + var textNode = el.firstChild; + el.innerHTML = "
          "; + crashyTextNodes = isBrokenNode(textNode); + + api.features.crashyTextNodes = crashyTextNodes; + })(); + + /*----------------------------------------------------------------------------------------------------------------*/ + + function inspectNode(node) { + if (!node) { + return "[No node]"; + } + if (crashyTextNodes && isBrokenNode(node)) { + return "[Broken node]"; + } + if (isCharacterDataNode(node)) { + return '"' + node.data + '"'; + } + if (node.nodeType == 1) { + var idAttr = node.id ? ' id="' + node.id + '"' : ""; + return "<" + node.nodeName + idAttr + ">[index:" + getNodeIndex(node) + ",length:" + node.childNodes.length + "][" + (node.innerHTML || "[innerHTML not supported]").slice(0, 25) + "]"; + } + return node.nodeName; + } + + function fragmentFromNodeChildren(node) { + var fragment = getDocument(node).createDocumentFragment(), child; + while ( (child = node.firstChild) ) { + fragment.appendChild(child); + } + return fragment; + } + + var getComputedStyleProperty; + if (typeof window.getComputedStyle != UNDEF) { + getComputedStyleProperty = function(el, propName) { + return getWindow(el).getComputedStyle(el, null)[propName]; + }; + } else if (typeof document.documentElement.currentStyle != UNDEF) { + getComputedStyleProperty = function(el, propName) { + return el.currentStyle[propName]; + }; + } else { + module.fail("No means of obtaining computed style properties found"); + } + + function NodeIterator(root) { + this.root = root; + this._next = root; + } + + NodeIterator.prototype = { + _current: null, + + hasNext: function() { + return !!this._next; + }, + + next: function() { + var n = this._current = this._next; + var child, next; + if (this._current) { + child = n.firstChild; + if (child) { + this._next = child; + } else { + next = null; + while ((n !== this.root) && !(next = n.nextSibling)) { + n = n.parentNode; + } + this._next = next; + } + } + return this._current; + }, + + detach: function() { + this._current = this._next = this.root = null; + } + }; + + function createIterator(root) { + return new NodeIterator(root); + } + + function DomPosition(node, offset) { + this.node = node; + this.offset = offset; + } + + DomPosition.prototype = { + equals: function(pos) { + return !!pos && this.node === pos.node && this.offset == pos.offset; + }, + + inspect: function() { + return "[DomPosition(" + inspectNode(this.node) + ":" + this.offset + ")]"; + }, + + toString: function() { + return this.inspect(); + } + }; + + function DOMException(codeName) { + this.code = this[codeName]; + this.codeName = codeName; + this.message = "DOMException: " + this.codeName; + } + + DOMException.prototype = { + INDEX_SIZE_ERR: 1, + HIERARCHY_REQUEST_ERR: 3, + WRONG_DOCUMENT_ERR: 4, + NO_MODIFICATION_ALLOWED_ERR: 7, + NOT_FOUND_ERR: 8, + NOT_SUPPORTED_ERR: 9, + INVALID_STATE_ERR: 11, + INVALID_NODE_TYPE_ERR: 24 + }; + + DOMException.prototype.toString = function() { + return this.message; + }; + + api.dom = { + arrayContains: arrayContains, + isHtmlNamespace: isHtmlNamespace, + parentElement: parentElement, + getNodeIndex: getNodeIndex, + getNodeLength: getNodeLength, + getCommonAncestor: getCommonAncestor, + isAncestorOf: isAncestorOf, + isOrIsAncestorOf: isOrIsAncestorOf, + getClosestAncestorIn: getClosestAncestorIn, + isCharacterDataNode: isCharacterDataNode, + isTextOrCommentNode: isTextOrCommentNode, + insertAfter: insertAfter, + splitDataNode: splitDataNode, + getDocument: getDocument, + getWindow: getWindow, + getIframeWindow: getIframeWindow, + getIframeDocument: getIframeDocument, + getBody: util.getBody, + isWindow: isWindow, + getContentDocument: getContentDocument, + getRootContainer: getRootContainer, + comparePoints: comparePoints, + isBrokenNode: isBrokenNode, + inspectNode: inspectNode, + getComputedStyleProperty: getComputedStyleProperty, + fragmentFromNodeChildren: fragmentFromNodeChildren, + createIterator: createIterator, + DomPosition: DomPosition + }; + + api.DOMException = DOMException; + }); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Pure JavaScript implementation of DOM Range + api.createCoreModule("DomRange", ["DomUtil"], function(api, module) { + var dom = api.dom; + var util = api.util; + var DomPosition = dom.DomPosition; + var DOMException = api.DOMException; + + var isCharacterDataNode = dom.isCharacterDataNode; + var getNodeIndex = dom.getNodeIndex; + var isOrIsAncestorOf = dom.isOrIsAncestorOf; + var getDocument = dom.getDocument; + var comparePoints = dom.comparePoints; + var splitDataNode = dom.splitDataNode; + var getClosestAncestorIn = dom.getClosestAncestorIn; + var getNodeLength = dom.getNodeLength; + var arrayContains = dom.arrayContains; + var getRootContainer = dom.getRootContainer; + var crashyTextNodes = api.features.crashyTextNodes; + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Utility functions + + function isNonTextPartiallySelected(node, range) { + return (node.nodeType != 3) && + (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer)); + } + + function getRangeDocument(range) { + return range.document || getDocument(range.startContainer); + } + + function getBoundaryBeforeNode(node) { + return new DomPosition(node.parentNode, getNodeIndex(node)); + } + + function getBoundaryAfterNode(node) { + return new DomPosition(node.parentNode, getNodeIndex(node) + 1); + } + + function insertNodeAtPosition(node, n, o) { + var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node; + if (isCharacterDataNode(n)) { + if (o == n.length) { + dom.insertAfter(node, n); + } else { + n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o)); + } + } else if (o >= n.childNodes.length) { + n.appendChild(node); + } else { + n.insertBefore(node, n.childNodes[o]); + } + return firstNodeInserted; + } + + function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) { + assertRangeValid(rangeA); + assertRangeValid(rangeB); + + if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) { + throw new DOMException("WRONG_DOCUMENT_ERR"); + } + + var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset), + endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset); + + return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0; + } + + function cloneSubtree(iterator) { + var partiallySelected; + for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) { + partiallySelected = iterator.isPartiallySelectedSubtree(); + node = node.cloneNode(!partiallySelected); + if (partiallySelected) { + subIterator = iterator.getSubtreeIterator(); + node.appendChild(cloneSubtree(subIterator)); + subIterator.detach(); + } + + if (node.nodeType == 10) { // DocumentType + throw new DOMException("HIERARCHY_REQUEST_ERR"); + } + frag.appendChild(node); + } + return frag; + } + + function iterateSubtree(rangeIterator, func, iteratorState) { + var it, n; + iteratorState = iteratorState || { stop: false }; + for (var node, subRangeIterator; node = rangeIterator.next(); ) { + if (rangeIterator.isPartiallySelectedSubtree()) { + if (func(node) === false) { + iteratorState.stop = true; + return; + } else { + // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of + // the node selected by the Range. + subRangeIterator = rangeIterator.getSubtreeIterator(); + iterateSubtree(subRangeIterator, func, iteratorState); + subRangeIterator.detach(); + if (iteratorState.stop) { + return; + } + } + } else { + // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its + // descendants + it = dom.createIterator(node); + while ( (n = it.next()) ) { + if (func(n) === false) { + iteratorState.stop = true; + return; + } + } + } + } + } + + function deleteSubtree(iterator) { + var subIterator; + while (iterator.next()) { + if (iterator.isPartiallySelectedSubtree()) { + subIterator = iterator.getSubtreeIterator(); + deleteSubtree(subIterator); + subIterator.detach(); + } else { + iterator.remove(); + } + } + } + + function extractSubtree(iterator) { + for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) { + + if (iterator.isPartiallySelectedSubtree()) { + node = node.cloneNode(false); + subIterator = iterator.getSubtreeIterator(); + node.appendChild(extractSubtree(subIterator)); + subIterator.detach(); + } else { + iterator.remove(); + } + if (node.nodeType == 10) { // DocumentType + throw new DOMException("HIERARCHY_REQUEST_ERR"); + } + frag.appendChild(node); + } + return frag; + } + + function getNodesInRange(range, nodeTypes, filter) { + var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex; + var filterExists = !!filter; + if (filterNodeTypes) { + regex = new RegExp("^(" + nodeTypes.join("|") + ")$"); + } + + var nodes = []; + iterateSubtree(new RangeIterator(range, false), function(node) { + if (filterNodeTypes && !regex.test(node.nodeType)) { + return; + } + if (filterExists && !filter(node)) { + return; + } + // Don't include a boundary container if it is a character data node and the range does not contain any + // of its character data. See issue 190. + var sc = range.startContainer; + if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) { + return; + } + + var ec = range.endContainer; + if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) { + return; + } + + nodes.push(node); + }); + return nodes; + } + + function inspect(range) { + var name = (typeof range.getName == "undefined") ? "Range" : range.getName(); + return "[" + name + "(" + dom.inspectNode(range.startContainer) + ":" + range.startOffset + ", " + + dom.inspectNode(range.endContainer) + ":" + range.endOffset + ")]"; + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange) + + function RangeIterator(range, clonePartiallySelectedTextNodes) { + this.range = range; + this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes; + + + if (!range.collapsed) { + this.sc = range.startContainer; + this.so = range.startOffset; + this.ec = range.endContainer; + this.eo = range.endOffset; + var root = range.commonAncestorContainer; + + if (this.sc === this.ec && isCharacterDataNode(this.sc)) { + this.isSingleCharacterDataNode = true; + this._first = this._last = this._next = this.sc; + } else { + this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ? + this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true); + this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ? + this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true); + } + } + } + + RangeIterator.prototype = { + _current: null, + _next: null, + _first: null, + _last: null, + isSingleCharacterDataNode: false, + + reset: function() { + this._current = null; + this._next = this._first; + }, + + hasNext: function() { + return !!this._next; + }, + + next: function() { + // Move to next node + var current = this._current = this._next; + if (current) { + this._next = (current !== this._last) ? current.nextSibling : null; + + // Check for partially selected text nodes + if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) { + if (current === this.ec) { + (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo); + } + if (this._current === this.sc) { + (current = current.cloneNode(true)).deleteData(0, this.so); + } + } + } + + return current; + }, + + remove: function() { + var current = this._current, start, end; + + if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) { + start = (current === this.sc) ? this.so : 0; + end = (current === this.ec) ? this.eo : current.length; + if (start != end) { + current.deleteData(start, end - start); + } + } else { + if (current.parentNode) { + current.parentNode.removeChild(current); + } else { + } + } + }, + + // Checks if the current node is partially selected + isPartiallySelectedSubtree: function() { + var current = this._current; + return isNonTextPartiallySelected(current, this.range); + }, + + getSubtreeIterator: function() { + var subRange; + if (this.isSingleCharacterDataNode) { + subRange = this.range.cloneRange(); + subRange.collapse(false); + } else { + subRange = new Range(getRangeDocument(this.range)); + var current = this._current; + var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current); + + if (isOrIsAncestorOf(current, this.sc)) { + startContainer = this.sc; + startOffset = this.so; + } + if (isOrIsAncestorOf(current, this.ec)) { + endContainer = this.ec; + endOffset = this.eo; + } + + updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset); + } + return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes); + }, + + detach: function() { + this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null; + } + }; + + /*----------------------------------------------------------------------------------------------------------------*/ + + var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10]; + var rootContainerNodeTypes = [2, 9, 11]; + var readonlyNodeTypes = [5, 6, 10, 12]; + var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11]; + var surroundNodeTypes = [1, 3, 4, 5, 7, 8]; + + function createAncestorFinder(nodeTypes) { + return function(node, selfIsAncestor) { + var t, n = selfIsAncestor ? node : node.parentNode; + while (n) { + t = n.nodeType; + if (arrayContains(nodeTypes, t)) { + return n; + } + n = n.parentNode; + } + return null; + }; + } + + var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] ); + var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes); + var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] ); + + function assertNoDocTypeNotationEntityAncestor(node, allowSelf) { + if (getDocTypeNotationEntityAncestor(node, allowSelf)) { + throw new DOMException("INVALID_NODE_TYPE_ERR"); + } + } + + function assertValidNodeType(node, invalidTypes) { + if (!arrayContains(invalidTypes, node.nodeType)) { + throw new DOMException("INVALID_NODE_TYPE_ERR"); + } + } + + function assertValidOffset(node, offset) { + if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) { + throw new DOMException("INDEX_SIZE_ERR"); + } + } + + function assertSameDocumentOrFragment(node1, node2) { + if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) { + throw new DOMException("WRONG_DOCUMENT_ERR"); + } + } + + function assertNodeNotReadOnly(node) { + if (getReadonlyAncestor(node, true)) { + throw new DOMException("NO_MODIFICATION_ALLOWED_ERR"); + } + } + + function assertNode(node, codeName) { + if (!node) { + throw new DOMException(codeName); + } + } + + function isOrphan(node) { + return (crashyTextNodes && dom.isBrokenNode(node)) || + !arrayContains(rootContainerNodeTypes, node.nodeType) && !getDocumentOrFragmentContainer(node, true); + } + + function isValidOffset(node, offset) { + return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length); + } + + function isRangeValid(range) { + return (!!range.startContainer && !!range.endContainer && + !isOrphan(range.startContainer) && + !isOrphan(range.endContainer) && + isValidOffset(range.startContainer, range.startOffset) && + isValidOffset(range.endContainer, range.endOffset)); + } + + function assertRangeValid(range) { + if (!isRangeValid(range)) { + throw new Error("Range error: Range is no longer valid after DOM mutation (" + range.inspect() + ")"); + } + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Test the browser's innerHTML support to decide how to implement createContextualFragment + var styleEl = document.createElement("style"); + var htmlParsingConforms = false; + try { + styleEl.innerHTML = "x"; + htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Opera incorrectly creates an element node + } catch (e) { + // IE 6 and 7 throw + } + + api.features.htmlParsingConforms = htmlParsingConforms; + + var createContextualFragment = htmlParsingConforms ? + + // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See + // discussion and base code for this implementation at issue 67. + // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface + // Thanks to Aleks Williams. + function(fragmentStr) { + // "Let node the context object's start's node." + var node = this.startContainer; + var doc = getDocument(node); + + // "If the context object's start's node is null, raise an INVALID_STATE_ERR + // exception and abort these steps." + if (!node) { + throw new DOMException("INVALID_STATE_ERR"); + } + + // "Let element be as follows, depending on node's interface:" + // Document, Document Fragment: null + var el = null; + + // "Element: node" + if (node.nodeType == 1) { + el = node; + + // "Text, Comment: node's parentElement" + } else if (isCharacterDataNode(node)) { + el = dom.parentElement(node); + } + + // "If either element is null or element's ownerDocument is an HTML document + // and element's local name is "html" and element's namespace is the HTML + // namespace" + if (el === null || ( + el.nodeName == "HTML" && + dom.isHtmlNamespace(getDocument(el).documentElement) && + dom.isHtmlNamespace(el) + )) { + + // "let element be a new Element with "body" as its local name and the HTML + // namespace as its namespace."" + el = doc.createElement("body"); + } else { + el = el.cloneNode(false); + } + + // "If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm." + // "If the node's document is an XML document: Invoke the XML fragment parsing algorithm." + // "In either case, the algorithm must be invoked with fragment as the input + // and element as the context element." + el.innerHTML = fragmentStr; + + // "If this raises an exception, then abort these steps. Otherwise, let new + // children be the nodes returned." + + // "Let fragment be a new DocumentFragment." + // "Append all new children to fragment." + // "Return fragment." + return dom.fragmentFromNodeChildren(el); + } : + + // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that + // previous versions of Rangy used (with the exception of using a body element rather than a div) + function(fragmentStr) { + var doc = getRangeDocument(this); + var el = doc.createElement("body"); + el.innerHTML = fragmentStr; + + return dom.fragmentFromNodeChildren(el); + }; + + function splitRangeBoundaries(range, positionsToPreserve) { + assertRangeValid(range); + + var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset; + var startEndSame = (sc === ec); + + if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) { + splitDataNode(ec, eo, positionsToPreserve); + } + + if (isCharacterDataNode(sc) && so > 0 && so < sc.length) { + sc = splitDataNode(sc, so, positionsToPreserve); + if (startEndSame) { + eo -= so; + ec = sc; + } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) { + eo++; + } + so = 0; + } + range.setStartAndEnd(sc, so, ec, eo); + } + + function rangeToHtml(range) { + assertRangeValid(range); + var container = range.commonAncestorContainer.parentNode.cloneNode(false); + container.appendChild( range.cloneContents() ); + return container.innerHTML; + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + var rangeProperties = ["startContainer", "startOffset", "endContainer", "endOffset", "collapsed", + "commonAncestorContainer"]; + + var s2s = 0, s2e = 1, e2e = 2, e2s = 3; + var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3; + + util.extend(api.rangePrototype, { + compareBoundaryPoints: function(how, range) { + assertRangeValid(this); + assertSameDocumentOrFragment(this.startContainer, range.startContainer); + + var nodeA, offsetA, nodeB, offsetB; + var prefixA = (how == e2s || how == s2s) ? "start" : "end"; + var prefixB = (how == s2e || how == s2s) ? "start" : "end"; + nodeA = this[prefixA + "Container"]; + offsetA = this[prefixA + "Offset"]; + nodeB = range[prefixB + "Container"]; + offsetB = range[prefixB + "Offset"]; + return comparePoints(nodeA, offsetA, nodeB, offsetB); + }, + + insertNode: function(node) { + assertRangeValid(this); + assertValidNodeType(node, insertableNodeTypes); + assertNodeNotReadOnly(this.startContainer); + + if (isOrIsAncestorOf(node, this.startContainer)) { + throw new DOMException("HIERARCHY_REQUEST_ERR"); + } + + // No check for whether the container of the start of the Range is of a type that does not allow + // children of the type of node: the browser's DOM implementation should do this for us when we attempt + // to add the node + + var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset); + this.setStartBefore(firstNodeInserted); + }, + + cloneContents: function() { + assertRangeValid(this); + + var clone, frag; + if (this.collapsed) { + return getRangeDocument(this).createDocumentFragment(); + } else { + if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) { + clone = this.startContainer.cloneNode(true); + clone.data = clone.data.slice(this.startOffset, this.endOffset); + frag = getRangeDocument(this).createDocumentFragment(); + frag.appendChild(clone); + return frag; + } else { + var iterator = new RangeIterator(this, true); + clone = cloneSubtree(iterator); + iterator.detach(); + } + return clone; + } + }, + + canSurroundContents: function() { + assertRangeValid(this); + assertNodeNotReadOnly(this.startContainer); + assertNodeNotReadOnly(this.endContainer); + + // Check if the contents can be surrounded. Specifically, this means whether the range partially selects + // no non-text nodes. + var iterator = new RangeIterator(this, true); + var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) || + (iterator._last && isNonTextPartiallySelected(iterator._last, this))); + iterator.detach(); + return !boundariesInvalid; + }, + + surroundContents: function(node) { + assertValidNodeType(node, surroundNodeTypes); + + if (!this.canSurroundContents()) { + throw new DOMException("INVALID_STATE_ERR"); + } + + // Extract the contents + var content = this.extractContents(); + + // Clear the children of the node + if (node.hasChildNodes()) { + while (node.lastChild) { + node.removeChild(node.lastChild); + } + } + + // Insert the new node and add the extracted contents + insertNodeAtPosition(node, this.startContainer, this.startOffset); + node.appendChild(content); + + this.selectNode(node); + }, + + cloneRange: function() { + assertRangeValid(this); + var range = new Range(getRangeDocument(this)); + var i = rangeProperties.length, prop; + while (i--) { + prop = rangeProperties[i]; + range[prop] = this[prop]; + } + return range; + }, + + toString: function() { + assertRangeValid(this); + var sc = this.startContainer; + if (sc === this.endContainer && isCharacterDataNode(sc)) { + return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : ""; + } else { + var textParts = [], iterator = new RangeIterator(this, true); + iterateSubtree(iterator, function(node) { + // Accept only text or CDATA nodes, not comments + if (node.nodeType == 3 || node.nodeType == 4) { + textParts.push(node.data); + } + }); + iterator.detach(); + return textParts.join(""); + } + }, + + // The methods below are all non-standard. The following batch were introduced by Mozilla but have since + // been removed from Mozilla. + + compareNode: function(node) { + assertRangeValid(this); + + var parent = node.parentNode; + var nodeIndex = getNodeIndex(node); + + if (!parent) { + throw new DOMException("NOT_FOUND_ERR"); + } + + var startComparison = this.comparePoint(parent, nodeIndex), + endComparison = this.comparePoint(parent, nodeIndex + 1); + + if (startComparison < 0) { // Node starts before + return (endComparison > 0) ? n_b_a : n_b; + } else { + return (endComparison > 0) ? n_a : n_i; + } + }, + + comparePoint: function(node, offset) { + assertRangeValid(this); + assertNode(node, "HIERARCHY_REQUEST_ERR"); + assertSameDocumentOrFragment(node, this.startContainer); + + if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) { + return -1; + } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) { + return 1; + } + return 0; + }, + + createContextualFragment: createContextualFragment, + + toHtml: function() { + return rangeToHtml(this); + }, + + // touchingIsIntersecting determines whether this method considers a node that borders a range intersects + // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default) + intersectsNode: function(node, touchingIsIntersecting) { + assertRangeValid(this); + assertNode(node, "NOT_FOUND_ERR"); + if (getDocument(node) !== getRangeDocument(this)) { + return false; + } + + var parent = node.parentNode, offset = getNodeIndex(node); + assertNode(parent, "NOT_FOUND_ERR"); + + var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset), + endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset); + + return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0; + }, + + isPointInRange: function(node, offset) { + assertRangeValid(this); + assertNode(node, "HIERARCHY_REQUEST_ERR"); + assertSameDocumentOrFragment(node, this.startContainer); + + return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) && + (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0); + }, + + // The methods below are non-standard and invented by me. + + // Sharing a boundary start-to-end or end-to-start does not count as intersection. + intersectsRange: function(range) { + return rangesIntersect(this, range, false); + }, + + // Sharing a boundary start-to-end or end-to-start does count as intersection. + intersectsOrTouchesRange: function(range) { + return rangesIntersect(this, range, true); + }, + + intersection: function(range) { + if (this.intersectsRange(range)) { + var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset), + endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset); + + var intersectionRange = this.cloneRange(); + if (startComparison == -1) { + intersectionRange.setStart(range.startContainer, range.startOffset); + } + if (endComparison == 1) { + intersectionRange.setEnd(range.endContainer, range.endOffset); + } + return intersectionRange; + } + return null; + }, + + union: function(range) { + if (this.intersectsOrTouchesRange(range)) { + var unionRange = this.cloneRange(); + if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) { + unionRange.setStart(range.startContainer, range.startOffset); + } + if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) { + unionRange.setEnd(range.endContainer, range.endOffset); + } + return unionRange; + } else { + throw new DOMException("Ranges do not intersect"); + } + }, + + containsNode: function(node, allowPartial) { + if (allowPartial) { + return this.intersectsNode(node, false); + } else { + return this.compareNode(node) == n_i; + } + }, + + containsNodeContents: function(node) { + return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0; + }, + + containsRange: function(range) { + var intersection = this.intersection(range); + return intersection !== null && range.equals(intersection); + }, + + containsNodeText: function(node) { + var nodeRange = this.cloneRange(); + nodeRange.selectNode(node); + var textNodes = nodeRange.getNodes([3]); + if (textNodes.length > 0) { + nodeRange.setStart(textNodes[0], 0); + var lastTextNode = textNodes.pop(); + nodeRange.setEnd(lastTextNode, lastTextNode.length); + return this.containsRange(nodeRange); + } else { + return this.containsNodeContents(node); + } + }, + + getNodes: function(nodeTypes, filter) { + assertRangeValid(this); + return getNodesInRange(this, nodeTypes, filter); + }, + + getDocument: function() { + return getRangeDocument(this); + }, + + collapseBefore: function(node) { + this.setEndBefore(node); + this.collapse(false); + }, + + collapseAfter: function(node) { + this.setStartAfter(node); + this.collapse(true); + }, + + getBookmark: function(containerNode) { + var doc = getRangeDocument(this); + var preSelectionRange = api.createRange(doc); + containerNode = containerNode || dom.getBody(doc); + preSelectionRange.selectNodeContents(containerNode); + var range = this.intersection(preSelectionRange); + var start = 0, end = 0; + if (range) { + preSelectionRange.setEnd(range.startContainer, range.startOffset); + start = preSelectionRange.toString().length; + end = start + range.toString().length; + } + + return { + start: start, + end: end, + containerNode: containerNode + }; + }, + + moveToBookmark: function(bookmark) { + var containerNode = bookmark.containerNode; + var charIndex = 0; + this.setStart(containerNode, 0); + this.collapse(true); + var nodeStack = [containerNode], node, foundStart = false, stop = false; + var nextCharIndex, i, childNodes; + + while (!stop && (node = nodeStack.pop())) { + if (node.nodeType == 3) { + nextCharIndex = charIndex + node.length; + if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) { + this.setStart(node, bookmark.start - charIndex); + foundStart = true; + } + if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) { + this.setEnd(node, bookmark.end - charIndex); + stop = true; + } + charIndex = nextCharIndex; + } else { + childNodes = node.childNodes; + i = childNodes.length; + while (i--) { + nodeStack.push(childNodes[i]); + } + } + } + }, + + getName: function() { + return "DomRange"; + }, + + equals: function(range) { + return Range.rangesEqual(this, range); + }, + + isValid: function() { + return isRangeValid(this); + }, + + inspect: function() { + return inspect(this); + }, + + detach: function() { + // In DOM4, detach() is now a no-op. + } + }); + + function copyComparisonConstantsToObject(obj) { + obj.START_TO_START = s2s; + obj.START_TO_END = s2e; + obj.END_TO_END = e2e; + obj.END_TO_START = e2s; + + obj.NODE_BEFORE = n_b; + obj.NODE_AFTER = n_a; + obj.NODE_BEFORE_AND_AFTER = n_b_a; + obj.NODE_INSIDE = n_i; + } + + function copyComparisonConstants(constructor) { + copyComparisonConstantsToObject(constructor); + copyComparisonConstantsToObject(constructor.prototype); + } + + function createRangeContentRemover(remover, boundaryUpdater) { + return function() { + assertRangeValid(this); + + var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer; + + var iterator = new RangeIterator(this, true); + + // Work out where to position the range after content removal + var node, boundary; + if (sc !== root) { + node = getClosestAncestorIn(sc, root, true); + boundary = getBoundaryAfterNode(node); + sc = boundary.node; + so = boundary.offset; + } + + // Check none of the range is read-only + iterateSubtree(iterator, assertNodeNotReadOnly); + + iterator.reset(); + + // Remove the content + var returnValue = remover(iterator); + iterator.detach(); + + // Move to the new position + boundaryUpdater(this, sc, so, sc, so); + + return returnValue; + }; + } + + function createPrototypeRange(constructor, boundaryUpdater) { + function createBeforeAfterNodeSetter(isBefore, isStart) { + return function(node) { + assertValidNodeType(node, beforeAfterNodeTypes); + assertValidNodeType(getRootContainer(node), rootContainerNodeTypes); + + var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node); + (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset); + }; + } + + function setRangeStart(range, node, offset) { + var ec = range.endContainer, eo = range.endOffset; + if (node !== range.startContainer || offset !== range.startOffset) { + // Check the root containers of the range and the new boundary, and also check whether the new boundary + // is after the current end. In either case, collapse the range to the new position + if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) { + ec = node; + eo = offset; + } + boundaryUpdater(range, node, offset, ec, eo); + } + } + + function setRangeEnd(range, node, offset) { + var sc = range.startContainer, so = range.startOffset; + if (node !== range.endContainer || offset !== range.endOffset) { + // Check the root containers of the range and the new boundary, and also check whether the new boundary + // is after the current end. In either case, collapse the range to the new position + if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) { + sc = node; + so = offset; + } + boundaryUpdater(range, sc, so, node, offset); + } + } + + // Set up inheritance + var F = function() {}; + F.prototype = api.rangePrototype; + constructor.prototype = new F(); + + util.extend(constructor.prototype, { + setStart: function(node, offset) { + assertNoDocTypeNotationEntityAncestor(node, true); + assertValidOffset(node, offset); + + setRangeStart(this, node, offset); + }, + + setEnd: function(node, offset) { + assertNoDocTypeNotationEntityAncestor(node, true); + assertValidOffset(node, offset); + + setRangeEnd(this, node, offset); + }, + + /** + * Convenience method to set a range's start and end boundaries. Overloaded as follows: + * - Two parameters (node, offset) creates a collapsed range at that position + * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at + * startOffset and ending at endOffset + * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in + * startNode and ending at endOffset in endNode + */ + setStartAndEnd: function() { + var args = arguments; + var sc = args[0], so = args[1], ec = sc, eo = so; + + switch (args.length) { + case 3: + eo = args[2]; + break; + case 4: + ec = args[2]; + eo = args[3]; + break; + } + + boundaryUpdater(this, sc, so, ec, eo); + }, + + setBoundary: function(node, offset, isStart) { + this["set" + (isStart ? "Start" : "End")](node, offset); + }, + + setStartBefore: createBeforeAfterNodeSetter(true, true), + setStartAfter: createBeforeAfterNodeSetter(false, true), + setEndBefore: createBeforeAfterNodeSetter(true, false), + setEndAfter: createBeforeAfterNodeSetter(false, false), + + collapse: function(isStart) { + assertRangeValid(this); + if (isStart) { + boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset); + } else { + boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset); + } + }, + + selectNodeContents: function(node) { + assertNoDocTypeNotationEntityAncestor(node, true); + + boundaryUpdater(this, node, 0, node, getNodeLength(node)); + }, + + selectNode: function(node) { + assertNoDocTypeNotationEntityAncestor(node, false); + assertValidNodeType(node, beforeAfterNodeTypes); + + var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node); + boundaryUpdater(this, start.node, start.offset, end.node, end.offset); + }, + + extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater), + + deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater), + + canSurroundContents: function() { + assertRangeValid(this); + assertNodeNotReadOnly(this.startContainer); + assertNodeNotReadOnly(this.endContainer); + + // Check if the contents can be surrounded. Specifically, this means whether the range partially selects + // no non-text nodes. + var iterator = new RangeIterator(this, true); + var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) || + (iterator._last && isNonTextPartiallySelected(iterator._last, this))); + iterator.detach(); + return !boundariesInvalid; + }, + + splitBoundaries: function() { + splitRangeBoundaries(this); + }, + + splitBoundariesPreservingPositions: function(positionsToPreserve) { + splitRangeBoundaries(this, positionsToPreserve); + }, + + normalizeBoundaries: function() { + assertRangeValid(this); + + var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset; + + var mergeForward = function(node) { + var sibling = node.nextSibling; + if (sibling && sibling.nodeType == node.nodeType) { + ec = node; + eo = node.length; + node.appendData(sibling.data); + sibling.parentNode.removeChild(sibling); + } + }; + + var mergeBackward = function(node) { + var sibling = node.previousSibling; + if (sibling && sibling.nodeType == node.nodeType) { + sc = node; + var nodeLength = node.length; + so = sibling.length; + node.insertData(0, sibling.data); + sibling.parentNode.removeChild(sibling); + if (sc == ec) { + eo += so; + ec = sc; + } else if (ec == node.parentNode) { + var nodeIndex = getNodeIndex(node); + if (eo == nodeIndex) { + ec = node; + eo = nodeLength; + } else if (eo > nodeIndex) { + eo--; + } + } + } + }; + + var normalizeStart = true; + + if (isCharacterDataNode(ec)) { + if (ec.length == eo) { + mergeForward(ec); + } + } else { + if (eo > 0) { + var endNode = ec.childNodes[eo - 1]; + if (endNode && isCharacterDataNode(endNode)) { + mergeForward(endNode); + } + } + normalizeStart = !this.collapsed; + } + + if (normalizeStart) { + if (isCharacterDataNode(sc)) { + if (so == 0) { + mergeBackward(sc); + } + } else { + if (so < sc.childNodes.length) { + var startNode = sc.childNodes[so]; + if (startNode && isCharacterDataNode(startNode)) { + mergeBackward(startNode); + } + } + } + } else { + sc = ec; + so = eo; + } + + boundaryUpdater(this, sc, so, ec, eo); + }, + + collapseToPoint: function(node, offset) { + assertNoDocTypeNotationEntityAncestor(node, true); + assertValidOffset(node, offset); + this.setStartAndEnd(node, offset); + } + }); + + copyComparisonConstants(constructor); + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Updates commonAncestorContainer and collapsed after boundary change + function updateCollapsedAndCommonAncestor(range) { + range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset); + range.commonAncestorContainer = range.collapsed ? + range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer); + } + + function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) { + range.startContainer = startContainer; + range.startOffset = startOffset; + range.endContainer = endContainer; + range.endOffset = endOffset; + range.document = dom.getDocument(startContainer); + + updateCollapsedAndCommonAncestor(range); + } + + function Range(doc) { + this.startContainer = doc; + this.startOffset = 0; + this.endContainer = doc; + this.endOffset = 0; + this.document = doc; + updateCollapsedAndCommonAncestor(this); + } + + createPrototypeRange(Range, updateBoundaries); + + util.extend(Range, { + rangeProperties: rangeProperties, + RangeIterator: RangeIterator, + copyComparisonConstants: copyComparisonConstants, + createPrototypeRange: createPrototypeRange, + inspect: inspect, + toHtml: rangeToHtml, + getRangeDocument: getRangeDocument, + rangesEqual: function(r1, r2) { + return r1.startContainer === r2.startContainer && + r1.startOffset === r2.startOffset && + r1.endContainer === r2.endContainer && + r1.endOffset === r2.endOffset; + } + }); + + api.DomRange = Range; + }); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Wrappers for the browser's native DOM Range and/or TextRange implementation + api.createCoreModule("WrappedRange", ["DomRange"], function(api, module) { + var WrappedRange, WrappedTextRange; + var dom = api.dom; + var util = api.util; + var DomPosition = dom.DomPosition; + var DomRange = api.DomRange; + var getBody = dom.getBody; + var getContentDocument = dom.getContentDocument; + var isCharacterDataNode = dom.isCharacterDataNode; + + + /*----------------------------------------------------------------------------------------------------------------*/ + + if (api.features.implementsDomRange) { + // This is a wrapper around the browser's native DOM Range. It has two aims: + // - Provide workarounds for specific browser bugs + // - provide convenient extensions, which are inherited from Rangy's DomRange + + (function() { + var rangeProto; + var rangeProperties = DomRange.rangeProperties; + + function updateRangeProperties(range) { + var i = rangeProperties.length, prop; + while (i--) { + prop = rangeProperties[i]; + range[prop] = range.nativeRange[prop]; + } + // Fix for broken collapsed property in IE 9. + range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset); + } + + function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) { + var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset); + var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset); + var nativeRangeDifferent = !range.equals(range.nativeRange); + + // Always set both boundaries for the benefit of IE9 (see issue 35) + if (startMoved || endMoved || nativeRangeDifferent) { + range.setEnd(endContainer, endOffset); + range.setStart(startContainer, startOffset); + } + } + + var createBeforeAfterNodeSetter; + + WrappedRange = function(range) { + if (!range) { + throw module.createError("WrappedRange: Range must be specified"); + } + this.nativeRange = range; + updateRangeProperties(this); + }; + + DomRange.createPrototypeRange(WrappedRange, updateNativeRange); + + rangeProto = WrappedRange.prototype; + + rangeProto.selectNode = function(node) { + this.nativeRange.selectNode(node); + updateRangeProperties(this); + }; + + rangeProto.cloneContents = function() { + return this.nativeRange.cloneContents(); + }; + + // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect, + // insertNode() is never delegated to the native range. + + rangeProto.surroundContents = function(node) { + this.nativeRange.surroundContents(node); + updateRangeProperties(this); + }; + + rangeProto.collapse = function(isStart) { + this.nativeRange.collapse(isStart); + updateRangeProperties(this); + }; + + rangeProto.cloneRange = function() { + return new WrappedRange(this.nativeRange.cloneRange()); + }; + + rangeProto.refresh = function() { + updateRangeProperties(this); + }; + + rangeProto.toString = function() { + return this.nativeRange.toString(); + }; + + // Create test range and node for feature detection + + var testTextNode = document.createTextNode("test"); + getBody(document).appendChild(testTextNode); + var range = document.createRange(); + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and + // correct for it + + range.setStart(testTextNode, 0); + range.setEnd(testTextNode, 0); + + try { + range.setStart(testTextNode, 1); + + rangeProto.setStart = function(node, offset) { + this.nativeRange.setStart(node, offset); + updateRangeProperties(this); + }; + + rangeProto.setEnd = function(node, offset) { + this.nativeRange.setEnd(node, offset); + updateRangeProperties(this); + }; + + createBeforeAfterNodeSetter = function(name) { + return function(node) { + this.nativeRange[name](node); + updateRangeProperties(this); + }; + }; + + } catch(ex) { + + rangeProto.setStart = function(node, offset) { + try { + this.nativeRange.setStart(node, offset); + } catch (ex) { + this.nativeRange.setEnd(node, offset); + this.nativeRange.setStart(node, offset); + } + updateRangeProperties(this); + }; + + rangeProto.setEnd = function(node, offset) { + try { + this.nativeRange.setEnd(node, offset); + } catch (ex) { + this.nativeRange.setStart(node, offset); + this.nativeRange.setEnd(node, offset); + } + updateRangeProperties(this); + }; + + createBeforeAfterNodeSetter = function(name, oppositeName) { + return function(node) { + try { + this.nativeRange[name](node); + } catch (ex) { + this.nativeRange[oppositeName](node); + this.nativeRange[name](node); + } + updateRangeProperties(this); + }; + }; + } + + rangeProto.setStartBefore = createBeforeAfterNodeSetter("setStartBefore", "setEndBefore"); + rangeProto.setStartAfter = createBeforeAfterNodeSetter("setStartAfter", "setEndAfter"); + rangeProto.setEndBefore = createBeforeAfterNodeSetter("setEndBefore", "setStartBefore"); + rangeProto.setEndAfter = createBeforeAfterNodeSetter("setEndAfter", "setStartAfter"); + + /*--------------------------------------------------------------------------------------------------------*/ + + // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing + // whether the native implementation can be trusted + rangeProto.selectNodeContents = function(node) { + this.setStartAndEnd(node, 0, dom.getNodeLength(node)); + }; + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for + // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738 + + range.selectNodeContents(testTextNode); + range.setEnd(testTextNode, 3); + + var range2 = document.createRange(); + range2.selectNodeContents(testTextNode); + range2.setEnd(testTextNode, 4); + range2.setStart(testTextNode, 2); + + if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 && + range.compareBoundaryPoints(range.END_TO_START, range2) == 1) { + // This is the wrong way round, so correct for it + + rangeProto.compareBoundaryPoints = function(type, range) { + range = range.nativeRange || range; + if (type == range.START_TO_END) { + type = range.END_TO_START; + } else if (type == range.END_TO_START) { + type = range.START_TO_END; + } + return this.nativeRange.compareBoundaryPoints(type, range); + }; + } else { + rangeProto.compareBoundaryPoints = function(type, range) { + return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range); + }; + } + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for IE 9 deleteContents() and extractContents() bug and correct it. See issue 107. + + var el = document.createElement("div"); + el.innerHTML = "123"; + var textNode = el.firstChild; + var body = getBody(document); + body.appendChild(el); + + range.setStart(textNode, 1); + range.setEnd(textNode, 2); + range.deleteContents(); + + if (textNode.data == "13") { + // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and + // extractContents() + rangeProto.deleteContents = function() { + this.nativeRange.deleteContents(); + updateRangeProperties(this); + }; + + rangeProto.extractContents = function() { + var frag = this.nativeRange.extractContents(); + updateRangeProperties(this); + return frag; + }; + } else { + } + + body.removeChild(el); + body = null; + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for existence of createContextualFragment and delegate to it if it exists + if (util.isHostMethod(range, "createContextualFragment")) { + rangeProto.createContextualFragment = function(fragmentStr) { + return this.nativeRange.createContextualFragment(fragmentStr); + }; + } + + /*--------------------------------------------------------------------------------------------------------*/ + + // Clean up + getBody(document).removeChild(testTextNode); + + rangeProto.getName = function() { + return "WrappedRange"; + }; + + api.WrappedRange = WrappedRange; + + api.createNativeRange = function(doc) { + doc = getContentDocument(doc, module, "createNativeRange"); + return doc.createRange(); + }; + })(); + } + + if (api.features.implementsTextRange) { + /* + This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement() + method. For example, in the following (where pipes denote the selection boundaries): + +
          • | a
          • b |
          + + var range = document.selection.createRange(); + alert(range.parentElement().id); // Should alert "ul" but alerts "b" + + This method returns the common ancestor node of the following: + - the parentElement() of the textRange + - the parentElement() of the textRange after calling collapse(true) + - the parentElement() of the textRange after calling collapse(false) + */ + var getTextRangeContainerElement = function(textRange) { + var parentEl = textRange.parentElement(); + var range = textRange.duplicate(); + range.collapse(true); + var startEl = range.parentElement(); + range = textRange.duplicate(); + range.collapse(false); + var endEl = range.parentElement(); + var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl); + + return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer); + }; + + var textRangeIsCollapsed = function(textRange) { + return textRange.compareEndPoints("StartToEnd", textRange) == 0; + }; + + // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started + // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/) + // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange + // bugs, handling for inputs and images, plus optimizations. + var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) { + var workingRange = textRange.duplicate(); + workingRange.collapse(isStart); + var containerElement = workingRange.parentElement(); + + // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so + // check for that + if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) { + containerElement = wholeRangeContainerElement; + } + + + // Deal with nodes that cannot "contain rich HTML markup". In practice, this means form inputs, images and + // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx + if (!containerElement.canHaveHTML) { + var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement)); + return { + boundaryPosition: pos, + nodeInfo: { + nodeIndex: pos.offset, + containerElement: pos.node + } + }; + } + + var workingNode = dom.getDocument(containerElement).createElement("span"); + + // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5 + // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64 + if (workingNode.parentNode) { + workingNode.parentNode.removeChild(workingNode); + } + + var comparison, workingComparisonType = isStart ? "StartToStart" : "StartToEnd"; + var previousNode, nextNode, boundaryPosition, boundaryNode; + var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0; + var childNodeCount = containerElement.childNodes.length; + var end = childNodeCount; + + // Check end first. Code within the loop assumes that the endth child node of the container is definitely + // after the range boundary. + var nodeIndex = end; + + while (true) { + if (nodeIndex == childNodeCount) { + containerElement.appendChild(workingNode); + } else { + containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]); + } + workingRange.moveToElementText(workingNode); + comparison = workingRange.compareEndPoints(workingComparisonType, textRange); + if (comparison == 0 || start == end) { + break; + } else if (comparison == -1) { + if (end == start + 1) { + // We know the endth child node is after the range boundary, so we must be done. + break; + } else { + start = nodeIndex; + } + } else { + end = (end == start + 1) ? start : nodeIndex; + } + nodeIndex = Math.floor((start + end) / 2); + containerElement.removeChild(workingNode); + } + + + // We've now reached or gone past the boundary of the text range we're interested in + // so have identified the node we want + boundaryNode = workingNode.nextSibling; + + if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) { + // This is a character data node (text, comment, cdata). The working range is collapsed at the start of + // the node containing the text range's boundary, so we move the end of the working range to the + // boundary point and measure the length of its text to get the boundary's offset within the node. + workingRange.setEndPoint(isStart ? "EndToStart" : "EndToEnd", textRange); + + var offset; + + if (/[\r\n]/.test(boundaryNode.data)) { + /* + For the particular case of a boundary within a text node containing rendered line breaks (within a +
           element, for example), we need a slightly complicated approach to get the boundary's offset in
          +                        IE. The facts:
          +                        
          +                        - Each line break is represented as \r in the text node's data/nodeValue properties
          +                        - Each line break is represented as \r\n in the TextRange's 'text' property
          +                        - The 'text' property of the TextRange does not contain trailing line breaks
          +                        
          +                        To get round the problem presented by the final fact above, we can use the fact that TextRange's
          +                        moveStart() and moveEnd() methods return the actual number of characters moved, which is not
          +                        necessarily the same as the number of characters it was instructed to move. The simplest approach is
          +                        to use this to store the characters moved when moving both the start and end of the range to the
          +                        start of the document body and subtracting the start offset from the end offset (the
          +                        "move-negative-gazillion" method). However, this is extremely slow when the document is large and
          +                        the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to
          +                        the end of the document) has the same problem.
          +                        
          +                        Another approach that works is to use moveStart() to move the start boundary of the range up to the
          +                        end boundary one character at a time and incrementing a counter with the value returned by the
          +                        moveStart() call. However, the check for whether the start boundary has reached the end boundary is
          +                        expensive, so this method is slow (although unlike "move-negative-gazillion" is largely unaffected
          +                        by the location of the range within the document).
          +                        
          +                        The approach used below is a hybrid of the two methods above. It uses the fact that a string
          +                        containing the TextRange's 'text' property with each \r\n converted to a single \r character cannot
          +                        be longer than the text of the TextRange, so the start of the range is moved that length initially
          +                        and then a character at a time to make up for any trailing line breaks not contained in the 'text'
          +                        property. This has good performance in most situations compared to the previous two methods.
          +                        */
          +                        var tempRange = workingRange.duplicate();
          +                        var rangeLength = tempRange.text.replace(/\r\n/g, "\r").length;
          +
          +                        offset = tempRange.moveStart("character", rangeLength);
          +                        while ( (comparison = tempRange.compareEndPoints("StartToEnd", tempRange)) == -1) {
          +                            offset++;
          +                            tempRange.moveStart("character", 1);
          +                        }
          +                    } else {
          +                        offset = workingRange.text.length;
          +                    }
          +                    boundaryPosition = new DomPosition(boundaryNode, offset);
          +                } else {
          +
          +                    // If the boundary immediately follows a character data node and this is the end boundary, we should favour
          +                    // a position within that, and likewise for a start boundary preceding a character data node
          +                    previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;
          +                    nextNode = (isCollapsed || isStart) && workingNode.nextSibling;
          +                    if (nextNode && isCharacterDataNode(nextNode)) {
          +                        boundaryPosition = new DomPosition(nextNode, 0);
          +                    } else if (previousNode && isCharacterDataNode(previousNode)) {
          +                        boundaryPosition = new DomPosition(previousNode, previousNode.data.length);
          +                    } else {
          +                        boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));
          +                    }
          +                }
          +
          +                // Clean up
          +                workingNode.parentNode.removeChild(workingNode);
          +
          +                return {
          +                    boundaryPosition: boundaryPosition,
          +                    nodeInfo: {
          +                        nodeIndex: nodeIndex,
          +                        containerElement: containerElement
          +                    }
          +                };
          +            };
          +
          +            // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that
          +            // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange
          +            // (http://code.google.com/p/ierange/)
          +            var createBoundaryTextRange = function(boundaryPosition, isStart) {
          +                var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;
          +                var doc = dom.getDocument(boundaryPosition.node);
          +                var workingNode, childNodes, workingRange = getBody(doc).createTextRange();
          +                var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);
          +
          +                if (nodeIsDataNode) {
          +                    boundaryNode = boundaryPosition.node;
          +                    boundaryParent = boundaryNode.parentNode;
          +                } else {
          +                    childNodes = boundaryPosition.node.childNodes;
          +                    boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;
          +                    boundaryParent = boundaryPosition.node;
          +                }
          +
          +                // Position the range immediately before the node containing the boundary
          +                workingNode = doc.createElement("span");
          +
          +                // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within
          +                // the element rather than immediately before or after it
          +                workingNode.innerHTML = "&#feff;";
          +
          +                // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report
          +                // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12
          +                if (boundaryNode) {
          +                    boundaryParent.insertBefore(workingNode, boundaryNode);
          +                } else {
          +                    boundaryParent.appendChild(workingNode);
          +                }
          +
          +                workingRange.moveToElementText(workingNode);
          +                workingRange.collapse(!isStart);
          +
          +                // Clean up
          +                boundaryParent.removeChild(workingNode);
          +
          +                // Move the working range to the text offset, if required
          +                if (nodeIsDataNode) {
          +                    workingRange[isStart ? "moveStart" : "moveEnd"]("character", boundaryOffset);
          +                }
          +
          +                return workingRange;
          +            };
          +
          +            /*------------------------------------------------------------------------------------------------------------*/
          +
          +            // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a
          +            // prototype
          +
          +            WrappedTextRange = function(textRange) {
          +                this.textRange = textRange;
          +                this.refresh();
          +            };
          +
          +            WrappedTextRange.prototype = new DomRange(document);
          +
          +            WrappedTextRange.prototype.refresh = function() {
          +                var start, end, startBoundary;
          +
          +                // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.
          +                var rangeContainerElement = getTextRangeContainerElement(this.textRange);
          +
          +                if (textRangeIsCollapsed(this.textRange)) {
          +                    end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,
          +                        true).boundaryPosition;
          +                } else {
          +                    startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);
          +                    start = startBoundary.boundaryPosition;
          +
          +                    // An optimization used here is that if the start and end boundaries have the same parent element, the
          +                    // search scope for the end boundary can be limited to exclude the portion of the element that precedes
          +                    // the start boundary
          +                    end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,
          +                        startBoundary.nodeInfo).boundaryPosition;
          +                }
          +
          +                this.setStart(start.node, start.offset);
          +                this.setEnd(end.node, end.offset);
          +            };
          +
          +            WrappedTextRange.prototype.getName = function() {
          +                return "WrappedTextRange";
          +            };
          +
          +            DomRange.copyComparisonConstants(WrappedTextRange);
          +
          +            var rangeToTextRange = function(range) {
          +                if (range.collapsed) {
          +                    return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);
          +                } else {
          +                    var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);
          +                    var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);
          +                    var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();
          +                    textRange.setEndPoint("StartToStart", startRange);
          +                    textRange.setEndPoint("EndToEnd", endRange);
          +                    return textRange;
          +                }
          +            };
          +
          +            WrappedTextRange.rangeToTextRange = rangeToTextRange;
          +
          +            WrappedTextRange.prototype.toTextRange = function() {
          +                return rangeToTextRange(this);
          +            };
          +
          +            api.WrappedTextRange = WrappedTextRange;
          +
          +            // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which
          +            // implementation to use by default.
          +            if (!api.features.implementsDomRange || api.config.preferTextRange) {
          +                // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work
          +                var globalObj = (function() { return this; })();
          +                if (typeof globalObj.Range == "undefined") {
          +                    globalObj.Range = WrappedTextRange;
          +                }
          +
          +                api.createNativeRange = function(doc) {
          +                    doc = getContentDocument(doc, module, "createNativeRange");
          +                    return getBody(doc).createTextRange();
          +                };
          +
          +                api.WrappedRange = WrappedTextRange;
          +            }
          +        }
          +
          +        api.createRange = function(doc) {
          +            doc = getContentDocument(doc, module, "createRange");
          +            return new api.WrappedRange(api.createNativeRange(doc));
          +        };
          +
          +        api.createRangyRange = function(doc) {
          +            doc = getContentDocument(doc, module, "createRangyRange");
          +            return new DomRange(doc);
          +        };
          +
          +        api.createIframeRange = function(iframeEl) {
          +            module.deprecationNotice("createIframeRange()", "createRange(iframeEl)");
          +            return api.createRange(iframeEl);
          +        };
          +
          +        api.createIframeRangyRange = function(iframeEl) {
          +            module.deprecationNotice("createIframeRangyRange()", "createRangyRange(iframeEl)");
          +            return api.createRangyRange(iframeEl);
          +        };
          +
          +        api.addShimListener(function(win) {
          +            var doc = win.document;
          +            if (typeof doc.createRange == "undefined") {
          +                doc.createRange = function() {
          +                    return api.createRange(doc);
          +                };
          +            }
          +            doc = win = null;
          +        });
          +    });
          +
          +    /*----------------------------------------------------------------------------------------------------------------*/
          +
          +    // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification
          +    // in the HTML Editing spec (http://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#selections)
          +    api.createCoreModule("WrappedSelection", ["DomRange", "WrappedRange"], function(api, module) {
          +        api.config.checkSelectionRanges = true;
          +
          +        var BOOLEAN = "boolean";
          +        var NUMBER = "number";
          +        var dom = api.dom;
          +        var util = api.util;
          +        var isHostMethod = util.isHostMethod;
          +        var DomRange = api.DomRange;
          +        var WrappedRange = api.WrappedRange;
          +        var DOMException = api.DOMException;
          +        var DomPosition = dom.DomPosition;
          +        var getNativeSelection;
          +        var selectionIsCollapsed;
          +        var features = api.features;
          +        var CONTROL = "Control";
          +        var getDocument = dom.getDocument;
          +        var getBody = dom.getBody;
          +        var rangesEqual = DomRange.rangesEqual;
          +
          +
          +        // Utility function to support direction parameters in the API that may be a string ("backward" or "forward") or a
          +        // Boolean (true for backwards).
          +        function isDirectionBackward(dir) {
          +            return (typeof dir == "string") ? /^backward(s)?$/i.test(dir) : !!dir;
          +        }
          +
          +        function getWindow(win, methodName) {
          +            if (!win) {
          +                return window;
          +            } else if (dom.isWindow(win)) {
          +                return win;
          +            } else if (win instanceof WrappedSelection) {
          +                return win.win;
          +            } else {
          +                var doc = dom.getContentDocument(win, module, methodName);
          +                return dom.getWindow(doc);
          +            }
          +        }
          +
          +        function getWinSelection(winParam) {
          +            return getWindow(winParam, "getWinSelection").getSelection();
          +        }
          +
          +        function getDocSelection(winParam) {
          +            return getWindow(winParam, "getDocSelection").document.selection;
          +        }
          +        
          +        function winSelectionIsBackward(sel) {
          +            var backward = false;
          +            if (sel.anchorNode) {
          +                backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);
          +            }
          +            return backward;
          +        }
          +
          +        // Test for the Range/TextRange and Selection features required
          +        // Test for ability to retrieve selection
          +        var implementsWinGetSelection = isHostMethod(window, "getSelection"),
          +            implementsDocSelection = util.isHostObject(document, "selection");
          +
          +        features.implementsWinGetSelection = implementsWinGetSelection;
          +        features.implementsDocSelection = implementsDocSelection;
          +
          +        var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);
          +
          +        if (useDocumentSelection) {
          +            getNativeSelection = getDocSelection;
          +            api.isSelectionValid = function(winParam) {
          +                var doc = getWindow(winParam, "isSelectionValid").document, nativeSel = doc.selection;
          +
          +                // Check whether the selection TextRange is actually contained within the correct document
          +                return (nativeSel.type != "None" || getDocument(nativeSel.createRange().parentElement()) == doc);
          +            };
          +        } else if (implementsWinGetSelection) {
          +            getNativeSelection = getWinSelection;
          +            api.isSelectionValid = function() {
          +                return true;
          +            };
          +        } else {
          +            module.fail("Neither document.selection or window.getSelection() detected.");
          +        }
          +
          +        api.getNativeSelection = getNativeSelection;
          +
          +        var testSelection = getNativeSelection();
          +        var testRange = api.createNativeRange(document);
          +        var body = getBody(document);
          +
          +        // Obtaining a range from a selection
          +        var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,
          +            ["anchorNode", "focusNode", "anchorOffset", "focusOffset"]);
          +
          +        features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;
          +
          +        // Test for existence of native selection extend() method
          +        var selectionHasExtend = isHostMethod(testSelection, "extend");
          +        features.selectionHasExtend = selectionHasExtend;
          +        
          +        // Test if rangeCount exists
          +        var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);
          +        features.selectionHasRangeCount = selectionHasRangeCount;
          +
          +        var selectionSupportsMultipleRanges = false;
          +        var collapsedNonEditableSelectionsSupported = true;
          +
          +        var addRangeBackwardToNative = selectionHasExtend ?
          +            function(nativeSelection, range) {
          +                var doc = DomRange.getRangeDocument(range);
          +                var endRange = api.createRange(doc);
          +                endRange.collapseToPoint(range.endContainer, range.endOffset);
          +                nativeSelection.addRange(getNativeRange(endRange));
          +                nativeSelection.extend(range.startContainer, range.startOffset);
          +            } : null;
          +
          +        if (util.areHostMethods(testSelection, ["addRange", "getRangeAt", "removeAllRanges"]) &&
          +                typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {
          +
          +            (function() {
          +                // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are
          +                // performed on the current document's selection. See issue 109.
          +
          +                // Note also that if a selection previously existed, it is wiped by these tests. This should usually be fine
          +                // because initialization usually happens when the document loads, but could be a problem for a script that
          +                // loads and initializes Rangy later. If anyone complains, code could be added to save and restore the
          +                // selection.
          +                var sel = window.getSelection();
          +                if (sel) {
          +                    // Store the current selection
          +                    var originalSelectionRangeCount = sel.rangeCount;
          +                    var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);
          +                    var originalSelectionRanges = [];
          +                    var originalSelectionBackward = winSelectionIsBackward(sel); 
          +                    for (var i = 0; i < originalSelectionRangeCount; ++i) {
          +                        originalSelectionRanges[i] = sel.getRangeAt(i);
          +                    }
          +                    
          +                    // Create some test elements
          +                    var body = getBody(document);
          +                    var testEl = body.appendChild( document.createElement("div") );
          +                    testEl.contentEditable = "false";
          +                    var textNode = testEl.appendChild( document.createTextNode("\u00a0\u00a0\u00a0") );
          +
          +                    // Test whether the native selection will allow a collapsed selection within a non-editable element
          +                    var r1 = document.createRange();
          +
          +                    r1.setStart(textNode, 1);
          +                    r1.collapse(true);
          +                    sel.addRange(r1);
          +                    collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);
          +                    sel.removeAllRanges();
          +
          +                    // Test whether the native selection is capable of supporting multiple ranges.
          +                    if (!selectionHasMultipleRanges) {
          +                        // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a
          +                        // console error of "Discontiguous selection is not supported." that cannot be suppressed. There's
          +                        // nothing we can do about this while retaining the feature test so we have to resort to a browser
          +                        // sniff. I'm not happy about it. See
          +                        // https://code.google.com/p/chromium/issues/detail?id=399791
          +                        var chromeMatch = window.navigator.appVersion.match(/Chrome\/(.*?) /);
          +                        if (chromeMatch && parseInt(chromeMatch[1]) >= 36) {
          +                            selectionSupportsMultipleRanges = false;
          +                        } else {
          +                            var r2 = r1.cloneRange();
          +                            r1.setStart(textNode, 0);
          +                            r2.setEnd(textNode, 3);
          +                            r2.setStart(textNode, 2);
          +                            sel.addRange(r1);
          +                            sel.addRange(r2);
          +                            selectionSupportsMultipleRanges = (sel.rangeCount == 2);
          +                        }
          +                    }
          +
          +                    // Clean up
          +                    body.removeChild(testEl);
          +                    sel.removeAllRanges();
          +
          +                    for (i = 0; i < originalSelectionRangeCount; ++i) {
          +                        if (i == 0 && originalSelectionBackward) {
          +                            if (addRangeBackwardToNative) {
          +                                addRangeBackwardToNative(sel, originalSelectionRanges[i]);
          +                            } else {
          +                                api.warn("Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend");
          +                                sel.addRange(originalSelectionRanges[i]);
          +                            }
          +                        } else {
          +                            sel.addRange(originalSelectionRanges[i]);
          +                        }
          +                    }
          +                }
          +            })();
          +        }
          +
          +        features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;
          +        features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;
          +
          +        // ControlRanges
          +        var implementsControlRange = false, testControlRange;
          +
          +        if (body && isHostMethod(body, "createControlRange")) {
          +            testControlRange = body.createControlRange();
          +            if (util.areHostProperties(testControlRange, ["item", "add"])) {
          +                implementsControlRange = true;
          +            }
          +        }
          +        features.implementsControlRange = implementsControlRange;
          +
          +        // Selection collapsedness
          +        if (selectionHasAnchorAndFocus) {
          +            selectionIsCollapsed = function(sel) {
          +                return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;
          +            };
          +        } else {
          +            selectionIsCollapsed = function(sel) {
          +                return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;
          +            };
          +        }
          +
          +        function updateAnchorAndFocusFromRange(sel, range, backward) {
          +            var anchorPrefix = backward ? "end" : "start", focusPrefix = backward ? "start" : "end";
          +            sel.anchorNode = range[anchorPrefix + "Container"];
          +            sel.anchorOffset = range[anchorPrefix + "Offset"];
          +            sel.focusNode = range[focusPrefix + "Container"];
          +            sel.focusOffset = range[focusPrefix + "Offset"];
          +        }
          +
          +        function updateAnchorAndFocusFromNativeSelection(sel) {
          +            var nativeSel = sel.nativeSelection;
          +            sel.anchorNode = nativeSel.anchorNode;
          +            sel.anchorOffset = nativeSel.anchorOffset;
          +            sel.focusNode = nativeSel.focusNode;
          +            sel.focusOffset = nativeSel.focusOffset;
          +        }
          +
          +        function updateEmptySelection(sel) {
          +            sel.anchorNode = sel.focusNode = null;
          +            sel.anchorOffset = sel.focusOffset = 0;
          +            sel.rangeCount = 0;
          +            sel.isCollapsed = true;
          +            sel._ranges.length = 0;
          +        }
          +
          +        function getNativeRange(range) {
          +            var nativeRange;
          +            if (range instanceof DomRange) {
          +                nativeRange = api.createNativeRange(range.getDocument());
          +                nativeRange.setEnd(range.endContainer, range.endOffset);
          +                nativeRange.setStart(range.startContainer, range.startOffset);
          +            } else if (range instanceof WrappedRange) {
          +                nativeRange = range.nativeRange;
          +            } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {
          +                nativeRange = range;
          +            }
          +            return nativeRange;
          +        }
          +
          +        function rangeContainsSingleElement(rangeNodes) {
          +            if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {
          +                return false;
          +            }
          +            for (var i = 1, len = rangeNodes.length; i < len; ++i) {
          +                if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {
          +                    return false;
          +                }
          +            }
          +            return true;
          +        }
          +
          +        function getSingleElementFromRange(range) {
          +            var nodes = range.getNodes();
          +            if (!rangeContainsSingleElement(nodes)) {
          +                throw module.createError("getSingleElementFromRange: range " + range.inspect() + " did not consist of a single element");
          +            }
          +            return nodes[0];
          +        }
          +
          +        // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange
          +        function isTextRange(range) {
          +            return !!range && typeof range.text != "undefined";
          +        }
          +
          +        function updateFromTextRange(sel, range) {
          +            // Create a Range from the selected TextRange
          +            var wrappedRange = new WrappedRange(range);
          +            sel._ranges = [wrappedRange];
          +
          +            updateAnchorAndFocusFromRange(sel, wrappedRange, false);
          +            sel.rangeCount = 1;
          +            sel.isCollapsed = wrappedRange.collapsed;
          +        }
          +
          +        function updateControlSelection(sel) {
          +            // Update the wrapped selection based on what's now in the native selection
          +            sel._ranges.length = 0;
          +            if (sel.docSelection.type == "None") {
          +                updateEmptySelection(sel);
          +            } else {
          +                var controlRange = sel.docSelection.createRange();
          +                if (isTextRange(controlRange)) {
          +                    // This case (where the selection type is "Control" and calling createRange() on the selection returns
          +                    // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected
          +                    // ControlRange have been removed from the ControlRange and removed from the document.
          +                    updateFromTextRange(sel, controlRange);
          +                } else {
          +                    sel.rangeCount = controlRange.length;
          +                    var range, doc = getDocument(controlRange.item(0));
          +                    for (var i = 0; i < sel.rangeCount; ++i) {
          +                        range = api.createRange(doc);
          +                        range.selectNode(controlRange.item(i));
          +                        sel._ranges.push(range);
          +                    }
          +                    sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;
          +                    updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);
          +                }
          +            }
          +        }
          +
          +        function addRangeToControlSelection(sel, range) {
          +            var controlRange = sel.docSelection.createRange();
          +            var rangeElement = getSingleElementFromRange(range);
          +
          +            // Create a new ControlRange containing all the elements in the selected ControlRange plus the element
          +            // contained by the supplied range
          +            var doc = getDocument(controlRange.item(0));
          +            var newControlRange = getBody(doc).createControlRange();
          +            for (var i = 0, len = controlRange.length; i < len; ++i) {
          +                newControlRange.add(controlRange.item(i));
          +            }
          +            try {
          +                newControlRange.add(rangeElement);
          +            } catch (ex) {
          +                throw module.createError("addRange(): Element within the specified Range could not be added to control selection (does it have layout?)");
          +            }
          +            newControlRange.select();
          +
          +            // Update the wrapped selection based on what's now in the native selection
          +            updateControlSelection(sel);
          +        }
          +
          +        var getSelectionRangeAt;
          +
          +        if (isHostMethod(testSelection, "getRangeAt")) {
          +            // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.
          +            // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a
          +            // lesson to us all, especially me.
          +            getSelectionRangeAt = function(sel, index) {
          +                try {
          +                    return sel.getRangeAt(index);
          +                } catch (ex) {
          +                    return null;
          +                }
          +            };
          +        } else if (selectionHasAnchorAndFocus) {
          +            getSelectionRangeAt = function(sel) {
          +                var doc = getDocument(sel.anchorNode);
          +                var range = api.createRange(doc);
          +                range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);
          +
          +                // Handle the case when the selection was selected backwards (from the end to the start in the
          +                // document)
          +                if (range.collapsed !== this.isCollapsed) {
          +                    range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);
          +                }
          +
          +                return range;
          +            };
          +        }
          +
          +        function WrappedSelection(selection, docSelection, win) {
          +            this.nativeSelection = selection;
          +            this.docSelection = docSelection;
          +            this._ranges = [];
          +            this.win = win;
          +            this.refresh();
          +        }
          +
          +        WrappedSelection.prototype = api.selectionPrototype;
          +
          +        function deleteProperties(sel) {
          +            sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;
          +            sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;
          +            sel.detached = true;
          +        }
          +
          +        var cachedRangySelections = [];
          +
          +        function actOnCachedSelection(win, action) {
          +            var i = cachedRangySelections.length, cached, sel;
          +            while (i--) {
          +                cached = cachedRangySelections[i];
          +                sel = cached.selection;
          +                if (action == "deleteAll") {
          +                    deleteProperties(sel);
          +                } else if (cached.win == win) {
          +                    if (action == "delete") {
          +                        cachedRangySelections.splice(i, 1);
          +                        return true;
          +                    } else {
          +                        return sel;
          +                    }
          +                }
          +            }
          +            if (action == "deleteAll") {
          +                cachedRangySelections.length = 0;
          +            }
          +            return null;
          +        }
          +
          +        var getSelection = function(win) {
          +            // Check if the parameter is a Rangy Selection object
          +            if (win && win instanceof WrappedSelection) {
          +                win.refresh();
          +                return win;
          +            }
          +
          +            win = getWindow(win, "getNativeSelection");
          +
          +            var sel = actOnCachedSelection(win);
          +            var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;
          +            if (sel) {
          +                sel.nativeSelection = nativeSel;
          +                sel.docSelection = docSel;
          +                sel.refresh();
          +            } else {
          +                sel = new WrappedSelection(nativeSel, docSel, win);
          +                cachedRangySelections.push( { win: win, selection: sel } );
          +            }
          +            return sel;
          +        };
          +
          +        api.getSelection = getSelection;
          +
          +        api.getIframeSelection = function(iframeEl) {
          +            module.deprecationNotice("getIframeSelection()", "getSelection(iframeEl)");
          +            return api.getSelection(dom.getIframeWindow(iframeEl));
          +        };
          +
          +        var selProto = WrappedSelection.prototype;
          +
          +        function createControlSelection(sel, ranges) {
          +            // Ensure that the selection becomes of type "Control"
          +            var doc = getDocument(ranges[0].startContainer);
          +            var controlRange = getBody(doc).createControlRange();
          +            for (var i = 0, el, len = ranges.length; i < len; ++i) {
          +                el = getSingleElementFromRange(ranges[i]);
          +                try {
          +                    controlRange.add(el);
          +                } catch (ex) {
          +                    throw module.createError("setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)");
          +                }
          +            }
          +            controlRange.select();
          +
          +            // Update the wrapped selection based on what's now in the native selection
          +            updateControlSelection(sel);
          +        }
          +
          +        // Selecting a range
          +        if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, ["removeAllRanges", "addRange"])) {
          +            selProto.removeAllRanges = function() {
          +                this.nativeSelection.removeAllRanges();
          +                updateEmptySelection(this);
          +            };
          +
          +            var addRangeBackward = function(sel, range) {
          +                addRangeBackwardToNative(sel.nativeSelection, range);
          +                sel.refresh();
          +            };
          +
          +            if (selectionHasRangeCount) {
          +                selProto.addRange = function(range, direction) {
          +                    if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {
          +                        addRangeToControlSelection(this, range);
          +                    } else {
          +                        if (isDirectionBackward(direction) && selectionHasExtend) {
          +                            addRangeBackward(this, range);
          +                        } else {
          +                            var previousRangeCount;
          +                            if (selectionSupportsMultipleRanges) {
          +                                previousRangeCount = this.rangeCount;
          +                            } else {
          +                                this.removeAllRanges();
          +                                previousRangeCount = 0;
          +                            }
          +                            // Clone the native range so that changing the selected range does not affect the selection.
          +                            // This is contrary to the spec but is the only way to achieve consistency between browsers. See
          +                            // issue 80.
          +                            this.nativeSelection.addRange(getNativeRange(range).cloneRange());
          +
          +                            // Check whether adding the range was successful
          +                            this.rangeCount = this.nativeSelection.rangeCount;
          +
          +                            if (this.rangeCount == previousRangeCount + 1) {
          +                                // The range was added successfully
          +
          +                                // Check whether the range that we added to the selection is reflected in the last range extracted from
          +                                // the selection
          +                                if (api.config.checkSelectionRanges) {
          +                                    var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);
          +                                    if (nativeRange && !rangesEqual(nativeRange, range)) {
          +                                        // Happens in WebKit with, for example, a selection placed at the start of a text node
          +                                        range = new WrappedRange(nativeRange);
          +                                    }
          +                                }
          +                                this._ranges[this.rangeCount - 1] = range;
          +                                updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));
          +                                this.isCollapsed = selectionIsCollapsed(this);
          +                            } else {
          +                                // The range was not added successfully. The simplest thing is to refresh
          +                                this.refresh();
          +                            }
          +                        }
          +                    }
          +                };
          +            } else {
          +                selProto.addRange = function(range, direction) {
          +                    if (isDirectionBackward(direction) && selectionHasExtend) {
          +                        addRangeBackward(this, range);
          +                    } else {
          +                        this.nativeSelection.addRange(getNativeRange(range));
          +                        this.refresh();
          +                    }
          +                };
          +            }
          +
          +            selProto.setRanges = function(ranges) {
          +                if (implementsControlRange && implementsDocSelection && ranges.length > 1) {
          +                    createControlSelection(this, ranges);
          +                } else {
          +                    this.removeAllRanges();
          +                    for (var i = 0, len = ranges.length; i < len; ++i) {
          +                        this.addRange(ranges[i]);
          +                    }
          +                }
          +            };
          +        } else if (isHostMethod(testSelection, "empty") && isHostMethod(testRange, "select") &&
          +                   implementsControlRange && useDocumentSelection) {
          +
          +            selProto.removeAllRanges = function() {
          +                // Added try/catch as fix for issue #21
          +                try {
          +                    this.docSelection.empty();
          +
          +                    // Check for empty() not working (issue #24)
          +                    if (this.docSelection.type != "None") {
          +                        // Work around failure to empty a control selection by instead selecting a TextRange and then
          +                        // calling empty()
          +                        var doc;
          +                        if (this.anchorNode) {
          +                            doc = getDocument(this.anchorNode);
          +                        } else if (this.docSelection.type == CONTROL) {
          +                            var controlRange = this.docSelection.createRange();
          +                            if (controlRange.length) {
          +                                doc = getDocument( controlRange.item(0) );
          +                            }
          +                        }
          +                        if (doc) {
          +                            var textRange = getBody(doc).createTextRange();
          +                            textRange.select();
          +                            this.docSelection.empty();
          +                        }
          +                    }
          +                } catch(ex) {}
          +                updateEmptySelection(this);
          +            };
          +
          +            selProto.addRange = function(range) {
          +                if (this.docSelection.type == CONTROL) {
          +                    addRangeToControlSelection(this, range);
          +                } else {
          +                    api.WrappedTextRange.rangeToTextRange(range).select();
          +                    this._ranges[0] = range;
          +                    this.rangeCount = 1;
          +                    this.isCollapsed = this._ranges[0].collapsed;
          +                    updateAnchorAndFocusFromRange(this, range, false);
          +                }
          +            };
          +
          +            selProto.setRanges = function(ranges) {
          +                this.removeAllRanges();
          +                var rangeCount = ranges.length;
          +                if (rangeCount > 1) {
          +                    createControlSelection(this, ranges);
          +                } else if (rangeCount) {
          +                    this.addRange(ranges[0]);
          +                }
          +            };
          +        } else {
          +            module.fail("No means of selecting a Range or TextRange was found");
          +            return false;
          +        }
          +
          +        selProto.getRangeAt = function(index) {
          +            if (index < 0 || index >= this.rangeCount) {
          +                throw new DOMException("INDEX_SIZE_ERR");
          +            } else {
          +                // Clone the range to preserve selection-range independence. See issue 80.
          +                return this._ranges[index].cloneRange();
          +            }
          +        };
          +
          +        var refreshSelection;
          +
          +        if (useDocumentSelection) {
          +            refreshSelection = function(sel) {
          +                var range;
          +                if (api.isSelectionValid(sel.win)) {
          +                    range = sel.docSelection.createRange();
          +                } else {
          +                    range = getBody(sel.win.document).createTextRange();
          +                    range.collapse(true);
          +                }
          +
          +                if (sel.docSelection.type == CONTROL) {
          +                    updateControlSelection(sel);
          +                } else if (isTextRange(range)) {
          +                    updateFromTextRange(sel, range);
          +                } else {
          +                    updateEmptySelection(sel);
          +                }
          +            };
          +        } else if (isHostMethod(testSelection, "getRangeAt") && typeof testSelection.rangeCount == NUMBER) {
          +            refreshSelection = function(sel) {
          +                if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {
          +                    updateControlSelection(sel);
          +                } else {
          +                    sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;
          +                    if (sel.rangeCount) {
          +                        for (var i = 0, len = sel.rangeCount; i < len; ++i) {
          +                            sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));
          +                        }
          +                        updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));
          +                        sel.isCollapsed = selectionIsCollapsed(sel);
          +                    } else {
          +                        updateEmptySelection(sel);
          +                    }
          +                }
          +            };
          +        } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {
          +            refreshSelection = function(sel) {
          +                var range, nativeSel = sel.nativeSelection;
          +                if (nativeSel.anchorNode) {
          +                    range = getSelectionRangeAt(nativeSel, 0);
          +                    sel._ranges = [range];
          +                    sel.rangeCount = 1;
          +                    updateAnchorAndFocusFromNativeSelection(sel);
          +                    sel.isCollapsed = selectionIsCollapsed(sel);
          +                } else {
          +                    updateEmptySelection(sel);
          +                }
          +            };
          +        } else {
          +            module.fail("No means of obtaining a Range or TextRange from the user's selection was found");
          +            return false;
          +        }
          +
          +        selProto.refresh = function(checkForChanges) {
          +            var oldRanges = checkForChanges ? this._ranges.slice(0) : null;
          +            var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;
          +
          +            refreshSelection(this);
          +            if (checkForChanges) {
          +                // Check the range count first
          +                var i = oldRanges.length;
          +                if (i != this._ranges.length) {
          +                    return true;
          +                }
          +
          +                // Now check the direction. Checking the anchor position is the same is enough since we're checking all the
          +                // ranges after this
          +                if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {
          +                    return true;
          +                }
          +
          +                // Finally, compare each range in turn
          +                while (i--) {
          +                    if (!rangesEqual(oldRanges[i], this._ranges[i])) {
          +                        return true;
          +                    }
          +                }
          +                return false;
          +            }
          +        };
          +
          +        // Removal of a single range
          +        var removeRangeManually = function(sel, range) {
          +            var ranges = sel.getAllRanges();
          +            sel.removeAllRanges();
          +            for (var i = 0, len = ranges.length; i < len; ++i) {
          +                if (!rangesEqual(range, ranges[i])) {
          +                    sel.addRange(ranges[i]);
          +                }
          +            }
          +            if (!sel.rangeCount) {
          +                updateEmptySelection(sel);
          +            }
          +        };
          +
          +        if (implementsControlRange && implementsDocSelection) {
          +            selProto.removeRange = function(range) {
          +                if (this.docSelection.type == CONTROL) {
          +                    var controlRange = this.docSelection.createRange();
          +                    var rangeElement = getSingleElementFromRange(range);
          +
          +                    // Create a new ControlRange containing all the elements in the selected ControlRange minus the
          +                    // element contained by the supplied range
          +                    var doc = getDocument(controlRange.item(0));
          +                    var newControlRange = getBody(doc).createControlRange();
          +                    var el, removed = false;
          +                    for (var i = 0, len = controlRange.length; i < len; ++i) {
          +                        el = controlRange.item(i);
          +                        if (el !== rangeElement || removed) {
          +                            newControlRange.add(controlRange.item(i));
          +                        } else {
          +                            removed = true;
          +                        }
          +                    }
          +                    newControlRange.select();
          +
          +                    // Update the wrapped selection based on what's now in the native selection
          +                    updateControlSelection(this);
          +                } else {
          +                    removeRangeManually(this, range);
          +                }
          +            };
          +        } else {
          +            selProto.removeRange = function(range) {
          +                removeRangeManually(this, range);
          +            };
          +        }
          +
          +        // Detecting if a selection is backward
          +        var selectionIsBackward;
          +        if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {
          +            selectionIsBackward = winSelectionIsBackward;
          +
          +            selProto.isBackward = function() {
          +                return selectionIsBackward(this);
          +            };
          +        } else {
          +            selectionIsBackward = selProto.isBackward = function() {
          +                return false;
          +            };
          +        }
          +
          +        // Create an alias for backwards compatibility. From 1.3, everything is "backward" rather than "backwards"
          +        selProto.isBackwards = selProto.isBackward;
          +
          +        // Selection stringifier
          +        // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.
          +        // The current spec does not yet define this method.
          +        selProto.toString = function() {
          +            var rangeTexts = [];
          +            for (var i = 0, len = this.rangeCount; i < len; ++i) {
          +                rangeTexts[i] = "" + this._ranges[i];
          +            }
          +            return rangeTexts.join("");
          +        };
          +
          +        function assertNodeInSameDocument(sel, node) {
          +            if (sel.win.document != getDocument(node)) {
          +                throw new DOMException("WRONG_DOCUMENT_ERR");
          +            }
          +        }
          +
          +        // No current browser conforms fully to the spec for this method, so Rangy's own method is always used
          +        selProto.collapse = function(node, offset) {
          +            assertNodeInSameDocument(this, node);
          +            var range = api.createRange(node);
          +            range.collapseToPoint(node, offset);
          +            this.setSingleRange(range);
          +            this.isCollapsed = true;
          +        };
          +
          +        selProto.collapseToStart = function() {
          +            if (this.rangeCount) {
          +                var range = this._ranges[0];
          +                this.collapse(range.startContainer, range.startOffset);
          +            } else {
          +                throw new DOMException("INVALID_STATE_ERR");
          +            }
          +        };
          +
          +        selProto.collapseToEnd = function() {
          +            if (this.rangeCount) {
          +                var range = this._ranges[this.rangeCount - 1];
          +                this.collapse(range.endContainer, range.endOffset);
          +            } else {
          +                throw new DOMException("INVALID_STATE_ERR");
          +            }
          +        };
          +
          +        // The spec is very specific on how selectAllChildren should be implemented so the native implementation is
          +        // never used by Rangy.
          +        selProto.selectAllChildren = function(node) {
          +            assertNodeInSameDocument(this, node);
          +            var range = api.createRange(node);
          +            range.selectNodeContents(node);
          +            this.setSingleRange(range);
          +        };
          +
          +        selProto.deleteFromDocument = function() {
          +            // Sepcial behaviour required for IE's control selections
          +            if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {
          +                var controlRange = this.docSelection.createRange();
          +                var element;
          +                while (controlRange.length) {
          +                    element = controlRange.item(0);
          +                    controlRange.remove(element);
          +                    element.parentNode.removeChild(element);
          +                }
          +                this.refresh();
          +            } else if (this.rangeCount) {
          +                var ranges = this.getAllRanges();
          +                if (ranges.length) {
          +                    this.removeAllRanges();
          +                    for (var i = 0, len = ranges.length; i < len; ++i) {
          +                        ranges[i].deleteContents();
          +                    }
          +                    // The spec says nothing about what the selection should contain after calling deleteContents on each
          +                    // range. Firefox moves the selection to where the final selected range was, so we emulate that
          +                    this.addRange(ranges[len - 1]);
          +                }
          +            }
          +        };
          +
          +        // The following are non-standard extensions
          +        selProto.eachRange = function(func, returnValue) {
          +            for (var i = 0, len = this._ranges.length; i < len; ++i) {
          +                if ( func( this.getRangeAt(i) ) ) {
          +                    return returnValue;
          +                }
          +            }
          +        };
          +
          +        selProto.getAllRanges = function() {
          +            var ranges = [];
          +            this.eachRange(function(range) {
          +                ranges.push(range);
          +            });
          +            return ranges;
          +        };
          +
          +        selProto.setSingleRange = function(range, direction) {
          +            this.removeAllRanges();
          +            this.addRange(range, direction);
          +        };
          +
          +        selProto.callMethodOnEachRange = function(methodName, params) {
          +            var results = [];
          +            this.eachRange( function(range) {
          +                results.push( range[methodName].apply(range, params) );
          +            } );
          +            return results;
          +        };
          +        
          +        function createStartOrEndSetter(isStart) {
          +            return function(node, offset) {
          +                var range;
          +                if (this.rangeCount) {
          +                    range = this.getRangeAt(0);
          +                    range["set" + (isStart ? "Start" : "End")](node, offset);
          +                } else {
          +                    range = api.createRange(this.win.document);
          +                    range.setStartAndEnd(node, offset);
          +                }
          +                this.setSingleRange(range, this.isBackward());
          +            };
          +        }
          +
          +        selProto.setStart = createStartOrEndSetter(true);
          +        selProto.setEnd = createStartOrEndSetter(false);
          +        
          +        // Add select() method to Range prototype. Any existing selection will be removed.
          +        api.rangePrototype.select = function(direction) {
          +            getSelection( this.getDocument() ).setSingleRange(this, direction);
          +        };
          +
          +        selProto.changeEachRange = function(func) {
          +            var ranges = [];
          +            var backward = this.isBackward();
          +
          +            this.eachRange(function(range) {
          +                func(range);
          +                ranges.push(range);
          +            });
          +
          +            this.removeAllRanges();
          +            if (backward && ranges.length == 1) {
          +                this.addRange(ranges[0], "backward");
          +            } else {
          +                this.setRanges(ranges);
          +            }
          +        };
          +
          +        selProto.containsNode = function(node, allowPartial) {
          +            return this.eachRange( function(range) {
          +                return range.containsNode(node, allowPartial);
          +            }, true ) || false;
          +        };
          +
          +        selProto.getBookmark = function(containerNode) {
          +            return {
          +                backward: this.isBackward(),
          +                rangeBookmarks: this.callMethodOnEachRange("getBookmark", [containerNode])
          +            };
          +        };
          +
          +        selProto.moveToBookmark = function(bookmark) {
          +            var selRanges = [];
          +            for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {
          +                range = api.createRange(this.win);
          +                range.moveToBookmark(rangeBookmark);
          +                selRanges.push(range);
          +            }
          +            if (bookmark.backward) {
          +                this.setSingleRange(selRanges[0], "backward");
          +            } else {
          +                this.setRanges(selRanges);
          +            }
          +        };
          +
          +        selProto.toHtml = function() {
          +            var rangeHtmls = [];
          +            this.eachRange(function(range) {
          +                rangeHtmls.push( DomRange.toHtml(range) );
          +            });
          +            return rangeHtmls.join("");
          +        };
          +
          +        if (features.implementsTextRange) {
          +            selProto.getNativeTextRange = function() {
          +                var sel, textRange;
          +                if ( (sel = this.docSelection) ) {
          +                    var range = sel.createRange();
          +                    if (isTextRange(range)) {
          +                        return range;
          +                    } else {
          +                        throw module.createError("getNativeTextRange: selection is a control selection"); 
          +                    }
          +                } else if (this.rangeCount > 0) {
          +                    return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) );
          +                } else {
          +                    throw module.createError("getNativeTextRange: selection contains no range");
          +                }
          +            };
          +        }
          +
          +        function inspect(sel) {
          +            var rangeInspects = [];
          +            var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);
          +            var focus = new DomPosition(sel.focusNode, sel.focusOffset);
          +            var name = (typeof sel.getName == "function") ? sel.getName() : "Selection";
          +
          +            if (typeof sel.rangeCount != "undefined") {
          +                for (var i = 0, len = sel.rangeCount; i < len; ++i) {
          +                    rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));
          +                }
          +            }
          +            return "[" + name + "(Ranges: " + rangeInspects.join(", ") +
          +                    ")(anchor: " + anchor.inspect() + ", focus: " + focus.inspect() + "]";
          +        }
          +
          +        selProto.getName = function() {
          +            return "WrappedSelection";
          +        };
          +
          +        selProto.inspect = function() {
          +            return inspect(this);
          +        };
          +
          +        selProto.detach = function() {
          +            actOnCachedSelection(this.win, "delete");
          +            deleteProperties(this);
          +        };
          +
          +        WrappedSelection.detachAll = function() {
          +            actOnCachedSelection(null, "deleteAll");
          +        };
          +
          +        WrappedSelection.inspect = inspect;
          +        WrappedSelection.isDirectionBackward = isDirectionBackward;
          +
          +        api.Selection = WrappedSelection;
          +
          +        api.selectionPrototype = selProto;
          +
          +        api.addShimListener(function(win) {
          +            if (typeof win.getSelection == "undefined") {
          +                win.getSelection = function() {
          +                    return getSelection(win);
          +                };
          +            }
          +            win = null;
          +        });
          +    });
          +    
          +
          +    /*----------------------------------------------------------------------------------------------------------------*/
          +
          +    return api;
          +}, this);;/**
          + * Selection save and restore module for Rangy.
          + * Saves and restores user selections using marker invisible elements in the DOM.
          + *
          + * Part of Rangy, a cross-browser JavaScript range and selection library
          + * http://code.google.com/p/rangy/
          + *
          + * Depends on Rangy core.
          + *
          + * Copyright 2014, Tim Down
          + * Licensed under the MIT license.
          + * Version: 1.3alpha.20140804
          + * Build date: 4 August 2014
          + */
          +(function(factory, global) {
          +    if (typeof define == "function" && define.amd) {
          +        // AMD. Register as an anonymous module with a dependency on Rangy.
          +        define(["rangy"], factory);
          +        /*
          +         } else if (typeof exports == "object") {
          +         // Node/CommonJS style for Browserify
          +         module.exports = factory;
          +         */
          +    } else {
          +        // No AMD or CommonJS support so we use the rangy global variable
          +        factory(global.rangy);
          +    }
          +})(function(rangy) {
          +    rangy.createModule("SaveRestore", ["WrappedRange"], function(api, module) {
          +        var dom = api.dom;
          +
          +        var markerTextChar = "\ufeff";
          +
          +        function gEBI(id, doc) {
          +            return (doc || document).getElementById(id);
          +        }
          +
          +        function insertRangeBoundaryMarker(range, atStart) {
          +            var markerId = "selectionBoundary_" + (+new Date()) + "_" + ("" + Math.random()).slice(2);
          +            var markerEl;
          +            var doc = dom.getDocument(range.startContainer);
          +
          +            // Clone the Range and collapse to the appropriate boundary point
          +            var boundaryRange = range.cloneRange();
          +            boundaryRange.collapse(atStart);
          +
          +            // Create the marker element containing a single invisible character using DOM methods and insert it
          +            markerEl = doc.createElement("span");
          +            markerEl.id = markerId;
          +            markerEl.style.lineHeight = "0";
          +            markerEl.style.display = "none";
          +            markerEl.className = "rangySelectionBoundary";
          +            markerEl.appendChild(doc.createTextNode(markerTextChar));
          +
          +            boundaryRange.insertNode(markerEl);
          +            return markerEl;
          +        }
          +
          +        function setRangeBoundary(doc, range, markerId, atStart) {
          +            var markerEl = gEBI(markerId, doc);
          +            if (markerEl) {
          +                range[atStart ? "setStartBefore" : "setEndBefore"](markerEl);
          +                markerEl.parentNode.removeChild(markerEl);
          +            } else {
          +                module.warn("Marker element has been removed. Cannot restore selection.");
          +            }
          +        }
          +
          +        function compareRanges(r1, r2) {
          +            return r2.compareBoundaryPoints(r1.START_TO_START, r1);
          +        }
          +
          +        function saveRange(range, backward) {
          +            var startEl, endEl, doc = api.DomRange.getRangeDocument(range), text = range.toString();
          +
          +            if (range.collapsed) {
          +                endEl = insertRangeBoundaryMarker(range, false);
          +                return {
          +                    document: doc,
          +                    markerId: endEl.id,
          +                    collapsed: true
          +                };
          +            } else {
          +                endEl = insertRangeBoundaryMarker(range, false);
          +                startEl = insertRangeBoundaryMarker(range, true);
          +
          +                return {
          +                    document: doc,
          +                    startMarkerId: startEl.id,
          +                    endMarkerId: endEl.id,
          +                    collapsed: false,
          +                    backward: backward,
          +                    toString: function() {
          +                        return "original text: '" + text + "', new text: '" + range.toString() + "'";
          +                    }
          +                };
          +            }
          +        }
          +
          +        function restoreRange(rangeInfo, normalize) {
          +            var doc = rangeInfo.document;
          +            if (typeof normalize == "undefined") {
          +                normalize = true;
          +            }
          +            var range = api.createRange(doc);
          +            if (rangeInfo.collapsed) {
          +                var markerEl = gEBI(rangeInfo.markerId, doc);
          +                if (markerEl) {
          +                    markerEl.style.display = "inline";
          +                    var previousNode = markerEl.previousSibling;
          +
          +                    // Workaround for issue 17
          +                    if (previousNode && previousNode.nodeType == 3) {
          +                        markerEl.parentNode.removeChild(markerEl);
          +                        range.collapseToPoint(previousNode, previousNode.length);
          +                    } else {
          +                        range.collapseBefore(markerEl);
          +                        markerEl.parentNode.removeChild(markerEl);
          +                    }
          +                } else {
          +                    module.warn("Marker element has been removed. Cannot restore selection.");
          +                }
          +            } else {
          +                setRangeBoundary(doc, range, rangeInfo.startMarkerId, true);
          +                setRangeBoundary(doc, range, rangeInfo.endMarkerId, false);
          +            }
          +
          +            if (normalize) {
          +                range.normalizeBoundaries();
          +            }
          +
          +            return range;
          +        }
          +
          +        function saveRanges(ranges, backward) {
          +            var rangeInfos = [], range, doc;
          +
          +            // Order the ranges by position within the DOM, latest first, cloning the array to leave the original untouched
          +            ranges = ranges.slice(0);
          +            ranges.sort(compareRanges);
          +
          +            for (var i = 0, len = ranges.length; i < len; ++i) {
          +                rangeInfos[i] = saveRange(ranges[i], backward);
          +            }
          +
          +            // Now that all the markers are in place and DOM manipulation over, adjust each range's boundaries to lie
          +            // between its markers
          +            for (i = len - 1; i >= 0; --i) {
          +                range = ranges[i];
          +                doc = api.DomRange.getRangeDocument(range);
          +                if (range.collapsed) {
          +                    range.collapseAfter(gEBI(rangeInfos[i].markerId, doc));
          +                } else {
          +                    range.setEndBefore(gEBI(rangeInfos[i].endMarkerId, doc));
          +                    range.setStartAfter(gEBI(rangeInfos[i].startMarkerId, doc));
          +                }
          +            }
          +
          +            return rangeInfos;
          +        }
          +
          +        function saveSelection(win) {
          +            if (!api.isSelectionValid(win)) {
          +                module.warn("Cannot save selection. This usually happens when the selection is collapsed and the selection document has lost focus.");
          +                return null;
          +            }
          +            var sel = api.getSelection(win);
          +            var ranges = sel.getAllRanges();
          +            var backward = (ranges.length == 1 && sel.isBackward());
          +
          +            var rangeInfos = saveRanges(ranges, backward);
          +
          +            // Ensure current selection is unaffected
          +            if (backward) {
          +                sel.setSingleRange(ranges[0], "backward");
          +            } else {
          +                sel.setRanges(ranges);
          +            }
          +
          +            return {
          +                win: win,
          +                rangeInfos: rangeInfos,
          +                restored: false
          +            };
          +        }
          +
          +        function restoreRanges(rangeInfos) {
          +            var ranges = [];
          +
          +            // Ranges are in reverse order of appearance in the DOM. We want to restore earliest first to avoid
          +            // normalization affecting previously restored ranges.
          +            var rangeCount = rangeInfos.length;
          +
          +            for (var i = rangeCount - 1; i >= 0; i--) {
          +                ranges[i] = restoreRange(rangeInfos[i], true);
          +            }
          +
          +            return ranges;
          +        }
          +
          +        function restoreSelection(savedSelection, preserveDirection) {
          +            if (!savedSelection.restored) {
          +                var rangeInfos = savedSelection.rangeInfos;
          +                var sel = api.getSelection(savedSelection.win);
          +                var ranges = restoreRanges(rangeInfos), rangeCount = rangeInfos.length;
          +
          +                if (rangeCount == 1 && preserveDirection && api.features.selectionHasExtend && rangeInfos[0].backward) {
          +                    sel.removeAllRanges();
          +                    sel.addRange(ranges[0], true);
          +                } else {
          +                    sel.setRanges(ranges);
          +                }
          +
          +                savedSelection.restored = true;
          +            }
          +        }
          +
          +        function removeMarkerElement(doc, markerId) {
          +            var markerEl = gEBI(markerId, doc);
          +            if (markerEl) {
          +                markerEl.parentNode.removeChild(markerEl);
          +            }
          +        }
          +
          +        function removeMarkers(savedSelection) {
          +            var rangeInfos = savedSelection.rangeInfos;
          +            for (var i = 0, len = rangeInfos.length, rangeInfo; i < len; ++i) {
          +                rangeInfo = rangeInfos[i];
          +                if (rangeInfo.collapsed) {
          +                    removeMarkerElement(savedSelection.doc, rangeInfo.markerId);
          +                } else {
          +                    removeMarkerElement(savedSelection.doc, rangeInfo.startMarkerId);
          +                    removeMarkerElement(savedSelection.doc, rangeInfo.endMarkerId);
          +                }
          +            }
          +        }
          +
          +        api.util.extend(api, {
          +            saveRange: saveRange,
          +            restoreRange: restoreRange,
          +            saveRanges: saveRanges,
          +            restoreRanges: restoreRanges,
          +            saveSelection: saveSelection,
          +            restoreSelection: restoreSelection,
          +            removeMarkerElement: removeMarkerElement,
          +            removeMarkers: removeMarkers
          +        });
          +    });
          +    
          +}, this);;/*
          +	Base.js, version 1.1a
          +	Copyright 2006-2010, Dean Edwards
          +	License: http://www.opensource.org/licenses/mit-license.php
          +*/
          +
          +var Base = function() {
          +	// dummy
          +};
          +
          +Base.extend = function(_instance, _static) { // subclass
          +	var extend = Base.prototype.extend;
          +	
          +	// build the prototype
          +	Base._prototyping = true;
          +	var proto = new this;
          +	extend.call(proto, _instance);
          +  proto.base = function() {
          +    // call this method from any other method to invoke that method's ancestor
          +  };
          +	delete Base._prototyping;
          +	
          +	// create the wrapper for the constructor function
          +	//var constructor = proto.constructor.valueOf(); //-dean
          +	var constructor = proto.constructor;
          +	var klass = proto.constructor = function() {
          +		if (!Base._prototyping) {
          +			if (this._constructing || this.constructor == klass) { // instantiation
          +				this._constructing = true;
          +				constructor.apply(this, arguments);
          +				delete this._constructing;
          +			} else if (arguments[0] != null) { // casting
          +				return (arguments[0].extend || extend).call(arguments[0], proto);
          +			}
          +		}
          +	};
          +	
          +	// build the class interface
          +	klass.ancestor = this;
          +	klass.extend = this.extend;
          +	klass.forEach = this.forEach;
          +	klass.implement = this.implement;
          +	klass.prototype = proto;
          +	klass.toString = this.toString;
          +	klass.valueOf = function(type) {
          +		//return (type == "object") ? klass : constructor; //-dean
          +		return (type == "object") ? klass : constructor.valueOf();
          +	};
          +	extend.call(klass, _static);
          +	// class initialisation
          +	if (typeof klass.init == "function") klass.init();
          +	return klass;
          +};
          +
          +Base.prototype = {	
          +	extend: function(source, value) {
          +		if (arguments.length > 1) { // extending with a name/value pair
          +			var ancestor = this[source];
          +			if (ancestor && (typeof value == "function") && // overriding a method?
          +				// the valueOf() comparison is to avoid circular references
          +				(!ancestor.valueOf || ancestor.valueOf() != value.valueOf()) &&
          +				/\bbase\b/.test(value)) {
          +				// get the underlying method
          +				var method = value.valueOf();
          +				// override
          +				value = function() {
          +					var previous = this.base || Base.prototype.base;
          +					this.base = ancestor;
          +					var returnValue = method.apply(this, arguments);
          +					this.base = previous;
          +					return returnValue;
          +				};
          +				// point to the underlying method
          +				value.valueOf = function(type) {
          +					return (type == "object") ? value : method;
          +				};
          +				value.toString = Base.toString;
          +			}
          +			this[source] = value;
          +		} else if (source) { // extending with an object literal
          +			var extend = Base.prototype.extend;
          +			// if this object has a customised extend method then use it
          +			if (!Base._prototyping && typeof this != "function") {
          +				extend = this.extend || extend;
          +			}
          +			var proto = {toSource: null};
          +			// do the "toString" and other methods manually
          +			var hidden = ["constructor", "toString", "valueOf"];
          +			// if we are prototyping then include the constructor
          +			var i = Base._prototyping ? 0 : 1;
          +			while (key = hidden[i++]) {
          +				if (source[key] != proto[key]) {
          +					extend.call(this, key, source[key]);
          +
          +				}
          +			}
          +			// copy each of the source object's properties to this object
          +			for (var key in source) {
          +				if (!proto[key]) extend.call(this, key, source[key]);
          +			}
          +		}
          +		return this;
          +	}
          +};
          +
          +// initialise
          +Base = Base.extend({
          +	constructor: function() {
          +		this.extend(arguments[0]);
          +	}
          +}, {
          +	ancestor: Object,
          +	version: "1.1",
          +	
          +	forEach: function(object, block, context) {
          +		for (var key in object) {
          +			if (this.prototype[key] === undefined) {
          +				block.call(context, object[key], key, object);
          +			}
          +		}
          +	},
          +		
          +	implement: function() {
          +		for (var i = 0; i < arguments.length; i++) {
          +			if (typeof arguments[i] == "function") {
          +				// if it's a function, call it
          +				arguments[i](this.prototype);
          +			} else {
          +				// add the interface using the extend method
          +				this.prototype.extend(arguments[i]);
          +			}
          +		}
          +		return this;
          +	},
          +	
          +	toString: function() {
          +		return String(this.valueOf());
          +	}
          +});;/**
          + * Detect browser support for specific features
          + */
          +wysihtml5.browser = (function() {
          +  var userAgent   = navigator.userAgent,
          +      testElement = document.createElement("div"),
          +      // Browser sniffing is unfortunately needed since some behaviors are impossible to feature detect
          +      isGecko     = userAgent.indexOf("Gecko")        !== -1 && userAgent.indexOf("KHTML") === -1,
          +      isWebKit    = userAgent.indexOf("AppleWebKit/") !== -1,
          +      isChrome    = userAgent.indexOf("Chrome/")      !== -1,
          +      isOpera     = userAgent.indexOf("Opera/")       !== -1;
          +
          +  function iosVersion(userAgent) {
          +    return +((/ipad|iphone|ipod/.test(userAgent) && userAgent.match(/ os (\d+).+? like mac os x/)) || [undefined, 0])[1];
          +  }
          +
          +  function androidVersion(userAgent) {
          +    return +(userAgent.match(/android (\d+)/) || [undefined, 0])[1];
          +  }
          +
          +  function isIE(version, equation) {
          +    var rv = -1,
          +        re;
          +
          +    if (navigator.appName == 'Microsoft Internet Explorer') {
          +      re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
          +    } else if (navigator.appName == 'Netscape') {
          +      re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
          +    }
          +
          +    if (re && re.exec(navigator.userAgent) != null) {
          +      rv = parseFloat(RegExp.$1);
          +    }
          +
          +    if (rv === -1) { return false; }
          +    if (!version) { return true; }
          +    if (!equation) { return version === rv; }
          +    if (equation === "<") { return version < rv; }
          +    if (equation === ">") { return version > rv; }
          +    if (equation === "<=") { return version <= rv; }
          +    if (equation === ">=") { return version >= rv; }
          +  }
          +
          +  return {
          +    // Static variable needed, publicly accessible, to be able override it in unit tests
          +    USER_AGENT: userAgent,
          +
          +    /**
          +     * Exclude browsers that are not capable of displaying and handling
          +     * contentEditable as desired:
          +     *    - iPhone, iPad (tested iOS 4.2.2) and Android (tested 2.2) refuse to make contentEditables focusable
          +     *    - IE < 8 create invalid markup and crash randomly from time to time
          +     *
          +     * @return {Boolean}
          +     */
          +    supported: function() {
          +      var userAgent                   = this.USER_AGENT.toLowerCase(),
          +          // Essential for making html elements editable
          +          hasContentEditableSupport   = "contentEditable" in testElement,
          +          // Following methods are needed in order to interact with the contentEditable area
          +          hasEditingApiSupport        = document.execCommand && document.queryCommandSupported && document.queryCommandState,
          +          // document selector apis are only supported by IE 8+, Safari 4+, Chrome and Firefox 3.5+
          +          hasQuerySelectorSupport     = document.querySelector && document.querySelectorAll,
          +          // contentEditable is unusable in mobile browsers (tested iOS 4.2.2, Android 2.2, Opera Mobile, WebOS 3.05)
          +          isIncompatibleMobileBrowser = (this.isIos() && iosVersion(userAgent) < 5) || (this.isAndroid() && androidVersion(userAgent) < 4) || userAgent.indexOf("opera mobi") !== -1 || userAgent.indexOf("hpwos/") !== -1;
          +      return hasContentEditableSupport
          +        && hasEditingApiSupport
          +        && hasQuerySelectorSupport
          +        && !isIncompatibleMobileBrowser;
          +    },
          +
          +    isTouchDevice: function() {
          +      return this.supportsEvent("touchmove");
          +    },
          +
          +    isIos: function() {
          +      return (/ipad|iphone|ipod/i).test(this.USER_AGENT);
          +    },
          +
          +    isAndroid: function() {
          +      return this.USER_AGENT.indexOf("Android") !== -1;
          +    },
          +
          +    /**
          +     * Whether the browser supports sandboxed iframes
          +     * Currently only IE 6+ offers such feature ';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]&&e.layero.addClass(l.anim[t.anim]),t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){function t(e){e=s.find(e),e.height(f[1]-c-u-2*(0|parseFloat(e.css("padding-top"))))}var a=this,o=a.config,s=i("#"+l[0]+e);""===o.area[0]&&o.maxWidth>0&&(r.ie&&r.ie<8&&o.btn&&s.width(s.innerWidth()),s.outerWidth()>o.maxWidth&&s.width(o.maxWidth));var f=[s.innerWidth(),s.innerHeight()],c=s.find(l[1]).outerHeight()||0,u=s.find("."+l[6]).outerHeight()||0;switch(o.type){case 2:t("iframe");break;default:""===o.area[1]?o.fixed&&f[1]>=n.height()&&(f[1]=n.height(),t("."+l[5])):t("."+l[5])}return a},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass(a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,n="";if(e>0)for(n=''+t[0].title+"";i"+t[i].title+"";return n}(),content:'
            '+function(){var e=t.length,i=1,n="";if(e>0)for(n='
          • '+(t[0].content||"no content")+"
          • ";i'+(t[i].content||"no content")+"";return n}()+"
          ",success:function(t){var a=t.find(".layui-layer-title").children(),o=t.find(".layui-layer-tabmain").children();a.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var n=i(this),a=n.index();n.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),o.eq(a).show().siblings().hide(),"function"==typeof e.change&&e.change(a)}),"function"==typeof n&&n(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
          '+(u.length>1?'':"")+'
          '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
        4. ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
          是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.jquery),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layer/mobile/layer.js b/hera-admin/src/main/resources/static/plugins/layer/mobile/layer.js new file mode 100755 index 00000000..f9cf6931 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layer/mobile/layer.js @@ -0,0 +1,2 @@ +/*! layer mobile-v2.0.0 Web弹层组件 MIT License http://layer.layui.com/mobile By 贤心 */ + ;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'

          '+(e?n.title[0]:n.title)+"

          ":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e=''+n.btn[0]+"",2===t&&(e=''+n.btn[1]+""+e),'
          '+e+"
          "):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='

          '+(n.content||"")+"

          "),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"
          ':"")+'
          "+l+'
          '+n.content+"
          "+c+"
          ",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;odiv{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layer/skin/default/icon-ext.png b/hera-admin/src/main/resources/static/plugins/layer/skin/default/icon-ext.png new file mode 100755 index 00000000..bbbb669b Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layer/skin/default/icon-ext.png differ diff --git a/hera-admin/src/main/resources/static/plugins/layer/skin/default/icon.png b/hera-admin/src/main/resources/static/plugins/layer/skin/default/icon.png new file mode 100755 index 00000000..3e17da8b Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layer/skin/default/icon.png differ diff --git a/hera-admin/src/main/resources/static/plugins/layer/skin/default/layer.css b/hera-admin/src/main/resources/static/plugins/layer/skin/default/layer.css new file mode 100755 index 00000000..83e36bfd --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layer/skin/default/layer.css @@ -0,0 +1 @@ +.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}*html{background-image:url(about:blank);background-attachment:fixed}html #layuicss-skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layui-layer{border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:6px 6px 0;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-0.gif b/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-0.gif new file mode 100755 index 00000000..6f3c9539 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-0.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-1.gif b/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-1.gif new file mode 100755 index 00000000..db3a483e Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-1.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-2.gif b/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-2.gif new file mode 100755 index 00000000..5bb90fd6 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layer/skin/default/loading-2.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/layui.css b/hera-admin/src/main/resources/static/plugins/layui/css/layui.css new file mode 100755 index 00000000..f297bf6e --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/css/layui.css @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-elip,.layui-form-checkbox span,.layui-form-pane .layui-form-label{text-overflow:ellipsis;white-space:nowrap}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;clear:both}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{overflow:hidden}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=240);src:url(../font/iconfont.eot?v=240#iefix) format('embedded-opentype'),url(../font/iconfont.svg?v=240#iconfont) format('svg'),url(../font/iconfont.woff?v=240) format('woff'),url(../font/iconfont.ttf?v=240) format('truetype')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-home:before{content:"\e68e"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-cols:before{content:"\e610"}.layui-icon-export:before{content:"\e67d"}.layui-icon-print:before{content:"\e66d"}.layui-icon-slider:before{content:"\e714"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;box-sizing:border-box}.layui-layout-body{overflow:hidden}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;line-height:44px;padding:0 15px;background-color:#eee}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space3{margin:-1.5px}.layui-col-space3>*{padding:1.5px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space8{margin:-3.5px}.layui-col-space8>*{padding:3.5px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#f2f2f2}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333;-moz-user-select:none}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #e6e6e6;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;z-index:66666666;width:280px;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#e2e2e2;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:'';position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #e6e6e6;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-15px}.layui-slider-input-btn{display:none;position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #d2d2d2}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #d2d2d2}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:34px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/layui.mobile.css b/hera-admin/src/main/resources/static/plugins/layui/css/layui.mobile.css new file mode 100755 index 00000000..6f7f0a14 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/css/layui.mobile.css @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/code.css b/hera-admin/src/main/resources/static/plugins/layui/css/modules/code.css new file mode 100755 index 00000000..d0d3822c --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/css/modules/code.css @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/formSelects-v4.css b/hera-admin/src/main/resources/static/plugins/layui/css/modules/formSelects-v4.css new file mode 100755 index 00000000..8b5f5c2a --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/css/modules/formSelects-v4.css @@ -0,0 +1,173 @@ +/* formSelects多选css */ +select[xm-select]{display: none !important;} +.xm-select-parent * {margin: 0;padding: 0;font-family: "Helvetica Neue", Helvetica, "PingFang SC", 微软雅黑, Tahoma, Arial, sans-serif; box-sizing: initial;} +.xm-select-parent {text-align: left;} +.xm-select-parent select {display: none;} +.xm-select-parent .xm-select-title {position: relative;min-height: 36px;} +.xm-select-parent .xm-input {cursor: pointer;border-radius: 2px;border-width: 1px;border-style: solid;border-color: #E6E6E6;display: block;width: 100%;box-sizing: border-box;background-color: #FFF;height: 36px;line-height: 1.3;padding-left: 10px;outline: 0} +.xm-select-parent .xm-select-sj {display: inline-block;width: 0;height: 0;border-style: dashed;border-color: transparent;overflow: hidden;position: absolute;right: 10px;top: 50%;margin-top: -3px;cursor: pointer;border-width: 6px;border-top-color: #C2C2C2;border-top-style: solid;transition: all .3s;-webkit-transition: all .3s} +.xm-select-parent .xm-form-selected .xm-select-sj {margin-top: -9px;transform: rotate(180deg)} +.xm-select-parent .xm-form-select dl {display: none;position: absolute;left: 0;top: 42px;padding: 5px 0;z-index: 999;min-width: 100%;border: 1px solid #d2d2d2;max-height: 300px;overflow-y: auto;background-color: #fff;border-radius: 2px;box-shadow: 0 2px 4px rgba(0, 0, 0, .12);box-sizing: border-box;animation-fill-mode: both;-webkit-animation-name: layui-upbit;animation-name: layui-upbit;-webkit-animation-duration: .3s;animation-duration: .3s;-webkit-animation-fill-mode: both;animation-fill-mode: both} +@-webkit-keyframes layui-upbit { + from {-webkit-transform: translate3d(0, 30px, 0);opacity: .3} + to {-webkit-transform: translate3d(0, 0, 0);opacity: 1} +} +@keyframes layui-upbit { + from {transform: translate3d(0, 30px, 0);opacity: .3} + to {transform: translate3d(0, 0, 0);opacity: 1} +} +.xm-select-parent .xm-form-selected dl {display: block} +.xm-select-parent .xm-form-select dl dd,.xm-select-parent .xm-form-select dl dt {padding: 0 10px;line-height: 36px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis} +.xm-select-parent .xm-form-select dl dd {cursor: pointer;height: 36px;} +.xm-select-parent .xm-form-select dl dd:hover {background-color: #f2f2f2} +.xm-select-parent .xm-form-select dl dt {font-size: 12px;color: #999} +.layui-select-disabled .xm-dis-disabled {border-color: #eee!important} +.xm-select-parent .xm-form-select dl .xm-select-tips {padding-left: 10px!important;color: #999;font-size: 14px} +.xm-unselect {-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none} + +.xm-form-checkbox {position: relative;display: block;vertical-align: middle;cursor: pointer;font-size: 0;-webkit-transition: .1s linear;transition: .1s linear;box-sizing: border-box;height: auto!important;line-height: normal!important;border: none!important;margin-right: 0;padding-right: 0;background: 0 0;} +.xm-form-checkbox > i {color: #FFF; font-size: 16px; width: 16px; height: 16px; position: absolute; top: 9px; border: 1px solid #5FB878; border-radius: 3px; z-index: 2;} +.xm-form-checkbox:hover > i {border-color: #5FB878;} +.xm-form-checkbox > span{display: block;position: relative;padding: 0 15px 0 30px;height: 100%;font-size: 14px;border-radius: 2px 0 0 2px;background-color: #d2d2d2;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;background: 0 0;color: #666;line-height: 36px;} + +.xm-select-parent dl{width: 100%;} +.xm-select-parent dl dd{position: relative;} +.xm-select-parent dl dd > i:not(.icon-sousuo){position: absolute; right: 10px; top: 0; color: #AAAAAA;} +.xm-select-parent dl dd.xm-select-this div i {border: none; color: #009688; font-size: 18px;} +.xm-select-parent dl dd.xm-select-this div i:after{content: '\e613';} +.xm-select-parent dl dd.xm-dis-disabled div i {border-color: #C2C2C2;} +.xm-select-parent dl dd.xm-dis-disabled.xm-select-this div i {color: #C2C2C2;} +.xm-select-radio div.xm-form-checkbox > i {border-radius: 20px;} +.xm-select-parent dl.xm-select-radio dd.xm-select-this div i:after{content: '\e62b';} + +.xm-dis-disabled,.xm-dis-disabled:hover {cursor: not-allowed!important} +.xm-form-select dl dd.xm-dis-disabled {background-color: #fff!important} +.xm-form-select dl dd.xm-dis-disabled span {color: #C2C2C2} +.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes {border-color: #C2C2C2} +.xm-select-parent {position: relative;-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none} +.xm-select-parent .xm-select {line-height: normal;height: auto;padding: 4px 10px 1px 10px;overflow: hidden;min-height: 36px;left: 0;z-index: 99;position: absolute;background: 0 0;padding-right: 20px} +.xm-select-parent .xm-select:hover {border-color: #C0C4CC} +.xm-select-parent .xm-select .xm-select-label {display: inline-block;margin: 0;vertical-align: middle} +.xm-select-parent .xm-select-title div.xm-select-label>span {position: relative;padding: 2px 5px;background-color: #009688;border-radius: 2px;color: #FFF;display: inline-block;line-height: 18px;height: 18px;margin: 2px 5px 2px 0;cursor: initial;user-select: none;font-size: 14px;padding-right: 25px;-webkit-user-select: none;} +.xm-select-parent .xm-select-title div.xm-select-label>span i {position: absolute; margin-left: 8px; font-size: 12px; cursor: pointer; line-height: 20px;} +.xm-select-parent .xm-select .xm-select-input {border: none;height: 28px;background-color: transparent;padding: 0;vertical-align: middle;display: inline-block;width: 50px} +.xm-select-parent .xm-select--suffix input {border: none} +.xm-form-selected .xm-select,.xm-form-selected .xm-select:hover {border-color: #009688!important} +.xm-select--suffix+div {position: absolute;top: 0;left: 0;bottom: 0;right: 0} +.xm-select-dis .xm-select--suffix+div {z-index: 100;cursor: no-drop!important;opacity: .2;background-color: #FFF;} +.xm-select-disabled,.xm-select-disabled:hover {color: #d2d2d2!important;cursor: not-allowed!important;background-color: #fff} +.xm-select-none {display: none;margin: 5px 0;text-align: center;} +.xm-select-none:hover {background-color: #FFF!important} +.xm-select-empty {display: block} +.xm-span-hide {display: none!important;} +.layui-form-pane .xm-select,.layui-form-pane .xm-select:hover {border: none!important;top: 0px} +.layui-form-pane .xm-select-title {border: 1px solid #e6e6e6!important} +.xm-select-hide {display: none !important;} +div[xm-hg] .xm-select-label{white-space: nowrap; overflow: hidden; position: absolute; right: 30px; left: 0; padding-left: 10px;} + +/* 颜色相关 */ +div[xm-select-skin] .xm-select-title div.xm-select-label>span {border: 1px solid #009688} +div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover {opacity: .8;filter: alpha(opacity=80);cursor: pointer} +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span {background-color: #F0F2F5;color: #909399;border: 1px solid #F0F2F5} +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i {color: #C0C4CC} +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i:before {content: '\e60b'; font-size: 16px; margin-left: -3px;} +div[xm-select-skin=default] dl dd:not(.xm-dis-disabled) i {border-color: #5FB878} +div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #5FB878} +div[xm-select-skin=default].xm-form-selected .xm-select,div[xm-select-skin=default].xm-form-selected .xm-select:hover {border-color: #C0C4CC!important} +div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span {background-color: #009688;color: #FFF;border: 1px solid #009688} +div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i {background-color: #009688; color: #FFF} +div[xm-select-skin=primary] dl dd:not(.xm-dis-disabled) i {border-color: #009688} +div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #009688} +div[xm-select-skin=primary].xm-form-selected .xm-select,div[xm-select-skin=primary].xm-form-selected .xm-select:hover {border-color: #009688!important} +div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span {background-color: #1E9FFF;color: #FFF;border: 1px solid #1E9FFF} +div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i {background-color: #1E9FFF;color: #FFF} +div[xm-select-skin=normal] dl dd:not(.xm-dis-disabled) i {border-color: #1E9FFF} +div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #1E9FFF} +div[xm-select-skin=normal].xm-form-selected .xm-select,div[xm-select-skin=normal].xm-form-selected .xm-select:hover {border-color: #1E9FFF!important} +div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span {background-color: #FFB800;color: #FFF;border: 1px solid #FFB800} +div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i {background-color: #FFB800;color: #FFF} +div[xm-select-skin=warm] dl dd:not(.xm-dis-disabled) i {border-color: #FFB800} +div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #FFB800} +div[xm-select-skin=warm].xm-form-selected .xm-select,div[xm-select-skin=warm].xm-form-selected .xm-select:hover {border-color: #FFB800!important} +div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span {background-color: #FF5722;color: #FFF;border: 1px solid #FF5722} +div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i {background-color: #FF5722;color: #FFF} +div[xm-select-skin=danger] dl dd:not(.xm-dis-disabled) i {border-color: #FF5722} +div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #FF5722} +div[xm-select-skin=danger].xm-form-selected .xm-select,div[xm-select-skin=danger].xm-form-selected .xm-select:hover {border-color: #FF5722!important} + + +/* 多选联动 */ +.xm-select-parent .layui-form-danger+.xm-select-title .xm-select {border-color: #FF5722 !important;} +.xm-select-linkage li {padding: 10px 0px;cursor: pointer;} +.xm-select-linkage li span {padding-left: 20px;padding-right: 30px;display: inline-block;height: 20px;overflow: hidden;text-overflow: ellipsis;} +.xm-select-linkage li.xm-select-this span {border-left: 5px solid #009688;color: #009688;padding-left: 15px;} +.xm-select-linkage-group {position: absolute;left: 0;top: 0;right: 0;bottom: 0;overflow-x: hidden;overflow-y: auto;} +.xm-select-linkage-group li:hover {border-left: 1px solid #009688;} +.xm-select-linkage-group li:hover span {padding-left: 19px;} +.xm-select-linkage-group li.xm-select-this:hover span {padding-left: 15px;border-left-width: 4px;} +.xm-select-linkage-group:nth-child(4n+1){background-color: #EFEFEF; left: 0;} +.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active{background-color: #F5F5F5;} +.xm-select-linkage-group:nth-child(4n+2){background-color: #F5F5F5; left: 100px;} +.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FAFAFA;} +.xm-select-linkage-group:nth-child(4n+3){background-color: #FAFAFA; left: 200px;} +.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FFFFFF;} +.xm-select-linkage-group:nth-child(4n+4){background-color: #FFFFFF; left: 300px;} +.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active{background-color: #EFEFEF;} +.xm-select-linkage li{list-style: none;} +.xm-select-linkage-hide {display: none;} +.xm-select-linkage-show {display: block;} + +div[xm-select-skin='default'] .xm-select-linkage li.xm-select-this span {border-left-color: #5FB878;color: #5FB878;} +div[xm-select-skin='default'] .xm-select-linkage-group li:hover {border-left-color: #5FB878;} +div[xm-select-skin='primary'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;} +div[xm-select-skin='primary'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;} +div[xm-select-skin='normal'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;} +div[xm-select-skin='normal'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;} +div[xm-select-skin='warm'] .xm-select-linkage li.xm-select-this span {border-left-color: #FFB800;color: #FFB800;} +div[xm-select-skin='warm'] .xm-select-linkage-group li:hover {border-left-color: #FFB800;} +div[xm-select-skin='danger'] .xm-select-linkage li.xm-select-this span {border-left-color: #FF5722;color: #FF5722;} +div[xm-select-skin='danger'] .xm-select-linkage-group li:hover {border-left-color: #FF5722;} + + +/* 快捷操作 */ +.xm-select-tips[style]:hover{background-color: #FFF!important;} +.xm-select-parent dd > .xm-cz{position: absolute; top: 0px; right: 10px;} +.xm-select-parent dd > .xm-cz-group{margin-right: 30px; border-right: 2px solid #ddd; height: 16px; margin-top: 10px; line-height: 16px; overflow: hidden;} +.xm-select-parent dd > .xm-cz-group .xm-cz{display: inline-block; margin-right: 30px;} +.xm-select-parent dd > .xm-cz-group .xm-cz i{margin-right: 10px;} +.xm-select-parent dd > .xm-cz-group[show='name'] .xm-cz i{display: none;} +.xm-select-parent dd > .xm-cz-group[show='icon'] .xm-cz span{display: none;} +.xm-select-parent dd .xm-cz:hover{color: #009688;} +div[xm-select-skin='default'] dd .xm-cz:hover{color: #C0C4CC;} +div[xm-select-skin='primary'] dd .xm-cz:hover{color: #009688;} +div[xm-select-skin='normal'] dd .xm-cz:hover{color: #1E9FFF;} +div[xm-select-skin='warm'] dd .xm-cz:hover{color: #FFB800;} +div[xm-select-skin='danger'] dd .xm-cz:hover{color: #FF5722;} + + +/* 下拉里面的搜索 */ +.xm-select-tips .xm-input{border: none; border-bottom: 1px solid #E6E6E6; padding-left: 27px;} +.xm-select-tips .icon-sousuo{position: absolute;} +.xm-select-tips.xm-dl-input{display: none;} +div[xm-select-search-type="1"] .xm-select-tips.xm-dl-input{display: block;} +div[xm-select-search-type="1"] .xm-select .xm-select-input{display: none !important;} + +/* 阿里巴巴矢量图标库 */ +@font-face {font-family: "xm-iconfont"; + src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831'); /* IE9*/ + src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.ttf?t=1534240067831') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.svg?t=1534240067831#iconfont') format('svg'); /* iOS 4.1- */ +} +.xm-iconfont {font-family:"xm-iconfont" !important; font-size:16px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;} +.icon-quanxuan:before { content: "\e62c"; } +.icon-caidan:before { content: "\e610"; } +.icon-fanxuan:before { content: "\e837"; } +.icon-pifu:before { content: "\e668"; } +.icon-qingkong:before { content: "\e63e"; } +.icon-sousuo:before { content: "\e600"; } +.icon-danx:before { content: "\e62b"; } +.icon-duox:before { content: "\e613"; } +.icon-close:before { content: "\e601"; } +.icon-expand:before { content: "\e641"; } \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/laydate/default/laydate.css b/hera-admin/src/main/resources/static/plugins/layui/css/modules/laydate/default/laydate.css new file mode 100755 index 00000000..f7e690e5 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/css/modules/laydate/default/laydate.css @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/icon-ext.png b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/icon-ext.png new file mode 100755 index 00000000..bbbb669b Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/icon-ext.png differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/icon.png b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/icon.png new file mode 100755 index 00000000..3e17da8b Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/icon.png differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/layer.css b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/layer.css new file mode 100755 index 00000000..157d537f --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/layer.css @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-0.gif b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-0.gif new file mode 100755 index 00000000..6f3c9539 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-0.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-1.gif b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-1.gif new file mode 100755 index 00000000..db3a483e Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-1.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-2.gif b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-2.gif new file mode 100755 index 00000000..5bb90fd6 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/css/modules/layer/default/loading-2.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.eot b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.eot new file mode 100755 index 00000000..93b3d5ab Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.eot differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.svg b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.svg new file mode 100755 index 00000000..1c7ffe97 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.svg @@ -0,0 +1,473 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.ttf b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.ttf new file mode 100755 index 00000000..0c8b0a50 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.ttf differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.woff b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.woff new file mode 100755 index 00000000..786bb2a8 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/font/iconfont.woff differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/0.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/0.gif new file mode 100755 index 00000000..a63f0d52 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/0.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/1.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/1.gif new file mode 100755 index 00000000..b2b78b21 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/1.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/10.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/10.gif new file mode 100755 index 00000000..556c7e32 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/10.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/11.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/11.gif new file mode 100755 index 00000000..2bfc58be Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/11.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/12.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/12.gif new file mode 100755 index 00000000..1c321c7e Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/12.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/13.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/13.gif new file mode 100755 index 00000000..300bbc2a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/13.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/14.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/14.gif new file mode 100755 index 00000000..43b6d0a4 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/14.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/15.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/15.gif new file mode 100755 index 00000000..c9f25fa1 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/15.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/16.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/16.gif new file mode 100755 index 00000000..34f28e4c Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/16.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/17.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/17.gif new file mode 100755 index 00000000..39cd0353 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/17.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/18.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/18.gif new file mode 100755 index 00000000..7bce2997 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/18.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/19.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/19.gif new file mode 100755 index 00000000..adac542f Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/19.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/2.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/2.gif new file mode 100755 index 00000000..7edbb58a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/2.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/20.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/20.gif new file mode 100755 index 00000000..50631a6e Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/20.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/21.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/21.gif new file mode 100755 index 00000000..b9842128 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/21.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/22.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/22.gif new file mode 100755 index 00000000..1f0bd8b0 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/22.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/23.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/23.gif new file mode 100755 index 00000000..e05e0f97 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/23.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/24.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/24.gif new file mode 100755 index 00000000..f35928a2 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/24.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/25.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/25.gif new file mode 100755 index 00000000..0b4a8832 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/25.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/26.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/26.gif new file mode 100755 index 00000000..45c4fb55 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/26.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/27.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/27.gif new file mode 100755 index 00000000..7a4c0131 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/27.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/28.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/28.gif new file mode 100755 index 00000000..fc5a0cfa Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/28.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/29.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/29.gif new file mode 100755 index 00000000..5dd7442b Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/29.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/3.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/3.gif new file mode 100755 index 00000000..86df67b7 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/3.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/30.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/30.gif new file mode 100755 index 00000000..b751f98a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/30.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/31.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/31.gif new file mode 100755 index 00000000..c9476d79 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/31.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/32.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/32.gif new file mode 100755 index 00000000..9931b063 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/32.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/33.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/33.gif new file mode 100755 index 00000000..59111a38 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/33.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/34.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/34.gif new file mode 100755 index 00000000..a334548e Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/34.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/35.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/35.gif new file mode 100755 index 00000000..a9322643 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/35.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/36.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/36.gif new file mode 100755 index 00000000..6de432ae Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/36.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/37.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/37.gif new file mode 100755 index 00000000..d05f2da4 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/37.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/38.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/38.gif new file mode 100755 index 00000000..8b1c88a3 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/38.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/39.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/39.gif new file mode 100755 index 00000000..38b84a51 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/39.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/4.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/4.gif new file mode 100755 index 00000000..d52200c5 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/4.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/40.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/40.gif new file mode 100755 index 00000000..ae429912 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/40.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/41.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/41.gif new file mode 100755 index 00000000..b9c715c5 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/41.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/42.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/42.gif new file mode 100755 index 00000000..0eb1434b Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/42.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/43.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/43.gif new file mode 100755 index 00000000..ac0b7008 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/43.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/44.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/44.gif new file mode 100755 index 00000000..ad444976 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/44.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/45.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/45.gif new file mode 100755 index 00000000..6837fcaf Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/45.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/46.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/46.gif new file mode 100755 index 00000000..d62916d4 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/46.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/47.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/47.gif new file mode 100755 index 00000000..58a08361 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/47.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/48.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/48.gif new file mode 100755 index 00000000..7ffd1613 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/48.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/49.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/49.gif new file mode 100755 index 00000000..959b9929 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/49.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/5.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/5.gif new file mode 100755 index 00000000..4e8b09f1 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/5.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/50.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/50.gif new file mode 100755 index 00000000..6e22e7ff Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/50.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/51.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/51.gif new file mode 100755 index 00000000..ad3f4d3a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/51.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/52.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/52.gif new file mode 100755 index 00000000..39f8a228 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/52.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/53.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/53.gif new file mode 100755 index 00000000..a181ee77 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/53.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/54.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/54.gif new file mode 100755 index 00000000..e289d929 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/54.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/55.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/55.gif new file mode 100755 index 00000000..4351083a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/55.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/56.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/56.gif new file mode 100755 index 00000000..e0eff222 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/56.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/57.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/57.gif new file mode 100755 index 00000000..0bf130f0 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/57.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/58.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/58.gif new file mode 100755 index 00000000..0f065087 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/58.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/59.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/59.gif new file mode 100755 index 00000000..7081e4f0 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/59.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/6.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/6.gif new file mode 100755 index 00000000..f7715bf5 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/6.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/60.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/60.gif new file mode 100755 index 00000000..6e15f89d Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/60.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/61.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/61.gif new file mode 100755 index 00000000..f092d7e3 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/61.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/62.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/62.gif new file mode 100755 index 00000000..7fe49840 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/62.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/63.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/63.gif new file mode 100755 index 00000000..cf8e23e5 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/63.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/64.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/64.gif new file mode 100755 index 00000000..a7797198 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/64.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/65.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/65.gif new file mode 100755 index 00000000..7bb98f2d Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/65.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/66.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/66.gif new file mode 100755 index 00000000..bb6d0775 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/66.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/67.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/67.gif new file mode 100755 index 00000000..6e33f7c4 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/67.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/68.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/68.gif new file mode 100755 index 00000000..1a6c400d Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/68.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/69.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/69.gif new file mode 100755 index 00000000..a02f0b22 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/69.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/7.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/7.gif new file mode 100755 index 00000000..e6d4db80 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/7.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/70.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/70.gif new file mode 100755 index 00000000..416c5c14 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/70.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/71.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/71.gif new file mode 100755 index 00000000..c17d60cb Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/71.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/8.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/8.gif new file mode 100755 index 00000000..66f967b4 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/8.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/images/face/9.gif b/hera-admin/src/main/resources/static/plugins/layui/images/face/9.gif new file mode 100755 index 00000000..60447400 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/layui/images/face/9.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/carousel.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/carousel.js new file mode 100755 index 00000000..2be2c8ca --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/carousel.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
            ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
          "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
          1. '+o.replace(/[\r\t\n]+/g,"
          2. ")+"
          "),c.find(">.layui-code-h3")[0]||c.prepend('

          '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

          ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/colorpicker.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/colorpicker.js new file mode 100755 index 00000000..fd99bf88 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/colorpicker.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['
          ',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
          "].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['
          ','
          ','
          ','
          ','
          ','
          ',"
          ",'
          ','
          ',"
          ","
          ",'
          ','
          ','
          ',"
          ","
          ",function(){if(o.predefine){var e=['
          '];return layui.each(o.colors,function(i,o){e.push(['
          ','
          ',"
          "].join(""))}),e.push("
          "),e.join("")}return""}(),'
          ','
          ','',"
          ",'
          ','','',"","
          "].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:fa()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['
          t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/element.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/element.js new file mode 100755 index 00000000..ac628df9 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/element.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
        5. "+(i.title||"unnaming")+"
        6. ";return s[0]?s.before(r):n.append(r),o.append('
          '+(i.content||"")+"
          "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/flow.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/flow.js new file mode 100755 index 00000000..8a80c05d --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/flow.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/form.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/form.js new file mode 100755 index 00000000..daa8ce5b --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/form.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=t(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value===t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e)},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),x=i.find("dl"),g=x.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=x.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),g.removeClass(o),y=null,g.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),$()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||T(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},$=function(){var e=x.children("dd."+s);if(e[0]){var t=e.position().top,i=x.height(),a=e.height();t>i&&x.scrollTop(t+x.scrollTop()-i+a-5),t<0&&x.scrollTop(t+x.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),x.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=x.children("dd."+s);if(x.children("dd."+o)[0]&&"next"===t){var i=x.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项

          '):x.find("."+r).remove()},"keyup"),""===t&&x.find("."+r).remove(),void $())};f&&k.on("keyup",j).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){T(k.val(),function(e){d||k.val("")},"blur")},200)}),g.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
          ','
          ','','
          ','
          ',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("
          "+a.label+"
          "):t.push('
          '+a.innerHTML+"
          "):t.push('
          '+(a.innerHTML||i)+"
          ")}),0===t.length&&t.push('
          没有选项
          '),t.join("")}(r.find("*"))+"
          ","
          "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
          ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
          "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['
          ',''+i[l.checked?0:1]+"","
          "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
          ","
          "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=t(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=t(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,t){var c,f="",v="function"==typeof a[t];if(a[t]){var c=v?f=a[t](d,l):!a[t][0].test(d);if(f=f||a[t][1],c)return"tips"===u?i.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];p[i]=0|p[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+p[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(c[t.name]=t.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/formSelects-v4.min.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/formSelects-v4.min.js new file mode 100755 index 00000000..1e7cdae9 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/formSelects-v4.min.js @@ -0,0 +1 @@ +"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function _defineProperty(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}(function(e,t,n){if((typeof exports==="undefined"?"undefined":_typeof(exports))==="object"){module.exports=n()}else if(typeof define==="function"&&define.amd){define(n)}else if(t.layui&&e.define){e.define(["jquery"],function(e){e("formSelects",n())})}else{t.formSelects=n()}})(typeof layui=="undefined"?null:layui,window,function(){var t="4.0.0.0910",v="xm-select",m="xm-select-parent",y="xm-select-input",g="xm-select--suffix",w="xm-select-this",x="xm-select-label",k="xm-select-search",b="xm-select-search-type",C="xm-select-show-count",S="xm-select-create",d="xm-select-create-long",T="xm-select-max",L="xm-select-skin",j="xm-select-direction",A="xm-select-height",E="xm-dis-disabled",N="xm-select-dis",p="xm-select-temp",D="xm-select-radio",H="xm-select-linkage",F="xm-select-dl",h="xm-select-hide",_="xm-hide-input",O="xm-select-sj",e="xm-icon-close",I="xm-select-title",P="xm-form-select",f="xm-form-selected",V="xm-select-none",U="xm-select-empty",M="xm-input",W="xm-dl-input",J="xm-select-tips",s="xm-iconfont",B="XM_PID_VALUE",R="xm-cz",l="xm-cz-group",n="请选择",q={},z={on:{},endOn:{},filter:{},maxTips:{},opened:{},closed:{}},X={type:"get",header:{},first:true,data:{},searchUrl:"",searchName:"keyword",searchVal:null,keyName:"name",keyVal:"value",keySel:"selected",keyDis:"disabled",keyChildren:"children",dataType:"",delay:500,beforeSuccess:null,success:null,error:null,beforeSearch:null,response:{statusCode:0,statusName:"code",msgName:"msg",dataName:"data"},tree:{nextClick:function e(t,n,i){i([])},folderChoose:true,lazy:true}},i=[{icon:"xm-iconfont icon-quanxuan",name:"全选",click:function e(t,n){n.selectAll(t,true,true)}},{icon:"xm-iconfont icon-qingkong",name:"清空",click:function e(t,n){n.removeAll(t,true,true)}},{icon:"xm-iconfont icon-fanxuan",name:"反选",click:function e(t,n){n.reverse(t,true,true)}},{icon:"xm-iconfont icon-pifu",name:"换肤",click:function e(t,n){n.skin(t)}}],Q=window.$||window.layui&&window.layui.jquery,c=Q(window),Y={},a={},r={},$=function e(t){var l=this;this.config={name:null,max:null,maxTips:function e(t,n,i,a){var r=Q('[xid="'+l.config.name+'"]').prev().find("."+v);if(r.parents(".layui-form-item[pane]").length){r=r.parents(".layui-form-item[pane]")}r.attr("style","border-color: red !important");setTimeout(function(){r.removeAttr("style")},300)},init:null,on:null,opened:null,closed:null,filter:function e(t,n,i,a){return i.name.indexOf(n)==-1},clearid:-1,direction:"auto",height:null,isEmpty:false,btns:[i[0],i[1],i[2]],searchType:0,create:function e(t,n){return Date.now()},template:function e(t,n){return n.name},showCount:0,isCreate:false,placeholder:n,clearInput:false};this.select=null;this.values=[];Q.extend(this.config,t,{searchUrl:t.isSearch?t.searchUrl:null,placeholder:t.optionsFirst?t.optionsFirst.value?n:t.optionsFirst.innerHTML||n:n,btns:t.radio?[i[1]]:[i[0],i[1],i[2]]},r[t.name]||a);if(isNaN(this.config.showCount)||this.config.showCount<=0){this.config.showCount=19921012}};var o=function e(){this.appender();this.on();this.onreset()};o.prototype.appender=function(){if(!Array.prototype.map){Array.prototype.map=function(e,t){var n,i,a,r=Object(this),l=r.length>>>0;if(t){n=t}i=new Array(l);a=0;while(a>>0;if(typeof t!=="function"){throw new TypeError(t+" is not a function")}if(arguments.length>1){i=n}a=0;while(a>>0;if(typeof e!=="function"){throw new TypeError}var i=[];var a=arguments[1];for(var r=0;r','',"
          "];var u=Q('
          \n\t\t\t\t\t\n\t\t\t\t\t
          \n\t\t\t\t\t\t
          \n\t\t\t\t\t\t\t"+f.join("")+'\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
          \n\t\t\t\t\t\t
          \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
          \n\t\t\t\t\t\t
          \n\t\t\t\t\t
          \n\t\t\t\t\t
          '+d+"
          \n\t\t\t\t
          ");var p=Q('
          ');p.append(u);n.after(p);n.attr("lay-ignore","");n.removeAttr("name")&&n.attr("_name",s.config.formname);n.removeAttr("lay-verify")&&n.attr("_lay-verify",s.config.layverify);if(s.config.isSearch){Y[i]=Q.extend({},X,{searchUrl:s.config.searchUrl},Y[i]);Q(document).on("input","div."+m+'[FS_ID="'+i+'"] .'+y,function(e){h.search(i,e,s.config.searchUrl)});if(s.config.searchUrl){h.triggerSearch(u,true)}}else{u.find("dl dd."+W).css("display","none")}})};o.prototype.search=function(a,e,t,n){var r=this;var i=void 0;if(n){i=n}else{i=e.target;var l=e.keyCode;if(l===9||l===13||l===37||l===38||l===39||l===40){return false}}var o=Q.trim(i.value);this.changePlaceHolder(Q(i));var s=Y[a]?Y[a]:X;t=s.searchUrl||t;var d=q[a],c=d.config.isCreate,f=Q('dl[xid="'+a+'"]').parents("."+P);if(t){if(s.searchVal){o=s.searchVal;s.searchVal=""}if(!s.beforeSearch||s.beforeSearch&&s.beforeSearch instanceof Function&&s.beforeSearch(a,t,o)){var u=s.delay;if(s.first){s.first=false;u=10}clearTimeout(d.clearid);d.clearid=setTimeout(function(){f.find("dl > *:not(."+J+")").remove();f.find("dd."+V).addClass(U).text("请求中");r.ajax(a,t,o,false,null,true)},u)}}else{f.find("dl ."+h).removeClass(h);f.find("dl dd:not(."+J+")").each(function(e,t){var n=Q(t);var i=z.filter[a]||q[a].config.filter;if(i&&i(a,o,r.getItem(a,n),n.hasClass(E))==true){n.addClass(h)}});f.find("dl dt").each(function(e,t){if(!Q(t).nextUntil("dt",":not(."+h+")").length){Q(t).addClass(h)}});this.create(a,c,o);var p=f.find("dl dd:not(."+J+"):not(."+h+")");if(!p.length){f.find("dd."+V).addClass(U).text("无匹配项")}else{f.find("dd."+V).removeClass(U)}}};o.prototype.isArray=function(e){return Object.prototype.toString.call(e)=="[object Array]"};o.prototype.triggerSearch=function(e,i){var a=this;(e?[e]:Q("."+P).toArray()).forEach(function(e,t){e=Q(e);var n=e.find("dl").attr("xid");if(n&&q[n]&&q[n].config.isEmpty||i){a.search(n,null,null,q[n].config.searchType==0?e.find("."+x+" ."+y):e.find("dl ."+W+" ."+y))}})};o.prototype.clearInput=function(e){var t=Q("."+m+'[fs_id="'+e+'"]');var n=q[e].config.searchType==0?t.find("."+x+" ."+y):t.find("dl ."+W+" ."+y);n.val("")};o.prototype.ajax=function(i,a,r,l,o,s,d,c){var f=this;var u=Q("."+m+' dl[xid="'+i+'"]').parents("."+P);if(!u[0]||!a){return}var p=Y[i]?Y[i]:X;var e=Q.extend(true,{},p.data);e[p.searchName]=r;Q.ajax({type:p.type,headers:p.header,url:a,data:p.dataType=="json"?JSON.stringify(e):e,success:function e(t){if(typeof t=="string"){t=JSON.parse(t)}p.beforeSuccess&&p.beforeSuccess instanceof Function&&(t=p.beforeSuccess(i,a,r,t));if(f.isArray(t)){var n={};n[p.response.statusName]=p.response.statusCode;n[p.response.msgName]="";n[p.response.dataName]=t;t=n}if(t[p.response.statusName]!=p.response.statusCode){u.find("dd."+V).addClass(U).text(t[p.response.msgName])}else{u.find("dd."+V).removeClass(U);f.renderData(i,t[p.response.dataName],l,o,s,c);q[i].config.isEmpty=t[p.response.dataName].length==0}d&&d(i);p.success&&p.success instanceof Function&&p.success(i,a,r,t)},error:function e(t){u.find("dd[lay-value]:not(."+J+")").remove();u.find("dd."+V).addClass(U).text("服务异常");p.error&&p.error instanceof Function&&p.error(i,a,r,t)}})};o.prototype.renderData=function(n,e,t,i,a,r){var l=this;if(t){this.renderLinkage(n,e,i);return}if(r){this.renderReplace(n,e);return}var o=Q("."+m+' dl[xid="'+n+'"]').parents("."+P);var s=Y[n]?Y[n]:X;var d=o.find("."+g+" input");e=this.exchangeData(n,e);var c=[];o.find("dl").html(this.renderSelect(n,d.attr("placeholder")||d.attr("back"),e.map(function(e){var t=Q.extend({},e,{innerHTML:e[s.keyName],value:e[s.keyVal],sel:e[s.keySel],disabled:e[s.keyDis],type:e.type,name:e[s.keyName]});if(t.sel){c.push(t)}return t})));var f=o.find("."+x);var u=o.find("dl[xid]");if(a){var p=q[n].values;p.forEach(function(e,t){u.find('dd[lay-value="'+e.value+'"]').addClass(w)});c.forEach(function(e,t){if(l.indexOf(p,e)==-1){l.addLabel(n,f,e);u.find('dd[lay-value="'+e.value+'"]').addClass(w);p.push(e)}})}else{c.forEach(function(e,t){l.addLabel(n,f,e);u.find('dd[lay-value="'+e.value+'"]').addClass(w)});q[n].values=c}this.commonHandler(n,f)};o.prototype.renderLinkage=function(l,e,n){var i=[],a=0,o={0:e},s=Y[l]?Y[l]:X;G[l]={};var t=function e(){var r=i[a++]=[],t=o;o={};Q.each(t,function(a,e){Q.each(e,function(e,t){var n={pid:a,name:t[s.keyName],value:t[s.keyVal]};G[l][n.value]=Q.extend(t,n);r.push(n);var i=t[s.keyChildren];if(i&&i.length){o[n.value]=i}})})};do{t()}while(Object.getOwnPropertyNames(o).length);var r=Q("."+m+' dl[xid="'+l+'"]').parents("."+P);var d=['
          '];Q.each(i,function(e,t){var i=['
          '];Q.each(t,function(e,t){var n='
        7. '+t.name+"
        8. ";i.push(n)});i.push("
          ");d=d.concat(i)});d.push('
          ');d.push("
          ");r.find("dl").html(d.join(""));r.find("."+y).css("display","none")};o.prototype.renderReplace=function(n,e){var i=this;var t=Q("."+m+' dl[xid="'+n+'"]');var a=Y[n]?Y[n]:X;e=this.exchangeData(n,e);G[n]=e;var r=e.map(function(e){var t=Q.extend({},e,{innerHTML:e[a.keyName],value:e[a.keyVal],sel:e[a.keySel],disabled:e[a.keyDis],type:e.type,name:e[a.keyName]});return i.createDD(n,t)}).join("");t.find("dd:not(."+J+"),dt:not([style])").remove();t.find("dt[style]").after(Q(r))};o.prototype.exchangeData=function(e,t){var n=Y[e]?Y[e]:X;var i=n["keyChildren"];var a=n["keyDis"];G[e]={};var r=this.getChildrenList(t,i,a,[],false);return r};o.prototype.getChildrenList=function(e,t,n,i,a){var r=[],l=0;for(var o=0;o\n\t\t\t\t\t
          \n\t\t\t\t\t\t\n\t\t\t\t\t\t'+r+"\n\t\t\t\t\t
          \n\t\t\t\t"};o.prototype.createQuickBtn=function(e,t){return'
          '+e.name+"
          "};o.prototype.renderBtns=function(e,t,n){var i=this;var a=[];var r=Q('dl[xid="'+e+'"]');a.push('
          ');Q.each(q[e].config.btns,function(e,t){a.push(i.createQuickBtn(t,n))});a.push("
          ");a.push(this.createQuickBtn({icon:"xm-iconfont icon-caidan",name:""}));return a.join("")};o.prototype.renderSelect=function(n,e,t){var i=this;G[n]={};var a=[];if(q[n].config.btns.length){setTimeout(function(){var e=Q('dl[xid="'+n+'"]');e.parents("."+P).attr(b,q[n].config.searchType);e.find("."+l).css("max-width",e.prev().width()-54+"px")},10);a.push(['
          ',this.renderBtns(n,null,"30px"),"
          ",'
          ','','',"
          "].join(""))}else{a.push('
          '+e+"
          ")}if(this.isArray(t)){Q(t).each(function(e,t){if(t){if(t.type&&t.type==="optgroup"){a.push("
          "+t.name+"
          ")}else{a.push(i.createDD(n,t))}}})}else{Q(t).find("*").each(function(e,t){if(t.tagName.toLowerCase()=="option"&&e==0&&!t.value){return}if(t.tagName.toLowerCase()==="optgroup"){a.push("
          "+t.label+"
          ")}else{a.push(i.createDD(n,t))}})}a.push('
          ');a.push('
          没有选项
          ');return a.join("")};o.prototype.on=function(){var n=this;this.one();Q(document).on("click",function(e){if(!Q(e.target).parents("."+I)[0]){Q("."+m+" dl ."+h).removeClass(h);Q("."+m+" dl dd."+U).removeClass(U);Q("."+m+" dl dd."+p).remove();Q.each(q,function(e,t){n.clearInput(e);if(!t.values.length){n.changePlaceHolder(Q('div[FS_ID="'+e+'"] .'+x))}})}Q("."+m+" ."+f).each(function(e,t){n.changeShow(Q(t).find("."+I),false)})})};o.prototype.calcLabelLeft=function(e,t,n){var i=this.getPosition(e[0]);i.y=i.x+e[0].clientWidth;var a=e[0].offsetLeft;if(!e.find("span").length){a=0}else if(n){var r=e.find("span:last");r.css("display")=="none"?r=r.prev()[0]:r=r[0];var l=this.getPosition(r);l.y=l.x+r.clientWidth;if(l.y>i.y){a=a-(l.y-i.y)-5}else{a=0}}else{if(t<0){var o=e.find(":last");o.css("display")=="none"?o=o.prev()[0]:o=o[0];var s=this.getPosition(o);s.y=s.x+o.clientWidth;if(s.y>i.y){a-=10}}else{if(a<0){a+=10}if(a>0){a=0}}}e.css("left",a+"px")};o.prototype.one=function(e){var C=this;Q(e?e:document).off("click","."+I).on("click","."+I,function(e){var t=Q(e.target),n=t.is(I)?t:t.parents("."+I),i=n.next(),a=i.attr("xid");Q("dl[xid]").not(i).each(function(e,t){C.clearInput(Q(t).attr("xid"))});Q("dl[xid]").not(i).find("dd."+h).removeClass(h);if(n.hasClass(N)){return false}if(t.is("."+O)||t.is("."+y+"[readonly]")){C.changeShow(n,!n.parents("."+P).hasClass(f));return false}if(n.find("."+y+":not(readonly)")[0]){var r=n.find("."+y),l={x:e.pageX,y:e.pageY},o=C.getPosition(n[0]),s=n.width();while(l.x>o.x){if(Q(document.elementFromPoint(l.x,l.y)).is(r)){r.focus();C.changeShow(n,true);return false}l.x-=50}}if(t.is("."+y)){C.changeShow(n,true);return false}if(t.is('i[fsw="'+v+'"]')){var d=C.getItem(a,t),c=i.find("dd[lay-value='"+d.value+"']");if(c.hasClass(E)){return false}C.handlerLabel(a,c,false,d);return false}C.changeShow(n,!n.parents("."+P).hasClass(f));return false});Q(e?e:document).off("click","dl."+F).on("click","dl."+F,function(e){var t=Q(e.target);if(t.is("."+H)||t.parents("."+H)[0]){t=t.is("li")?t:t.parents("li[xm-value]");var n=t.parents(".xm-select-linkage-group"),i=t.parents("dl").attr("xid");if(!i){return false}n.find(".xm-select-active").removeClass("xm-select-active");t.addClass("xm-select-active");n.nextAll(".xm-select-linkage-group").addClass("xm-select-linkage-hide");var a=n.next(".xm-select-linkage-group");a.find("li").addClass("xm-select-linkage-hide");a.find('li[pid="'+t.attr("xm-value")+'"]').removeClass("xm-select-linkage-hide");if(!a[0]||a.find("li:not(.xm-select-linkage-hide)").length==0){var r=[],l=0,o=!t.hasClass("xm-select-this");if(q[i].config.radio){t.parents(".xm-select-linkage").find(".xm-select-this").removeClass("xm-select-this")}do{r[l++]={name:t.find("span").text(),value:t.attr("xm-value")};t=t.parents(".xm-select-linkage-group").prev().find('li[xm-value="'+t.attr("pid")+'"]')}while(t.length);r.reverse();var s={name:r.map(function(e){return e.name}).join("/"),value:r.map(function(e){return e.value}).join("/")};C.handlerLabel(i,null,o,s)}else{a.removeClass("xm-select-linkage-hide")}return false}if(t.is("dl")){return false}if(t.is("dt")){t.nextUntil("dt").each(function(e,t){t=Q(t);if(t.hasClass(E)||t.hasClass(w)){}else{t.find("i:not(.icon-expand)").click()}});return false}var d=t.is("dd")?t:t.parents("dd");var c=d.parent("dl").attr("xid");if(d.hasClass(E)){return false}if(t.is("i.icon-caidan")){var f=[],u=[];t.parents("dl").find('dd[tree-folder="true"]').each(function(e,t){Q(t).attr("xm-tree-hidn")==undefined?f.push(t):u.push(t)});var p=u.length?u:f;p.forEach(function(e){return e.click()});return false}var h=d.attr("tree-id");if(h){if(t.is("i:not(.icon-expand)")){C.handlerLabel(c,d,!d.hasClass(w));return false}var v=Y[c]||X;var m=v.tree;var y=d.nextAll('dd[tree-id^="'+h+'"]');if(y&&y.length){var g=y[0].clientHeight;g?(C.addTreeHeight(d,g),g=0):(g=d.attr("xm-tree-hidn")||36,d.removeAttr("xm-tree-hidn"),d.find(">i").remove(),y=y.filter(function(e,t){return Q(t).attr("tree-id").split("-").length-1==h.split("-").length}));y.animate({height:g},150);return false}else{if(m.nextClick&&m.nextClick instanceof Function){m.nextClick(c,C.getItem(c,d),function(e){if(!e||!e.length){C.handlerLabel(c,d,!d.hasClass(w))}else{d.attr("tree-folder","true");var n=[];e.forEach(function(e,t){e.innerHTML=e[v.keyName];e[B]=JSON.stringify(h.split("-").concat([t]));n.push(C.createDD(c,e));G[c][e[v.keyVal]]=e});d.after(n.join(""))}});return false}}}if(d.hasClass(J)){var x=t.is("."+R)?t:t.parents("."+R);if(!x[0]){return false}var k=x.attr("method");var b=q[c].config.btns.filter(function(e){return e.name==k})[0];b&&b.click&&b.click instanceof Function&&b.click(c,C);return false}C.handlerLabel(c,d,!d.hasClass(w));return false})};o.prototype.addTreeHeight=function(e,i){var a=this;var t=e.attr("tree-id");var n=e.nextAll('dd[tree-id^="'+t+'"]');if(n.length){e.append('');e.attr("xm-tree-hidn",i);n.each(function(e,t){var n=Q(t);a.addTreeHeight(n,i)})}};var G={};o.prototype.getItem=function(e,t){if(t instanceof Q){if(t.is('i[fsw="'+v+'"]')){var n=t.parent();return G[e][t]||{name:n.find("font").text(),value:n.attr("value")}}var i=t.attr("lay-value");return!G[e][i]?G[e][i]={name:t.find("span[name]").attr("name"),value:i}:G[e][i]}else if(typeof t=="string"&&t.indexOf("/")!=-1){return G[e][t]||{name:this.valToName(e,t),value:t}}return G[e][t]};o.prototype.linkageAdd=function(e,t){var n=Q('dl[xid="'+e+'"]');n.find(".xm-select-active").removeClass("xm-select-active");var i=t.value.split("/");var a=void 0,r=void 0,l=0;var o=[];do{a=i[l];r=n.find(".xm-select-linkage-group"+(l+1)+' li[xm-value="'+a+'"]');r[0]&&o.push(r);l++}while(r.length&&a!=undefined);if(o.length==i.length){Q.each(o,function(e,t){t.addClass("xm-select-this")})}};o.prototype.linkageDel=function(e,t){var n=Q('dl[xid="'+e+'"]');var i=t.value.split("/");var a=void 0,r=void 0,l=i.length-1;do{a=i[l];r=n.find(".xm-select-linkage-group"+(l+1)+' li[xm-value="'+a+'"]');if(!r.parent().next().find("li[pid="+a+"].xm-select-this").length){r.removeClass("xm-select-this")}l--}while(r.length&&a!=undefined)};o.prototype.valToName=function(e,t){var i=Q('dl[xid="'+e+'"]');var n=(t+"").split("/");if(!n.length){return null}var a=[];Q.each(n,function(e,t){var n=i.find(".xm-select-linkage-group"+(e+1)+' li[xm-value="'+t+'"] span').text();a.push(n)});return a.length==n.length?a.join("/"):null};o.prototype.commonHandler=function(e,t){if(!t||!t[0]){return}this.checkHideSpan(e,t);this.changePlaceHolder(t);this.retop(t.parents("."+P));this.calcLabelLeft(t,0,true);this.setHidnVal(e,t);t.parents("."+I+" ."+v).attr("title",q[e].values.map(function(e){return e.name}).join(","))};o.prototype.initVal=function(e){var o=this;var t={};if(e){t[e]=q[e]}else{t=q}Q.each(t,function(n,e){var t=e.values,i=Q('dl[xid="'+n+'"]').parent(),a=i.find("."+x),r=i.find("dl");r.find("dd."+w).removeClass(w);var l=t.concat([]);l.concat([]).forEach(function(e,t){o.addLabel(n,a,e);r.find('dd[lay-value="'+e.value+'"]').addClass(w)});if(e.config.radio){l.length&&t.push(l[l.length-1])}o.commonHandler(n,a)})};o.prototype.setHidnVal=function(e,t){if(!t||!t[0]){return}t.parents("."+m).find("."+_).val(q[e].values.map(function(e){return e.value}).join(","))};o.prototype.handlerLabel=function(e,t,n,i,a){var r=Q('[xid="'+e+'"]').prev().find("."+x),l=t&&this.getItem(e,t),o=q[e].values,s=q[e].config.on||z.on[e],d=q[e].config.endOn||z.endOn[e];if(i){l=i}var c=q[e];if(n&&c.config.max&&c.values.length>=c.config.max){var f=z.maxTips[e]||q[e].config.maxTips;f&&f(e,o.concat([]),l,c.config.max);return}if(!a){if(s&&s instanceof Function&&s(e,o.concat([]),l,n,t&&t.hasClass(E))==false){return}}var u=Q('dl[xid="'+e+'"]');n?(t&&t[0]?(t.addClass(w),t.removeClass(p)):u.find(".xm-select-linkage")[0]&&this.linkageAdd(e,l),this.addLabel(e,r,l),o.push(l)):(t&&t[0]?t.removeClass(w):u.find(".xm-select-linkage")[0]&&this.linkageDel(e,l),this.delLabel(e,r,l),this.remove(o,l));if(!r[0])return;if(c.config.radio){this.changeShow(r,false)}r.parents("."+I).prev().removeClass("layui-form-danger");c.config.clearInput&&this.clearInput(e);this.commonHandler(e,r);!a&&d&&d instanceof Function&&d(e,o.concat([]),l,n,t&&t.hasClass(E))};o.prototype.addLabel=function(e,t,n){if(!n)return;var i='fsw="'+v+'"';var a=[Q(""+n.name+""),Q("')],r=a[0],l=a[1];r.append(l);var o=q[e];if(o.config.radio){o.values.length=0;Q('dl[xid="'+e+'"]').find("dd."+w+':not([lay-value="'+n.value+'"])').removeClass(w);t.find("span").remove()}t.find("input").css("width","50px");t.find("input").before(r)};o.prototype.delLabel=function(e,t,n){if(!n)return;t.find('span[value="'+n.value+'"]:first').remove()};o.prototype.checkHideSpan=function(e,t){var n=t.parents("."+v)[0].offsetHeight+5;t.find("span.xm-span-hide").removeClass("xm-span-hide");t.find("span[style]").remove();var i=q[e].config.showCount;t.find("span").each(function(e,t){if(e>=i){Q(t).addClass("xm-span-hide")}});var a=t.find("span:eq("+i+")");a[0]&&a.before(Q(' + '+(t.find("span").length-i)+""))};o.prototype.retop=function(e){var t=e.find("dl"),n=e.offset().top+e.outerHeight()+5-c.scrollTop(),i=t.outerHeight();var a=e.hasClass("layui-form-selectup")||t.css("top").indexOf("-")!=-1||n+i>c.height()&&n>=i;e=e.find("."+v);var r=q[t.attr("xid")];var l=t.parents(".layui-form-pane")[0]&&t.prev()[0].clientHeight>38?14:10;if(r&&r.config.direction=="up"||a){a=true;if(r&&r.config.direction=="down"){a=false}}var o=e[0].offsetTop+e.height()+l;if(a){t.css({top:"auto",bottom:o+3+"px"})}else{t.css({top:o+"px",bottom:"auto"})}};o.prototype.changeShow=function(e,t){Q(".layui-form-selected").removeClass("layui-form-selected");var n=e.parents("."+P),i=n.hasClass(f),a=n.find("dl").attr("xid");Q("."+m+" ."+P).not(n).removeClass(f);if(t){this.retop(n);n.addClass(f);n.find("."+y).focus();if(!n.find("dl dd[lay-value]:not(."+J+")").length){n.find("dl ."+V).addClass(U)}}else{n.removeClass(f);this.clearInput(a);n.find("dl ."+U).removeClass(U);n.find("dl dd."+h).removeClass(h);n.find("dl dd."+p).remove();if(a&&q[a]&&q[a].config.isEmpty){this.triggerSearch(n)}this.changePlaceHolder(n.find("."+x))}if(t!=i){var r=q[a].config.opened||z.opened[a];t&&r&&r instanceof Function&&r(a);var l=q[a].config.closed||z.closed[a];!t&&l&&l instanceof Function&&l(a)}};o.prototype.changePlaceHolder=function(e){var t=e.parents("."+I);t[0]||(t=e.parents("dl").prev());if(!t[0]){return}var n=e.parents("."+m).find("dl[xid]").attr("xid");if(q[n]&&q[n].config.height){}else{var i=t.find("."+v)[0].clientHeight;t.css("height",(i>36?i+4:i)+"px");var a=t.parents("."+m).parent().prev();if(a.is(".layui-form-label")&&t.parents(".layui-form-pane")[0]){i=i>36?i+4:i;t.css("height",i+"px");a.css({height:i+2+"px",lineHeight:i-18+"px"})}}var r=t.find("."+g+" input"),l=!e.find("span:last")[0]&&!t.find("."+y).val();if(l){var o=r.attr("back");r.removeAttr("back");r.attr("placeholder",o)}else{var s=r.attr("placeholder");r.removeAttr("placeholder");r.attr("back",s)}};o.prototype.indexOf=function(e,t){for(var n=0;n-1){e.splice(n,1);return true}return false};o.prototype.selectAll=function(i,a,e){var r=this;var l=Q('[xid="'+i+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){return}l.find("dd[lay-value]:not(."+J+"):not(."+w+")"+(e?":not(."+E+")":"")).each(function(e,t){t=Q(t);var n=r.getItem(i,t);r.handlerLabel(i,l.find('dd[lay-value="'+n.value+'"]'),true,n,!a)})};o.prototype.removeAll=function(n,i,a){var r=this;var l=Q('[xid="'+n+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){q[n].values.concat([]).forEach(function(e,t){var n=e.value.split("/");var i=void 0,a=void 0,r=0;do{i=n[r++];a=l.find(".xm-select-linkage-group"+r+':not(.xm-select-linkage-hide) li[xm-value="'+i+'"]');a.click()}while(a.length&&i!=undefined)});return}q[n].values.concat([]).forEach(function(e,t){if(a&&l.find('dd[lay-value="'+e.value+'"]').hasClass(E)){}else{r.handlerLabel(n,l.find('dd[lay-value="'+e.value+'"]'),false,e,!i)}})};o.prototype.reverse=function(i,a,e){var r=this;var l=Q('[xid="'+i+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){return}l.find("dd[lay-value]:not(."+J+")"+(e?":not(."+E+")":"")).each(function(e,t){t=Q(t);var n=r.getItem(i,t);r.handlerLabel(i,l.find('dd[lay-value="'+n.value+'"]'),!t.hasClass(w),n,!a)})};o.prototype.skin=function(e){var t=["default","primary","normal","warm","danger"];var n=t[Math.floor(Math.random()*t.length)];Q('dl[xid="'+e+'"]').parents("."+m).find("."+P).attr("xm-select-skin",n);this.check(e)&&this.commonHandler(e,Q('dl[xid="'+e+'"]').parents("."+m).find("."+x))};o.prototype.getPosition=function(e){var t=0,n=0;while(e!=null){t+=e.offsetLeft;n+=e.offsetTop;e=e.offsetParent}return{x:t,y:n}};o.prototype.onreset=function(){Q(document).on("click","[type=reset]",function(e){Q(e.target).parents("form").find("."+m+" dl[xid]").each(function(e,t){var n=t.getAttribute("xid"),i=Q(t),a=void 0,r={};K.removeAll(n);q[n].config.init.forEach(function(e,t){if(e&&(!r[e]||q[n].config.repeat)&&(a=i.find('dd[lay-value="'+e.value+'"]'))[0]){K.handlerLabel(n,a,true);r[e]=1}})})})};o.prototype.bindEvent=function(n,e,i){if(e&&e instanceof Function){i=e;e=null}if(i&&i instanceof Function){if(!e){Q.each(q,function(e,t){q[e]?q[e].config[n]=i:z[n][e]=i})}else{q[e]?(q[e].config[n]=i,delete z[n][e]):z[n][e]=i}}};o.prototype.check=function(e,t){if(Q('dl[xid="'+e+'"]').length){return true}else if(Q('select[xm-select="'+e+'"]').length){if(!t){this.render(e,Q('select[xm-select="'+e+'"]'));return true}}else{delete q[e];return false}};o.prototype.render=function(e,t){K.init(t);K.one(Q('dl[xid="'+e+'"]').parents("."+m));K.initVal(e)};o.prototype.log=function(e){console.log(e)};var u=function e(){this.v=t;this.render()};var K=new o;u.prototype.value=function(i,e,t){if(typeof i!="string"){return[]}var a=q[i];if(!K.check(i)){return[]}if(typeof e=="string"||e==undefined){var n=a.values.concat([])||[];if(e=="val"){return n.map(function(e){return e.value})}if(e=="valStr"){return n.map(function(e){return e.value}).join(",")}if(e=="name"){return n.map(function(e){return e.name})}if(e=="nameStr"){return n.map(function(e){return e.name}).join(",")}return n}if(K.isArray(e)){var r=Q('[xid="'+i+'"]'),l={},o=void 0,s=true;if(t==false){s=false}else if(t==true){s=true}else{K.removeAll(i)}if(s){a.values.forEach(function(e,t){l[e.value]=1})}e.forEach(function(e,t){if(e&&(!l[e]||a.config.repeat)){if((o=r.find('dd[lay-value="'+e+'"]'))[0]){K.handlerLabel(i,o,s,null,true);l[e]=1}else{var n=K.valToName(i,e);if(n){K.handlerLabel(i,o,s,K.getItem(i,e),true);l[e]=1}}}})}};u.prototype.on=function(e,t,n){K.bindEvent(n?"endOn":"on",e,t);return this};u.prototype.filter=function(e,t){K.bindEvent("filter",e,t);return this};u.prototype.maxTips=function(e,t){K.bindEvent("maxTips",e,t);return this};u.prototype.opened=function(e,t){K.bindEvent("opened",e,t);return this};u.prototype.closed=function(e,t){K.bindEvent("closed",e,t);return this};u.prototype.config=function(e,n,t){if(e&&(typeof e==="undefined"?"undefined":_typeof(e))=="object"){t=n==true;n=e;e=null}if(n&&(typeof n==="undefined"?"undefined":_typeof(n))=="object"){if(t){n.header||(n.header={});n.header["Content-Type"]="application/json; charset=UTF-8";n.dataType="json"}e?(Y[e]=Q.extend(true,{},Y[e]||X,n),!K.check(e)&&this.render(e),q[e]&&n.direction&&(q[e].config.direction=n.direction),q[e]&&n.clearInput&&(q[e].config.clearInput=true),n.searchUrl&&q[e]&&K.triggerSearch(Q("."+m+' dl[xid="'+e+'"]').parents("."+P),true)):(Q.extend(true,X,n),Q.each(Y,function(e,t){Q.extend(true,t,n)}))}return this};u.prototype.render=function(e,t){var n;if(e&&(typeof e==="undefined"?"undefined":_typeof(e))=="object"){t=e;e=null}var i=t?(n={init:t.init,disabled:t.disabled,max:t.max,isSearch:t.isSearch,searchUrl:t.searchUrl,isCreate:t.isCreate,radio:t.radio,skin:t.skin,direction:t.direction,height:t.height,formname:t.formname,layverify:t.layverify,layverType:t.layverType,showCount:t.showCount,placeholder:t.placeholder,create:t.create,filter:t.filter,maxTips:t.maxTips,on:t.on},_defineProperty(n,"on",t.on),_defineProperty(n,"opened",t.opened),_defineProperty(n,"closed",t.closed),_defineProperty(n,"template",t.template),_defineProperty(n,"clearInput",t.clearInput),n):{};t&&t.searchType!=undefined&&(i.searchType=t.searchType=="dl"?1:0);if(e){r[e]={};Q.extend(r[e],q[e]?q[e].config:{},i)}else{Q.extend(a,i)}(Q("select["+v+'="'+e+'"]')[0]?Q("select["+v+'="'+e+'"]'):Q("select["+v+"]")).each(function(e,t){var n=t.getAttribute(v);K.render(n,t);setTimeout(function(){return K.setHidnVal(n,Q('select[xm-select="'+n+'"] + div.'+m+" ."+x))},10)});return this};u.prototype.disabled=function(e){var t={};e?K.check(e)&&(t[e]=q[e]):t=q;Q.each(t,function(e,t){Q('dl[xid="'+e+'"]').prev().addClass(N)});return this};u.prototype.undisabled=function(e){var t={};e?K.check(e)&&(t[e]=q[e]):t=q;Q.each(t,function(e,t){Q('dl[xid="'+e+'"]').prev().removeClass(N)});return this};u.prototype.data=function(e,t,n){if(!e||!t||!n){K.log("id: "+e+" param error !!!");return this}if(!K.check(e)){K.log("id: "+e+" not render !!!");return this}this.value(e,[]);this.config(e,n);if(t=="local"){K.renderData(e,n.arr,n.linkage==true,n.linkageWidth?n.linkageWidth:"100")}else if(t=="server"){K.ajax(e,n.url,n.keyword,n.linkage==true,n.linkageWidth?n.linkageWidth:"100")}return this};u.prototype.btns=function(e,o,s){if(e&&K.isArray(e)){o=e;e=null}if(!o||!K.isArray(o)){return this}var t={};e?K.check(e)&&(t[e]=q[e]):t=q;o=o.map(function(e){if(typeof e=="string"){if(e=="select"){return i[0]}if(e=="remove"){return i[1]}if(e=="reverse"){return i[2]}if(e=="skin"){return i[3]}}return e});Q.each(t,function(e,t){t.config.btns=o;var n=Q('dl[xid="'+e+'"]').find("."+J+":first");if(o.length){var i=s&&s.show&&(s.show=="name"||s.show=="icon")?s.show:"";var a=K.renderBtns(e,i,s&&s.space?s.space:"30px");n.html(a)}else{var r=n.parents("."+P).find("."+g+" input");var l=r.attr("placeholder")||r.attr("back");n.html(l);n.removeAttr("style")}});return this};u.prototype.search=function(e,t){if(e&&K.check(e)){Y[e]=Q.extend(true,{},Y[e]||X,{first:true,searchVal:t});K.triggerSearch(Q('dl[xid="'+e+'"]').parents("."+P),true)}return this};u.prototype.replace=function(e,t,n){var i=this;if(!e||!t||!n){K.log("id: "+e+" param error !!!");return this}if(!K.check(e,true)){K.log("id: "+e+" not render !!!");return this}var a=this.value(e,"val");this.value(e,[]);this.config(e,n);if(t=="local"){K.renderData(e,n.arr,n.linkage==true,n.linkageWidth?n.linkageWidth:"100",false,true);this.value(e,a,true)}else if(t=="server"){K.ajax(e,n.url,n.keyword,n.linkage==true,n.linkageWidth?n.linkageWidth:"100",false,function(e){i.value(e,a,true)},true)}};return new u}); diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/jquery.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/jquery.js new file mode 100755 index 00000000..242696a4 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/jquery.js @@ -0,0 +1,5 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
          a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
          ","
          "],area:[1,"",""],param:[1,"",""],thead:[1,"","
          "],tr:[2,"","
          "],col:[2,"","
          "],td:[3,"","
          "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
          ","
          "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
          a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
          ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laydate.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laydate.js new file mode 100755 index 00000000..ae0a591d --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laydate.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
          建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
          "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
          已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

          "+r.time[e]+"

            "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
          ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s','
          '+f+"
          ",'
          ','',"
          ","
          "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

          ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

          "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

          "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

            ','
          • ','','
            ','',"
            ","
          • ",'
          • ','','
            ','",'","
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
        9. '+e+'
        10. ')}),'
            '+t.join("")+"
          "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
            ','
          • ','','
            ','","
            ","
          • ",'
          • ','','
            ','',"
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/layer.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/layer.js new file mode 100755 index 00000000..c6d53784 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/layer.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
          '+(f?r.title[0]:r.title)+"
          ":"";return r.zIndex=s,t([r.shade?'
          ':"",'
          '+(e&&2!=r.type?"":u)+'
          '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
          '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
          '+e+"
          "}():"")+(r.resize?'':"")+"
          "],u,i('
          ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
            '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
          • '+(t[0].content||"no content")+"
          • ";i'+(t[i].content||"no content")+"";return a}()+"
          ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
          '+(u.length>1?'':"")+'
          '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
          ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
          是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laypage.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laypage.js new file mode 100755 index 00000000..fd07fdae --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laypage.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
          ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
          "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laytpl.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laytpl.js new file mode 100755 index 00000000..d482d4eb --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/laytpl.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/mobile.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/mobile.js new file mode 100755 index 00000000..35cfdf07 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/mobile.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

          '+(e?i.title[0]:i.title)+"

          ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
          '+e+"
          "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

          '+(i.content||"")+"

          "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
          ':"")+'
          "+l+'
          '+i.content+"
          "+d+"
          ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
          ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:2})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='
          ',l=s.attr("lay-type")||a.type;a.unwrap||(u='
          '+u+''+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"
          "),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/rate.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/rate.js new file mode 100755 index 00000000..762fb3a9 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/rate.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
            ",u=1;u<=i.length;u++){var r='
          • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
          • ":n+=r}n+="
          "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/slider.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/slider.js new file mode 100755 index 00000000..446378d9 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/slider.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
          '+(t.tips?'
          ':"")+'
          '+(t.range?'
          ':"")+"
          ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
          ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
          ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
          f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/table.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/table.js new file mode 100755 index 00000000..e9217db6 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/table.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,u,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)},config:t}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u="table",h=".layui-table",y="layui-hide",f="layui-none",p="layui-table-view",v=".layui-table-tool",m=".layui-table-box",g=".layui-table-init",b=".layui-table-header",x=".layui-table-body",k=".layui-table-main",C=".layui-table-fixed",w=".layui-table-fixed-l",T=".layui-table-fixed-r",A=".layui-table-total",L=".layui-table-page",S=".layui-table-sort",N="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
          ','
          ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
          ","
          "].join("")},E=['',"","
          "].join(""),z=['
          ',"{{# if(d.data.toolbar){ }}",'
          ','
          ','
          ',"
          ","{{# } }}",'
          ',"{{# if(d.data.loading){ }}",'
          ','',"
          ","{{# } }}","{{# var left, right; }}",'
          ',_(),"
          ",'
          ',E,"
          ","{{# if(left){ }}",'
          ','
          ',_({fixed:!0}),"
          ",'
          ',E,"
          ","
          ","{{# }; }}","{{# if(right){ }}",'
          ','
          ',_({fixed:"right"}),'
          ',"
          ",'
          ',E,"
          ","
          ","{{# }; }}","
          ","{{# if(d.data.totalRow){ }}",'
          ','','',"
          ","
          ","{{# } }}","{{# if(d.data.page){ }}",'
          ','
          ',"
          ","{{# } }}","","
          "].join(""),H=t(window),R=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+p),o=e.elem=t(i(z).render({VIEW_CLASS:p,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(v),e.layBox=o.find(m),e.layHeader=o.find(b),e.layMain=o.find(k),e.layBody=o.find(x),e.layFixed=o.find(C),e.layFixLeft=o.find(w),e.layFixRight=o.find(T),e.layTotal=o.find(A),e.layPage=o.find(L),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(b).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
          ','
          ','
          '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=r[t];i&&d.push('
          ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](y),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.layMain.html('
          '+(t[n.msgName]||"返回的数据不符合规范,正确的成功状态码 ("+n.statusName+") 应为:"+n.statusCode)+"
          ")):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.layMain.html('
          数据接口请求异常:'+t+"
          "),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,a.data.length),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],p=[],v=[],m=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],f=[],m=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,p=l[c];if(void 0!==p&&null!==p||(p=""),!r.colGroup){var v=['','
          '+function(){var n=t.extend(!0,{LAY_INDEX:m},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return m}return r.toolbar?i(t(r.toolbar).html()||"").render(n):r.templet?function(){return"function"==typeof r.templet?r.templet(n):i(t(r.templet).html()||String(p)).render(n)}():p}(),"
          "].join("");o.push(v),r.fixed&&"right"!==r.fixed&&u.push(v),"right"===r.fixed&&f.push(v)}}),h.push(''+o.join("")+""),p.push(''+u.join("")+""),v.push(''+f.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(v.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](y),r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
          '+s.text.none+"
          ")):(m(),c.renderTotal(u),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.loading(),c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})});var l=[];t.eachCols(function(e,t){var n=t.field||e,o=['','
          '+function(){var e=t.totalRowText||"";return t.totalRow?parseFloat(a[n]).toFixed(2)||e:e}(),"
          "].join("");l.push(o)}),t.layTotal.find("tbody").html(""+l.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},h=c.config,y=h.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},h.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[h.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,u,"sort("+y+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(g).remove()):(i.layInit=t(['
          ','',"
          "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e=e-(t.layPage.outerHeight()||41)-2),t.layMain.css("height",e))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
          ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(x).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](y),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,a=this,o=a.config,c=t("body"),s={},h=a.layHeader.find("th"),f=".layui-table-cell",p=o.elem.attr("lay-filter");a.layTool.on("click","*[lay-event]",function(e){var i=t(this),c=i.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
            ');n.html(l),o.height&&n.css("max-height",o.height-(a.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(n),a.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),R.trigger("table.tool.panel.remove"),l.close(a.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return a.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
          • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var i=t(e.elem),l=this.checked,n=i.data("key"),r=i.data("parentkey");layui.each(o.cols,function(e,t){layui.each(t,function(t,i){if(e+"-"+t===n){var d=i.hide;i.hide=!l,a.elem.find('*[data-key="'+o.index+"-"+n+'"]')[l?"removeClass":"addClass"](y),d!=i.hide&&a.setParentCol(!l,r),a.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
          • 导出到 Csv 文件
          • ','
          • 导出到 Excel 文件
          • '].join("")}(),done:function(e,i){i.on("click",function(){var e=t(this).data("type");d.exportFile(o.id,null,e)})}});break;case"LAYTABLE_PRINT":var h=window.open("打印窗口","_blank"),f=[""].join(""),v=t(a.layHeader.html());v.append(a.layMain.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),h.document.write(f+v.prop("outerHTML")),h.document.close(),h.print(),h.close()}layui.event.call(this,u,"toolbar("+p+")",t.extend({event:c,config:o},{}))}),h.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||s.resizeStart||(s.allowResize=i.width()-l<=10,c.css("cursor",s.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);s.resizeStart||c.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(s.allowResize){var l=i.data("key");e.preventDefault(),s.resizeStart=!0,s.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();s.rule=e,s.ruleWidth=parseFloat(t),s.minWidth=i.data("minwidth")||o.cellMinWidth})}}),R.on("mousemove",function(t){if(s.resizeStart){if(t.preventDefault(),s.rule){var i=s.ruleWidth+t.clientX-s.offset[0];i');return n[0].value=i.data("content")||l.text(),i.find("."+N)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(f);if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
            ')}};a.layBody.on("click","."+g,function(e){var i=t(this),n=i.parent(),d=n.children(f);a.tipsIndex=l.tips(['
            ',d.html(),"
            ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:a.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),i=e.parents("tr").eq(0).data("index");layui.event.call(this,u,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),a.setThisRowChecked(i)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layTotal.scrollLeft(i),a.layFixed.find(x).scrollTop(n),l.close(a.tipsIndex)}),R.on("click",function(){R.trigger("table.remove.tool.panel")}),R.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()}),H.on("resize",function(){a.resize()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var a=c.config[e]||{},l={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],n=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(n.href="data:"+l+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],a=[];return layui.each(t,function(t,l){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(l),function(e,t){n.push(t)})):d.eachCols(e,function(e,a){a.field&&"normal"==a.type&&!a.hide&&(0==t&&i.push(a.title||""),n.push(l[a.field]))}),a.push(n.join(","))}),i.join(",")+"\r\n"+a.join("\r\n")}()),n.download=(a.title||"table_"+(a.index||""))+"."+i,document.body.appendChild(n),n.click(),void document.body.removeChild(n))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,i){i=i||{};var a=s(e);if(a)return i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(u,d)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/tree.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/tree.js new file mode 100755 index 00000000..e8c053d3 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/tree.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
              '),s=o(["
            • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
            • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
              '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/upload.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/upload.js new file mode 100755 index 00000000..404d534d --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/upload.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
              '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
              ',"
              "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/lay/modules/util.js b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/util.js new file mode 100755 index 00000000..8d38508c --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/lay/modules/util.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,a,n="layui-fixbar",r="layui-fixbar-top",o=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['
                ',t.bar1?'
              • '+c[0]+"
              • ":"",t.bar2?'
              • '+c[1]+"
              • ":"",'
              • '+c[2]+"
              • ","
              "].join("")),s=g.find("."+r),u=function(){var e=o.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+n)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),a=i.attr("lay-type");"top"===a&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,a)}),o.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var a=this,n="function"==typeof e,r=new Date(t).getTime(),o=new Date(!e||n?(new Date).getTime():e).getTime(),l=r-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];n&&(i=e);var g=setTimeout(function(){a.countdown(t,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,a=[[],[]],n=(new Date).getTime()-new Date(t).getTime();return n>6912e5?(n=new Date(t),a[0][0]=i.digit(n.getFullYear(),4),a[0][1]=i.digit(n.getMonth()+1),a[0][2]=i.digit(n.getDate()),e||(a[1][0]=i.digit(n.getHours()),a[1][1]=i.digit(n.getMinutes()),a[1][2]=i.digit(n.getSeconds())),a[0].join("-")+" "+a[1].join(":")):n>=864e5?(n/1e3/60/60/24|0)+"天前":n>=36e5?(n/1e3/60/60|0)+"小时前":n>=12e4?(n/1e3/60|0)+"分钟前":n<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var a=t.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};!function(t,e,i){"$:nomunge";function a(){n=e[l](function(){r.each(function(){var e=t(this),i=e.width(),a=e.height(),n=t.data(this,g);(i!==n.w||a!==n.h)&&e.trigger(c,[n.w=i,n.h=a])}),a()},o[s])}var n,r=t([]),o=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";o[s]=250,o[u]=!0,t.event.special[c]={setup:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===r.length&&a()},teardown:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.not(e),e.removeData(g),r.length||clearTimeout(n)},add:function(e){function a(e,a,r){var o=t(this),l=t.data(this,g)||{};l.w=a!==i?a:o.width(),l.h=r!==i?r:o.height(),n.apply(this,arguments)}if(!o[u]&&this[l])return!1;var n;return t.isFunction(e)?(n=e,a):(n=e.handler,void(e.handler=a))}}}(e,window),t("util",i)}); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/layui.all.js b/hera-admin/src/main/resources/static/plugins/layui/layui.all.js new file mode 100755 index 00000000..5cd59739 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/layui.all.js @@ -0,0 +1,5 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.4.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:r/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
              ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
              "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
              建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
              "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
              已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

              "+r.time[e]+"

                "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
              ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
              a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
              ","
              "],area:[1,"",""],param:[1,"",""],thead:[1,"","
              "],tr:[2,"","
              "],col:[2,"","
              "],td:[3,"","
              "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
              ","
              "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
              a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
              ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
              '+(f?r.title[0]:r.title)+"
              ":"";return r.zIndex=s,t([r.shade?'
              ':"",'
              '+(e&&2!=r.type?"":u)+'
              '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
              '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
              '+e+"
              "}():"")+(r.resize?'':"")+"
              "],u,i('
              ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
                '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
              • '+(t[0].content||"no content")+"
              • ";i'+(t[i].content||"no content")+"";return a}()+"
              ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
              '+(u.length>1?'':"")+'
              '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
              ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
              是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
            • "+(i.title||"unnaming")+"
            • ";return s[0]?s.before(r):n.append(r),o.append('
              '+(i.content||"")+"
              "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
              '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
              ',"
              "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
              '+(t.tips?'
              ':"")+'
              '+(t.range?'
              ':"")+"
              ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
              ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
              ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
              f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['
              ',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
              "].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['
              ','
              ','
              ','
              ','
              ','
              ',"
              ",'
              ','
              ',"
              ","
              ",'
              ','
              ','
              ',"
              ","
              ",function(){if(o.predefine){var e=['
              '];return layui.each(o.colors,function(i,o){e.push(['
              ','
              ',"
              "].join(""))}),e.push("
              "),e.join("")}return""}(),'
              ','
              ','',"
              ",'
              ','','',"","
              "].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:fa()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['
              t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=t(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value===t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e)},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),x=i.find("dl"),g=x.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=x.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),g.removeClass(o),y=null,g.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),$()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||T(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},$=function(){var e=x.children("dd."+s);if(e[0]){var t=e.position().top,i=x.height(),a=e.height();t>i&&x.scrollTop(t+x.scrollTop()-i+a-5),t<0&&x.scrollTop(t+x.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),x.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=x.children("dd."+s);if(x.children("dd."+o)[0]&&"next"===t){var i=x.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项

              '):x.find("."+r).remove()},"keyup"),""===t&&x.find("."+r).remove(),void $())};f&&k.on("keyup",j).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){T(k.val(),function(e){d||k.val("")},"blur")},200)}),g.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
              ','
              ','','
              ','
              ',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("
              "+a.label+"
              "):t.push('
              '+a.innerHTML+"
              "):t.push('
              '+(a.innerHTML||i)+"
              ")}),0===t.length&&t.push('
              没有选项
              '),t.join("")}(r.find("*"))+"
              ","
              "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
              ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
              "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['
              ',''+i[l.checked?0:1]+"","
              "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
              ","
              "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=t(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=t(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,t){var c,f="",v="function"==typeof a[t];if(a[t]){var c=v?f=a[t](d,l):!a[t][0].test(d);if(f=f||a[t][1],c)return"tips"===u?i.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];p[i]=0|p[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+p[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(c[t.name]=t.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
                '),s=o(["
              • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
              • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
                '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,u,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)},config:t}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u="table",h=".layui-table",y="layui-hide",f="layui-none",p="layui-table-view",v=".layui-table-tool",m=".layui-table-box",g=".layui-table-init",b=".layui-table-header",x=".layui-table-body",k=".layui-table-main",C=".layui-table-fixed",w=".layui-table-fixed-l",T=".layui-table-fixed-r",A=".layui-table-total",L=".layui-table-page",S=".layui-table-sort",N="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                ','
                ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                ","
                "].join("")},E=['',"","
                "].join(""),z=['
                ',"{{# if(d.data.toolbar){ }}",'
                ','
                ','
                ',"
                ","{{# } }}",'
                ',"{{# if(d.data.loading){ }}",'
                ','',"
                ","{{# } }}","{{# var left, right; }}",'
                ',_(),"
                ",'
                ',E,"
                ","{{# if(left){ }}",'
                ','
                ',_({fixed:!0}),"
                ",'
                ',E,"
                ","
                ","{{# }; }}","{{# if(right){ }}",'
                ','
                ',_({fixed:"right"}),'
                ',"
                ",'
                ',E,"
                ","
                ","{{# }; }}","
                ","{{# if(d.data.totalRow){ }}",'
                ','','',"
                ","
                ","{{# } }}","{{# if(d.data.page){ }}",'
                ','
                ',"
                ","{{# } }}","","
                "].join(""),H=t(window),R=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+p),o=e.elem=t(i(z).render({VIEW_CLASS:p,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(v),e.layBox=o.find(m),e.layHeader=o.find(b),e.layMain=o.find(k),e.layBody=o.find(x),e.layFixed=o.find(C),e.layFixLeft=o.find(w),e.layFixRight=o.find(T),e.layTotal=o.find(A),e.layPage=o.find(L),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(b).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
                ','
                ','
                '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=r[t];i&&d.push('
                ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](y),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.layMain.html('
                '+(t[n.msgName]||"返回的数据不符合规范,正确的成功状态码 ("+n.statusName+") 应为:"+n.statusCode)+"
                ")):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.layMain.html('
                数据接口请求异常:'+t+"
                "),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,a.data.length),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],p=[],v=[],m=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],f=[],m=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,p=l[c];if(void 0!==p&&null!==p||(p=""),!r.colGroup){var v=['','
                '+function(){var n=t.extend(!0,{LAY_INDEX:m},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return m}return r.toolbar?i(t(r.toolbar).html()||"").render(n):r.templet?function(){return"function"==typeof r.templet?r.templet(n):i(t(r.templet).html()||String(p)).render(n)}():p}(),"
                "].join("");o.push(v),r.fixed&&"right"!==r.fixed&&u.push(v),"right"===r.fixed&&f.push(v)}}),h.push(''+o.join("")+""),p.push(''+u.join("")+""),v.push(''+f.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(v.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](y),r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
                '+s.text.none+"
                ")):(m(),c.renderTotal(u),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.loading(),c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})});var l=[];t.eachCols(function(e,t){var n=t.field||e,o=['','
                '+function(){var e=t.totalRowText||"";return t.totalRow?parseFloat(a[n]).toFixed(2)||e:e}(),"
                "].join("");l.push(o)}),t.layTotal.find("tbody").html(""+l.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},h=c.config,y=h.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},h.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[h.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,u,"sort("+y+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(g).remove()):(i.layInit=t(['
                ','',"
                "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e=e-(t.layPage.outerHeight()||41)-2),t.layMain.css("height",e))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
                ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(x).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](y),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,a=this,o=a.config,c=t("body"),s={},h=a.layHeader.find("th"),f=".layui-table-cell",p=o.elem.attr("lay-filter");a.layTool.on("click","*[lay-event]",function(e){var i=t(this),c=i.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
                  ');n.html(l),o.height&&n.css("max-height",o.height-(a.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(n),a.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),R.trigger("table.tool.panel.remove"),l.close(a.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return a.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
                • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var i=t(e.elem),l=this.checked,n=i.data("key"),r=i.data("parentkey");layui.each(o.cols,function(e,t){layui.each(t,function(t,i){if(e+"-"+t===n){var d=i.hide;i.hide=!l,a.elem.find('*[data-key="'+o.index+"-"+n+'"]')[l?"removeClass":"addClass"](y),d!=i.hide&&a.setParentCol(!l,r),a.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
                • 导出到 Csv 文件
                • ','
                • 导出到 Excel 文件
                • '].join("")}(),done:function(e,i){i.on("click",function(){var e=t(this).data("type");d.exportFile(o.id,null,e)})}});break;case"LAYTABLE_PRINT":var h=window.open("打印窗口","_blank"),f=[""].join(""),v=t(a.layHeader.html());v.append(a.layMain.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),h.document.write(f+v.prop("outerHTML")),h.document.close(),h.print(),h.close()}layui.event.call(this,u,"toolbar("+p+")",t.extend({event:c,config:o},{}))}),h.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||s.resizeStart||(s.allowResize=i.width()-l<=10,c.css("cursor",s.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);s.resizeStart||c.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(s.allowResize){var l=i.data("key");e.preventDefault(),s.resizeStart=!0,s.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();s.rule=e,s.ruleWidth=parseFloat(t),s.minWidth=i.data("minwidth")||o.cellMinWidth})}}),R.on("mousemove",function(t){if(s.resizeStart){if(t.preventDefault(),s.rule){var i=s.ruleWidth+t.clientX-s.offset[0];i');return n[0].value=i.data("content")||l.text(),i.find("."+N)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(f);if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
                  ')}};a.layBody.on("click","."+g,function(e){var i=t(this),n=i.parent(),d=n.children(f);a.tipsIndex=l.tips(['
                  ',d.html(),"
                  ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:a.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),i=e.parents("tr").eq(0).data("index");layui.event.call(this,u,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),a.setThisRowChecked(i)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layTotal.scrollLeft(i),a.layFixed.find(x).scrollTop(n),l.close(a.tipsIndex)}),R.on("click",function(){R.trigger("table.remove.tool.panel")}),R.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()}),H.on("resize",function(){a.resize()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var a=c.config[e]||{},l={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],n=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(n.href="data:"+l+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],a=[];return layui.each(t,function(t,l){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(l),function(e,t){n.push(t)})):d.eachCols(e,function(e,a){a.field&&"normal"==a.type&&!a.hide&&(0==t&&i.push(a.title||""),n.push(l[a.field]))}),a.push(n.join(","))}),i.join(",")+"\r\n"+a.join("\r\n")}()),n.download=(a.title||"table_"+(a.index||""))+"."+i,document.body.appendChild(n),n.click(),void document.body.removeChild(n))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,i){i=i||{};var a=s(e);if(a)return i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(u,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
                    ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
                  "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a",u=1;u<=i.length;u++){var r='
                • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
                • ":n+=r}n+="
              "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,a,n="layui-fixbar",r="layui-fixbar-top",o=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['
                ',t.bar1?'
              • '+c[0]+"
              • ":"",t.bar2?'
              • '+c[1]+"
              • ":"",'
              • '+c[2]+"
              • ","
              "].join("")),s=g.find("."+r),u=function(){var e=o.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+n)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),a=i.attr("lay-type");"top"===a&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,a)}),o.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var a=this,n="function"==typeof e,r=new Date(t).getTime(),o=new Date(!e||n?(new Date).getTime():e).getTime(),l=r-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];n&&(i=e);var g=setTimeout(function(){a.countdown(t,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,a=[[],[]],n=(new Date).getTime()-new Date(t).getTime();return n>6912e5?(n=new Date(t),a[0][0]=i.digit(n.getFullYear(),4),a[0][1]=i.digit(n.getMonth()+1),a[0][2]=i.digit(n.getDate()),e||(a[1][0]=i.digit(n.getHours()),a[1][1]=i.digit(n.getMinutes()),a[1][2]=i.digit(n.getSeconds())),a[0].join("-")+" "+a[1].join(":")):n>=864e5?(n/1e3/60/60/24|0)+"天前":n>=36e5?(n/1e3/60/60|0)+"小时前":n>=12e4?(n/1e3/60|0)+"分钟前":n<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var a=t.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};!function(t,e,i){"$:nomunge";function a(){n=e[l](function(){r.each(function(){var e=t(this),i=e.width(),a=e.height(),n=t.data(this,g);(i!==n.w||a!==n.h)&&e.trigger(c,[n.w=i,n.h=a])}),a()},o[s])}var n,r=t([]),o=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";o[s]=250,o[u]=!0,t.event.special[c]={setup:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===r.length&&a()},teardown:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.not(e),e.removeData(g),r.length||clearTimeout(n)},add:function(e){function a(e,a,r){var o=t(this),l=t.data(this,g)||{};l.w=a!==i?a:o.width(),l.h=r!==i?r:o.height(),n.apply(this,arguments)}if(!o[u]&&this[l])return!1;var n;return t.isFunction(e)?(n=e,a):(n=e.handler,void(e.handler=a))}}}(e,window),t("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
              ','
              '+f+"
              ",'
              ','',"
              ","
              "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

              ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

              "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

              "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

                ','
              • ','','
                ','',"
                ","
              • ",'
              • ','','
                ','",'","
                ","
              • ",'
              • ','','',"
              • ","
              "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
            • '+e+'
            • ')}),'
                '+t.join("")+"
              "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
                ','
              • ','','
                ','","
                ","
              • ",'
              • ','','
                ','',"
                ","
              • ",'
              • ','','',"
              • ","
              "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
              1. '+o.replace(/[\r\t\n]+/g,"
              2. ")+"
              "),c.find(">.layui-code-h3")[0]||c.prepend('

              '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

              ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/layui/layui.js b/hera-admin/src/main/resources/static/plugins/layui/layui.js new file mode 100755 index 00000000..3cd51c21 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/layui/layui.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.4.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:rb;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cQ;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='
              \n
              \n
              \n
              ',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b;return null==document.querySelector(D.target)?!1:(a=this.getElement(),a.children[0].style.width=""+this.progress+"%",(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?b="99":(b=this.progress<10?"0":"",b+=0|this.progress),a.children[0].setAttribute("data-progress",""+b)),this.lastRenderedProgress=this.progress)},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&"function"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/pace/themes/pace-theme-bounce.css b/hera-admin/src/main/resources/static/plugins/pace/themes/pace-theme-bounce.css new file mode 100755 index 00000000..74a19727 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/pace/themes/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #29d; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3); + -moz-transform: scaleY(.3); + -ms-transform: scaleY(.3); + -o-transform: scaleY(.3); + transform: scaleY(.3); + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/pace/themes/pace-theme-flash.css b/hera-admin/src/main/resources/static/plugins/pace/themes/pace-theme-flash.css new file mode 100755 index 00000000..29264503 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/pace/themes/pace-theme-flash.css @@ -0,0 +1,81 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #29d; + position: fixed; + z-index: 2000; + top: 0; + left: 0; + height: 2px; + + -webkit-transition: width 1s; + -moz-transition: width 1s; + -o-transition: width 1s; + transition: width 1s; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #29d, 0 0 5px #29d; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #29d; + border-left-color: #29d; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/hera-admin/src/main/resources/static/plugins/resize/resize.js b/hera-admin/src/main/resources/static/plugins/resize/resize.js new file mode 100755 index 00000000..013cc162 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/resize/resize.js @@ -0,0 +1,9 @@ +/* + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/awesome.css b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/awesome.css new file mode 100755 index 00000000..c1fcf3a2 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/awesome.css @@ -0,0 +1,386 @@ +/*------------------------------------- +zTree Style using fontawesome instead of images + +version: 1.1 +author: Mike King +email: mikkelking @ hotmail . com +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ +/* Definitions ----------------------*/ +/* End of Definitions ---------------*/ +/* Imports -------------------------*/ +/* End of Imports ------------------*/ +.ztree * { + padding: 0; + margin: 0; + font-size: 12px; + font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif; + background-color: #af0000; +} +.ztree { + margin: 0; + padding: 5px; + color: #ffffff; + background-color: #af0000; +} +.ztree li { + padding: 0; + margin: 0; + list-style: none; + line-height: 17px; + text-align: left; + white-space: nowrap; + outline: 0; +} +.ztree li ul { + margin: 0px; + padding: 0 0 0 18px; +} +.ztree li a { + padding-right: 3px; + margin: 0; + cursor: pointer; + height: 17px; + color: #ffffff; + background-color: transparent; + text-decoration: none; + vertical-align: top; + display: inline-block; +} +.ztree li a input.rename { + height: 14px; + width: 80px; + padding: 0; + margin: 0; + color: #af0000; + background-color: #ffffff; + font-size: 12px; + border: 1px #585956 solid; + *border: 0px; +} +.ztree li a:hover { + text-decoration: underline; +} +.ztree li a.curSelectedNode { + padding-top: 0px; + background-color: #af4040; + color: #ffff00; + height: 17px; + opacity: 0.8; +} +.ztree li a.curSelectedNode_Edit { + padding-top: 0px; + background-color: transparent; + color: #ffff00; + height: 17px; + border: 1px #666 solid; + opacity: 0.8; +} +.ztree li a.tmpTargetNode_inner { + padding-top: 0px; + background-color: #aaa; + color: #ffff00; + height: 17px; + border: 1px #666 solid; + opacity: 0.8; + filter: alpha(opacity=80); +} +.ztree li span { + line-height: 17px; + margin-right: 2px; + background-color: transparent; +} +.ztree li span.button { + line-height: 0; + margin: 0; + padding: 0; + width: 15px; + height: 17px; + display: inline-block; + vertical-align: top; + border: 0px solid; + cursor: pointer; + outline: none; + background-color: transparent; + background-repeat: no-repeat; + background-attachment: scroll; +} +.ztree li span.button::before { + color: #ffffff; + font-family: FontAwesome; + padding-top: 10px; +} +.ztree li span.button.chk { + margin: 0px; + cursor: auto; + width: 12px; + display: inline-block; + padding-top: 10px; + padding-left: 2px; +} +.ztree li span.button.chk.checkbox_false_full::before { + content: "\f096"; +} +.ztree li span.button.chk.checkbox_false_full_focus::before { + content: "\f096"; + color: #ffff00; +} +.ztree li span.button.chk.checkbox_false_part::before { + content: "\f096"; + color: #aaaaaa; +} +.ztree li span.button.chk.checkbox_false_part_focus::before { + content: "\f096"; + color: #cad96c; +} +.ztree li span.button.chk.checkbox_false_disable::before { + content: "\f096"; + color: #808080; +} +.ztree li span.button.chk.checkbox_true_full::before { + content: "\f046"; +} +.ztree li span.button.chk.checkbox_true_full_focus::before { + content: "\f046"; +} +.ztree li span.button.chk.checkbox_true_part::before { + content: "\f14a"; +} +.ztree li span.button.chk.checkbox_true_part_focus::before { + content: "\f14a"; + color: #ffff00; +} +.ztree li span.button.chk.checkbox_true_full_focus::before { + content: "\f046"; + color: #ffff00; +} +.ztree li span.button.chk.checkbox_true_part::before { + content: "\f046"; + color: #aaaaaa; +} +.ztree li span.button.chk.checkbox_true_part_focus::before { + content: "\f046"; + color: #cad96c; +} +.ztree li span.button.chk.checkbox_true_disable::before { + content: "\f046"; + color: #808080; +} +.ztree li span.button.chk.radio_false_full::before { + content: "\f10c"; +} +.ztree li span.button.chk.radio_false_full_focus::before { + content: "\f10c"; + color: #ffff00; +} +.ztree li span.button.chk.radio_false_part::before { + content: "\f10c"; + color: #aaaaaa; +} +.ztree li span.button.chk.radio_false_part_focus::before { + content: "\f10c"; + color: #ffff00; +} +.ztree li span.button.chk.radio_false_disable::before { + content: "\f1db"; + color: #808080; +} +.ztree li span.button.chk.radio_true_full::before { + content: "\f192"; +} +.ztree li span.button.chk.radio_true_full_focus::before { + content: "\f192"; + color: #ffff00; +} +.ztree li span.button.chk.radio_true_part::before { + content: "\f192"; + color: #aaaaaa; +} +.ztree li span.button.chk.radio_true_part_focus::before { + content: "\f192"; + color: #aaaaaa; +} +.ztree li span.button.chk.radio_true_disable::before { + content: "\f1db"; + color: #808080; +} +.ztree li span.button.switch { + width: 15px; + height: 17px; +} +.ztree li span.button.root_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.root_close::before { + content: "\f115"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.roots_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.roots_close::before { + content: "\f054"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.center_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.center_close::before { + content: "\f054"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.bottom_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.bottom_close::before { + content: "\f054"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.root_docu { + background: none; +} +.ztree li span.button.roots_docu::before { + content: "\f022"; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.center_docu::before { + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.bottom_docu::before { + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.noline_docu { + background: none; +} +.ztree li span.button.ico_open::before { + content: "\f115"; + font-family: FontAwesome; + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.ico_close::before { + content: "\f114"; + font-family: FontAwesome; + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.ico_docu::before { + content: "\f022"; + font-family: FontAwesome; + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.edit { + margin-left: 4px; + margin-right: -1px; + vertical-align: top; + *vertical-align: middle; + padding-top: 10px; +} +.ztree li span.button.edit::before { + content: "\f044"; + font-family: FontAwesome; +} +.ztree li span.button.remove { + margin-left: 4px; + margin-right: -1px; + vertical-align: top; + *vertical-align: middle; + padding-top: 10px; +} +.ztree li span.button.remove::before { + content: "\f1f8"; + font-family: FontAwesome; +} +.ztree li span.button.add { + margin-left: 4px; + margin-right: -1px; + vertical-align: top; + *vertical-align: middle; + padding-top: 10px; +} +.ztree li span.button.add::before { + content: "\f067"; + font-family: FontAwesome; +} +.ztree li span.button.ico_loading { + margin-right: 2px; + background: url(./img/loading.gif) no-repeat scroll 0 0 transparent; + vertical-align: top; + *vertical-align: middle; +} +ul.tmpTargetzTree { + background-color: #FFE6B0; + opacity: 0.8; + filter: alpha(opacity=80); +} +span.tmpzTreeMove_arrow { + width: 16px; + height: 17px; + display: inline-block; + padding: 0; + margin: 2px 0 0 1px; + border: 0 none; + position: absolute; + background-color: transparent; + background-attachment: scroll; +} +span.tmpzTreeMove_arrow::before { + content: "\f04b"; + font-family: FontAwesome; + color: #ffff00; +} +ul.ztree.zTreeDragUL { + margin: 0; + padding: 0; + position: absolute; + width: auto; + height: auto; + overflow: hidden; + background-color: #cfcfcf; + border: 1px #ffff00 dotted; + opacity: 0.8; + filter: alpha(opacity=80); +} +.ztreeMask { + z-index: 10000; + background-color: #cfcfcf; + opacity: 0.0; + filter: alpha(opacity=0); + position: absolute; +} diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/awesome.less b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/awesome.less new file mode 100755 index 00000000..b282d81b --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/awesome.less @@ -0,0 +1,146 @@ +/*------------------------------------- +zTree Style using fontawesome instead of images + +version: 1.1 +author: Mike King +email: mikkelking @ hotmail . com +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ + +/* Definitions ----------------------*/ +@font-size: 12px; +// Regular icon and text color is white, which suits any medium -> dark background +@color-normal: white; +// Background color +@color-bg: #af0000; +// Highlight color +@color-highlight: yellow; +// Partially selected (checkboxes, radio buttons) +@color-partial: #aaaaaa; +// Partially selected and focused (checkboxes, radio buttons) +@color-partfocus: #cad96c; +// Disabled altogether +@color-disabled: #808080; +// Editing color +@color-edit: yellow; +@w: 15px; +@h: 17px; +@pad-left: 2px; +@pad-top: 10px; +/* End of Definitions ---------------*/ + +/* Imports -------------------------*/ +@import "fa.less"; +/* End of Imports ------------------*/ + +.ztree * {padding:0; margin:0; font-size:@font-size; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif; background-color: @color-bg;} +.ztree { + margin:0; padding:5px; color:@color-normal; background-color: @color-bg; + li { + padding:0; margin:0; list-style:none; line-height:17px; text-align:left; white-space:nowrap; outline:0; + ul { + margin: 0px; padding:0 0 0 18px; + } + ul.line { } + a {padding-right:3px; margin:0; cursor:pointer; height:@h; color:@color-normal; background-color: transparent; + text-decoration:none; vertical-align:top; display: inline-block; + input.rename {height:14px; width:80px; padding:0; margin:0; + color: @color-bg; background-color: @color-normal; + font-size:@font-size; border:1px #585956 solid; *border:0px} + } + a:hover {text-decoration:underline} + a.curSelectedNode {padding-top:0px; background-color:#af4040; color:@color-highlight; height:@h; opacity:0.8;} + a.curSelectedNode_Edit {padding-top:0px; background-color:transparent; color:@color-highlight; height:@h; border:1px #666 solid; opacity:0.8;} + a.tmpTargetNode_inner {padding-top:0px; background-color:#aaa; color:@color-highlight; height:@h; border:1px #666 solid; + opacity:0.8; filter:alpha(opacity=80)} + a.tmpTargetNode_prev {} + a.tmpTargetNode_next {} + span {line-height:@h; margin-right:2px; background-color:transparent;} + span.button {line-height:0; margin:0; padding: 0; width:@w; height:@h; display: inline-block; vertical-align:top; + border:0px solid; cursor: pointer;outline:none; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + + &::before{color: @color-normal; font-family: FontAwesome; padding-top:@pad-top;} + &.chk { margin:0px; cursor: auto; width: 12px; + display: inline-block;padding-top:@pad-top;padding-left:@pad-left; + + &.checkbox_false_full::before {content: @fa-square-o;} + &.checkbox_false_full_focus::before {content: @fa-square-o; color:@color-highlight;} + &.checkbox_false_part::before {content: @fa-square-o;color: @color-partial;} + &.checkbox_false_part_focus::before {content: @fa-square-o; color:@color-partfocus;} + &.checkbox_false_disable::before {content: @fa-square-o; color:@color-disabled;} + &.checkbox_true_full::before {content: @fa-check-square-o;} + &.checkbox_true_full_focus::before {content: @fa-check-square-o;} + &.checkbox_true_part::before {content: @fa-check-square;} + &.checkbox_true_part_focus::before {content: @fa-check-square; color: @color-highlight} + &.checkbox_true_full_focus::before {content: @fa-check-square-o; color: @color-highlight} + &.checkbox_true_part::before {content: @fa-check-square-o;color: @color-partial} + &.checkbox_true_part_focus::before {content: @fa-check-square-o;color: @color-partfocus;} + &.checkbox_true_disable::before {content: @fa-check-square-o;color: @color-disabled} + + &.radio_false_full::before {content: @fa-circle-o;} + &.radio_false_full_focus::before {content: @fa-circle-o;color: @color-highlight} + &.radio_false_part::before {content: @fa-circle-o;color: @color-partial} + &.radio_false_part_focus::before {content: @fa-circle-o;color: @color-highlight} + &.radio_false_disable::before {content: @fa-circle-thin;color: @color-disabled} + &.radio_true_full::before {content: @fa-dot-circle-o;} + &.radio_true_full_focus::before {content: @fa-dot-circle-o;color: @color-highlight} + &.radio_true_part::before {content: @fa-dot-circle-o;color: @color-partial} + &.radio_true_part_focus::before {content: @fa-dot-circle-o;color: @color-partial;} + &.radio_true_disable::before {content: @fa-circle-thin;color: @color-disabled} + + } + &.switch {width:@w; height:@h} + &.root_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.root_close::before{content: @fa-folder-open-o;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.roots_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.roots_close::before{content: @fa-chevron-right;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.center_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.center_close::before{content: @fa-chevron-right;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.bottom_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.bottom_close::before{content: @fa-chevron-right;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.noline_open{} + &.noline_close{} + &.root_docu{ background:none;} + &.roots_docu::before{content: @fa-list-alt;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.center_docu::before{padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.bottom_docu::before{padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.noline_docu{ background:none;} + + &.ico_open::before {content: @fa-folder-open-o;font-family: FontAwesome;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.ico_close::before {content: @fa-folder-o;font-family: FontAwesome;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.ico_docu::before{content: @fa-list-alt;font-family: FontAwesome;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + + &.edit {margin-left:4px; margin-right: -1px; vertical-align:top; *vertical-align:middle;padding-top:@pad-top;} + &.edit::before{content: @fa-pencil-square-o;font-family: FontAwesome;} + + &.remove {margin-left:4px; margin-right: -1px; vertical-align:top; *vertical-align:middle;padding-top:@pad-top;} + &.remove::before{content: @fa-trash;font-family: FontAwesome;} + + + &.add {margin-left:4px; margin-right: -1px; vertical-align:top; *vertical-align:middle;padding-top:@pad-top;} + &.add::before{content: @fa-plus;font-family: FontAwesome;} + + &.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle} + } + + } +} + + +ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)} + +// this is the arrow that moves +span.tmpzTreeMove_arrow{width:16px; height:@h; display: inline-block; + padding:0; margin:2px 0 0 1px; border:0 none; position:absolute; + background-color:transparent; background-attachment: scroll; + } +span.tmpzTreeMove_arrow::before{content: @fa-play;font-family: FontAwesome;color: @color-highlight; + } +// outline + +ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; + background-color:#cfcfcf; border:1px @color-highlight dotted; opacity:0.8; filter:alpha(opacity=80)} +.ztreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute} + diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/fa.less b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/fa.less new file mode 100755 index 00000000..3714884a --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/fa.less @@ -0,0 +1,480 @@ +@fa-glass: "\f000"; +@fa-music: "\f001"; +@fa-search: "\f002"; +@fa-envelope-o: "\f003"; +@fa-heart: "\f004"; +@fa-star: "\f005"; +@fa-star-o: "\f006"; +@fa-user: "\f007"; +@fa-film: "\f008"; +@fa-th-large: "\f009"; +@fa-th: "\f00a"; +@fa-th-list: "\f00b"; +@fa-check: "\f00c"; +@fa-times: "\f00d"; +@fa-search-plus: "\f00e"; +@fa-search-minus: "\f010"; +@fa-power-off: "\f011"; +@fa-signal: "\f012"; +@fa-cog: "\f013"; +@fa-trash-o: "\f014"; +@fa-home: "\f015"; +@fa-file-o: "\f016"; +@fa-clock-o: "\f017"; +@fa-road: "\f018"; +@fa-download: "\f019"; +@fa-arrow-circle-o-down: "\f01a"; +@fa-arrow-circle-o-up: "\f01b"; +@fa-inbox: "\f01c"; +@fa-play-circle-o: "\f01d"; +@fa-repeat: "\f01e"; +@fa-refresh: "\f021"; +@fa-list-alt: "\f022"; +@fa-lock: "\f023"; +@fa-flag: "\f024"; +@fa-headphones: "\f025"; +@fa-volume-off: "\f026"; +@fa-volume-down: "\f027"; +@fa-volume-up: "\f028"; +@fa-qrcode: "\f029"; +@fa-barcode: "\f02a"; +@fa-tag: "\f02b"; +@fa-tags: "\f02c"; +@fa-book: "\f02d"; +@fa-bookmark: "\f02e"; +@fa-print: "\f02f"; +@fa-camera: "\f030"; +@fa-font: "\f031"; +@fa-bold: "\f032"; +@fa-italic: "\f033"; +@fa-text-height: "\f034"; +@fa-text-width: "\f035"; +@fa-align-left: "\f036"; +@fa-align-center: "\f037"; +@fa-align-right: "\f038"; +@fa-align-justify: "\f039"; +@fa-list: "\f03a"; +@fa-outdent: "\f03b"; +@fa-indent: "\f03c"; +@fa-video-camera: "\f03d"; +@fa-picture-o: "\f03e"; +@fa-pencil: "\f040"; +@fa-map-marker: "\f041"; +@fa-adjust: "\f042"; +@fa-tint: "\f043"; +@fa-pencil-square-o: "\f044"; +@fa-share-square-o: "\f045"; +@fa-check-square-o: "\f046"; +@fa-arrows: "\f047"; +@fa-step-backward: "\f048"; +@fa-fast-backward: "\f049"; +@fa-backward: "\f04a"; +@fa-play: "\f04b"; +@fa-pause: "\f04c"; +@fa-stop: "\f04d"; +@fa-forward: "\f04e"; +@fa-fast-forward: "\f050"; +@fa-step-forward: "\f051"; +@fa-eject: "\f052"; +@fa-chevron-left: "\f053"; +@fa-chevron-right: "\f054"; +@fa-plus-circle: "\f055"; +@fa-minus-circle: "\f056"; +@fa-times-circle: "\f057"; +@fa-check-circle: "\f058"; +@fa-question-circle: "\f059"; +@fa-info-circle: "\f05a"; +@fa-crosshairs: "\f05b"; +@fa-times-circle-o: "\f05c"; +@fa-check-circle-o: "\f05d"; +@fa-ban: "\f05e"; +@fa-arrow-left: "\f060"; +@fa-arrow-right: "\f061"; +@fa-arrow-up: "\f062"; +@fa-arrow-down: "\f063"; +@fa-share: "\f064"; +@fa-expand: "\f065"; +@fa-compress: "\f066"; +@fa-plus: "\f067"; +@fa-minus: "\f068"; +@fa-asterisk: "\f069"; +@fa-exclamation-circle: "\f06a"; +@fa-gift: "\f06b"; +@fa-leaf: "\f06c"; +@fa-fire: "\f06d"; +@fa-eye: "\f06e"; +@fa-eye-slash: "\f070"; +@fa-exclamation-triangle: "\f071"; +@fa-plane: "\f072"; +@fa-calendar: "\f073"; +@fa-random: "\f074"; +@fa-comment: "\f075"; +@fa-magnet: "\f076"; +@fa-chevron-up: "\f077"; +@fa-chevron-down: "\f078"; +@fa-retweet: "\f079"; +@fa-shopping-cart: "\f07a"; +@fa-folder: "\f07b"; +@fa-folder-open: "\f07c"; +@fa-arrows-v: "\f07d"; +@fa-arrows-h: "\f07e"; +@fa-bar-chart: "\f080"; +@fa-twitter-square: "\f081"; +@fa-facebook-square: "\f082"; +@fa-camera-retro: "\f083"; +@fa-key: "\f084"; +@fa-cogs: "\f085"; +@fa-comments: "\f086"; +@fa-thumbs-o-up: "\f087"; +@fa-thumbs-o-down: "\f088"; +@fa-star-half: "\f089"; +@fa-heart-o: "\f08a"; +@fa-sign-out: "\f08b"; +@fa-linkedin-square: "\f08c"; +@fa-thumb-tack: "\f08d"; +@fa-external-link: "\f08e"; +@fa-sign-in: "\f090"; +@fa-trophy: "\f091"; +@fa-github-square: "\f092"; +@fa-upload: "\f093"; +@fa-lemon-o: "\f094"; +@fa-phone: "\f095"; +@fa-square-o: "\f096"; +@fa-bookmark-o: "\f097"; +@fa-phone-square: "\f098"; +@fa-twitter: "\f099"; +@fa-facebook: "\f09a"; +@fa-github: "\f09b"; +@fa-unlock: "\f09c"; +@fa-credit-card: "\f09d"; +@fa-rss: "\f09e"; +@fa-hdd-o: "\f0a0"; +@fa-bullhorn: "\f0a1"; +@fa-bell: "\f0f3"; +@fa-certificate: "\f0a3"; +@fa-hand-o-right: "\f0a4"; +@fa-hand-o-left: "\f0a5"; +@fa-hand-o-up: "\f0a6"; +@fa-hand-o-down: "\f0a7"; +@fa-arrow-circle-left: "\f0a8"; +@fa-arrow-circle-right: "\f0a9"; +@fa-arrow-circle-up: "\f0aa"; +@fa-arrow-circle-down: "\f0ab"; +@fa-globe: "\f0ac"; +@fa-wrench: "\f0ad"; +@fa-tasks: "\f0ae"; +@fa-filter: "\f0b0"; +@fa-briefcase: "\f0b1"; +@fa-arrows-alt: "\f0b2"; +@fa-users: "\f0c0"; +@fa-link: "\f0c1"; +@fa-cloud: "\f0c2"; +@fa-flask: "\f0c3"; +@fa-scissors: "\f0c4"; +@fa-files-o: "\f0c5"; +@fa-paperclip: "\f0c6"; +@fa-floppy-o: "\f0c7"; +@fa-square: "\f0c8"; +@fa-bars: "\f0c9"; +@fa-list-ul: "\f0ca"; +@fa-list-ol: "\f0cb"; +@fa-strikethrough: "\f0cc"; +@fa-underline: "\f0cd"; +@fa-table: "\f0ce"; +@fa-magic: "\f0d0"; +@fa-truck: "\f0d1"; +@fa-pinterest: "\f0d2"; +@fa-pinterest-square: "\f0d3"; +@fa-google-plus-square: "\f0d4"; +@fa-google-plus: "\f0d5"; +@fa-money: "\f0d6"; +@fa-caret-down: "\f0d7"; +@fa-caret-up: "\f0d8"; +@fa-caret-left: "\f0d9"; +@fa-caret-right: "\f0da"; +@fa-columns: "\f0db"; +@fa-sort: "\f0dc"; +@fa-sort-desc: "\f0dd"; +@fa-sort-asc: "\f0de"; +@fa-envelope: "\f0e0"; +@fa-linkedin: "\f0e1"; +@fa-undo: "\f0e2"; +@fa-gavel: "\f0e3"; +@fa-tachometer: "\f0e4"; +@fa-comment-o: "\f0e5"; +@fa-comments-o: "\f0e6"; +@fa-bolt: "\f0e7"; +@fa-sitemap: "\f0e8"; +@fa-umbrella: "\f0e9"; +@fa-clipboard: "\f0ea"; +@fa-lightbulb-o: "\f0eb"; +@fa-exchange: "\f0ec"; +@fa-cloud-download: "\f0ed"; +@fa-cloud-upload: "\f0ee"; +@fa-user-md: "\f0f0"; +@fa-stethoscope: "\f0f1"; +@fa-suitcase: "\f0f2"; +@fa-bell-o: "\f0a2"; +@fa-coffee: "\f0f4"; +@fa-cutlery: "\f0f5"; +@fa-file-text-o: "\f0f6"; +@fa-building-o: "\f0f7"; +@fa-hospital-o: "\f0f8"; +@fa-ambulance: "\f0f9"; +@fa-medkit: "\f0fa"; +@fa-fighter-jet: "\f0fb"; +@fa-beer: "\f0fc"; +@fa-h-square: "\f0fd"; +@fa-plus-square: "\f0fe"; +@fa-angle-double-left: "\f100"; +@fa-angle-double-right: "\f101"; +@fa-angle-double-up: "\f102"; +@fa-angle-double-down: "\f103"; +@fa-angle-left: "\f104"; +@fa-angle-right: "\f105"; +@fa-angle-up: "\f106"; +@fa-angle-down: "\f107"; +@fa-desktop: "\f108"; +@fa-laptop: "\f109"; +@fa-tablet: "\f10a"; +@fa-mobile: "\f10b"; +@fa-circle-o: "\f10c"; +@fa-quote-left: "\f10d"; +@fa-quote-right: "\f10e"; +@fa-spinner: "\f110"; +@fa-circle: "\f111"; +@fa-reply: "\f112"; +@fa-github-alt: "\f113"; +@fa-folder-o: "\f114"; +@fa-folder-open-o: "\f115"; +@fa-smile-o: "\f118"; +@fa-frown-o: "\f119"; +@fa-meh-o: "\f11a"; +@fa-gamepad: "\f11b"; +@fa-keyboard-o: "\f11c"; +@fa-flag-o: "\f11d"; +@fa-flag-checkered: "\f11e"; +@fa-terminal: "\f120"; +@fa-code: "\f121"; +@fa-reply-all: "\f122"; +@fa-star-half-o: "\f123"; +@fa-location-arrow: "\f124"; +@fa-crop: "\f125"; +@fa-code-fork: "\f126"; +@fa-chain-broken: "\f127"; +@fa-question: "\f128"; +@fa-info: "\f129"; +@fa-exclamation: "\f12a"; +@fa-superscript: "\f12b"; +@fa-subscript: "\f12c"; +@fa-eraser: "\f12d"; +@fa-puzzle-piece: "\f12e"; +@fa-microphone: "\f130"; +@fa-microphone-slash: "\f131"; +@fa-shield: "\f132"; +@fa-calendar-o: "\f133"; +@fa-fire-extinguisher: "\f134"; +@fa-rocket: "\f135"; +@fa-maxcdn: "\f136"; +@fa-chevron-circle-left: "\f137"; +@fa-chevron-circle-right: "\f138"; +@fa-chevron-circle-up: "\f139"; +@fa-chevron-circle-down: "\f13a"; +@fa-html5: "\f13b"; +@fa-css3: "\f13c"; +@fa-anchor: "\f13d"; +@fa-unlock-alt: "\f13e"; +@fa-bullseye: "\f140"; +@fa-ellipsis-h: "\f141"; +@fa-ellipsis-v: "\f142"; +@fa-rss-square: "\f143"; +@fa-play-circle: "\f144"; +@fa-ticket: "\f145"; +@fa-minus-square: "\f146"; +@fa-minus-square-o: "\f147"; +@fa-level-up: "\f148"; +@fa-level-down: "\f149"; +@fa-check-square: "\f14a"; +@fa-pencil-square: "\f14b"; +@fa-external-link-square: "\f14c"; +@fa-share-square: "\f14d"; +@fa-compass: "\f14e"; +@fa-caret-square-o-down: "\f150"; +@fa-caret-square-o-up: "\f151"; +@fa-caret-square-o-right: "\f152"; +@fa-eur: "\f153"; +@fa-gbp: "\f154"; +@fa-usd: "\f155"; +@fa-inr: "\f156"; +@fa-jpy: "\f157"; +@fa-rub: "\f158"; +@fa-krw: "\f159"; +@fa-btc: "\f15a"; +@fa-file: "\f15b"; +@fa-file-text: "\f15c"; +@fa-sort-alpha-asc: "\f15d"; +@fa-sort-alpha-desc: "\f15e"; +@fa-sort-amount-asc: "\f160"; +@fa-sort-amount-desc: "\f161"; +@fa-sort-numeric-asc: "\f162"; +@fa-sort-numeric-desc: "\f163"; +@fa-thumbs-up: "\f164"; +@fa-thumbs-down: "\f165"; +@fa-youtube-square: "\f166"; +@fa-youtube: "\f167"; +@fa-xing: "\f168"; +@fa-xing-square: "\f169"; +@fa-youtube-play: "\f16a"; +@fa-dropbox: "\f16b"; +@fa-stack-overflow: "\f16c"; +@fa-instagram: "\f16d"; +@fa-flickr: "\f16e"; +@fa-adn: "\f170"; +@fa-bitbucket: "\f171"; +@fa-bitbucket-square: "\f172"; +@fa-tumblr: "\f173"; +@fa-tumblr-square: "\f174"; +@fa-long-arrow-down: "\f175"; +@fa-long-arrow-up: "\f176"; +@fa-long-arrow-left: "\f177"; +@fa-long-arrow-right: "\f178"; +@fa-apple: "\f179"; +@fa-windows: "\f17a"; +@fa-android: "\f17b"; +@fa-linux: "\f17c"; +@fa-dribbble: "\f17d"; +@fa-skype: "\f17e"; +@fa-foursquare: "\f180"; +@fa-trello: "\f181"; +@fa-female: "\f182"; +@fa-male: "\f183"; +@fa-gittip: "\f184"; +@fa-sun-o: "\f185"; +@fa-moon-o: "\f186"; +@fa-archive: "\f187"; +@fa-bug: "\f188"; +@fa-vk: "\f189"; +@fa-weibo: "\f18a"; +@fa-renren: "\f18b"; +@fa-pagelines: "\f18c"; +@fa-stack-exchange: "\f18d"; +@fa-arrow-circle-o-right: "\f18e"; +@fa-arrow-circle-o-left: "\f190"; +@fa-caret-square-o-left: "\f191"; +@fa-dot-circle-o: "\f192"; +@fa-wheelchair: "\f193"; +@fa-vimeo-square: "\f194"; +@fa-try: "\f195"; +@fa-plus-square-o: "\f196"; +@fa-space-shuttle: "\f197"; +@fa-slack: "\f198"; +@fa-envelope-square: "\f199"; +@fa-wordpress: "\f19a"; +@fa-openid: "\f19b"; +@fa-university: "\f19c"; +@fa-graduation-cap: "\f19d"; +@fa-yahoo: "\f19e"; +@fa-google: "\f1a0"; +@fa-reddit: "\f1a1"; +@fa-reddit-square: "\f1a2"; +@fa-stumbleupon-circle: "\f1a3"; +@fa-stumbleupon: "\f1a4"; +@fa-delicious: "\f1a5"; +@fa-digg: "\f1a6"; +@fa-pied-piper: "\f1a7"; +@fa-pied-piper-alt: "\f1a8"; +@fa-drupal: "\f1a9"; +@fa-joomla: "\f1aa"; +@fa-language: "\f1ab"; +@fa-fax: "\f1ac"; +@fa-building: "\f1ad"; +@fa-child: "\f1ae"; +@fa-paw: "\f1b0"; +@fa-spoon: "\f1b1"; +@fa-cube: "\f1b2"; +@fa-cubes: "\f1b3"; +@fa-behance: "\f1b4"; +@fa-behance-square: "\f1b5"; +@fa-steam: "\f1b6"; +@fa-steam-square: "\f1b7"; +@fa-recycle: "\f1b8"; +@fa-car: "\f1b9"; +@fa-taxi: "\f1ba"; +@fa-tree: "\f1bb"; +@fa-spotify: "\f1bc"; +@fa-deviantart: "\f1bd"; +@fa-soundcloud: "\f1be"; +@fa-database: "\f1c0"; +@fa-file-pdf-o: "\f1c1"; +@fa-file-word-o: "\f1c2"; +@fa-file-excel-o: "\f1c3"; +@fa-file-powerpoint-o: "\f1c4"; +@fa-file-image-o: "\f1c5"; +@fa-file-archive-o: "\f1c6"; +@fa-file-audio-o: "\f1c7"; +@fa-file-video-o: "\f1c8"; +@fa-file-code-o: "\f1c9"; +@fa-vine: "\f1ca"; +@fa-codepen: "\f1cb"; +@fa-jsfiddle: "\f1cc"; +@fa-life-ring: "\f1cd"; +@fa-circle-o-notch: "\f1ce"; +@fa-rebel: "\f1d0"; +@fa-empire: "\f1d1"; +@fa-git-square: "\f1d2"; +@fa-git: "\f1d3"; +@fa-hacker-news: "\f1d4"; +@fa-tencent-weibo: "\f1d5"; +@fa-qq: "\f1d6"; +@fa-weixin: "\f1d7"; +@fa-paper-plane: "\f1d8"; +@fa-paper-plane-o: "\f1d9"; +@fa-history: "\f1da"; +@fa-circle-thin: "\f1db"; +@fa-header: "\f1dc"; +@fa-paragraph: "\f1dd"; +@fa-sliders: "\f1de"; +@fa-share-alt: "\f1e0"; +@fa-share-alt-square: "\f1e1"; +@fa-bomb: "\f1e2"; +@fa-futbol-o: "\f1e3"; +@fa-tty: "\f1e4"; +@fa-binoculars: "\f1e5"; +@fa-plug: "\f1e6"; +@fa-slideshare: "\f1e7"; +@fa-twitch: "\f1e8"; +@fa-yelp: "\f1e9"; +@fa-newspaper-o: "\f1ea"; +@fa-wifi: "\f1eb"; +@fa-calculator: "\f1ec"; +@fa-paypal: "\f1ed"; +@fa-google-wallet: "\f1ee"; +@fa-cc-visa: "\f1f0"; +@fa-cc-mastercard: "\f1f1"; +@fa-cc-discover: "\f1f2"; +@fa-cc-amex: "\f1f3"; +@fa-cc-paypal: "\f1f4"; +@fa-cc-stripe: "\f1f5"; +@fa-bell-slash: "\f1f6"; +@fa-bell-slash-o: "\f1f7"; +@fa-trash: "\f1f8"; +@fa-copyright: "\f1f9"; +@fa-at: "\f1fa"; +@fa-eyedropper: "\f1fb"; +@fa-paint-brush: "\f1fc"; +@fa-birthday-cake: "\f1fd"; +@fa-area-chart: "\f1fe"; +@fa-pie-chart: "\f200"; +@fa-line-chart: "\f201"; +@fa-lastfm: "\f202"; +@fa-lastfm-square: "\f203"; +@fa-toggle-off: "\f204"; +@fa-toggle-on: "\f205"; +@fa-bicycle: "\f206"; +@fa-bus: "\f207"; +@fa-ioxhost: "\f208"; +@fa-angellist: "\f209"; +@fa-cc: "\f20a"; +@fa-ils: "\f20b"; +@fa-meanpath: "\f20c"; + diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/img/loading.gif b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/img/loading.gif new file mode 100755 index 00000000..e8c28929 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/awesomeStyle/img/loading.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/demo.css b/hera-admin/src/main/resources/static/plugins/ztree/css/demo.css new file mode 100755 index 00000000..f6dba0de --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/css/demo.css @@ -0,0 +1,33 @@ +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0;padding: 0;border: 0;outline: 0;font-weight: inherit;font-style: inherit;font-size: 100%;font-family: inherit;vertical-align: baseline;} +body {color: #2f332a;font: 15px/21px Arial, Helvetica, simsun, sans-serif;background: #f0f6e4 \9;} +h1, h2, h3, h4, h5, h6 {color: #2f332a;font-weight: bold;font-family: Helvetica, Arial, sans-serif;padding-bottom: 5px;} +h1 {font-size: 24px;line-height: 34px;text-align: center;} +h2 {font-size: 14px;line-height: 24px;padding-top: 5px;} +h6 {font-weight: normal;font-size: 12px;letter-spacing: 1px;line-height: 24px;text-align: center;} +a {color:#3C6E31;text-decoration: underline;} +a:hover {background-color:#3C6E31;color:white;} +input.radio {margin: 0 2px 0 8px;} +input.radio.first {margin-left:0;} +input.empty {color: lightgray;} +code {color: #2f332a;} +.highlight_red {color:#A60000;} +.highlight_green {color:#A7F43D;} +li {list-style: circle;font-size: 12px;} +li.title {list-style: none;} +ul.list {margin-left: 17px;} + +div.content_wrap {width: 600px;height:380px;} +div.content_wrap div.left{float: left;width: 250px;} +div.content_wrap div.right{float: right;width: 340px;} +div.zTreeDemoBackground {width:250px;height:362px;text-align:left;} + +ul.ztree {margin-top: 10px;border: 1px solid #617775;background: #f0f6e4;width:220px;height:360px;overflow-y:scroll;overflow-x:auto;} +ul.log {border: 1px solid #617775;background: #f0f6e4;width:300px;height:170px;overflow: hidden;} +ul.log.small {height:45px;} +ul.log li {color: #666666;list-style: none;padding-left: 10px;} +ul.log li.dark {background-color: #E3E3E3;} + +/* ruler */ +div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer} +div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer} \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/line_conn.png b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/line_conn.png new file mode 100755 index 00000000..b211da2f Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/line_conn.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/loading.gif b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/loading.gif new file mode 100755 index 00000000..e8c28929 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/loading.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/metro.gif b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/metro.gif new file mode 100755 index 00000000..664b969a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/metro.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/metro.png b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/metro.png new file mode 100755 index 00000000..e9e58a3a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/img/metro.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/metroStyle.css b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/metroStyle.css new file mode 100755 index 00000000..ae88a62d --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/css/metroStyle/metroStyle.css @@ -0,0 +1,109 @@ +/*------------------------------------- +zTree Style + +version: 3.4 +author: Hunter.z +email: hunter.z@263.net +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ + +.ztree *{padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif} +.ztree {margin:0; padding:5px; color:#333} +.ztree li{padding:0; margin:0; list-style:none; line-height:17px; text-align:left; white-space:nowrap; outline:0} +.ztree li ul{ margin:0; padding:0 0 0 18px} +.ztree li ul.line{ background:url(./img/line_conn.png) 0 0 repeat-y;} + +.ztree li a {padding-right:3px; margin:0; cursor:pointer; height:21px; color:#333; background-color: transparent; text-decoration:none; vertical-align:top; display: inline-block} +.ztree li a:hover {text-decoration:underline} +.ztree li a.curSelectedNode {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; opacity:0.8;} +.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; border:1px #666 solid; opacity:0.8;} +.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#aaa; color:white; height:21px; border:1px #666 solid; + opacity:0.8; filter:alpha(opacity=80)} +.ztree li a.tmpTargetNode_prev {} +.ztree li a.tmpTargetNode_next {} +.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0; + font-size:12px; border:1px #585956 solid; *border:0px} +.ztree li span {line-height:21px; margin-right:2px} +.ztree li span.button {line-height:0; margin:0; padding: 0; width:21px; height:21px; display: inline-block; vertical-align:middle; + border:0 none; cursor: pointer;outline:none; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")} + +.ztree li span.button.chk {width:13px; height:13px; margin:0 2px; cursor: auto} +.ztree li span.button.chk.checkbox_false_full {background-position: -5px -5px;} +.ztree li span.button.chk.checkbox_false_full_focus {background-position: -5px -26px;} +.ztree li span.button.chk.checkbox_false_part {background-position: -5px -48px;} +.ztree li span.button.chk.checkbox_false_part_focus {background-position: -5px -68px;} +.ztree li span.button.chk.checkbox_false_disable {background-position: -5px -89px;} +.ztree li span.button.chk.checkbox_true_full {background-position: -26px -5px;} +.ztree li span.button.chk.checkbox_true_full_focus {background-position: -26px -26px;} +.ztree li span.button.chk.checkbox_true_part {background-position: -26px -48px;} +.ztree li span.button.chk.checkbox_true_part_focus {background-position: -26px -68px;} +.ztree li span.button.chk.checkbox_true_disable {background-position: -26px -89px;} +.ztree li span.button.chk.radio_false_full {background-position: -47px -5px;} +.ztree li span.button.chk.radio_false_full_focus {background-position: -47px -26px;} +.ztree li span.button.chk.radio_false_part {background-position: -47px -47px;} +.ztree li span.button.chk.radio_false_part_focus {background-position: -47px -68px;} +.ztree li span.button.chk.radio_false_disable {background-position: -47px -89px;} +.ztree li span.button.chk.radio_true_full {background-position: -68px -5px;} +.ztree li span.button.chk.radio_true_full_focus {background-position: -68px -26px;} +.ztree li span.button.chk.radio_true_part {background-position: -68px -47px;} +.ztree li span.button.chk.radio_true_part_focus {background-position: -68px -68px;} +.ztree li span.button.chk.radio_true_disable {background-position: -68px -89px;} + +.ztree li span.button.switch {width:21px; height:21px} +.ztree li span.button.root_open{background-position:-105px -63px} +.ztree li span.button.root_close{background-position:-126px -63px} +.ztree li span.button.roots_open{background-position: -105px 0;} +.ztree li span.button.roots_close{background-position: -126px 0;} +.ztree li span.button.center_open{background-position: -105px -21px;} +.ztree li span.button.center_open2{background-position: -105px -21px;} +.ztree li span.button.center_close{background-position: -126px -21px;} +.ztree li span.button.center_close2{background-position: -126px -21px;} +.ztree li span.button.bottom_open{background-position: -105px -42px;} +.ztree li span.button.bottom_open2{background-position: -105px -42px;} +.ztree li span.button.bottom_close{background-position: -126px -42px;} +.ztree li span.button.bottom_close2{background-position: -126px -42px;} +.ztree li span.button.noline_open{background-position: -105px -84px;} +.ztree li span.button.noline_close{background-position: -126px -84px;} +.ztree li span.button.root_docu{ background:none;} +.ztree li span.button.roots_docu{background-position: -84px 0;} +.ztree li span.button.center_docu{background-position: -84px -21px;} +.ztree li span.button.bottom_docu{background-position: -84px -42px;} +.ztree li span.button.noline_docu{ background:none;} + +.ztree li span.button.ico_open{margin-right:2px; background-position: -147px -21px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_close{margin-right:2px; margin-right:2px; background-position: -147px 0; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_open2{ + background: url("../../../../images/folder_open.png") no-repeat center center; + background-size:14px 14px; +} +.ztree li span.button.ico_close2{ + background: url("../../../../images/folder_close.png") no-repeat center center; + background-size:14px 14px; +} + +.ztree li span.button.ico_docu{margin-right:2px; background-position: -147px -42px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.edit {margin-left:2px; margin-right: -1px; background-position: -189px -21px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.edit:hover { + background-position: -168px -21px; +} +.ztree li span.button.remove {margin-left:2px; margin-right: -1px; background-position: -189px -42px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.remove:hover { + background-position: -168px -42px; +} +.ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position: -189px 0; vertical-align:top; *vertical-align:middle} +.ztree li span.button.add:hover { + background-position: -168px 0; +} +.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle} + +ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)} + +span.tmpzTreeMove_arrow {width:16px; height:21px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-position:-168px -84px; background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")} + +ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)} +.ztreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute} diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/1_close.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/1_close.png new file mode 100755 index 00000000..68ccb3c3 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/1_close.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/1_open.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/1_open.png new file mode 100755 index 00000000..d6ff36d3 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/1_open.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/2.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/2.png new file mode 100755 index 00000000..9eff506b Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/2.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/3.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/3.png new file mode 100755 index 00000000..d7ba6d0c Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/3.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/4.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/4.png new file mode 100755 index 00000000..753e2bfd Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/4.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/5.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/5.png new file mode 100755 index 00000000..0c5eccd5 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/5.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/6.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/6.png new file mode 100755 index 00000000..070b8352 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/6.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/7.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/7.png new file mode 100755 index 00000000..532b037f Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/7.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/8.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/8.png new file mode 100755 index 00000000..a8f3a86e Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/8.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/9.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/9.png new file mode 100755 index 00000000..4db73cd4 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/diy/9.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/line_conn.gif b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/line_conn.gif new file mode 100755 index 00000000..d561d36a Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/line_conn.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/loading.gif b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/loading.gif new file mode 100755 index 00000000..e8c28929 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/loading.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/zTreeStandard.gif b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/zTreeStandard.gif new file mode 100755 index 00000000..50c94fd4 Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/zTreeStandard.gif differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/zTreeStandard.png b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/zTreeStandard.png new file mode 100755 index 00000000..ffda01ef Binary files /dev/null and b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/img/zTreeStandard.png differ diff --git a/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/zTreeStyle.css b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/zTreeStyle.css new file mode 100755 index 00000000..4a1705b1 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/css/zTreeStyle/zTreeStyle.css @@ -0,0 +1,97 @@ +/*------------------------------------- +zTree Style + +version: 3.5.19 +author: Hunter.z +email: hunter.z@263.net +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ + +.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif} +.ztree {margin:0; padding:5px; color:#333} +.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0} +.ztree li ul{ margin:0; padding:0 0 0 18px} +.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;} + +.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent; + text-decoration:none; vertical-align:top; display: inline-block} +.ztree li a:hover {text-decoration:underline} +.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;} +.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;} +.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid; + opacity:0.8; filter:alpha(opacity=80)} +.ztree li a.tmpTargetNode_prev {} +.ztree li a.tmpTargetNode_next {} +.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0; + font-size:12px; border:1px #7EC4CC solid; *border:0px} +.ztree li span {line-height:16px; margin-right:2px} +.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle; + border:0 none; cursor: pointer;outline:none; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")} + +.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto} +.ztree li span.button.chk.checkbox_false_full {background-position:0 0} +.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px} +.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px} +.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px} +.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px} +.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0} +.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px} +.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px} +.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px} +.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px} +.ztree li span.button.chk.radio_false_full {background-position:-28px 0} +.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px} +.ztree li span.button.chk.radio_false_part {background-position:-28px -28px} +.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px} +.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px} +.ztree li span.button.chk.radio_true_full {background-position:-42px 0} +.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px} +.ztree li span.button.chk.radio_true_part {background-position:-42px -28px} +.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px} +.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px} + +.ztree li span.button.switch {width:18px; height:18px} +.ztree li span.button.root_open{background-position:-92px -54px} +.ztree li span.button.root_close{background-position:-74px -54px} +.ztree li span.button.roots_open{background-position:-92px 0} +.ztree li span.button.roots_close{background-position:-74px 0} +.ztree li span.button.center_open{background-position:-92px -18px} +.ztree li span.button.center_close{background-position:-74px -18px} +.ztree li span.button.bottom_open{background-position:-92px -36px} +.ztree li span.button.bottom_close{background-position:-74px -36px} +.ztree li span.button.noline_open{background-position:-92px -72px} +.ztree li span.button.noline_close{background-position:-74px -72px} +.ztree li span.button.root_docu{ background:none;} +.ztree li span.button.roots_docu{background-position:-56px 0} +.ztree li span.button.center_docu{background-position:-56px -18px} +.ztree li span.button.bottom_docu{background-position:-56px -36px} +.ztree li span.button.noline_docu{ background:none;} + +.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle} + +.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle} + +ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)} + +span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")} + +ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)} +.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute} + +/* level style*/ +/*.ztree li span.button.level0 { + display:none; +} +.ztree li ul.level0 { + padding:0; + background:none; +}*/ \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery-1.4.4.min.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery-1.4.4.min.js new file mode 100755 index 00000000..8f3ca2e2 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery-1.4.4.min.js @@ -0,0 +1,167 @@ +/*! + * jQuery JavaScript Library v1.4.4 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Nov 11 19:04:53 2010 -0500 + */ +(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= +h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, +"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, +e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, +"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ +a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, +C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, +s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, +j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, +toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== +-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; +if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", +b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& +!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& +l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
              a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), +k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, +scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= +false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= +1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
              ";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
              t
              ";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= +"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= +c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); +else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; +if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, +attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& +b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; +c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, +arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= +d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ +c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== +8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== +"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ +d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= +B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== +0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; +break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, +q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= +l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, +m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- +0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; +if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, +g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); +n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& +function(){var g=k,i=t.createElement("div");i.innerHTML="

              ";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| +p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= +t.createElement("div");g.innerHTML="
              ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? +function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= +h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): +c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, +2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, +b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& +e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, +""],legend:[1,"
              ","
              "],thead:[1,"","
              "],tr:[2,"","
              "],td:[3,"","
              "],col:[2,"","
              "],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
              ","
              "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; +else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", +prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- +1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); +d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, +jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, +zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), +h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); +if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= +d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; +e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, +ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== +"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
              ").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; +A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= +encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", +[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), +e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); +if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", +3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} +var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.all.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.all.js new file mode 100755 index 00000000..e2376133 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.all.js @@ -0,0 +1,3841 @@ + +/* + * JQuery zTree core v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + var settings = {}, roots = {}, caches = {}, + //default consts of core + _consts = { + className: { + BUTTON: "button", + LEVEL: "level", + ICO_LOADING: "ico_loading", + SWITCH: "switch", + NAME: 'node_name' + }, + event: { + NODECREATED: "ztree_nodeCreated", + CLICK: "ztree_click", + EXPAND: "ztree_expand", + COLLAPSE: "ztree_collapse", + ASYNC_SUCCESS: "ztree_async_success", + ASYNC_ERROR: "ztree_async_error", + REMOVE: "ztree_remove", + SELECTED: "ztree_selected", + UNSELECTED: "ztree_unselected" + }, + id: { + A: "_a", + ICON: "_ico", + SPAN: "_span", + SWITCH: "_switch", + UL: "_ul" + }, + line: { + ROOT: "root", + ROOTS: "roots", + CENTER: "center", + BOTTOM: "bottom", + NOLINE: "noline", + LINE: "line" + }, + folder: { + OPEN: "open", + CLOSE: "close", + DOCU: "docu" + }, + node: { + CURSELECTED: "curSelectedNode" + } + }, + //default setting of core + _setting = { + treeId: "", + treeObj: null, + view: { + addDiyDom: null, + autoCancelSelected: true, + dblClickExpand: true, + expandSpeed: "fast", + fontCss: {}, + nameIsHTML: false, + selectedMulti: true, + showIcon: true, + showLine: true, + showTitle: true, + txtSelectedEnable: false + }, + data: { + key: { + isParent: "isParent", + children: "children", + name: "name", + title: "", + url: "url", + icon: "icon" + }, + simpleData: { + enable: false, + idKey: "id", + pIdKey: "pId", + rootPId: null + }, + keep: { + parent: false, + leaf: false + } + }, + async: { + enable: false, + contentType: "application/x-www-form-urlencoded", + type: "post", + dataType: "text", + headers: {}, + xhrFields: {}, + url: "", + autoParam: [], + otherParam: [], + dataFilter: null + }, + callback: { + beforeAsync: null, + beforeClick: null, + beforeDblClick: null, + beforeRightClick: null, + beforeMouseDown: null, + beforeMouseUp: null, + beforeExpand: null, + beforeCollapse: null, + beforeRemove: null, + + onAsyncError: null, + onAsyncSuccess: null, + onNodeCreated: null, + onClick: null, + onDblClick: null, + onRightClick: null, + onMouseDown: null, + onMouseUp: null, + onExpand: null, + onCollapse: null, + onRemove: null + } + }, + //default root of core + //zTree use root to save full data + _initRoot = function (setting) { + var r = data.getRoot(setting); + if (!r) { + r = {}; + data.setRoot(setting, r); + } + data.nodeChildren(setting, r, []); + r.expandTriggerFlag = false; + r.curSelectedList = []; + r.noSelection = true; + r.createdNodes = []; + r.zId = 0; + r._ver = (new Date()).getTime(); + }, + //default cache of core + _initCache = function (setting) { + var c = data.getCache(setting); + if (!c) { + c = {}; + data.setCache(setting, c); + } + c.nodes = []; + c.doms = []; + }, + //default bindEvent of core + _bindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.bind(c.NODECREATED, function (event, treeId, node) { + tools.apply(setting.callback.onNodeCreated, [event, treeId, node]); + }); + + o.bind(c.CLICK, function (event, srcEvent, treeId, node, clickFlag) { + tools.apply(setting.callback.onClick, [srcEvent, treeId, node, clickFlag]); + }); + + o.bind(c.EXPAND, function (event, treeId, node) { + tools.apply(setting.callback.onExpand, [event, treeId, node]); + }); + + o.bind(c.COLLAPSE, function (event, treeId, node) { + tools.apply(setting.callback.onCollapse, [event, treeId, node]); + }); + + o.bind(c.ASYNC_SUCCESS, function (event, treeId, node, msg) { + tools.apply(setting.callback.onAsyncSuccess, [event, treeId, node, msg]); + }); + + o.bind(c.ASYNC_ERROR, function (event, treeId, node, XMLHttpRequest, textStatus, errorThrown) { + tools.apply(setting.callback.onAsyncError, [event, treeId, node, XMLHttpRequest, textStatus, errorThrown]); + }); + + o.bind(c.REMOVE, function (event, treeId, treeNode) { + tools.apply(setting.callback.onRemove, [event, treeId, treeNode]); + }); + + o.bind(c.SELECTED, function (event, treeId, node) { + tools.apply(setting.callback.onSelected, [treeId, node]); + }); + o.bind(c.UNSELECTED, function (event, treeId, node) { + tools.apply(setting.callback.onUnSelected, [treeId, node]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.unbind(c.NODECREATED) + .unbind(c.CLICK) + .unbind(c.EXPAND) + .unbind(c.COLLAPSE) + .unbind(c.ASYNC_SUCCESS) + .unbind(c.ASYNC_ERROR) + .unbind(c.REMOVE) + .unbind(c.SELECTED) + .unbind(c.UNSELECTED); + }, + //default event proxy of core + _eventProxy = function (event) { + var target = event.target, + setting = data.getSetting(event.data.treeId), + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null, + tmp = null; + + if (tools.eqs(event.type, "mousedown")) { + treeEventType = "mousedown"; + } else if (tools.eqs(event.type, "mouseup")) { + treeEventType = "mouseup"; + } else if (tools.eqs(event.type, "contextmenu")) { + treeEventType = "contextmenu"; + } else if (tools.eqs(event.type, "click")) { + if (tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.SWITCH) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "switchNode"; + } else { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "clickNode"; + } + } + } else if (tools.eqs(event.type, "dblclick")) { + treeEventType = "dblclick"; + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "switchNode"; + } + } + if (treeEventType.length > 0 && tId.length == 0) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + } + } + // event to node + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "switchNode" : + var isParent = data.nodeIsParent(setting, node); + if (!isParent) { + nodeEventType = ""; + } else if (tools.eqs(event.type, "click") + || (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) { + nodeEventCallback = handler.onSwitchNode; + } else { + nodeEventType = ""; + } + break; + case "clickNode" : + nodeEventCallback = handler.onClickNode; + break; + } + } + // event to zTree + switch (treeEventType) { + case "mousedown" : + treeEventCallback = handler.onZTreeMousedown; + break; + case "mouseup" : + treeEventCallback = handler.onZTreeMouseup; + break; + case "dblclick" : + treeEventCallback = handler.onZTreeDblclick; + break; + case "contextmenu" : + treeEventCallback = handler.onZTreeContextmenu; + break; + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of core + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var r = data.getRoot(setting), + children = data.nodeChildren(setting, n); + n.level = level; + n.tId = setting.treeId + "_" + (++r.zId); + n.parentTId = parentNode ? parentNode.tId : null; + n.open = (typeof n.open == "string") ? tools.eqs(n.open, "true") : !!n.open; + var isParent = data.nodeIsParent(setting, n); + if (tools.isArray(children)) { + data.nodeIsParent(setting, n, true); + n.zAsync = true; + } else { + isParent = data.nodeIsParent(setting, n, isParent); + n.open = (isParent && !setting.async.enable) ? n.open : false; + n.zAsync = !isParent; + } + n.isFirstNode = isFirstNode; + n.isLastNode = isLastNode; + n.getParentNode = function () { + return data.getNodeCache(setting, n.parentTId); + }; + n.getPreNode = function () { + return data.getPreNode(setting, n); + }; + n.getNextNode = function () { + return data.getNextNode(setting, n); + }; + n.getIndex = function () { + return data.getNodeIndex(setting, n); + }; + n.getPath = function () { + return data.getNodePath(setting, n); + }; + n.isAjaxing = false; + data.fixPIdKeyValue(setting, n); + }, + _init = { + bind: [_bindEvent], + unbind: [_unbindEvent], + caches: [_initCache], + nodes: [_initNode], + proxys: [_eventProxy], + roots: [_initRoot], + beforeA: [], + afterA: [], + innerBeforeA: [], + innerAfterA: [], + zTreeTools: [] + }, + //method of operate data + data = { + addNodeCache: function (setting, node) { + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node; + }, + getNodeCacheId: function (tId) { + return tId.substring(tId.lastIndexOf("_") + 1); + }, + addAfterA: function (afterA) { + _init.afterA.push(afterA); + }, + addBeforeA: function (beforeA) { + _init.beforeA.push(beforeA); + }, + addInnerAfterA: function (innerAfterA) { + _init.innerAfterA.push(innerAfterA); + }, + addInnerBeforeA: function (innerBeforeA) { + _init.innerBeforeA.push(innerBeforeA); + }, + addInitBind: function (bindEvent) { + _init.bind.push(bindEvent); + }, + addInitUnBind: function (unbindEvent) { + _init.unbind.push(unbindEvent); + }, + addInitCache: function (initCache) { + _init.caches.push(initCache); + }, + addInitNode: function (initNode) { + _init.nodes.push(initNode); + }, + addInitProxy: function (initProxy, isFirst) { + if (!!isFirst) { + _init.proxys.splice(0, 0, initProxy); + } else { + _init.proxys.push(initProxy); + } + }, + addInitRoot: function (initRoot) { + _init.roots.push(initRoot); + }, + addNodesData: function (setting, parentNode, index, nodes) { + var children = data.nodeChildren(setting, parentNode), params; + if (!children) { + children = data.nodeChildren(setting, parentNode, []); + index = -1; + } else if (index >= children.length) { + index = -1; + } + + if (children.length > 0 && index === 0) { + children[0].isFirstNode = false; + view.setNodeLineIcos(setting, children[0]); + } else if (children.length > 0 && index < 0) { + children[children.length - 1].isLastNode = false; + view.setNodeLineIcos(setting, children[children.length - 1]); + } + data.nodeIsParent(setting, parentNode, true); + + if (index < 0) { + data.nodeChildren(setting, parentNode, children.concat(nodes)); + } else { + params = [index, 0].concat(nodes); + children.splice.apply(children, params); + } + }, + addSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + if (!data.isSelectedNode(setting, node)) { + root.curSelectedList.push(node); + } + }, + addCreatedNode: function (setting, node) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + root.createdNodes.push(node); + } + }, + addZTreeTools: function (zTreeTools) { + _init.zTreeTools.push(zTreeTools); + }, + exSetting: function (s) { + $.extend(true, _setting, s); + }, + fixPIdKeyValue: function (setting, node) { + if (setting.data.simpleData.enable) { + node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId; + } + }, + getAfterA: function (setting, node, array) { + for (var i = 0, j = _init.afterA.length; i < j; i++) { + _init.afterA[i].apply(this, arguments); + } + }, + getBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.beforeA.length; i < j; i++) { + _init.beforeA[i].apply(this, arguments); + } + }, + getInnerAfterA: function (setting, node, array) { + for (var i = 0, j = _init.innerAfterA.length; i < j; i++) { + _init.innerAfterA[i].apply(this, arguments); + } + }, + getInnerBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.innerBeforeA.length; i < j; i++) { + _init.innerBeforeA[i].apply(this, arguments); + } + }, + getCache: function (setting) { + return caches[setting.treeId]; + }, + getNodeIndex: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return i; + } + } + return -1; + }, + getNextNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return (i == l ? null : children[i + 1]); + } + } + return null; + }, + getNodeByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return null; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + return nodes[i]; + } + var children = data.nodeChildren(setting, node); + var tmp = data.getNodeByParam(setting, children, key, value); + if (tmp) return tmp; + } + return null; + }, + getNodeCache: function (setting, tId) { + if (!tId) return null; + var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)]; + return n ? n : null; + }, + getNodePath: function (setting, node) { + if (!node) return null; + + var path; + if (node.parentTId) { + path = node.getParentNode().getPath(); + } else { + path = []; + } + + if (path) { + path.push(node); + } + + return path; + }, + getNodes: function (setting) { + return data.nodeChildren(setting, data.getRoot(setting)); + }, + getNodesByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParam(setting, children, key, value)); + } + return result; + }, + getNodesByParamFuzzy: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + value = value.toLowerCase(); + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (typeof node[key] == "string" && nodes[i][key].toLowerCase().indexOf(value) > -1) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParamFuzzy(setting, children, key, value)); + } + return result; + }, + getNodesByFilter: function (setting, nodes, filter, isSingle, invokeParam) { + if (!nodes) return (isSingle ? null : []); + var result = isSingle ? null : []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (tools.apply(filter, [node, invokeParam], false)) { + if (isSingle) { + return node; + } + result.push(node); + } + var children = data.nodeChildren(setting, node); + var tmpResult = data.getNodesByFilter(setting, children, filter, isSingle, invokeParam); + if (isSingle && !!tmpResult) { + return tmpResult; + } + result = isSingle ? tmpResult : result.concat(tmpResult); + } + return result; + }, + getPreNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] === node) { + return (i == 0 ? null : children[i - 1]); + } + } + return null; + }, + getRoot: function (setting) { + return setting ? roots[setting.treeId] : null; + }, + getRoots: function () { + return roots; + }, + getSetting: function (treeId) { + return settings[treeId]; + }, + getSettings: function () { + return settings; + }, + getZTreeTools: function (treeId) { + var r = this.getRoot(this.getSetting(treeId)); + return r ? r.treeTools : null; + }, + initCache: function (setting) { + for (var i = 0, j = _init.caches.length; i < j; i++) { + _init.caches[i].apply(this, arguments); + } + }, + initNode: function (setting, level, node, parentNode, preNode, nextNode) { + for (var i = 0, j = _init.nodes.length; i < j; i++) { + _init.nodes[i].apply(this, arguments); + } + }, + initRoot: function (setting) { + for (var i = 0, j = _init.roots.length; i < j; i++) { + _init.roots[i].apply(this, arguments); + } + }, + isSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i]) return true; + } + return false; + }, + nodeChildren: function (setting, node, newChildren) { + if (!node) { + return null; + } + var key = setting.data.key.children; + if (typeof newChildren !== 'undefined') { + node[key] = newChildren; + } + return node[key]; + }, + nodeIsParent: function (setting, node, newIsParent) { + if (!node) { + return false; + } + var key = setting.data.key.isParent; + if (typeof newIsParent !== 'undefined') { + if (typeof newIsParent === "string") { + newIsParent = tools.eqs(newIsParent, "true"); + } + newIsParent = !!newIsParent; + node[key] = newIsParent; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }, + nodeName: function (setting, node, newName) { + var key = setting.data.key.name; + if (typeof newName !== 'undefined') { + node[key] = newName; + } + return "" + node[key]; + }, + nodeTitle: function (setting, node) { + var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title; + return "" + node[t]; + }, + removeNodeCache: function (setting, node) { + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + } + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null; + }, + removeSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) { + root.curSelectedList.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, node]); + i--; + j--; + } + } + }, + setCache: function (setting, cache) { + caches[setting.treeId] = cache; + }, + setRoot: function (setting, root) { + roots[setting.treeId] = root; + }, + setZTreeTools: function (setting, zTreeTools) { + for (var i = 0, j = _init.zTreeTools.length; i < j; i++) { + _init.zTreeTools[i].apply(this, arguments); + } + }, + transformToArrayFormat: function (setting, nodes) { + if (!nodes) return []; + var r = []; + if (tools.isArray(nodes)) { + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + _do(node); + } + } else { + _do(nodes); + } + return r; + + function _do(_node) { + r.push(_node); + var children = data.nodeChildren(setting, _node); + if (children) { + r = r.concat(data.transformToArrayFormat(setting, children)); + } + } + }, + transformTozTreeFormat: function (setting, sNodes) { + var i, l, + key = setting.data.simpleData.idKey, + parentKey = setting.data.simpleData.pIdKey; + if (!key || key == "" || !sNodes) return []; + + if (tools.isArray(sNodes)) { + var r = []; + var tmpMap = {}; + for (i = 0, l = sNodes.length; i < l; i++) { + tmpMap[sNodes[i][key]] = sNodes[i]; + } + for (i = 0, l = sNodes.length; i < l; i++) { + var p = tmpMap[sNodes[i][parentKey]]; + if (p && sNodes[i][key] != sNodes[i][parentKey]) { + var children = data.nodeChildren(setting, p); + if (!children) { + children = data.nodeChildren(setting, p, []); + } + children.push(sNodes[i]); + } else { + r.push(sNodes[i]); + } + } + return r; + } else { + return [sNodes]; + } + } + }, + //method of event proxy + event = { + bindEvent: function (setting) { + for (var i = 0, j = _init.bind.length; i < j; i++) { + _init.bind[i].apply(this, arguments); + } + }, + unbindEvent: function (setting) { + for (var i = 0, j = _init.unbind.length; i < j; i++) { + _init.unbind[i].apply(this, arguments); + } + }, + bindTree: function (setting) { + var eventParam = { + treeId: setting.treeId + }, + o = setting.treeObj; + if (!setting.view.txtSelectedEnable) { + // for can't select text + o.bind('selectstart', handler.onSelectStart).css({ + "-moz-user-select": "-moz-none" + }); + } + o.bind('click', eventParam, event.proxy); + o.bind('dblclick', eventParam, event.proxy); + o.bind('mouseover', eventParam, event.proxy); + o.bind('mouseout', eventParam, event.proxy); + o.bind('mousedown', eventParam, event.proxy); + o.bind('mouseup', eventParam, event.proxy); + o.bind('contextmenu', eventParam, event.proxy); + }, + unbindTree: function (setting) { + var o = setting.treeObj; + o.unbind('selectstart', handler.onSelectStart) + .unbind('click', event.proxy) + .unbind('dblclick', event.proxy) + .unbind('mouseover', event.proxy) + .unbind('mouseout', event.proxy) + .unbind('mousedown', event.proxy) + .unbind('mouseup', event.proxy) + .unbind('contextmenu', event.proxy); + }, + doProxy: function (e) { + var results = []; + for (var i = 0, j = _init.proxys.length; i < j; i++) { + var proxyResult = _init.proxys[i].apply(this, arguments); + results.push(proxyResult); + if (proxyResult.stop) { + break; + } + } + return results; + }, + proxy: function (e) { + var setting = data.getSetting(e.data.treeId); + if (!tools.uCanDo(setting, e)) return true; + var results = event.doProxy(e), + r = true, x = false; + for (var i = 0, l = results.length; i < l; i++) { + var proxyResult = results[i]; + if (proxyResult.nodeEventCallback) { + x = true; + r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + if (proxyResult.treeEventCallback) { + x = true; + r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + } + return r; + } + }, + //method of event handler + handler = { + onSwitchNode: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (node.open) { + if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } else { + if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } + return true; + }, + onClickNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + clickFlag = ((setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey)) && data.isSelectedNode(setting, node)) ? 0 : (setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey) && setting.view.selectedMulti) ? 2 : 1; + if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true; + if (clickFlag === 0) { + view.cancelPreSelectedNode(setting, node); + } else { + view.selectNode(setting, node, clickFlag === 2); + } + setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]); + return true; + }, + onZTreeMousedown: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]); + } + return true; + }, + onZTreeMouseup: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]); + } + return true; + }, + onZTreeDblclick: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]); + } + return true; + }, + onZTreeContextmenu: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]); + } + return (typeof setting.callback.onRightClick) != "function"; + }, + onSelectStart: function (e) { + var n = e.originalEvent.srcElement.nodeName.toLowerCase(); + return (n === "input" || n === "textarea"); + } + }, + //method of tools for zTree + tools = { + apply: function (fun, param, defaultValue) { + if ((typeof fun) == "function") { + return fun.apply(zt, param ? param : []); + } + return defaultValue; + }, + canAsync: function (setting, node) { + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + return (setting.async.enable && node && isParent && !(node.zAsync || (children && children.length > 0))); + }, + clone: function (obj) { + if (obj === null) return null; + var o = tools.isArray(obj) ? [] : {}; + for (var i in obj) { + o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? tools.clone(obj[i]) : obj[i]); + } + return o; + }, + eqs: function (str1, str2) { + return str1.toLowerCase() === str2.toLowerCase(); + }, + isArray: function (arr) { + return Object.prototype.toString.apply(arr) === "[object Array]"; + }, + isElement: function (o) { + return ( + typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2 + o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string" + ); + }, + $: function (node, exp, setting) { + if (!!exp && typeof exp != "string") { + setting = exp; + exp = ""; + } + if (typeof node == "string") { + return $(node, setting ? setting.treeObj.get(0).ownerDocument : null); + } else { + return $("#" + node.tId + exp, setting ? setting.treeObj : null); + } + }, + getMDom: function (setting, curDom, targetExpr) { + if (!curDom) return null; + while (curDom && curDom.id !== setting.treeId) { + for (var i = 0, l = targetExpr.length; curDom.tagName && i < l; i++) { + if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) { + return curDom; + } + } + curDom = curDom.parentNode; + } + return null; + }, + getNodeMainDom: function (target) { + return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0)); + }, + isChildOrSelf: function (dom, parentId) { + return ($(dom).closest("#" + parentId).length > 0); + }, + uCanDo: function (setting, e) { + return true; + } + }, + //method of operate ztree dom + view = { + addNodes: function (setting, parentNode, index, newNodes, isSilent) { + var isParent = data.nodeIsParent(setting, parentNode); + if (setting.data.keep.leaf && parentNode && !isParent) { + return; + } + if (!tools.isArray(newNodes)) { + newNodes = [newNodes]; + } + if (setting.data.simpleData.enable) { + newNodes = data.transformTozTreeFormat(setting, newNodes); + } + if (parentNode) { + var target_switchObj = $$(parentNode, consts.id.SWITCH, setting), + target_icoObj = $$(parentNode, consts.id.ICON, setting), + target_ulObj = $$(parentNode, consts.id.UL, setting); + + if (!parentNode.open) { + view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE); + view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE); + parentNode.open = false; + target_ulObj.css({ + "display": "none" + }); + } + + data.addNodesData(setting, parentNode, index, newNodes); + view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index); + if (!isSilent) { + view.expandCollapseParentNode(setting, parentNode, true); + } + } else { + data.addNodesData(setting, data.getRoot(setting), index, newNodes); + view.createNodes(setting, 0, newNodes, null, index); + } + }, + appendNodes: function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + if (!nodes) return []; + var html = []; + + var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting), + tmpPChild = data.nodeChildren(setting, tmpPNode), + isFirstNode, isLastNode; + + if (!tmpPChild || index >= tmpPChild.length - nodes.length) { + index = -1; + } + + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (initFlag) { + isFirstNode = ((index === 0 || tmpPChild.length == nodes.length) && (i == 0)); + isLastNode = (index < 0 && i == (nodes.length - 1)); + data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag); + data.addNodeCache(setting, node); + } + var isParent = data.nodeIsParent(setting, node); + + var childHtml = []; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + //make child html first, because checkType + childHtml = view.appendNodes(setting, level + 1, children, node, -1, initFlag, openFlag && node.open); + } + if (openFlag) { + view.makeDOMNodeMainBefore(html, setting, node); + view.makeDOMNodeLine(html, setting, node); + data.getBeforeA(setting, node, html); + view.makeDOMNodeNameBefore(html, setting, node); + data.getInnerBeforeA(setting, node, html); + view.makeDOMNodeIcon(html, setting, node); + data.getInnerAfterA(setting, node, html); + view.makeDOMNodeNameAfter(html, setting, node); + data.getAfterA(setting, node, html); + if (isParent && node.open) { + view.makeUlHtml(setting, node, html, childHtml.join('')); + } + view.makeDOMNodeMainAfter(html, setting, node); + data.addCreatedNode(setting, node); + } + } + return html; + }, + appendParentULDom: function (setting, node) { + var html = [], + nObj = $$(node, setting); + if (!nObj.get(0) && !!node.parentTId) { + view.appendParentULDom(setting, node.getParentNode()); + nObj = $$(node, setting); + } + var ulObj = $$(node, consts.id.UL, setting); + if (ulObj.get(0)) { + ulObj.remove(); + } + var children = data.nodeChildren(setting, node), + childHtml = view.appendNodes(setting, node.level + 1, children, node, -1, false, true); + view.makeUlHtml(setting, node, html, childHtml.join('')); + nObj.append(html.join('')); + }, + asyncNode: function (setting, node, isSilent, callback) { + var i, l; + var isParent = data.nodeIsParent(setting, node); + if (node && !isParent) { + tools.apply(callback); + return false; + } else if (node && node.isAjaxing) { + return false; + } else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) { + tools.apply(callback); + return false; + } + if (node) { + node.isAjaxing = true; + var icoObj = $$(node, consts.id.ICON, setting); + icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING}); + } + + var tmpParam = {}; + var autoParam = tools.apply(setting.async.autoParam, [setting.treeId, node], setting.async.autoParam); + for (i = 0, l = autoParam.length; node && i < l; i++) { + var pKey = autoParam[i].split("="), spKey = pKey; + if (pKey.length > 1) { + spKey = pKey[1]; + pKey = pKey[0]; + } + tmpParam[spKey] = node[pKey]; + } + var otherParam = tools.apply(setting.async.otherParam, [setting.treeId, node], setting.async.otherParam); + if (tools.isArray(otherParam)) { + for (i = 0, l = otherParam.length; i < l; i += 2) { + tmpParam[otherParam[i]] = otherParam[i + 1]; + } + } else { + for (var p in otherParam) { + tmpParam[p] = otherParam[p]; + } + } + + var _tmpV = data.getRoot(setting)._ver; + $.ajax({ + contentType: setting.async.contentType, + cache: false, + type: setting.async.type, + url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url), + data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam, + dataType: setting.async.dataType, + headers: setting.async.headers, + xhrFields: setting.async.xhrFields, + success: function (msg) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + var newNodes = []; + try { + if (!msg || msg.length == 0) { + newNodes = []; + } else if (typeof msg == "string") { + newNodes = eval("(" + msg + ")"); + } else { + newNodes = msg; + } + } catch (err) { + newNodes = msg; + } + + if (node) { + node.isAjaxing = null; + node.zAsync = true; + } + view.setNodeLineIcos(setting, node); + if (newNodes && newNodes !== "") { + newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes); + view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent); + } else { + view.addNodes(setting, node, -1, [], !!isSilent); + } + setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]); + tools.apply(callback); + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + if (node) node.isAjaxing = null; + view.setNodeLineIcos(setting, node); + setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]); + } + }); + return true; + }, + cancelPreSelectedNode: function (setting, node, excludeNode) { + var list = data.getRoot(setting).curSelectedList, + i, n; + for (i = list.length - 1; i >= 0; i--) { + n = list[i]; + if (node === n || (!node && (!excludeNode || excludeNode !== n))) { + $$(n, consts.id.A, setting).removeClass(consts.node.CURSELECTED); + if (node) { + data.removeSelectedNode(setting, node); + break; + } else { + list.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, n]); + } + } + } + }, + createNodeCallback: function (setting) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + while (root.createdNodes.length > 0) { + var node = root.createdNodes.shift(); + tools.apply(setting.view.addDiyDom, [setting.treeId, node]); + if (!!setting.callback.onNodeCreated) { + setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]); + } + } + } + }, + createNodes: function (setting, level, nodes, parentNode, index) { + if (!nodes || nodes.length == 0) return; + var root = data.getRoot(setting), + openFlag = !parentNode || parentNode.open || !!$$(data.nodeChildren(setting, parentNode)[0], setting).get(0); + root.createdNodes = []; + var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, index, true, openFlag), + parentObj, nextObj; + + if (!parentNode) { + parentObj = setting.treeObj; + //setting.treeObj.append(zTreeHtml.join('')); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + if (ulObj.get(0)) { + parentObj = ulObj; + //ulObj.append(zTreeHtml.join('')); + } + } + if (parentObj) { + if (index >= 0) { + nextObj = parentObj.children()[index]; + } + if (index >= 0 && nextObj) { + $(nextObj).before(zTreeHtml.join('')); + } else { + parentObj.append(zTreeHtml.join('')); + } + } + + view.createNodeCallback(setting); + }, + destroy: function (setting) { + if (!setting) return; + data.initCache(setting); + data.initRoot(setting); + event.unbindTree(setting); + event.unbindEvent(setting); + setting.treeObj.empty(); + delete settings[setting.treeId]; + }, + expandCollapseNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting); + var tmpCb, _callback; + if (!node) { + tools.apply(callback, []); + return; + } + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + if (root.expandTriggerFlag) { + _callback = callback; + tmpCb = function () { + if (_callback) _callback(); + if (node.open) { + setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]); + } else { + setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]); + } + }; + callback = tmpCb; + root.expandTriggerFlag = false; + } + if (!node.open && isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (children && children.length > 0 && !$$(children[0], setting).get(0)))) { + view.appendParentULDom(setting, node); + view.createNodeCallback(setting); + } + if (node.open == expandFlag) { + tools.apply(callback, []); + return; + } + var ulObj = $$(node, consts.id.UL, setting), + switchObj = $$(node, consts.id.SWITCH, setting), + icoObj = $$(node, consts.id.ICON, setting); + + if (isParent) { + node.open = !node.open; + if (node.iconOpen && node.iconClose) { + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + } + + if (node.open) { + view.replaceSwitchClass(node, switchObj, consts.folder.OPEN); + view.replaceIcoClass(node, icoObj, consts.folder.OPEN); + if (animateFlag == false || setting.view.expandSpeed == "") { + ulObj.show(); + tools.apply(callback, []); + } else { + if (children && children.length > 0) { + ulObj.slideDown(setting.view.expandSpeed, callback); + } else { + ulObj.show(); + tools.apply(callback, []); + } + } + } else { + view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE); + view.replaceIcoClass(node, icoObj, consts.folder.CLOSE); + if (animateFlag == false || setting.view.expandSpeed == "" || !(children && children.length > 0)) { + ulObj.hide(); + tools.apply(callback, []); + } else { + ulObj.slideUp(setting.view.expandSpeed, callback); + } + } + } else { + tools.apply(callback, []); + } + }, + expandCollapseParentNode: function (setting, node, expandFlag, animateFlag, callback) { + if (!node) return; + if (!node.parentTId) { + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + return; + } else { + view.expandCollapseNode(setting, node, expandFlag, animateFlag); + } + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback); + } + }, + expandCollapseSonNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting), + treeNodes = (node) ? data.nodeChildren(setting, node) : data.nodeChildren(setting, root), + selfAnimateSign = (node) ? false : animateFlag, + expandTriggerFlag = data.getRoot(setting).expandTriggerFlag; + data.getRoot(setting).expandTriggerFlag = false; + if (treeNodes) { + for (var i = 0, l = treeNodes.length; i < l; i++) { + if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign); + } + } + data.getRoot(setting).expandTriggerFlag = expandTriggerFlag; + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + }, + isSelectedNode: function (setting, node) { + if (!node) { + return false; + } + var list = data.getRoot(setting).curSelectedList, + i; + for (i = list.length - 1; i >= 0; i--) { + if (node === list[i]) { + return true; + } + } + return false; + }, + makeDOMNodeIcon: function (html, setting, node) { + var nameStr = data.nodeName(setting, node), + name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g, '&').replace(//g, '>'); + html.push("", name, ""); + }, + makeDOMNodeLine: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainBefore: function (html, setting, node) { + html.push("
            • "); + }, + makeDOMNodeNameAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeNameBefore: function (html, setting, node) { + var title = data.nodeTitle(setting, node), + url = view.makeNodeUrl(setting, node), + fontcss = view.makeNodeFontCss(setting, node), + fontStyle = []; + for (var f in fontcss) { + fontStyle.push(f, ":", fontcss[f], ";"); + } + html.push(" 0) ? "href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''), + "'"); + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) { + html.push("title='", title.replace(/'/g, "'").replace(//g, '>'), "'"); + } + html.push(">"); + }, + makeNodeFontCss: function (setting, node) { + var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss); + return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {}; + }, + makeNodeIcoClass: function (setting, node) { + var icoCss = ["ico"]; + if (!node.isAjaxing) { + var isParent = data.nodeIsParent(setting, node); + icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0]; + if (isParent) { + icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else { + icoCss.push(consts.folder.DOCU); + } + } + return consts.className.BUTTON + " " + icoCss.join('_'); + }, + makeNodeIcoStyle: function (setting, node) { + var icoStyle = []; + if (!node.isAjaxing) { + var isParent = data.nodeIsParent(setting, node); + var icon = (isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon]; + if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;"); + if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) { + icoStyle.push("width:0px;height:0px;"); + } + } + return icoStyle.join(''); + }, + makeNodeLineClass: function (setting, node) { + var lineClass = []; + if (setting.view.showLine) { + if (node.level == 0 && node.isFirstNode && node.isLastNode) { + lineClass.push(consts.line.ROOT); + } else if (node.level == 0 && node.isFirstNode) { + lineClass.push(consts.line.ROOTS); + } else if (node.isLastNode) { + lineClass.push(consts.line.BOTTOM); + } else { + lineClass.push(consts.line.CENTER); + } + } else { + lineClass.push(consts.line.NOLINE); + } + if (data.nodeIsParent(setting, node)) { + lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else { + lineClass.push(consts.folder.DOCU); + } + return view.makeNodeLineClassEx(node) + lineClass.join('_'); + }, + makeNodeLineClassEx: function (node) { + return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " "; + }, + makeNodeTarget: function (node) { + return (node.target || "_blank"); + }, + makeNodeUrl: function (setting, node) { + var urlKey = setting.data.key.url; + return node[urlKey] ? node[urlKey] : null; + }, + makeUlHtml: function (setting, node, html, content) { + html.push("
                "); + html.push(content); + html.push("
              "); + }, + makeUlLineClass: function (setting, node) { + return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : ""); + }, + removeChildNodes: function (setting, node) { + if (!node) return; + var nodes = data.nodeChildren(setting, node); + if (!nodes) return; + + for (var i = 0, l = nodes.length; i < l; i++) { + data.removeNodeCache(setting, nodes[i]); + } + data.removeSelectedNode(setting); + delete node[setting.data.key.children]; + + if (!setting.data.keep.parent) { + data.nodeIsParent(setting, node, false); + node.open = false; + var tmp_switchObj = $$(node, consts.id.SWITCH, setting), + tmp_icoObj = $$(node, consts.id.ICON, setting); + view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU); + $$(node, consts.id.UL, setting).remove(); + } else { + $$(node, consts.id.UL, setting).empty(); + } + }, + scrollIntoView: function (setting, dom) { + if (!dom) { + return; + } + // support IE 7 + if (typeof Element === 'undefined') { + var contRect = setting.treeObj.get(0).getBoundingClientRect(), + findMeRect = dom.getBoundingClientRect(); + if (findMeRect.top < contRect.top || findMeRect.bottom > contRect.bottom + || findMeRect.right > contRect.right || findMeRect.left < contRect.left) { + dom.scrollIntoView(); + } + return; + } + // CC-BY jocki84@googlemail.com, https://gist.github.com/jocki84/6ffafd003387179a988e + if (!Element.prototype.scrollIntoViewIfNeeded) { + Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) { + "use strict"; + + function makeRange(start, length) { + return {"start": start, "length": length, "end": start + length}; + } + + function coverRange(inner, outer) { + if ( + false === centerIfNeeded || + (outer.start < inner.end && inner.start < outer.end) + ) { + return Math.max( + inner.end - outer.length, + Math.min(outer.start, inner.start) + ); + } + return (inner.start + inner.end - outer.length) / 2; + } + + function makePoint(x, y) { + return { + "x": x, + "y": y, + "translate": function translate(dX, dY) { + return makePoint(x + dX, y + dY); + } + }; + } + + function absolute(elem, pt) { + while (elem) { + pt = pt.translate(elem.offsetLeft, elem.offsetTop); + elem = elem.offsetParent; + } + return pt; + } + + var target = absolute(this, makePoint(0, 0)), + extent = makePoint(this.offsetWidth, this.offsetHeight), + elem = this.parentNode, + origin; + + while (elem instanceof HTMLElement) { + // Apply desired scroll amount. + origin = absolute(elem, makePoint(elem.clientLeft, elem.clientTop)); + elem.scrollLeft = coverRange( + makeRange(target.x - origin.x, extent.x), + makeRange(elem.scrollLeft, elem.clientWidth) + ); + elem.scrollTop = coverRange( + makeRange(target.y - origin.y, extent.y), + makeRange(elem.scrollTop, elem.clientHeight) + ); + + // Determine actual scroll amount by reading back scroll properties. + target = target.translate(-elem.scrollLeft, -elem.scrollTop); + elem = elem.parentNode; + } + }; + } + dom.scrollIntoViewIfNeeded(); + }, + setFirstNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[0].isFirstNode = true; + } + }, + setLastNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[children.length - 1].isLastNode = true; + } + }, + removeNode: function (setting, node) { + var root = data.getRoot(setting), + parentNode = (node.parentTId) ? node.getParentNode() : root; + + node.isFirstNode = false; + node.isLastNode = false; + node.getPreNode = function () { + return null; + }; + node.getNextNode = function () { + return null; + }; + + if (!data.getNodeCache(setting, node.tId)) { + return; + } + + $$(node, setting).remove(); + data.removeNodeCache(setting, node); + data.removeSelectedNode(setting, node); + + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i].tId == node.tId) { + children.splice(i, 1); + break; + } + } + view.setFirstNode(setting, parentNode); + view.setLastNode(setting, parentNode); + + var tmp_ulObj, tmp_switchObj, tmp_icoObj, + childLength = children.length; + + //repair nodes old parent + if (!setting.data.keep.parent && childLength == 0) { + //old parentNode has no child nodes + data.nodeIsParent(setting, parentNode, false); + parentNode.open = false; + delete parentNode[setting.data.key.children]; + tmp_ulObj = $$(parentNode, consts.id.UL, setting); + tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting); + tmp_icoObj = $$(parentNode, consts.id.ICON, setting); + view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU); + tmp_ulObj.css("display", "none"); + + } else if (setting.view.showLine && childLength > 0) { + //old parentNode has child nodes + var newLast = children[childLength - 1]; + tmp_ulObj = $$(newLast, consts.id.UL, setting); + tmp_switchObj = $$(newLast, consts.id.SWITCH, setting); + tmp_icoObj = $$(newLast, consts.id.ICON, setting); + if (parentNode == root) { + if (children.length == 1) { + //node was root, and ztree has only one root after move node + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT); + } else { + var tmp_first_switchObj = $$(children[0], consts.id.SWITCH, setting); + view.replaceSwitchClass(children[0], tmp_first_switchObj, consts.line.ROOTS); + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + } else { + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + tmp_ulObj.removeClass(consts.line.LINE); + } + }, + replaceIcoClass: function (node, obj, newName) { + if (!obj || node.isAjaxing) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.folder.OPEN: + case consts.folder.CLOSE: + case consts.folder.DOCU: + tmpList[tmpList.length - 1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + }, + replaceSwitchClass: function (node, obj, newName) { + if (!obj) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.line.ROOT: + case consts.line.ROOTS: + case consts.line.CENTER: + case consts.line.BOTTOM: + case consts.line.NOLINE: + tmpList[0] = view.makeNodeLineClassEx(node) + newName; + break; + case consts.folder.OPEN: + case consts.folder.CLOSE: + case consts.folder.DOCU: + tmpList[1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + if (newName !== consts.folder.DOCU) { + obj.removeAttr("disabled"); + } else { + obj.attr("disabled", "disabled"); + } + }, + selectNode: function (setting, node, addFlag) { + if (!addFlag) { + view.cancelPreSelectedNode(setting, null, node); + } + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED); + data.addSelectedNode(setting, node); + setting.treeObj.trigger(consts.event.SELECTED, [setting.treeId, node]); + }, + setNodeFontCss: function (setting, treeNode) { + var aObj = $$(treeNode, consts.id.A, setting), + fontCss = view.makeNodeFontCss(setting, treeNode); + if (fontCss) { + aObj.css(fontCss); + } + }, + setNodeLineIcos: function (setting, node) { + if (!node) return; + var switchObj = $$(node, consts.id.SWITCH, setting), + ulObj = $$(node, consts.id.UL, setting), + icoObj = $$(node, consts.id.ICON, setting), + ulLine = view.makeUlLineClass(setting, node); + if (ulLine.length == 0) { + ulObj.removeClass(consts.line.LINE); + } else { + ulObj.addClass(ulLine); + } + switchObj.attr("class", view.makeNodeLineClass(setting, node)); + if (data.nodeIsParent(setting, node)) { + switchObj.removeAttr("disabled"); + } else { + switchObj.attr("disabled", "disabled"); + } + icoObj.removeAttr("style"); + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + icoObj.attr("class", view.makeNodeIcoClass(setting, node)); + }, + setNodeName: function (setting, node) { + var title = data.nodeTitle(setting, node), + nObj = $$(node, consts.id.SPAN, setting); + nObj.empty(); + if (setting.view.nameIsHTML) { + nObj.html(data.nodeName(setting, node)); + } else { + nObj.text(data.nodeName(setting, node)); + } + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("title", !title ? "" : title); + } + }, + setNodeTarget: function (setting, node) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("target", view.makeNodeTarget(node)); + }, + setNodeUrl: function (setting, node) { + var aObj = $$(node, consts.id.A, setting), + url = view.makeNodeUrl(setting, node); + if (url == null || url.length == 0) { + aObj.removeAttr("href"); + } else { + aObj.attr("href", url); + } + }, + switchNode: function (setting, node) { + if (node.open || !tools.canAsync(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + } else if (setting.async.enable) { + if (!view.asyncNode(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + return; + } + } else if (node) { + view.expandCollapseNode(setting, node, !node.open); + } + } + }; + // zTree defind + $.fn.zTree = { + consts: _consts, + _z: { + tools: tools, + view: view, + event: event, + data: data + }, + getZTreeObj: function (treeId) { + var o = data.getZTreeTools(treeId); + return o ? o : null; + }, + destroy: function (treeId) { + if (!!treeId && treeId.length > 0) { + view.destroy(data.getSetting(treeId)); + } else { + for (var s in settings) { + view.destroy(settings[s]); + } + } + }, + init: function (obj, zSetting, zNodes) { + var setting = tools.clone(_setting); + $.extend(true, setting, zSetting); + setting.treeId = obj.attr("id"); + setting.treeObj = obj; + setting.treeObj.empty(); + settings[setting.treeId] = setting; + //For some older browser,(e.g., ie6) + if (typeof document.body.style.maxHeight === "undefined") { + setting.view.expandSpeed = ""; + } + data.initRoot(setting); + var root = data.getRoot(setting); + zNodes = zNodes ? tools.clone(tools.isArray(zNodes) ? zNodes : [zNodes]) : []; + if (setting.data.simpleData.enable) { + data.nodeChildren(setting, root, data.transformTozTreeFormat(setting, zNodes)); + } else { + data.nodeChildren(setting, root, zNodes); + } + + data.initCache(setting); + event.unbindTree(setting); + event.bindTree(setting); + event.unbindEvent(setting); + event.bindEvent(setting); + + var zTreeTools = { + setting: setting, + addNodes: function (parentNode, index, newNodes, isSilent) { + if (!parentNode) parentNode = null; + var isParent = data.nodeIsParent(setting, parentNode); + if (parentNode && !isParent && setting.data.keep.leaf) return null; + + var i = parseInt(index, 10); + if (isNaN(i)) { + isSilent = !!newNodes; + newNodes = index; + index = -1; + } else { + index = i; + } + if (!newNodes) return null; + + + var xNewNodes = tools.clone(tools.isArray(newNodes) ? newNodes : [newNodes]); + + function addCallback() { + view.addNodes(setting, parentNode, index, xNewNodes, (isSilent == true)); + } + + if (tools.canAsync(setting, parentNode)) { + view.asyncNode(setting, parentNode, isSilent, addCallback); + } else { + addCallback(); + } + return xNewNodes; + }, + cancelSelectedNode: function (node) { + view.cancelPreSelectedNode(setting, node); + }, + destroy: function () { + view.destroy(setting); + }, + expandAll: function (expandFlag) { + expandFlag = !!expandFlag; + view.expandCollapseSonNode(setting, null, expandFlag, true); + return expandFlag; + }, + expandNode: function (node, expandFlag, sonSign, focus, callbackFlag) { + if (!node || !data.nodeIsParent(setting, node)) return null; + if (expandFlag !== true && expandFlag !== false) { + expandFlag = !node.open; + } + callbackFlag = !!callbackFlag; + + if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) { + return null; + } else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) { + return null; + } + if (expandFlag && node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false); + } + if (expandFlag === node.open && !sonSign) { + return null; + } + + data.getRoot(setting).expandTriggerFlag = callbackFlag; + if (!tools.canAsync(setting, node) && sonSign) { + view.expandCollapseSonNode(setting, node, expandFlag, true, showNodeFocus); + } else { + node.open = !expandFlag; + view.switchNode(this.setting, node); + showNodeFocus(); + } + return expandFlag; + + function showNodeFocus() { + var a = $$(node, setting).get(0); + if (a && focus !== false) { + view.scrollIntoView(setting, a); + } + } + }, + getNodes: function () { + return data.getNodes(setting); + }, + getNodeByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodeByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodeByTId: function (tId) { + return data.getNodeCache(setting, tId); + }, + getNodesByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByParamFuzzy: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParamFuzzy(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByFilter: function (filter, isSingle, parentNode, invokeParam) { + isSingle = !!isSingle; + if (!filter || (typeof filter != "function")) return (isSingle ? null : []); + return data.getNodesByFilter(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), filter, isSingle, invokeParam); + }, + getNodeIndex: function (node) { + if (!node) return null; + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] == node) return i; + } + return -1; + }, + getSelectedNodes: function () { + var r = [], list = data.getRoot(setting).curSelectedList; + for (var i = 0, l = list.length; i < l; i++) { + r.push(list[i]); + } + return r; + }, + isSelectedNode: function (node) { + return data.isSelectedNode(setting, node); + }, + reAsyncChildNodesPromise: function (parentNode, reloadType, isSilent) { + var promise = new Promise(function (resolve, reject) { + try { + zTreeTools.reAsyncChildNodes(parentNode, reloadType, isSilent, function () { + resolve(parentNode); + }); + } catch (e) { + reject(e); + } + }); + return promise; + }, + reAsyncChildNodes: function (parentNode, reloadType, isSilent, callback) { + if (!this.setting.async.enable) return; + var isRoot = !parentNode; + if (isRoot) { + parentNode = data.getRoot(setting); + } + if (reloadType == "refresh") { + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children ? children.length : 0; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + data.removeSelectedNode(setting); + data.nodeChildren(setting, parentNode, []); + if (isRoot) { + this.setting.treeObj.empty(); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + ulObj.empty(); + } + } + view.asyncNode(this.setting, isRoot ? null : parentNode, !!isSilent, callback); + }, + refresh: function () { + this.setting.treeObj.empty(); + var root = data.getRoot(setting), + nodes = data.nodeChildren(setting, root); + data.initRoot(setting); + data.nodeChildren(setting, root, nodes); + data.initCache(setting); + view.createNodes(setting, 0, data.nodeChildren(setting, root), null, -1); + }, + removeChildNodes: function (node) { + if (!node) return null; + var nodes = data.nodeChildren(setting, node); + view.removeChildNodes(setting, node); + return nodes ? nodes : null; + }, + removeNode: function (node, callbackFlag) { + if (!node) return; + callbackFlag = !!callbackFlag; + if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return; + view.removeNode(setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + } + }, + selectNode: function (node, addFlag, isSilent) { + if (!node) return; + if (tools.uCanDo(setting)) { + addFlag = setting.view.selectedMulti && addFlag; + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, false, showNodeFocus); + } else if (!isSilent) { + try { + $$(node, setting).focus().blur(); + } catch (e) { + } + } + view.selectNode(setting, node, addFlag); + } + + function showNodeFocus() { + if (isSilent) { + return; + } + var a = $$(node, setting).get(0); + view.scrollIntoView(setting, a); + } + }, + transformTozTreeNodes: function (simpleNodes) { + return data.transformTozTreeFormat(setting, simpleNodes); + }, + transformToArray: function (nodes) { + return data.transformToArrayFormat(setting, nodes); + }, + updateNode: function (node, checkTypeFlag) { + if (!node) return; + var nObj = $$(node, setting); + if (nObj.get(0) && tools.uCanDo(setting)) { + view.setNodeName(setting, node); + view.setNodeTarget(setting, node); + view.setNodeUrl(setting, node); + view.setNodeLineIcos(setting, node); + view.setNodeFontCss(setting, node); + } + } + }; + root.treeTools = zTreeTools; + data.setZTreeTools(setting, zTreeTools); + var children = data.nodeChildren(setting, root); + if (children && children.length > 0) { + view.createNodes(setting, 0, children, null, -1); + } else if (setting.async.enable && setting.async.url && setting.async.url !== '') { + view.asyncNode(setting); + } + return zTreeTools; + } + }; + + var zt = $.fn.zTree, + $$ = tools.$, + consts = zt.consts; +})(jQuery); +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of excheck + var _consts = { + event: { + CHECK: "ztree_check" + }, + id: { + CHECK: "_check" + }, + checkbox: { + STYLE: "checkbox", + DEFAULT: "chk", + DISABLED: "disable", + FALSE: "false", + TRUE: "true", + FULL: "full", + PART: "part", + FOCUS: "focus" + }, + radio: { + STYLE: "radio", + TYPE_ALL: "all", + TYPE_LEVEL: "level" + } + }, + //default setting of excheck + _setting = { + check: { + enable: false, + autoCheckTrigger: false, + chkStyle: _consts.checkbox.STYLE, + nocheckInherit: false, + chkDisabledInherit: false, + radioType: _consts.radio.TYPE_LEVEL, + chkboxType: { + "Y": "ps", + "N": "ps" + } + }, + data: { + key: { + checked: "checked" + } + }, + callback: { + beforeCheck: null, + onCheck: null + } + }, + //default root of excheck + _initRoot = function (setting) { + var r = data.getRoot(setting); + r.radioCheckedList = []; + }, + //default cache of excheck + _initCache = function (treeId) { + }, + //default bind event of excheck + _bindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.bind(c.CHECK, function (event, srcEvent, treeId, node) { + event.srcEvent = srcEvent; + tools.apply(setting.callback.onCheck, [event, treeId, node]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.unbind(c.CHECK); + }, + //default event proxy of excheck + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null; + + if (tools.eqs(e.type, "mouseover")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoverCheck"; + } + } else if (tools.eqs(e.type, "mouseout")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoutCheck"; + } + } else if (tools.eqs(e.type, "click")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "checkNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "checkNode" : + nodeEventCallback = _handler.onCheckNode; + break; + case "mouseoverCheck" : + nodeEventCallback = _handler.onMouseoverCheck; + break; + case "mouseoutCheck" : + nodeEventCallback = _handler.onMouseoutCheck; + break; + } + } + var proxyResult = { + stop: nodeEventType === "checkNode", + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of excheck + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var checked = data.nodeChecked(setting, n); + n.checkedOld = checked; + if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true"); + n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck); + if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true"); + n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled); + if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true"); + n.halfCheck = !!n.halfCheck; + n.check_Child_State = -1; + n.check_Focus = false; + n.getCheckStatus = function () { + return data.getCheckStatus(setting, n); + }; + + if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && checked) { + var r = data.getRoot(setting); + r.radioCheckedList.push(n); + } + }, + //add dom for check + _beforeA = function (setting, node, html) { + if (setting.check.enable) { + data.makeChkFlag(setting, node); + html.push(""); + } + }, + //update zTreeObj, add method of check + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.checkNode = function (node, checked, checkTypeFlag, callbackFlag) { + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) return; + if (checked !== true && checked !== false) { + checked = !nodeChecked; + } + callbackFlag = !!callbackFlag; + + if (nodeChecked === checked && !checkTypeFlag) { + return; + } else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) { + return; + } + if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) { + data.nodeChecked(setting, node, checked); + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]); + } + } + } + + zTreeTools.checkAllNodes = function (checked) { + view.repairAllChk(this.setting, !!checked); + } + + zTreeTools.getCheckedNodes = function (checked) { + var checked = (checked !== false); + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeCheckedNodes(this.setting, children, checked); + } + + zTreeTools.getChangeCheckedNodes = function () { + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeChangeCheckedNodes(this.setting, children); + } + + zTreeTools.setChkDisabled = function (node, disabled, inheritParent, inheritChildren) { + disabled = !!disabled; + inheritParent = !!inheritParent; + inheritChildren = !!inheritChildren; + view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren); + view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent); + } + + var _updateNode = zTreeTools.updateNode; + zTreeTools.updateNode = function (node, checkTypeFlag) { + if (_updateNode) _updateNode.apply(zTreeTools, arguments); + if (!node || !this.setting.check.enable) return; + var nObj = $$(node, this.setting); + if (nObj.get(0) && tools.uCanDo(this.setting)) { + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + } + } + }, + //method of operate data + _data = { + getRadioCheckedList: function (setting) { + var checkedList = data.getRoot(setting).radioCheckedList; + for (var i = 0, j = checkedList.length; i < j; i++) { + if (!data.getNodeCache(setting, checkedList[i].tId)) { + checkedList.splice(i, 1); + i--; + j--; + } + } + return checkedList; + }, + getCheckStatus: function (setting, node) { + if (!setting.check.enable || node.nocheck || node.chkDisabled) return null; + var checked = data.nodeChecked(setting, node), + r = { + checked: checked, + half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (checked ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0))) + }; + return r; + }, + getTreeCheckedNodes: function (setting, nodes, checked, results) { + if (!nodes) return []; + var onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL); + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked == checked) { + results.push(node); + if (onlyOne) { + break; + } + } + data.getTreeCheckedNodes(setting, children, checked, results); + if (onlyOne && results.length > 0) { + break; + } + } + return results; + }, + getTreeChangeCheckedNodes: function (setting, nodes, results) { + if (!nodes) return []; + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked != node.checkedOld) { + results.push(node); + } + data.getTreeChangeCheckedNodes(setting, children, results); + } + return results; + }, + makeChkFlag: function (setting, node) { + if (!node) return; + var chkFlag = -1; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var cNode = children[i]; + var nodeChecked = data.nodeChecked(setting, cNode); + var tmp = -1; + if (setting.check.chkStyle == consts.radio.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 2; + } else if (nodeChecked) { + tmp = 2; + } else { + tmp = cNode.check_Child_State > 0 ? 2 : 0; + } + if (tmp == 2) { + chkFlag = 2; + break; + } else if (tmp == 0) { + chkFlag = 0; + } + } else if (setting.check.chkStyle == consts.checkbox.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 1; + } else if (nodeChecked) { + tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1; + } else { + tmp = (cNode.check_Child_State > 0) ? 1 : 0; + } + if (tmp === 1) { + chkFlag = 1; + break; + } else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) { + chkFlag = 1; + break; + } else if (chkFlag === 2 && tmp > -1 && tmp < 2) { + chkFlag = 1; + break; + } else if (tmp > -1) { + chkFlag = tmp; + } + } + } + } + node.check_Child_State = chkFlag; + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onCheckNode: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true; + var nodeChecked = data.nodeChecked(setting, node); + data.nodeChecked(setting, node, !nodeChecked); + view.checkNodeRelation(setting, node); + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + view.repairParentChkClassWithSelf(setting, node); + setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]); + return true; + }, + onMouseoverCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = true; + view.setChkClass(setting, checkObj, node); + return true; + }, + onMouseoutCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = false; + view.setChkClass(setting, checkObj, node); + return true; + } + }, + //method of tools for zTree + _tools = {}, + //method of operate ztree dom + _view = { + checkNodeRelation: function (setting, node) { + var pNode, i, l, + r = consts.radio; + var nodeChecked = data.nodeChecked(setting, node); + if (setting.check.chkStyle == r.STYLE) { + var checkedList = data.getRadioCheckedList(setting); + if (nodeChecked) { + if (setting.check.radioType == r.TYPE_ALL) { + for (i = checkedList.length - 1; i >= 0; i--) { + pNode = checkedList[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + checkedList.splice(i, 1); + + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + if (pNode.parentTId != node.parentTId) { + view.repairParentChkClassWithSelf(setting, pNode); + } + } + } + checkedList.push(node); + } else { + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (i = 0, l = children.length; i < l; i++) { + pNode = children[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + } + } + } + } else if (setting.check.radioType == r.TYPE_ALL) { + for (i = 0, l = checkedList.length; i < l; i++) { + if (node == checkedList[i]) { + checkedList.splice(i, 1); + break; + } + } + } + + } else { + var children = data.nodeChildren(setting, node); + if (nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.Y.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, true); + } + if (!nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.N.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, false); + } + if (nodeChecked && setting.check.chkboxType.Y.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, true); + } + if (!nodeChecked && setting.check.chkboxType.N.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, false); + } + } + }, + makeChkClass: function (setting, node) { + var c = consts.checkbox, r = consts.radio, + fullStyle = ""; + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) { + fullStyle = c.DISABLED; + } else if (node.halfCheck) { + fullStyle = c.PART; + } else if (setting.check.chkStyle == r.STYLE) { + fullStyle = (node.check_Child_State < 1) ? c.FULL : c.PART; + } else { + fullStyle = nodeChecked ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL : c.PART) : ((node.check_Child_State < 1) ? c.FULL : c.PART); + } + var chkName = setting.check.chkStyle + "_" + (nodeChecked ? c.TRUE : c.FALSE) + "_" + fullStyle; + chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName; + return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName; + }, + repairAllChk: function (setting, checked) { + if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) { + var root = data.getRoot(setting); + var children = data.nodeChildren(setting, root); + for (var i = 0, l = children.length; i < l; i++) { + var node = children[i]; + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, checked); + } + view.setSonNodeCheckBox(setting, node, checked); + } + } + }, + repairChkClass: function (setting, node) { + if (!node) return; + data.makeChkFlag(setting, node); + if (node.nocheck !== true) { + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + } + }, + repairParentChkClass: function (setting, node) { + if (!node || !node.parentTId) return; + var pNode = node.getParentNode(); + view.repairChkClass(setting, pNode); + view.repairParentChkClass(setting, pNode); + }, + repairParentChkClassWithSelf: function (setting, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + view.repairParentChkClass(setting, children[0]); + } else { + view.repairParentChkClass(setting, node); + } + }, + repairSonChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + var children = data.nodeChildren(setting, node); + if (children && inherit) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit); + } + } + }, + repairParentChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled && inherit) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit); + }, + setChkClass: function (setting, obj, node) { + if (!obj) return; + if (node.nocheck === true) { + obj.hide(); + } else { + obj.show(); + } + obj.attr('class', view.makeChkClass(setting, node)); + }, + setParentNodeCheckBox: function (setting, node, value, srcNode) { + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + data.makeChkFlag(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + if (node.parentTId) { + var pSign = true; + if (!value) { + var pNodes = data.nodeChildren(setting, node.getParentNode()); + for (var i = 0, l = pNodes.length; i < l; i++) { + var pNode = pNodes[i]; + var nodeChecked = data.nodeChecked(setting, pNode); + if ((pNode.nocheck !== true && pNode.chkDisabled !== true && nodeChecked) + || ((pNode.nocheck === true || pNode.chkDisabled === true) && pNode.check_Child_State > 0)) { + pSign = false; + break; + } + } + } + if (pSign) { + view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode); + } + } + }, + setSonNodeCheckBox: function (setting, node, value, srcNode) { + if (!node) return; + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + + var hasDisable = false; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.setSonNodeCheckBox(setting, sNode, value, srcNode); + if (sNode.chkDisabled === true) hasDisable = true; + } + } + + if (node != data.getRoot(setting) && node.chkDisabled !== true) { + if (hasDisable && node.nocheck !== true) { + data.makeChkFlag(setting, node); + } + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + if (!hasDisable) node.check_Child_State = (children && children.length > 0) ? (value ? 2 : 0) : -1; + } else { + node.check_Child_State = -1; + } + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.nodeChecked = function (setting, node, newChecked) { + if (!node) { + return false; + } + var key = setting.data.key.checked; + if (typeof newChecked !== 'undefined') { + if (typeof newChecked === "string") { + newChecked = tools.eqs(newChecked, "true"); + } + newChecked = !!newChecked; + node[key] = newChecked; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy, true); + data.addInitRoot(_initRoot); + data.addBeforeA(_beforeA); + data.addZTreeTools(_zTreeTools); + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) _createNodes.apply(view, arguments); + if (!nodes) return; + view.repairParentChkClassWithSelf(setting, parentNode); + } + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var parentNode = node.getParentNode(); + if (_removeNode) _removeNode.apply(view, arguments); + if (!node || !parentNode) return; + view.repairChkClass(setting, parentNode); + view.repairParentChkClass(setting, parentNode); + } + + var _appendNodes = view.appendNodes; + view.appendNodes = function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + var html = ""; + if (_appendNodes) { + html = _appendNodes.apply(view, arguments); + } + if (parentNode) { + data.makeChkFlag(setting, parentNode); + } + return html; + } +})(jQuery); +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of exedit + var _consts = { + event: { + DRAG: "ztree_drag", + DROP: "ztree_drop", + RENAME: "ztree_rename", + DRAGMOVE: "ztree_dragmove" + }, + id: { + EDIT: "_edit", + INPUT: "_input", + REMOVE: "_remove" + }, + move: { + TYPE_INNER: "inner", + TYPE_PREV: "prev", + TYPE_NEXT: "next" + }, + node: { + CURSELECTED_EDIT: "curSelectedNode_Edit", + TMPTARGET_TREE: "tmpTargetzTree", + TMPTARGET_NODE: "tmpTargetNode" + } + }, + //default setting of exedit + _setting = { + edit: { + enable: false, + editNameSelectAll: false, + showRemoveBtn: true, + showRenameBtn: true, + removeTitle: "remove", + renameTitle: "rename", + drag: { + autoExpandTrigger: false, + isCopy: true, + isMove: true, + prev: true, + next: true, + inner: true, + minMoveSize: 5, + borderMax: 10, + borderMin: -5, + maxShowNodeNum: 5, + autoOpenTime: 500 + } + }, + view: { + addHoverDom: null, + removeHoverDom: null + }, + callback: { + beforeDrag: null, + beforeDragOpen: null, + beforeDrop: null, + beforeEditName: null, + beforeRename: null, + onDrag: null, + onDragMove: null, + onDrop: null, + onRename: null + } + }, + //default root of exedit + _initRoot = function (setting) { + var r = data.getRoot(setting), rs = data.getRoots(); + r.curEditNode = null; + r.curEditInput = null; + r.curHoverNode = null; + r.dragFlag = 0; + r.dragNodeShowBefore = []; + r.dragMaskList = new Array(); + rs.showHoverDom = true; + }, + //default cache of exedit + _initCache = function (treeId) { + }, + //default bind event of exedit + _bindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) { + tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]); + }); + + o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DRAGMOVE, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDragMove, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) { + tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.unbind(c.RENAME); + o.unbind(c.DRAG); + o.unbind(c.DRAGMOVE); + o.unbind(c.DROP); + }, + //default event proxy of exedit + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + relatedTarget = e.relatedTarget, + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null, + tmp = null; + + if (tools.eqs(e.type, "mouseover")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "hoverOverNode"; + } + } else if (tools.eqs(e.type, "mouseout")) { + tmp = tools.getMDom(setting, relatedTarget, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (!tmp) { + tId = "remove"; + nodeEventType = "hoverOutNode"; + } + } else if (tools.eqs(e.type, "mousedown")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "mousedownNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "mousedownNode" : + nodeEventCallback = _handler.onMousedownNode; + break; + case "hoverOverNode" : + nodeEventCallback = _handler.onHoverOverNode; + break; + case "hoverOutNode" : + nodeEventCallback = _handler.onHoverOutNode; + break; + } + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of exedit + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + n.isHover = false; + n.editNameFlag = false; + }, + //update zTreeObj, add method of edit + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.cancelEditName = function (newName) { + var root = data.getRoot(this.setting); + if (!root.curEditNode) return; + view.cancelCurEditNode(this.setting, newName ? newName : null, true); + } + zTreeTools.copyNode = function (targetNode, node, moveType, isSilent) { + if (!node) return null; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null; + var _this = this, + newNode = tools.clone(node); + if (!targetNode) { + targetNode = null; + moveType = consts.move.TYPE_INNER; + } + if (moveType == consts.move.TYPE_INNER) { + function copyCallback() { + view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent); + } + + if (tools.canAsync(this.setting, targetNode)) { + view.asyncNode(this.setting, targetNode, isSilent, copyCallback); + } else { + copyCallback(); + } + } else { + view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent); + view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent); + } + return newNode; + } + zTreeTools.editName = function (node) { + if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return; + if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true); + view.editNode(this.setting, node) + } + zTreeTools.moveNode = function (targetNode, node, moveType, isSilent) { + if (!node) return node; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) { + return null; + } else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) { + return null; + } else if (!targetNode) { + targetNode = null; + } + var _this = this; + + function moveCallback() { + view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent); + } + + if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) { + view.asyncNode(this.setting, targetNode, isSilent, moveCallback); + } else { + moveCallback(); + } + return node; + } + zTreeTools.setEditable = function (editable) { + this.setting.edit.enable = editable; + return this.refresh(); + } + }, + //method of operate data + _data = { + setSonNodeLevel: function (setting, parentNode, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + node.level = (parentNode) ? parentNode.level + 1 : 0; + if (!children) return; + for (var i = 0, l = children.length; i < l; i++) { + if (children[i]) data.setSonNodeLevel(setting, node, children[i]); + } + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onHoverOverNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode != node) { + _handler.onHoverOutNode(event); + } + root.curHoverNode = node; + view.addHoverDom(setting, node); + }, + onHoverOutNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) { + view.removeTreeDom(setting, root.curHoverNode); + root.curHoverNode = null; + } + }, + onMousedownNode: function (eventMouseDown, _node) { + var i, l, + setting = data.getSetting(eventMouseDown.data.treeId), + root = data.getRoot(setting), roots = data.getRoots(); + //right click can't drag & drop + if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true; + + //input of edit node name can't drag & drop + var target = eventMouseDown.target, + _nodes = data.getRoot(setting).curSelectedList, + nodes = []; + if (!data.isSelectedNode(setting, _node)) { + nodes = [_node]; + } else { + for (i = 0, l = _nodes.length; i < l; i++) { + if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode" + consts.id.INPUT) !== null) { + return true; + } + nodes.push(_nodes[i]); + if (nodes[0].parentTId !== _nodes[i].parentTId) { + nodes = [_node]; + break; + } + } + } + + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + + var doc = $(setting.treeObj.get(0).ownerDocument), + body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget, + isOtherTree = false, + targetSetting = setting, + sourceSetting = setting, + preNode, nextNode, + preTmpTargetNodeId = null, + preTmpMoveType = null, + tmpTargetNodeId = null, + moveType = consts.move.TYPE_INNER, + mouseDownX = eventMouseDown.clientX, + mouseDownY = eventMouseDown.clientY, + startTime = (new Date()).getTime(); + + if (tools.uCanDo(setting)) { + doc.bind("mousemove", _docMouseMove); + } + + function _docMouseMove(event) { + //avoid start drag after click node + if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize + && Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) { + return true; + } + var i, l, tmpNode, tmpDom, tmpNodes; + body.css("cursor", "pointer"); + + if (root.dragFlag == 0) { + if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) { + _docMouseUp(event); + return true; + } + + for (i = 0, l = nodes.length; i < l; i++) { + if (i == 0) { + root.dragNodeShowBefore = []; + } + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + root.dragNodeShowBefore[tmpNode.tId] = true; + } else { + root.dragNodeShowBefore[tmpNode.tId] = false; + } + } + + root.dragFlag = 1; + roots.showHoverDom = false; + tools.showIfameMask(setting, true); + + //sort + var isOrder = true, lastIndex = -1; + if (nodes.length > 1) { + var pNodes = nodes[0].parentTId ? data.nodeChildren(setting, nodes[0].getParentNode()) : data.getNodes(setting); + tmpNodes = []; + for (i = 0, l = pNodes.length; i < l; i++) { + if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) { + if (isOrder && lastIndex > -1 && (lastIndex + 1) !== i) { + isOrder = false; + } + tmpNodes.push(pNodes[i]); + lastIndex = i; + } + if (nodes.length === tmpNodes.length) { + nodes = tmpNodes; + break; + } + } + } + if (isOrder) { + preNode = nodes[0].getPreNode(); + nextNode = nodes[nodes.length - 1].getNextNode(); + } + + //set node in selected + curNode = $$("
                ", setting); + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + tmpNode.editNameFlag = false; + view.selectNode(setting, tmpNode, i > 0); + view.removeTreeDom(setting, tmpNode); + + if (i > setting.edit.drag.maxShowNodeNum - 1) { + continue; + } + + tmpDom = $$("
              • ", setting); + tmpDom.append($$(tmpNode, consts.id.A, setting).clone()); + tmpDom.css("padding", "0"); + tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED); + curNode.append(tmpDom); + if (i == setting.edit.drag.maxShowNodeNum - 1) { + tmpDom = $$("
              • ...
              • ", setting); + curNode.append(tmpDom); + } + } + curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp"); + curNode.addClass(setting.treeObj.attr("class")); + curNode.appendTo(body); + + tmpArrow = $$("", setting); + tmpArrow.attr("id", "zTreeMove_arrow_tmp"); + tmpArrow.appendTo(body); + + setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]); + } + + if (root.dragFlag == 1) { + if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft() + 2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) { + var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget); + event.target = (xT.length > 0) ? xT.get(0) : event.target; + } else if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tmpTarget = null; + tmpTargetNodeId = null; + + //judge drag & drop in multi ztree + isOtherTree = false; + targetSetting = setting; + var settings = data.getSettings(); + for (var s in settings) { + if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId + && (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length > 0)) { + isOtherTree = true; + targetSetting = settings[s]; + } + } + + var docScrollTop = doc.scrollTop(), + docScrollLeft = doc.scrollLeft(), + treeOffset = targetSetting.treeObj.offset(), + scrollHeight = targetSetting.treeObj.get(0).scrollHeight, + scrollWidth = targetSetting.treeObj.get(0).scrollWidth, + dTop = (event.clientY + docScrollTop - treeOffset.top), + dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop), + dLeft = (event.clientX + docScrollLeft - treeOffset.left), + dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft), + isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin), + isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin), + isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin), + isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin), + isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin, + isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0), + isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height() + 10) >= scrollHeight), + isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0), + isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width() + 10) >= scrollWidth); + + if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //get node
              • dom + var targetObj = event.target; + while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) { + targetObj = targetObj.parentNode; + } + + var canMove = true; + //don't move to self or children of self + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (targetObj.id === tmpNode.tId) { + canMove = false; + break; + } else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) { + canMove = false; + break; + } + } + if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) { + tmpTarget = $(targetObj); + tmpTargetNodeId = targetObj.id; + } + } + + //the mouse must be in zTree + tmpNode = nodes[0]; + if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //judge mouse move in root of ztree + if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) { + tmpTarget = targetSetting.treeObj; + } + //auto scroll top + if (isTop) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() - 10); + } else if (isBottom) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() + 10); + } + if (isLeft) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() - 10); + } else if (isRight) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + 10); + } + //auto scroll left + if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + tmpTarget.offset().left - targetSetting.treeObj.offset().left); + } + } + + curNode.css({ + "top": (event.clientY + docScrollTop + 3) + "px", + "left": (event.clientX + docScrollLeft + 3) + "px" + }); + + var dX = 0; + var dY = 0; + if (tmpTarget && tmpTarget.attr("id") != targetSetting.treeId) { + var tmpTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId), + isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy), + isPrev = !!(preNode && tmpTargetNodeId === preNode.tId), + isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId), + isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId), + canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev), + canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next), + canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !data.nodeIsParent(setting, tmpTargetNode)) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner); + + function clearMove() { + tmpTarget = null; + tmpTargetNodeId = ""; + moveType = consts.move.TYPE_INNER; + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null + } + } + + if (!canPrev && !canNext && !canInner) { + clearMove(); + } else { + var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget), + tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()), + tmpTop = tmpTargetA.offset().top, + tmpLeft = tmpTargetA.offset().left, + prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1)) : -1, + nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0)) : -1, + dY_percent = (event.clientY + docScrollTop - tmpTop) / tmpTargetA.height(); + + if ((prevPercent == 1 || dY_percent <= prevPercent && dY_percent >= -.2) && canPrev) { + dX = 1 - tmpArrow.width(); + dY = tmpTop - tmpArrow.height() / 2; + moveType = consts.move.TYPE_PREV; + } else if ((nextPercent == 0 || dY_percent >= nextPercent && dY_percent <= 1.2) && canNext) { + dX = 1 - tmpArrow.width(); + dY = (tmpNextA == null || (data.nodeIsParent(setting, tmpTargetNode) && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height() / 2) : (tmpNextA.offset().top - tmpArrow.height() / 2); + moveType = consts.move.TYPE_NEXT; + } else if (canInner) { + dX = 5 - tmpArrow.width(); + dY = tmpTop; + moveType = consts.move.TYPE_INNER; + } else { + clearMove(); + } + + if (tmpTarget) { + tmpArrow.css({ + "display": "block", + "top": dY + "px", + "left": (tmpLeft + dX) + "px" + }); + tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType); + + if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) { + startTime = (new Date()).getTime(); + } + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && moveType == consts.move.TYPE_INNER) { + var startTimer = true; + if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) { + startTimer = false; + } + if (startTimer) { + window.zTreeMoveTimer = setTimeout(function () { + if (moveType != consts.move.TYPE_INNER) return; + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime + && tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) { + view.switchNode(targetSetting, tmpTargetNode); + if (targetSetting.edit.drag.autoExpandTrigger) { + targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]); + } + } + }, targetSetting.edit.drag.autoOpenTime + 50); + window.zTreeMoveTargetNodeTId = tmpTargetNode.tId; + } + } + } + } + } else { + moveType = consts.move.TYPE_INNER; + if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) { + tmpTarget.addClass(consts.node.TMPTARGET_TREE); + } else { + tmpTarget = null; + } + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + } + preTmpTargetNodeId = tmpTargetNodeId; + preTmpMoveType = moveType; + + setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]); + } + return false; + } + + doc.bind("mouseup", _docMouseUp); + + function _docMouseUp(event) { + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + preTmpTargetNodeId = null; + preTmpMoveType = null; + doc.unbind("mousemove", _docMouseMove); + doc.unbind("mouseup", _docMouseUp); + doc.unbind("selectstart", _docSelect); + body.css("cursor", ""); + if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tools.showIfameMask(setting, false); + + roots.showHoverDom = true; + if (root.dragFlag == 0) return; + root.dragFlag = 0; + + var i, l, tmpNode; + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + delete root.dragNodeShowBefore[tmpNode.tId]; + } + } + + if (curNode) curNode.remove(); + if (tmpArrow) tmpArrow.remove(); + + var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy); + if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId == nodes[0].parentTId && moveType == consts.move.TYPE_INNER) { + tmpTarget = null; + } + if (tmpTarget) { + var dragTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId); + if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) { + view.selectNodes(sourceSetting, nodes); + return; + } + var newNodes = isCopy ? tools.clone(nodes) : nodes; + + function dropCallback() { + if (isOtherTree) { + if (!isCopy) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.removeNode(setting, nodes[i]); + } + } + if (moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } + } else { + if (isCopy && moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else if (isCopy) { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } else { + if (moveType != consts.move.TYPE_NEXT) { + for (i = 0, l = newNodes.length; i < l; i++) { + view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false); + } + } else { + for (i = -1, l = newNodes.length - 1; i < l; l--) { + view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false); + } + } + } + } + view.selectNodes(targetSetting, newNodes); + + var a = $$(newNodes[0], setting).get(0); + view.scrollIntoView(setting, a); + + setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]); + } + + if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) { + view.asyncNode(targetSetting, dragTargetNode, false, dropCallback); + } else { + dropCallback(); + } + + } else { + view.selectNodes(sourceSetting, nodes); + setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]); + } + } + + doc.bind("selectstart", _docSelect); + + function _docSelect() { + return false; + } + + // 2018-03-30 FireFox has fixed this issue. + //Avoid FireFox's Bug + //If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error. + // if(eventMouseDown.preventDefault) { + // eventMouseDown.preventDefault(); + // } + return true; + } + }, + //method of tools for zTree + _tools = { + getAbs: function (obj) { + var oRect = obj.getBoundingClientRect(), + scrollTop = document.body.scrollTop + document.documentElement.scrollTop, + scrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft; + return [oRect.left + scrollLeft, oRect.top + scrollTop]; + }, + inputFocus: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + tools.setCursorPosition(inputObj.get(0), inputObj.val().length); + } + }, + inputSelect: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + inputObj.select(); + } + }, + setCursorPosition: function (obj, pos) { + if (obj.setSelectionRange) { + obj.focus(); + obj.setSelectionRange(pos, pos); + } else if (obj.createTextRange) { + var range = obj.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, + showIfameMask: function (setting, showSign) { + var root = data.getRoot(setting); + //clear full mask + while (root.dragMaskList.length > 0) { + root.dragMaskList[0].remove(); + root.dragMaskList.shift(); + } + if (showSign) { + //show mask + var iframeList = $$("iframe", setting); + for (var i = 0, l = iframeList.length; i < l; i++) { + var obj = iframeList.get(i), + r = tools.getAbs(obj), + dragMask = $$("
                ", setting); + dragMask.appendTo($$("body", setting)); + root.dragMaskList.push(dragMask); + } + } + } + }, + //method of operate ztree dom + _view = { + addEditBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + editStr = ""; + aObj.append(editStr); + + $$(node, consts.id.EDIT, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false; + view.editNode(setting, node); + return false; + } + ).show(); + }, + addRemoveBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + removeStr = ""; + aObj.append(removeStr); + + $$(node, consts.id.REMOVE, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false; + view.removeNode(setting, node); + setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + return false; + } + ).bind('mousedown', + function (eventMouseDown) { + return true; + } + ).show(); + }, + addHoverDom: function (setting, node) { + if (data.getRoots().showHoverDom) { + node.isHover = true; + if (setting.edit.enable) { + view.addEditBtn(setting, node); + view.addRemoveBtn(setting, node); + } + tools.apply(setting.view.addHoverDom, [setting.treeId, node]); + } + }, + cancelCurEditNode: function (setting, forceName, isCancel) { + var root = data.getRoot(setting), + node = root.curEditNode; + + if (node) { + var inputObj = root.curEditInput, + newName = forceName ? forceName : (isCancel ? data.nodeName(setting, node) : inputObj.val()); + if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) { + return false; + } + data.nodeName(setting, node, newName); + var aObj = $$(node, consts.id.A, setting); + aObj.removeClass(consts.node.CURSELECTED_EDIT); + inputObj.unbind(); + view.setNodeName(setting, node); + node.editNameFlag = false; + root.curEditNode = null; + root.curEditInput = null; + view.selectNode(setting, node, false); + setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]); + } + root.noSelection = true; + return true; + }, + editNode: function (setting, node) { + var root = data.getRoot(setting); + view.editNodeBlur = false; + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + setTimeout(function () { + tools.inputFocus(root.curEditInput); + }, 0); + return; + } + node.editNameFlag = true; + view.removeTreeDom(setting, node); + view.cancelCurEditNode(setting); + view.selectNode(setting, node, false); + $$(node, consts.id.SPAN, setting).html(""); + var inputObj = $$(node, consts.id.INPUT, setting); + inputObj.attr("value", data.nodeName(setting, node)); + if (setting.edit.editNameSelectAll) { + tools.inputSelect(inputObj); + } else { + tools.inputFocus(inputObj); + } + + inputObj.bind('blur', function (event) { + if (!view.editNodeBlur) { + view.cancelCurEditNode(setting); + } + }).bind('keydown', function (event) { + if (event.keyCode == "13") { + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + } else if (event.keyCode == "27") { + view.cancelCurEditNode(setting, null, true); + } + }).bind('click', function (event) { + return false; + }).bind('dblclick', function (event) { + return false; + }); + + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT); + root.curEditInput = inputObj; + root.noSelection = false; + root.curEditNode = node; + }, + moveNode: function (setting, targetNode, node, moveType, animateFlag, isSilent) { + var root = data.getRoot(setting); + if (targetNode == node) return; + if (setting.data.keep.leaf && targetNode && !data.nodeIsParent(setting, targetNode) && moveType == consts.move.TYPE_INNER) return; + var oldParentNode = (node.parentTId ? node.getParentNode() : root), + targetNodeIsRoot = (targetNode === null || targetNode == root); + if (targetNodeIsRoot && targetNode === null) targetNode = root; + if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER; + var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root); + + if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) { + moveType = consts.move.TYPE_INNER; + } + + if (moveType == consts.move.TYPE_INNER) { + if (targetNodeIsRoot) { + //parentTId of root node is null + node.parentTId = null; + } else { + if (!data.nodeIsParent(setting, targetNode)) { + data.nodeIsParent(setting, targetNode, true); + targetNode.open = !!targetNode.open; + view.setNodeLineIcos(setting, targetNode); + } + node.parentTId = targetNode.tId; + } + } + + //move node Dom + var targetObj, target_ulObj; + if (targetNodeIsRoot) { + targetObj = setting.treeObj; + target_ulObj = targetObj; + } else { + if (!isSilent && moveType == consts.move.TYPE_INNER) { + view.expandCollapseNode(setting, targetNode, true, false); + } else if (!isSilent) { + view.expandCollapseNode(setting, targetNode.getParentNode(), true, false); + } + targetObj = $$(targetNode, setting); + target_ulObj = $$(targetNode, consts.id.UL, setting); + if (!!targetObj.get(0) && !target_ulObj.get(0)) { + var ulstr = []; + view.makeUlHtml(setting, targetNode, ulstr, ''); + targetObj.append(ulstr.join('')); + } + target_ulObj = $$(targetNode, consts.id.UL, setting); + } + var nodeDom = $$(node, setting); + if (!nodeDom.get(0)) { + nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join(''); + } else if (!targetObj.get(0)) { + nodeDom.remove(); + } + if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) { + target_ulObj.append(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) { + targetObj.before(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) { + targetObj.after(nodeDom); + } + + //repair the data after move + var i, l, + tmpSrcIndex = -1, + tmpTargetIndex = 0, + oldNeighbor = null, + newNeighbor = null, + oldLevel = node.level; + var oldChildren = data.nodeChildren(setting, oldParentNode); + var targetParentChildren = data.nodeChildren(setting, targetParentNode); + var targetChildren = data.nodeChildren(setting, targetNode); + if (node.isFirstNode) { + tmpSrcIndex = 0; + if (oldChildren.length > 1) { + oldNeighbor = oldChildren[1]; + oldNeighbor.isFirstNode = true; + } + } else if (node.isLastNode) { + tmpSrcIndex = oldChildren.length - 1; + oldNeighbor = oldChildren[tmpSrcIndex - 1]; + oldNeighbor.isLastNode = true; + } else { + for (i = 0, l = oldChildren.length; i < l; i++) { + if (oldChildren[i].tId == node.tId) { + tmpSrcIndex = i; + break; + } + } + } + if (tmpSrcIndex >= 0) { + oldChildren.splice(tmpSrcIndex, 1); + } + if (moveType != consts.move.TYPE_INNER) { + for (i = 0, l = targetParentChildren.length; i < l; i++) { + if (targetParentChildren[i].tId == targetNode.tId) tmpTargetIndex = i; + } + } + if (moveType == consts.move.TYPE_INNER) { + if (!targetChildren) { + targetChildren = data.nodeChildren(setting, targetNode, []); + } + if (targetChildren.length > 0) { + newNeighbor = targetChildren[targetChildren.length - 1]; + newNeighbor.isLastNode = false; + } + targetChildren.splice(targetChildren.length, 0, node); + node.isLastNode = true; + node.isFirstNode = (targetChildren.length == 1); + } else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + newNeighbor = targetNode; + newNeighbor.isFirstNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = true; + node.isLastNode = false; + + } else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + newNeighbor = targetNode; + newNeighbor.isLastNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = true; + + } else { + if (moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + } else { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + } + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = false; + } + data.fixPIdKeyValue(setting, node); + data.setSonNodeLevel(setting, node.getParentNode(), node); + + //repair node what been moved + view.setNodeLineIcos(setting, node); + view.repairNodeLevelClass(setting, node, oldLevel); + + //repair node's old parentNode dom + if (!setting.data.keep.parent && oldChildren.length < 1) { + //old parentNode has no child nodes + data.nodeIsParent(setting, oldParentNode, false); + oldParentNode.open = false; + var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting), + tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting), + tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting); + view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU); + tmp_ulObj.css("display", "none"); + + } else if (oldNeighbor) { + //old neigbor node + view.setNodeLineIcos(setting, oldNeighbor); + } + + //new neigbor node + if (newNeighbor) { + view.setNodeLineIcos(setting, newNeighbor); + } + + //repair checkbox / radio + if (!!setting.check && setting.check.enable && view.repairChkClass) { + view.repairChkClass(setting, oldParentNode); + view.repairParentChkClassWithSelf(setting, oldParentNode); + if (oldParentNode != node.parent) + view.repairParentChkClassWithSelf(setting, node); + } + + //expand parents after move + if (!isSilent) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag); + } + }, + removeEditBtn: function (setting, node) { + $$(node, consts.id.EDIT, setting).unbind().remove(); + }, + removeRemoveBtn: function (setting, node) { + $$(node, consts.id.REMOVE, setting).unbind().remove(); + }, + removeTreeDom: function (setting, node) { + node.isHover = false; + view.removeEditBtn(setting, node); + view.removeRemoveBtn(setting, node); + tools.apply(setting.view.removeHoverDom, [setting.treeId, node]); + }, + repairNodeLevelClass: function (setting, node, oldLevel) { + if (oldLevel === node.level) return; + var liObj = $$(node, setting), + aObj = $$(node, consts.id.A, setting), + ulObj = $$(node, consts.id.UL, setting), + oldClass = consts.className.LEVEL + oldLevel, + newClass = consts.className.LEVEL + node.level; + liObj.removeClass(oldClass); + liObj.addClass(newClass); + aObj.removeClass(oldClass); + aObj.addClass(newClass); + ulObj.removeClass(oldClass); + ulObj.addClass(newClass); + }, + selectNodes: function (setting, nodes) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.selectNode(setting, nodes[i], i > 0); + } + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy); + data.addInitRoot(_initRoot); + data.addZTreeTools(_zTreeTools); + + var _cancelPreSelectedNode = view.cancelPreSelectedNode; + view.cancelPreSelectedNode = function (setting, node) { + var list = data.getRoot(setting).curSelectedList; + for (var i = 0, j = list.length; i < j; i++) { + if (!node || node === list[i]) { + view.removeTreeDom(setting, list[i]); + if (node) break; + } + } + if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments); + } + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) { + _createNodes.apply(view, arguments); + } + if (!nodes) return; + if (view.repairParentChkClassWithSelf) { + view.repairParentChkClassWithSelf(setting, parentNode); + } + } + + var _makeNodeUrl = view.makeNodeUrl; + view.makeNodeUrl = function (setting, node) { + return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments)); + } + + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var root = data.getRoot(setting); + if (root.curEditNode === node) root.curEditNode = null; + if (_removeNode) { + _removeNode.apply(view, arguments); + } + } + + var _selectNode = view.selectNode; + view.selectNode = function (setting, node, addFlag) { + var root = data.getRoot(setting); + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + return false; + } + if (_selectNode) _selectNode.apply(view, arguments); + view.addHoverDom(setting, node); + return true; + } + + var _uCanDo = tools.uCanDo; + tools.uCanDo = function (setting, e) { + var root = data.getRoot(setting); + if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) { + return true; + } + if (root.curEditNode) { + view.editNodeBlur = false; + root.curEditInput.focus(); + } + return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true); + } +})(jQuery); diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.all.min.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.all.min.js new file mode 100755 index 00000000..b50f265b --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.all.min.js @@ -0,0 +1,166 @@ + +/* + * JQuery zTree core v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(r){var J,K,L,M,N,O,v,t={},w={},x={},P={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post", +dataType:"text",headers:{},xhrFields:{},url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},y=[function(a){var b=a.treeObj,c=g.event;b.bind(c.NODECREATED, +function(b,c,i){h.apply(a.callback.onNodeCreated,[b,c,i])});b.bind(c.CLICK,function(b,c,i,e,k){h.apply(a.callback.onClick,[c,i,e,k])});b.bind(c.EXPAND,function(b,c,i){h.apply(a.callback.onExpand,[b,c,i])});b.bind(c.COLLAPSE,function(b,c,i){h.apply(a.callback.onCollapse,[b,c,i])});b.bind(c.ASYNC_SUCCESS,function(b,c,i,e){h.apply(a.callback.onAsyncSuccess,[b,c,i,e])});b.bind(c.ASYNC_ERROR,function(b,c,i,e,k,g){h.apply(a.callback.onAsyncError,[b,c,i,e,k,g])});b.bind(c.REMOVE,function(b,c,i){h.apply(a.callback.onRemove, +[b,c,i])});b.bind(c.SELECTED,function(b,c,i){h.apply(a.callback.onSelected,[c,i])});b.bind(c.UNSELECTED,function(b,c,i){h.apply(a.callback.onUnSelected,[c,i])})}],z=[function(a){var b=g.event;a.treeObj.unbind(b.NODECREATED).unbind(b.CLICK).unbind(b.EXPAND).unbind(b.COLLAPSE).unbind(b.ASYNC_SUCCESS).unbind(b.ASYNC_ERROR).unbind(b.REMOVE).unbind(b.SELECTED).unbind(b.UNSELECTED)}],A=[function(a){var b=e.getCache(a);b||(b={},e.setCache(a,b));b.nodes=[];b.doms=[]}],B=[function(a,b,c,d,f,i){if(c){var m= +e.getRoot(a),k=e.nodeChildren(a,c);c.level=b;c.tId=a.treeId+"_"+ ++m.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?h.eqs(c.open,"true"):!!c.open;b=e.nodeIsParent(a,c);h.isArray(k)?(e.nodeIsParent(a,c,!0),c.zAsync=!0):(b=e.nodeIsParent(a,c,b),c.open=b&&!a.async.enable?c.open:!1,c.zAsync=!b);c.isFirstNode=f;c.isLastNode=i;c.getParentNode=function(){return e.getNodeCache(a,c.parentTId)};c.getPreNode=function(){return e.getPreNode(a,c)};c.getNextNode=function(){return e.getNextNode(a,c)}; +c.getIndex=function(){return e.getNodeIndex(a,c)};c.getPath=function(){return e.getNodePath(a,c)};c.isAjaxing=!1;e.fixPIdKeyValue(a,c)}}],u=[function(a){var b=a.target,c=e.getSetting(a.data.treeId),d="",f=null,i="",m="",k=null,j=null,o=null;if(h.eqs(a.type,"mousedown"))m="mousedown";else if(h.eqs(a.type,"mouseup"))m="mouseup";else if(h.eqs(a.type,"contextmenu"))m="contextmenu";else if(h.eqs(a.type,"click"))if(h.eqs(b.tagName,"span")&&b.getAttribute("treeNode"+g.id.SWITCH)!==null)d=h.getNodeMainDom(b).id, +i="switchNode";else{if(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}]))d=h.getNodeMainDom(o).id,i="clickNode"}else if(h.eqs(a.type,"dblclick")&&(m="dblclick",o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id,i="switchNode";if(m.length>0&&d.length==0&&(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id;if(d.length>0)switch(f=e.getNodeCache(c,d),i){case "switchNode":e.nodeIsParent(c,f)?h.eqs(a.type,"click")||h.eqs(a.type, +"dblclick")&&h.apply(c.view.dblClickExpand,[c.treeId,f],c.view.dblClickExpand)?k=J:i="":i="";break;case "clickNode":k=K}switch(m){case "mousedown":j=L;break;case "mouseup":j=M;break;case "dblclick":j=N;break;case "contextmenu":j=O}return{stop:!1,node:f,nodeEventType:i,nodeEventCallback:k,treeEventType:m,treeEventCallback:j}}],C=[function(a){var b=e.getRoot(a);b||(b={},e.setRoot(a,b));e.nodeChildren(a,b,[]);b.expandTriggerFlag=!1;b.curSelectedList=[];b.noSelection=!0;b.createdNodes=[];b.zId=0;b._ver= +(new Date).getTime()}],D=[],E=[],F=[],G=[],H=[],e={addNodeCache:function(a,b){e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=b},getNodeCacheId:function(a){return a.substring(a.lastIndexOf("_")+1)},addAfterA:function(a){E.push(a)},addBeforeA:function(a){D.push(a)},addInnerAfterA:function(a){G.push(a)},addInnerBeforeA:function(a){F.push(a)},addInitBind:function(a){y.push(a)},addInitUnBind:function(a){z.push(a)},addInitCache:function(a){A.push(a)},addInitNode:function(a){B.push(a)},addInitProxy:function(a, +b){b?u.splice(0,0,a):u.push(a)},addInitRoot:function(a){C.push(a)},addNodesData:function(a,b,c,d){var f=e.nodeChildren(a,b);f?c>=f.length&&(c=-1):(f=e.nodeChildren(a,b,[]),c=-1);if(f.length>0&&c===0)f[0].isFirstNode=!1,j.setNodeLineIcos(a,f[0]);else if(f.length>0&&c<0)f[f.length-1].isLastNode=!1,j.setNodeLineIcos(a,f[f.length-1]);e.nodeIsParent(a,b,!0);c<0?e.nodeChildren(a,b,f.concat(d)):(a=[c,0].concat(d),f.splice.apply(f,a))},addSelectedNode:function(a,b){var c=e.getRoot(a);e.isSelectedNode(a,b)|| +c.curSelectedList.push(b)},addCreatedNode:function(a,b){(a.callback.onNodeCreated||a.view.addDiyDom)&&e.getRoot(a).createdNodes.push(b)},addZTreeTools:function(a){H.push(a)},exSetting:function(a){r.extend(!0,P,a)},fixPIdKeyValue:function(a,b){a.data.simpleData.enable&&(b[a.data.simpleData.pIdKey]=b.parentTId?b.getParentNode()[a.data.simpleData.idKey]:a.data.simpleData.rootPId)},getAfterA:function(a,b,c){for(var d=0,e=E.length;d-1&&f.push(k);k=e.nodeChildren(a, +k);f=f.concat(e.getNodesByParamFuzzy(a,k,c,d))}return f},getNodesByFilter:function(a,b,c,d,f){if(!b)return d?null:[];for(var i=d?null:[],m=0,k=b.length;m0)},clone:function(a){if(a===null)return null;var b=h.isArray(a)?[]:{},c;for(c in a)b[c]=a[c]instanceof Date?new Date(a[c].getTime()):typeof a[c]==="object"?h.clone(a[c]):a[c];return b},eqs:function(a,b){return a.toLowerCase()===b.toLowerCase()},isArray:function(a){return Object.prototype.toString.apply(a)==="[object Array]"},isElement:function(a){return typeof HTMLElement==="object"?a instanceof HTMLElement:a&&typeof a==="object"&&a!==null&& +a.nodeType===1&&typeof a.nodeName==="string"},$:function(a,b,c){b&&typeof b!="string"&&(c=b,b="");return typeof a=="string"?r(a,c?c.treeObj.get(0).ownerDocument:null):r("#"+a.tId+b,c?c.treeObj:null)},getMDom:function(a,b,c){if(!b)return null;for(;b&&b.id!==a.treeId;){for(var d=0,e=c.length;b.tagName&&d0},uCanDo:function(){return!0}},j={addNodes:function(a,b,c,d,f){var i=e.nodeIsParent(a,b);if(!a.data.keep.leaf||!b||i)if(h.isArray(d)||(d=[d]),a.data.simpleData.enable&&(d=e.transformTozTreeFormat(a,d)),b){var i=l(b,g.id.SWITCH,a),m=l(b,g.id.ICON,a),k=l(b,g.id.UL,a);if(!b.open)j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,m,g.folder.CLOSE),b.open=!1,k.css({display:"none"});e.addNodesData(a,b,c,d);j.createNodes(a,b.level+ +1,d,b,c);f||j.expandCollapseParentNode(a,b,!0)}else e.addNodesData(a,e.getRoot(a),c,d),j.createNodes(a,0,d,null,c)},appendNodes:function(a,b,c,d,f,i,g){if(!c)return[];var k=[],h=d?d:e.getRoot(a),h=e.nodeChildren(a,h),o,l;if(!h||f>=h.length-c.length)f=-1;for(var s=0,n=c.length;s0&&(l=j.appendNodes(a,b+1,I,p,-1, +i,g&&p.open));g&&(j.makeDOMNodeMainBefore(k,a,p),j.makeDOMNodeLine(k,a,p),e.getBeforeA(a,p,k),j.makeDOMNodeNameBefore(k,a,p),e.getInnerBeforeA(a,p,k),j.makeDOMNodeIcon(k,a,p),e.getInnerAfterA(a,p,k),j.makeDOMNodeNameAfter(k,a,p),e.getAfterA(a,p,k),o&&p.open&&j.makeUlHtml(a,p,k,l.join("")),j.makeDOMNodeMainAfter(k,a,p),e.addCreatedNode(a,p))}return k},appendParentULDom:function(a,b){var c=[],d=l(b,a);!d.get(0)&&b.parentTId&&(j.appendParentULDom(a,b.getParentNode()),d=l(b,a));var f=l(b,g.id.UL,a);f.get(0)&& +f.remove();f=e.nodeChildren(a,b);f=j.appendNodes(a,b.level+1,f,b,-1,!1,!0);j.makeUlHtml(a,b,c,f.join(""));d.append(c.join(""))},asyncNode:function(a,b,c,d){var f,i;f=e.nodeIsParent(a,b);if(b&&!f)return h.apply(d),!1;else if(b&&b.isAjaxing)return!1;else if(h.apply(a.callback.beforeAsync,[a.treeId,b],!0)==!1)return h.apply(d),!1;if(b)b.isAjaxing=!0,l(b,g.id.ICON,a).attr({style:"","class":g.className.BUTTON+" "+g.className.ICO_LOADING});var m={},k=h.apply(a.async.autoParam,[a.treeId,b],a.async.autoParam); +for(f=0,i=k.length;b&&f1&&(o=q[1],q=q[0]);m[o]=b[q]}k=h.apply(a.async.otherParam,[a.treeId,b],a.async.otherParam);if(h.isArray(k))for(f=0,i=k.length;f-1?JSON.stringify(m):m,dataType:a.async.dataType,headers:a.async.headers, +xhrFields:a.async.xhrFields,success:function(i){if(s==e.getRoot(a)._ver){var f=[];try{f=!i||i.length==0?[]:typeof i=="string"?eval("("+i+")"):i}catch(k){f=i}if(b)b.isAjaxing=null,b.zAsync=!0;j.setNodeLineIcos(a,b);f&&f!==""?(f=h.apply(a.async.dataFilter,[a.treeId,b,f],f),j.addNodes(a,b,-1,f?h.clone(f):[],!!c)):j.addNodes(a,b,-1,[],!!c);a.treeObj.trigger(g.event.ASYNC_SUCCESS,[a.treeId,b,i]);h.apply(d)}},error:function(c,d,i){if(s==e.getRoot(a)._ver){if(b)b.isAjaxing=null;j.setNodeLineIcos(a,b);a.treeObj.trigger(g.event.ASYNC_ERROR, +[a.treeId,b,c,d,i])}}});return!0},cancelPreSelectedNode:function(a,b,c){var d=e.getRoot(a).curSelectedList,f,i;for(f=d.length-1;f>=0;f--)if(i=d[f],b===i||!b&&(!c||c!==i))if(l(i,g.id.A,a).removeClass(g.node.CURSELECTED),b){e.removeSelectedNode(a,b);break}else d.splice(f,1),a.treeObj.trigger(g.event.UNSELECTED,[a.treeId,i])},createNodeCallback:function(a){if(a.callback.onNodeCreated||a.view.addDiyDom)for(var b=e.getRoot(a);b.createdNodes.length>0;){var c=b.createdNodes.shift();h.apply(a.view.addDiyDom, +[a.treeId,c]);a.callback.onNodeCreated&&a.treeObj.trigger(g.event.NODECREATED,[a.treeId,c])}},createNodes:function(a,b,c,d,f){if(c&&c.length!=0){var i=e.getRoot(a),m=!d||d.open||!!l(e.nodeChildren(a,d)[0],a).get(0);i.createdNodes=[];var b=j.appendNodes(a,b,c,d,f,!0,m),k,h;d?(d=l(d,g.id.UL,a),d.get(0)&&(k=d)):k=a.treeObj;k&&(f>=0&&(h=k.children()[f]),f>=0&&h?r(h).before(b.join("")):k.append(b.join("")));j.createNodeCallback(a)}},destroy:function(a){a&&(e.initCache(a),e.initRoot(a),n.unbindTree(a), +n.unbindEvent(a),a.treeObj.empty(),delete t[a.treeId])},expandCollapseNode:function(a,b,c,d,f){var i=e.getRoot(a),m;if(b){var k=e.nodeChildren(a,b),q=e.nodeIsParent(a,b);if(i.expandTriggerFlag)m=f,f=function(){m&&m();b.open?a.treeObj.trigger(g.event.EXPAND,[a.treeId,b]):a.treeObj.trigger(g.event.COLLAPSE,[a.treeId,b])},i.expandTriggerFlag=!1;if(!b.open&&q&&(!l(b,g.id.UL,a).get(0)||k&&k.length>0&&!l(k[0],a).get(0)))j.appendParentULDom(a,b),j.createNodeCallback(a);if(b.open==c)h.apply(f,[]);else{var c= +l(b,g.id.UL,a),i=l(b,g.id.SWITCH,a),o=l(b,g.id.ICON,a);q?(b.open=!b.open,b.iconOpen&&b.iconClose&&o.attr("style",j.makeNodeIcoStyle(a,b)),b.open?(j.replaceSwitchClass(b,i,g.folder.OPEN),j.replaceIcoClass(b,o,g.folder.OPEN),d==!1||a.view.expandSpeed==""?(c.show(),h.apply(f,[])):k&&k.length>0?c.slideDown(a.view.expandSpeed,f):(c.show(),h.apply(f,[]))):(j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,o,g.folder.CLOSE),d==!1||a.view.expandSpeed==""||!(k&&k.length>0)?(c.hide(),h.apply(f,[])): +c.slideUp(a.view.expandSpeed,f))):h.apply(f,[])}}else h.apply(f,[])},expandCollapseParentNode:function(a,b,c,d,e){b&&(b.parentTId?(j.expandCollapseNode(a,b,c,d),b.parentTId&&j.expandCollapseParentNode(a,b.getParentNode(),c,d,e)):j.expandCollapseNode(a,b,c,d,e))},expandCollapseSonNode:function(a,b,c,d,f){var i=e.getRoot(a),i=b?e.nodeChildren(a,b):e.nodeChildren(a,i),g=b?!1:d,k=e.getRoot(a).expandTriggerFlag;e.getRoot(a).expandTriggerFlag=!1;if(i)for(var h=0,l=i.length;h=0;d--)if(b===c[d])return!0;return!1},makeDOMNodeIcon:function(a,b,c){var d=e.nodeName(b,c),d=b.view.nameIsHTML?d:d.replace(/&/g,"&").replace(//g,">");a.push("",d,"")},makeDOMNodeLine:function(a,b,c){a.push("")},makeDOMNodeMainAfter:function(a){a.push("
              • ")},makeDOMNodeMainBefore:function(a,b,c){a.push("
              • ")},makeDOMNodeNameAfter:function(a){a.push("")},makeDOMNodeNameBefore:function(a,b,c){var d= +e.nodeTitle(b,c),f=j.makeNodeUrl(b,c),i=j.makeNodeFontCss(b,c),m=[],k;for(k in i)m.push(k,":",i[k],";");a.push("0?"href='"+f+"'":""," target='",j.makeNodeTarget(c),"' style='",m.join(""),"'");h.apply(b.view.showTitle,[b.treeId,c],b.view.showTitle)&&d&&a.push("title='",d.replace(/'/g,"'").replace(//g,">"),"'");a.push(">")},makeNodeFontCss:function(a, +b){var c=h.apply(a.view.fontCss,[a.treeId,b],a.view.fontCss);return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(a,b){var c=["ico"];if(!b.isAjaxing){var d=e.nodeIsParent(a,b);c[0]=(b.iconSkin?b.iconSkin+"_":"")+c[0];d?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU)}return g.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(a,b){var c=[];if(!b.isAjaxing){var d=e.nodeIsParent(a,b)&&b.iconOpen&&b.iconClose?b.open?b.iconOpen:b.iconClose:b[a.data.key.icon];d&&c.push("background:url(", +d,") 0 0 no-repeat;");(a.view.showIcon==!1||!h.apply(a.view.showIcon,[a.treeId,b],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(a,b){var c=[];a.view.showLine?b.level==0&&b.isFirstNode&&b.isLastNode?c.push(g.line.ROOT):b.level==0&&b.isFirstNode?c.push(g.line.ROOTS):b.isLastNode?c.push(g.line.BOTTOM):c.push(g.line.CENTER):c.push(g.line.NOLINE);e.nodeIsParent(a,b)?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU);return j.makeNodeLineClassEx(b)+c.join("_")}, +makeNodeLineClassEx:function(a){return g.className.BUTTON+" "+g.className.LEVEL+a.level+" "+g.className.SWITCH+" "},makeNodeTarget:function(a){return a.target||"_blank"},makeNodeUrl:function(a,b){var c=a.data.key.url;return b[c]?b[c]:null},makeUlHtml:function(a,b,c,d){c.push("
                  ");c.push(d);c.push("
                ")},makeUlLineClass:function(a,b){return a.view.showLine&&!b.isLastNode? +g.line.LINE:""},removeChildNodes:function(a,b){if(b){var c=e.nodeChildren(a,b);if(c){for(var d=0,f=c.length;dc.bottom||d.right>c.right||d.left0)c[0].isFirstNode= +!0},setLastNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[c.length-1].isLastNode=!0},removeNode:function(a,b){var c=e.getRoot(a),d=b.parentTId?b.getParentNode():c;b.isFirstNode=!1;b.isLastNode=!1;b.getPreNode=function(){return null};b.getNextNode=function(){return null};if(e.getNodeCache(a,b.tId)){l(b,a).remove();e.removeNodeCache(a,b);e.removeSelectedNode(a,b);for(var f=e.nodeChildren(a,d),i=0,h=f.length;i0){var q=f[i-1],i=l(q,g.id.UL,a),h=l(q,g.id.SWITCH,a);k=l(q,g.id.ICON,a);d==c?f.length==1?j.replaceSwitchClass(q,h,g.line.ROOT):(c=l(f[0],g.id.SWITCH,a),j.replaceSwitchClass(f[0],c,g.line.ROOTS),j.replaceSwitchClass(q, +h,g.line.BOTTOM)):j.replaceSwitchClass(q,h,g.line.BOTTOM);i.removeClass(g.line.LINE)}}},replaceIcoClass:function(a,b,c){if(b&&!a.isAjaxing&&(a=b.attr("class"),a!=void 0)){a=a.split("_");switch(c){case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:a[a.length-1]=c}b.attr("class",a.join("_"))}},replaceSwitchClass:function(a,b,c){if(b){var d=b.attr("class");if(d!=void 0){d=d.split("_");switch(c){case g.line.ROOT:case g.line.ROOTS:case g.line.CENTER:case g.line.BOTTOM:case g.line.NOLINE:d[0]=j.makeNodeLineClassEx(a)+ +c;break;case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:d[1]=c}b.attr("class",d.join("_"));c!==g.folder.DOCU?b.removeAttr("disabled"):b.attr("disabled","disabled")}}},selectNode:function(a,b,c){c||j.cancelPreSelectedNode(a,null,b);l(b,g.id.A,a).addClass(g.node.CURSELECTED);e.addSelectedNode(a,b);a.treeObj.trigger(g.event.SELECTED,[a.treeId,b])},setNodeFontCss:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeFontCss(a,b);d&&c.css(d)},setNodeLineIcos:function(a,b){if(b){var c=l(b,g.id.SWITCH, +a),d=l(b,g.id.UL,a),f=l(b,g.id.ICON,a),i=j.makeUlLineClass(a,b);i.length==0?d.removeClass(g.line.LINE):d.addClass(i);c.attr("class",j.makeNodeLineClass(a,b));e.nodeIsParent(a,b)?c.removeAttr("disabled"):c.attr("disabled","disabled");f.removeAttr("style");f.attr("style",j.makeNodeIcoStyle(a,b));f.attr("class",j.makeNodeIcoClass(a,b))}},setNodeName:function(a,b){var c=e.nodeTitle(a,b),d=l(b,g.id.SPAN,a);d.empty();a.view.nameIsHTML?d.html(e.nodeName(a,b)):d.text(e.nodeName(a,b));h.apply(a.view.showTitle, +[a.treeId,b],a.view.showTitle)&&l(b,g.id.A,a).attr("title",!c?"":c)},setNodeTarget:function(a,b){l(b,g.id.A,a).attr("target",j.makeNodeTarget(b))},setNodeUrl:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeUrl(a,b);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(a,b){b.open||!h.canAsync(a,b)?j.expandCollapseNode(a,b,!b.open):a.async.enable?j.asyncNode(a,b)||j.expandCollapseNode(a,b,!b.open):b&&j.expandCollapseNode(a,b,!b.open)}};r.fn.zTree={consts:{className:{BUTTON:"button", +LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open", +CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:h,view:j,event:n,data:e},getZTreeObj:function(a){return(a=e.getZTreeTools(a))?a:null},destroy:function(a){if(a&&a.length>0)j.destroy(e.getSetting(a));else for(var b in t)j.destroy(t[b])},init:function(a,b,c){var d=h.clone(P);r.extend(!0,d,b);d.treeId=a.attr("id");d.treeObj=a;d.treeObj.empty();t[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";e.initRoot(d);a=e.getRoot(d);c=c?h.clone(h.isArray(c)? +c:[c]):[];d.data.simpleData.enable?e.nodeChildren(d,a,e.transformTozTreeFormat(d,c)):e.nodeChildren(d,a,c);e.initCache(d);n.unbindTree(d);n.bindTree(d);n.unbindEvent(d);n.bindEvent(d);var f={setting:d,addNodes:function(a,b,c,f){function g(){j.addNodes(d,a,b,n,f==!0)}a||(a=null);var l=e.nodeIsParent(d,a);if(a&&!l&&d.data.keep.leaf)return null;l=parseInt(b,10);isNaN(l)?(f=!!c,c=b,b=-1):b=l;if(!c)return null;var n=h.clone(h.isArray(c)?c:[c]);h.canAsync(d,a)?j.asyncNode(d,a,f,g):g();return n},cancelSelectedNode:function(a){j.cancelPreSelectedNode(d, +a)},destroy:function(){j.destroy(d)},expandAll:function(a){a=!!a;j.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,f,g){function n(){var b=l(a,d).get(0);b&&f!==!1&&j.scrollIntoView(d,b)}if(!a||!e.nodeIsParent(d,a))return null;b!==!0&&b!==!1&&(b=!a.open);if((g=!!g)&&b&&h.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(g&&!b&&h.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&j.expandCollapseParentNode(d,a.getParentNode(), +b,!1);if(b===a.open&&!c)return null;e.getRoot(d).expandTriggerFlag=g;!h.canAsync(d,a)&&c?j.expandCollapseSonNode(d,a,b,!0,n):(a.open=!b,j.switchNode(this.setting,a),n());return b},getNodes:function(){return e.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:e.getNodeByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodeByTId:function(a){return e.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:e.getNodesByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByParamFuzzy:function(a, +b,c){return!a?null:e.getNodesByParamFuzzy(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:e.getNodesByFilter(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=a.parentTId?a.getParentNode():e.getRoot(d),b=e.nodeChildren(d,b),c=0,f=b.length;c0?j.createNodes(d,0,c,null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&j.asyncNode(d);return f}};var Q=r.fn.zTree,l=h.$,g=Q.consts})(jQuery); + +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(m){var p,q,r,o={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},v={check:{enable:!1,autoCheckTrigger:!1,chkStyle:o.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:o.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};p=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=f.nodeChecked(b,a);f.nodeChecked(b,a,!d);e.checkNodeRelation(b,a);d=n(a,h.id.CHECK,b);e.setChkClass(b,d,a);e.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};q=function(c,a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!0;e.setChkClass(b,d,a);return!0};r=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!1;e.setChkClass(b,d,a);return!0};m.extend(!0,m.fn.zTree.consts,o);m.extend(!0,m.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=f.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=f.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=f.nodeChecked(c,b);k&&b!=a&&(f.nodeChecked(c,b,!1),g.splice(d,1),e.setChkClass(c, +n(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&e.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():f.getRoot(c);g=f.nodeChildren(c,g);for(d=0,j=g.length;d-1)&&e.setSonNodeCheckBox(c,a, +!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=f.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART: +a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=f.getRoot(c),b=f.nodeChildren(c,b),d=0,j=b.length;d0?e.repairParentChkClass(c,b[0]):e.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;e.repairChkClass(c,a);if((a=f.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j0){j=!1;break}}j&&e.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=n(a,h.id.CHECK,c);d||(d=a);var g=!1,k=f.nodeChildren(c,a);if(k)for(var i=0,l=k.length;i0?b?2:0:-1}else a.check_Child_State=-1;e.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=f.getRoot(c).radioCheckedList,b=0,d=a.length;b-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,e=a.length;g0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=e.nocheck===!0||e.chkDisabled===!0?e.check_Child_State:e.halfCheck===!0?1:i?e.check_Child_State===-1||e.check_Child_State===2?2:1:e.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!== +b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var m=m.fn.zTree,i=m._z.tools,h=m.consts,e=m._z.view,f=m._z.data,n=i.$;f.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"?(typeof b==="string"&&(b=i.eqs(b,"true")),a[c]=!!b):a[c]=typeof a[c]=="string"?i.eqs(a[c],"true"):!!a[c];return a[c]};f.exSetting(v);f.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a, +d,e])})});f.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)});f.addInitCache(function(){});f.addInitNode(function(c,a,b,d){if(b){a=f.nodeChecked(c,b);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck, +"true");b.halfCheck=!!b.halfCheck;b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return f.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&f.getRoot(c).radioCheckedList.push(b)}});f.addInitProxy(function(c){var a=c.target,b=f.getSetting(c.data.treeId),d="",e=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type, +"mouseout")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(e=f.getNodeCache(b,d),g){case "checkNode":k=p;break;case "mouseoverCheck":k=q;break;case "mouseoutCheck":k=r}return{stop:g==="checkNode",node:e,nodeEventType:g,nodeEventCallback:k, +treeEventType:"",treeEventCallback:null}},!0);f.addInitRoot(function(c){f.getRoot(c).radioCheckedList=[]});f.addBeforeA(function(c,a,b){c.check.enable&&(f.makeChkFlag(c,a),b.push(""))});f.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var m=f.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!m),k=!!k,(m!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck, +[this.setting.treeId,a],!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))f.nodeChecked(c,a,b),b=n(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,a),e.setChkClass(this.setting,b,a),e.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){e.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b= +f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,f){b=!!b;c=!!c;e.repairSonChkDisabled(this.setting,a,b,!!f);e.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,f){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&n(c,this.setting).get(0)&& +i.uCanDo(this.setting)){var g=n(c,h.id.CHECK,this.setting);(f==!0||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,c);e.setChkClass(this.setting,g,c);e.repairParentChkClassWithSelf(this.setting,c)}}});var s=e.createNodes;e.createNodes=function(c,a,b,d,f){s&&s.apply(e,arguments);b&&e.repairParentChkClassWithSelf(c,d)};var t=e.removeNode;e.removeNode=function(c,a){var b=a.getParentNode();t&&t.apply(e,arguments);a&&b&&(e.repairChkClass(c,b),e.repairParentChkClass(c,b))}; +var u=e.appendNodes;e.appendNodes=function(c,a,b,d,h,g,i){var m="";u&&(m=u.apply(e,arguments));d&&f.makeChkFlag(c,d);return m}})(jQuery); + +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a= +i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("
                  ", +f);for(b=0,c=n.length;b0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("
                • ",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("
                • ...
                • ",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("", +f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER)); +w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=cf.edit.drag.borderMin,o=Ef.edit.drag.borderMin,F=rf.edit.drag.borderMin,v=sf.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!= +h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+ +10);t&&t!=h.treeObj&&t.offset().left=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f, +A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND, +[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId= +null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g
                  ",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,b){if(!(b.editNameFlag|| +q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},addRemoveBtn:function(a, +b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,b);a.treeObj.trigger(d.event.REMOVE, +[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,a).removeClass(d.node.CURSELECTED_EDIT); +o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l; +c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId= +b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null, +m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode= +u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a, +c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a, +b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a, +b){for(var c=0,d=b.length;c0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode; +break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b, +l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting, +a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable= +a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d 0 && tId.length == 0) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + } + } + // event to node + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "switchNode" : + var isParent = data.nodeIsParent(setting, node); + if (!isParent) { + nodeEventType = ""; + } else if (tools.eqs(event.type, "click") + || (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) { + nodeEventCallback = handler.onSwitchNode; + } else { + nodeEventType = ""; + } + break; + case "clickNode" : + nodeEventCallback = handler.onClickNode; + break; + } + } + // event to zTree + switch (treeEventType) { + case "mousedown" : + treeEventCallback = handler.onZTreeMousedown; + break; + case "mouseup" : + treeEventCallback = handler.onZTreeMouseup; + break; + case "dblclick" : + treeEventCallback = handler.onZTreeDblclick; + break; + case "contextmenu" : + treeEventCallback = handler.onZTreeContextmenu; + break; + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of core + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var r = data.getRoot(setting), + children = data.nodeChildren(setting, n); + n.level = level; + n.tId = setting.treeId + "_" + (++r.zId); + n.parentTId = parentNode ? parentNode.tId : null; + n.open = (typeof n.open == "string") ? tools.eqs(n.open, "true") : !!n.open; + var isParent = data.nodeIsParent(setting, n); + if (tools.isArray(children) && + !(isParent === false || (typeof isParent == "string" && tools.eqs(isParent, "false")))) { + data.nodeIsParent(setting, n, true); + n.zAsync = true; + } else { + isParent = data.nodeIsParent(setting, n, isParent); + n.open = (isParent && !setting.async.enable) ? n.open : false; + n.zAsync = !isParent; + } + n.isFirstNode = isFirstNode; + n.isLastNode = isLastNode; + n.getParentNode = function () { + return data.getNodeCache(setting, n.parentTId); + }; + n.getPreNode = function () { + return data.getPreNode(setting, n); + }; + n.getNextNode = function () { + return data.getNextNode(setting, n); + }; + n.getIndex = function () { + return data.getNodeIndex(setting, n); + }; + n.getPath = function () { + return data.getNodePath(setting, n); + }; + n.isAjaxing = false; + data.fixPIdKeyValue(setting, n); + }, + _init = { + bind: [_bindEvent], + unbind: [_unbindEvent], + caches: [_initCache], + nodes: [_initNode], + proxys: [_eventProxy], + roots: [_initRoot], + beforeA: [], + afterA: [], + innerBeforeA: [], + innerAfterA: [], + zTreeTools: [] + }, + //method of operate data + data = { + addNodeCache: function (setting, node) { + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node; + }, + getNodeCacheId: function (tId) { + return tId.substring(tId.lastIndexOf("_") + 1); + }, + addAfterA: function (afterA) { + _init.afterA.push(afterA); + }, + addBeforeA: function (beforeA) { + _init.beforeA.push(beforeA); + }, + addInnerAfterA: function (innerAfterA) { + _init.innerAfterA.push(innerAfterA); + }, + addInnerBeforeA: function (innerBeforeA) { + _init.innerBeforeA.push(innerBeforeA); + }, + addInitBind: function (bindEvent) { + _init.bind.push(bindEvent); + }, + addInitUnBind: function (unbindEvent) { + _init.unbind.push(unbindEvent); + }, + addInitCache: function (initCache) { + _init.caches.push(initCache); + }, + addInitNode: function (initNode) { + _init.nodes.push(initNode); + }, + addInitProxy: function (initProxy, isFirst) { + if (!!isFirst) { + _init.proxys.splice(0, 0, initProxy); + } else { + _init.proxys.push(initProxy); + } + }, + addInitRoot: function (initRoot) { + _init.roots.push(initRoot); + }, + addNodesData: function (setting, parentNode, index, nodes) { + var children = data.nodeChildren(setting, parentNode), params; + if (!children) { + children = data.nodeChildren(setting, parentNode, []); + index = -1; + } else if (index >= children.length) { + index = -1; + } + + if (children.length > 0 && index === 0) { + children[0].isFirstNode = false; + view.setNodeLineIcos(setting, children[0]); + } else if (children.length > 0 && index < 0) { + children[children.length - 1].isLastNode = false; + view.setNodeLineIcos(setting, children[children.length - 1]); + } + data.nodeIsParent(setting, parentNode, true); + + if (index < 0) { + data.nodeChildren(setting, parentNode, children.concat(nodes)); + } else { + params = [index, 0].concat(nodes); + children.splice.apply(children, params); + } + }, + addSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + if (!data.isSelectedNode(setting, node)) { + root.curSelectedList.push(node); + } + }, + addCreatedNode: function (setting, node) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + root.createdNodes.push(node); + } + }, + addZTreeTools: function (zTreeTools) { + _init.zTreeTools.push(zTreeTools); + }, + exSetting: function (s) { + $.extend(true, _setting, s); + }, + fixPIdKeyValue: function (setting, node) { + if (setting.data.simpleData.enable) { + node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId; + } + }, + getAfterA: function (setting, node, array) { + for (var i = 0, j = _init.afterA.length; i < j; i++) { + _init.afterA[i].apply(this, arguments); + } + }, + getBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.beforeA.length; i < j; i++) { + _init.beforeA[i].apply(this, arguments); + } + }, + getInnerAfterA: function (setting, node, array) { + for (var i = 0, j = _init.innerAfterA.length; i < j; i++) { + _init.innerAfterA[i].apply(this, arguments); + } + }, + getInnerBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.innerBeforeA.length; i < j; i++) { + _init.innerBeforeA[i].apply(this, arguments); + } + }, + getCache: function (setting) { + return caches[setting.treeId]; + }, + getNodeIndex: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return i; + } + } + return -1; + }, + getNextNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return (i == l ? null : children[i + 1]); + } + } + return null; + }, + getNodeByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return null; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + return nodes[i]; + } + var children = data.nodeChildren(setting, node); + var tmp = data.getNodeByParam(setting, children, key, value); + if (tmp) return tmp; + } + return null; + }, + getNodeCache: function (setting, tId) { + if (!tId) return null; + var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)]; + return n ? n : null; + }, + getNodePath: function (setting, node) { + if (!node) return null; + + var path; + if (node.parentTId) { + path = node.getParentNode().getPath(); + } else { + path = []; + } + + if (path) { + path.push(node); + } + + return path; + }, + getNodes: function (setting) { + return data.nodeChildren(setting, data.getRoot(setting)); + }, + getNodesByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParam(setting, children, key, value)); + } + return result; + }, + getNodesByParamFuzzy: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + value = value.toLowerCase(); + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (typeof node[key] == "string" && nodes[i][key].toLowerCase().indexOf(value) > -1) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParamFuzzy(setting, children, key, value)); + } + return result; + }, + getNodesByFilter: function (setting, nodes, filter, isSingle, invokeParam) { + if (!nodes) return (isSingle ? null : []); + var result = isSingle ? null : []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (tools.apply(filter, [node, invokeParam], false)) { + if (isSingle) { + return node; + } + result.push(node); + } + var children = data.nodeChildren(setting, node); + var tmpResult = data.getNodesByFilter(setting, children, filter, isSingle, invokeParam); + if (isSingle && !!tmpResult) { + return tmpResult; + } + result = isSingle ? tmpResult : result.concat(tmpResult); + } + return result; + }, + getPreNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] === node) { + return (i == 0 ? null : children[i - 1]); + } + } + return null; + }, + getRoot: function (setting) { + return setting ? roots[setting.treeId] : null; + }, + getRoots: function () { + return roots; + }, + getSetting: function (treeId) { + return settings[treeId]; + }, + getSettings: function () { + return settings; + }, + getZTreeTools: function (treeId) { + var r = this.getRoot(this.getSetting(treeId)); + return r ? r.treeTools : null; + }, + initCache: function (setting) { + for (var i = 0, j = _init.caches.length; i < j; i++) { + _init.caches[i].apply(this, arguments); + } + }, + initNode: function (setting, level, node, parentNode, preNode, nextNode) { + for (var i = 0, j = _init.nodes.length; i < j; i++) { + _init.nodes[i].apply(this, arguments); + } + }, + initRoot: function (setting) { + for (var i = 0, j = _init.roots.length; i < j; i++) { + _init.roots[i].apply(this, arguments); + } + }, + isSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i]) return true; + } + return false; + }, + nodeChildren: function (setting, node, newChildren) { + if (!node) { + return null; + } + var key = setting.data.key.children; + if (typeof newChildren !== 'undefined') { + node[key] = newChildren; + } + return node[key]; + }, + nodeIsParent: function (setting, node, newIsParent) { + if (!node) { + return false; + } + var key = setting.data.key.isParent; + if (typeof newIsParent !== 'undefined') { + if (typeof newIsParent === "string") { + newIsParent = tools.eqs(checked, "true"); + } + newIsParent = !!newIsParent; + node[key] = newIsParent; + } + return node[key]; + }, + nodeName: function (setting, node, newName) { + var key = setting.data.key.name; + if (typeof newName !== 'undefined') { + node[key] = newName; + } + return "" + node[key]; + }, + nodeTitle: function (setting, node) { + var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title; + return "" + node[t]; + }, + removeNodeCache: function (setting, node) { + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + } + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null; + }, + removeSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) { + root.curSelectedList.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, node]); + i--; + j--; + } + } + }, + setCache: function (setting, cache) { + caches[setting.treeId] = cache; + }, + setRoot: function (setting, root) { + roots[setting.treeId] = root; + }, + setZTreeTools: function (setting, zTreeTools) { + for (var i = 0, j = _init.zTreeTools.length; i < j; i++) { + _init.zTreeTools[i].apply(this, arguments); + } + }, + transformToArrayFormat: function (setting, nodes) { + if (!nodes) return []; + var r = []; + if (tools.isArray(nodes)) { + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + _do(node); + } + } else { + _do(nodes); + } + return r; + + function _do(_node) { + r.push(_node); + var children = data.nodeChildren(setting, _node); + if (children) { + r = r.concat(data.transformToArrayFormat(setting, children)); + } + } + }, + transformTozTreeFormat: function (setting, sNodes) { + var i, l, + key = setting.data.simpleData.idKey, + parentKey = setting.data.simpleData.pIdKey; + if (!key || key == "" || !sNodes) return []; + + if (tools.isArray(sNodes)) { + var r = []; + var tmpMap = {}; + for (i = 0, l = sNodes.length; i < l; i++) { + tmpMap[sNodes[i][key]] = sNodes[i]; + } + for (i = 0, l = sNodes.length; i < l; i++) { + var p = tmpMap[sNodes[i][parentKey]]; + if (p && sNodes[i][key] != sNodes[i][parentKey]) { + var children = data.nodeChildren(setting, p); + if (!children) { + children = data.nodeChildren(setting, p, []); + } + children.push(sNodes[i]); + } else { + r.push(sNodes[i]); + } + } + return r; + } else { + return [sNodes]; + } + } + }, + //method of event proxy + event = { + bindEvent: function (setting) { + for (var i = 0, j = _init.bind.length; i < j; i++) { + _init.bind[i].apply(this, arguments); + } + }, + unbindEvent: function (setting) { + for (var i = 0, j = _init.unbind.length; i < j; i++) { + _init.unbind[i].apply(this, arguments); + } + }, + bindTree: function (setting) { + var eventParam = { + treeId: setting.treeId + }, + o = setting.treeObj; + if (!setting.view.txtSelectedEnable) { + // for can't select text + o.bind('selectstart', handler.onSelectStart).css({ + "-moz-user-select": "-moz-none" + }); + } + o.bind('click', eventParam, event.proxy); + o.bind('dblclick', eventParam, event.proxy); + o.bind('mouseover', eventParam, event.proxy); + o.bind('mouseout', eventParam, event.proxy); + o.bind('mousedown', eventParam, event.proxy); + o.bind('mouseup', eventParam, event.proxy); + o.bind('contextmenu', eventParam, event.proxy); + }, + unbindTree: function (setting) { + var o = setting.treeObj; + o.unbind('selectstart', handler.onSelectStart) + .unbind('click', event.proxy) + .unbind('dblclick', event.proxy) + .unbind('mouseover', event.proxy) + .unbind('mouseout', event.proxy) + .unbind('mousedown', event.proxy) + .unbind('mouseup', event.proxy) + .unbind('contextmenu', event.proxy); + }, + doProxy: function (e) { + var results = []; + for (var i = 0, j = _init.proxys.length; i < j; i++) { + var proxyResult = _init.proxys[i].apply(this, arguments); + results.push(proxyResult); + if (proxyResult.stop) { + break; + } + } + return results; + }, + proxy: function (e) { + var setting = data.getSetting(e.data.treeId); + if (!tools.uCanDo(setting, e)) return true; + var results = event.doProxy(e), + r = true, x = false; + for (var i = 0, l = results.length; i < l; i++) { + var proxyResult = results[i]; + if (proxyResult.nodeEventCallback) { + x = true; + r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + if (proxyResult.treeEventCallback) { + x = true; + r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + } + return r; + } + }, + //method of event handler + handler = { + onSwitchNode: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (node.open) { + if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } else { + if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } + return true; + }, + onClickNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + clickFlag = ((setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey)) && data.isSelectedNode(setting, node)) ? 0 : (setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey) && setting.view.selectedMulti) ? 2 : 1; + if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true; + if (clickFlag === 0) { + view.cancelPreSelectedNode(setting, node); + } else { + view.selectNode(setting, node, clickFlag === 2); + } + setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]); + return true; + }, + onZTreeMousedown: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]); + } + return true; + }, + onZTreeMouseup: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]); + } + return true; + }, + onZTreeDblclick: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]); + } + return true; + }, + onZTreeContextmenu: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]); + } + return (typeof setting.callback.onRightClick) != "function"; + }, + onSelectStart: function (e) { + var n = e.originalEvent.srcElement.nodeName.toLowerCase(); + return (n === "input" || n === "textarea"); + } + }, + //method of tools for zTree + tools = { + apply: function (fun, param, defaultValue) { + if ((typeof fun) == "function") { + return fun.apply(zt, param ? param : []); + } + return defaultValue; + }, + canAsync: function (setting, node) { + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + return (setting.async.enable && node && isParent && !(node.zAsync || (children && children.length > 0))); + }, + clone: function (obj) { + if (obj === null) return null; + var o = tools.isArray(obj) ? [] : {}; + for (var i in obj) { + o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? tools.clone(obj[i]) : obj[i]); + } + return o; + }, + eqs: function (str1, str2) { + return str1.toLowerCase() === str2.toLowerCase(); + }, + isArray: function (arr) { + return Object.prototype.toString.apply(arr) === "[object Array]"; + }, + isElement: function (o) { + return ( + typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2 + o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string" + ); + }, + $: function (node, exp, setting) { + if (!!exp && typeof exp != "string") { + setting = exp; + exp = ""; + } + if (typeof node == "string") { + return $(node, setting ? setting.treeObj.get(0).ownerDocument : null); + } else { + return $("#" + node.tId + exp, setting ? setting.treeObj : null); + } + }, + getMDom: function (setting, curDom, targetExpr) { + if (!curDom) return null; + while (curDom && curDom.id !== setting.treeId) { + for (var i = 0, l = targetExpr.length; curDom.tagName && i < l; i++) { + if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) { + return curDom; + } + } + curDom = curDom.parentNode; + } + return null; + }, + getNodeMainDom: function (target) { + return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0)); + }, + isChildOrSelf: function (dom, parentId) { + return ($(dom).closest("#" + parentId).length > 0); + }, + uCanDo: function (setting, e) { + return true; + } + }, + //method of operate ztree dom + view = { + addNodes: function (setting, parentNode, index, newNodes, isSilent) { + var isParent = data.nodeIsParent(setting, parentNode); + if (setting.data.keep.leaf && parentNode && !isParent) { + return; + } + if (!tools.isArray(newNodes)) { + newNodes = [newNodes]; + } + if (setting.data.simpleData.enable) { + newNodes = data.transformTozTreeFormat(setting, newNodes); + } + if (parentNode) { + var target_switchObj = $$(parentNode, consts.id.SWITCH, setting), + target_icoObj = $$(parentNode, consts.id.ICON, setting), + target_ulObj = $$(parentNode, consts.id.UL, setting); + + if (!parentNode.open) { + view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE); + view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE); + parentNode.open = false; + target_ulObj.css({ + "display": "none" + }); + } + + data.addNodesData(setting, parentNode, index, newNodes); + view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index); + if (!isSilent) { + view.expandCollapseParentNode(setting, parentNode, true); + } + } else { + data.addNodesData(setting, data.getRoot(setting), index, newNodes); + view.createNodes(setting, 0, newNodes, null, index); + } + }, + appendNodes: function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + if (!nodes) return []; + var html = []; + + var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting), + tmpPChild = data.nodeChildren(setting, tmpPNode), + isFirstNode, isLastNode; + + if (!tmpPChild || index >= tmpPChild.length - nodes.length) { + index = -1; + } + + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (initFlag) { + isFirstNode = ((index === 0 || tmpPChild.length == nodes.length) && (i == 0)); + isLastNode = (index < 0 && i == (nodes.length - 1)); + data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag); + data.addNodeCache(setting, node); + } + var isParent = data.nodeIsParent(setting, node); + + var childHtml = []; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + //make child html first, because checkType + childHtml = view.appendNodes(setting, level + 1, children, node, -1, initFlag, openFlag && node.open); + } + if (openFlag) { + view.makeDOMNodeMainBefore(html, setting, node); + view.makeDOMNodeLine(html, setting, node); + data.getBeforeA(setting, node, html); + view.makeDOMNodeNameBefore(html, setting, node); + data.getInnerBeforeA(setting, node, html); + view.makeDOMNodeIcon(html, setting, node); + data.getInnerAfterA(setting, node, html); + view.makeDOMNodeNameAfter(html, setting, node); + data.getAfterA(setting, node, html); + if (isParent && node.open) { + view.makeUlHtml(setting, node, html, childHtml.join('')); + } + view.makeDOMNodeMainAfter(html, setting, node); + data.addCreatedNode(setting, node); + } + } + return html; + }, + appendParentULDom: function (setting, node) { + var html = [], + nObj = $$(node, setting); + if (!nObj.get(0) && !!node.parentTId) { + view.appendParentULDom(setting, node.getParentNode()); + nObj = $$(node, setting); + } + var ulObj = $$(node, consts.id.UL, setting); + if (ulObj.get(0)) { + ulObj.remove(); + } + var children = data.nodeChildren(setting, node), + childHtml = view.appendNodes(setting, node.level + 1, children, node, -1, false, true); + view.makeUlHtml(setting, node, html, childHtml.join('')); + nObj.append(html.join('')); + }, + asyncNode: function (setting, node, isSilent, callback) { + var i, l; + var isParent = data.nodeIsParent(setting, node); + if (node && !isParent) { + tools.apply(callback); + return false; + } else if (node && node.isAjaxing) { + return false; + } else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) { + tools.apply(callback); + return false; + } + if (node) { + node.isAjaxing = true; + var icoObj = $$(node, consts.id.ICON, setting); + icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING}); + } + + var tmpParam = {}; + var autoParam = tools.apply(setting.async.autoParam, [setting.treeId, node], setting.async.autoParam); + for (i = 0, l = autoParam.length; node && i < l; i++) { + var pKey = autoParam[i].split("="), spKey = pKey; + if (pKey.length > 1) { + spKey = pKey[1]; + pKey = pKey[0]; + } + tmpParam[spKey] = node[pKey]; + } + var otherParam = tools.apply(setting.async.otherParam, [setting.treeId, node], setting.async.otherParam); + if (tools.isArray(otherParam)) { + for (i = 0, l = otherParam.length; i < l; i += 2) { + tmpParam[otherParam[i]] = otherParam[i + 1]; + } + } else { + for (var p in otherParam) { + tmpParam[p] = otherParam[p]; + } + } + + var _tmpV = data.getRoot(setting)._ver; + $.ajax({ + contentType: setting.async.contentType, + cache: false, + type: setting.async.type, + url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url), + data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam, + dataType: setting.async.dataType, + success: function (msg) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + var newNodes = []; + try { + if (!msg || msg.length == 0) { + newNodes = []; + } else if (typeof msg == "string") { + newNodes = eval("(" + msg + ")"); + } else { + newNodes = msg; + } + } catch (err) { + newNodes = msg; + } + + if (node) { + node.isAjaxing = null; + node.zAsync = true; + } + view.setNodeLineIcos(setting, node); + if (newNodes && newNodes !== "") { + newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes); + view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent); + } else { + view.addNodes(setting, node, -1, [], !!isSilent); + } + setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]); + tools.apply(callback); + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + if (node) node.isAjaxing = null; + view.setNodeLineIcos(setting, node); + setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]); + } + }); + return true; + }, + cancelPreSelectedNode: function (setting, node, excludeNode) { + var list = data.getRoot(setting).curSelectedList, + i, n; + for (i = list.length - 1; i >= 0; i--) { + n = list[i]; + if (node === n || (!node && (!excludeNode || excludeNode !== n))) { + $$(n, consts.id.A, setting).removeClass(consts.node.CURSELECTED); + if (node) { + data.removeSelectedNode(setting, node); + break; + } else { + list.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, n]); + } + } + } + }, + createNodeCallback: function (setting) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + while (root.createdNodes.length > 0) { + var node = root.createdNodes.shift(); + tools.apply(setting.view.addDiyDom, [setting.treeId, node]); + if (!!setting.callback.onNodeCreated) { + setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]); + } + } + } + }, + createNodes: function (setting, level, nodes, parentNode, index) { + if (!nodes || nodes.length == 0) return; + var root = data.getRoot(setting), + openFlag = !parentNode || parentNode.open || !!$$(data.nodeChildren(setting, parentNode)[0], setting).get(0); + root.createdNodes = []; + var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, index, true, openFlag), + parentObj, nextObj; + + if (!parentNode) { + parentObj = setting.treeObj; + //setting.treeObj.append(zTreeHtml.join('')); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + if (ulObj.get(0)) { + parentObj = ulObj; + //ulObj.append(zTreeHtml.join('')); + } + } + if (parentObj) { + if (index >= 0) { + nextObj = parentObj.children()[index]; + } + if (index >= 0 && nextObj) { + $(nextObj).before(zTreeHtml.join('')); + } else { + parentObj.append(zTreeHtml.join('')); + } + } + + view.createNodeCallback(setting); + }, + destroy: function (setting) { + if (!setting) return; + data.initCache(setting); + data.initRoot(setting); + event.unbindTree(setting); + event.unbindEvent(setting); + setting.treeObj.empty(); + delete settings[setting.treeId]; + }, + expandCollapseNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting); + var tmpCb, _callback; + if (!node) { + tools.apply(callback, []); + return; + } + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + if (root.expandTriggerFlag) { + _callback = callback; + tmpCb = function () { + if (_callback) _callback(); + if (node.open) { + setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]); + } else { + setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]); + } + }; + callback = tmpCb; + root.expandTriggerFlag = false; + } + if (!node.open && isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (children && children.length > 0 && !$$(children[0], setting).get(0)))) { + view.appendParentULDom(setting, node); + view.createNodeCallback(setting); + } + if (node.open == expandFlag) { + tools.apply(callback, []); + return; + } + var ulObj = $$(node, consts.id.UL, setting), + switchObj = $$(node, consts.id.SWITCH, setting), + icoObj = $$(node, consts.id.ICON, setting); + + if (isParent) { + node.open = !node.open; + if (node.iconOpen && node.iconClose) { + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + } + var dir = node.directory; + if (node.open) { + + if (dir == 1) { + view.replaceSwitchClass(node, switchObj, consts.folder.OPEN2); + view.replaceIcoClass(node, icoObj, consts.folder.OPEN2); + } else { + view.replaceSwitchClass(node, switchObj, consts.folder.OPEN); + view.replaceIcoClass(node, icoObj, consts.folder.OPEN); + } + + if (animateFlag == false || setting.view.expandSpeed == "") { + ulObj.show(); + tools.apply(callback, []); + } else { + if (children && children.length > 0) { + ulObj.slideDown(setting.view.expandSpeed, callback); + } else { + ulObj.show(); + tools.apply(callback, []); + } + } + } else { + if (dir == 1) { + view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE2); + view.replaceIcoClass(node, icoObj, consts.folder.CLOSE2); + } else { + view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE); + view.replaceIcoClass(node, icoObj, consts.folder.CLOSE); + } + + + if (animateFlag == false || setting.view.expandSpeed == "" || !(children && children.length > 0)) { + ulObj.hide(); + tools.apply(callback, []); + } else { + ulObj.slideUp(setting.view.expandSpeed, callback); + } + } + } else { + tools.apply(callback, []); + } + }, + expandCollapseParentNode: function (setting, node, expandFlag, animateFlag, callback) { + if (!node) return; + if (!node.parentTId) { + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + return; + } else { + view.expandCollapseNode(setting, node, expandFlag, animateFlag); + } + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback); + } + }, + expandCollapseSonNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting), + treeNodes = (node) ? data.nodeChildren(setting, node) : data.nodeChildren(setting, root), + selfAnimateSign = (node) ? false : animateFlag, + expandTriggerFlag = data.getRoot(setting).expandTriggerFlag; + data.getRoot(setting).expandTriggerFlag = false; + if (treeNodes) { + for (var i = 0, l = treeNodes.length; i < l; i++) { + if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign); + } + } + data.getRoot(setting).expandTriggerFlag = expandTriggerFlag; + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + }, + isSelectedNode: function (setting, node) { + if (!node) { + return false; + } + var list = data.getRoot(setting).curSelectedList, + i; + for (i = list.length - 1; i >= 0; i--) { + if (node === list[i]) { + return true; + } + } + return false; + }, + makeDOMNodeIcon: function (html, setting, node) { + var nameStr = data.nodeName(setting, node), + name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g, '&').replace(//g, '>'); + html.push("", name, ""); + }, + makeDOMNodeLine: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainBefore: function (html, setting, node) { + html.push("
                • "); + }, + makeDOMNodeNameAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeNameBefore: function (html, setting, node) { + var title = data.nodeTitle(setting, node), + url = view.makeNodeUrl(setting, node), + fontcss = view.makeNodeFontCss(setting, node), + fontStyle = []; + for (var f in fontcss) { + fontStyle.push(f, ":", fontcss[f], ";"); + } + html.push(" 0) ? "href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''), + "'"); + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) { + html.push("title='", title.replace(/'/g, "'").replace(//g, '>'), "'"); + } + html.push(">"); + }, + makeNodeFontCss: function (setting, node) { + var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss); + return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {}; + }, + makeNodeIcoClass: function (setting, node) { + var icoCss = ["ico"]; + if (!node.isAjaxing) { + icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0]; + var dir = node.directory; + if (dir == 0) { + icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else if (dir == 1) { + icoCss.push(node.open ? consts.folder.OPEN2 : consts.folder.CLOSE2); + + } else { + icoCss.push(consts.folder.DOCU); + + } + } + return consts.className.BUTTON + " " + icoCss.join('_'); + }, + makeNodeIcoStyle: function (setting, node) { + var icoStyle = []; + if (!node.isAjaxing) { + var isParent = data.nodeIsParent(setting, node); + var icon = (isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon]; + if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;"); + if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) { + icoStyle.push("width:0px;height:0px;"); + } + } + return icoStyle.join(''); + }, + makeNodeLineClass: function (setting, node) { + var lineClass = []; + if (setting.view.showLine) { + if (node.level == 0 && node.isFirstNode && node.isLastNode) { + lineClass.push(consts.line.ROOT); + } else if (node.level == 0 && node.isFirstNode) { + lineClass.push(consts.line.ROOTS); + } else if (node.isLastNode) { + lineClass.push(consts.line.BOTTOM); + } else { + lineClass.push(consts.line.CENTER); + } + } else { + lineClass.push(consts.line.NOLINE); + } + if (data.nodeIsParent(setting, node)) { + lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else { + lineClass.push(consts.folder.DOCU); + } + return view.makeNodeLineClassEx(node) + lineClass.join('_'); + }, + makeNodeLineClassEx: function (node) { + return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " "; + }, + makeNodeTarget: function (node) { + return (node.target || "_blank"); + }, + makeNodeUrl: function (setting, node) { + var urlKey = setting.data.key.url; + return node[urlKey] ? node[urlKey] : null; + }, + makeUlHtml: function (setting, node, html, content) { + html.push("
                    "); + html.push(content); + html.push("
                  "); + }, + makeUlLineClass: function (setting, node) { + return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : ""); + }, + removeChildNodes: function (setting, node) { + if (!node) return; + var nodes = data.nodeChildren(setting, node); + if (!nodes) return; + + for (var i = 0, l = nodes.length; i < l; i++) { + data.removeNodeCache(setting, nodes[i]); + } + data.removeSelectedNode(setting); + delete node[setting.data.key.children]; + + if (!setting.data.keep.parent) { + data.nodeIsParent(setting, node, false); + node.open = false; + var tmp_switchObj = $$(node, consts.id.SWITCH, setting), + tmp_icoObj = $$(node, consts.id.ICON, setting); + view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU); + $$(node, consts.id.UL, setting).remove(); + } else { + $$(node, consts.id.UL, setting).empty(); + } + }, + scrollIntoView: function (setting, dom) { + if (!dom) { + return; + } + // support IE 7 + if (typeof Element === 'undefined') { + var contRect = setting.treeObj.get(0).getBoundingClientRect(), + findMeRect = dom.getBoundingClientRect(); + if (findMeRect.top < contRect.top || findMeRect.bottom > contRect.bottom + || findMeRect.right > contRect.right || findMeRect.left < contRect.left) { + dom.scrollIntoView(); + } + return; + } + // code src: http://jsfiddle.net/08u6cxwj/ + if (!Element.prototype.scrollIntoViewIfNeeded) { + Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) { + function withinBounds(value, min, max, extent) { + if (false === centerIfNeeded || max <= value + extent && value <= min + extent) { + return Math.min(max, Math.max(min, value)); + } else { + return (min + max) / 2; + } + } + + function makeArea(left, top, width, height) { + return { + "left": left, "top": top, "width": width, "height": height + , "right": left + width, "bottom": top + height + , "translate": function (x, y) { + return makeArea(x + left, y + top, width, height); + } + , "relativeFromTo": function (lhs, rhs) { + var newLeft = left, newTop = top; + lhs = lhs.offsetParent; + rhs = rhs.offsetParent; + if (lhs === rhs) { + return area; + } + for (; lhs; lhs = lhs.offsetParent) { + newLeft += lhs.offsetLeft + lhs.clientLeft; + newTop += lhs.offsetTop + lhs.clientTop; + } + for (; rhs; rhs = rhs.offsetParent) { + newLeft -= rhs.offsetLeft + rhs.clientLeft; + newTop -= rhs.offsetTop + rhs.clientTop; + } + return makeArea(newLeft, newTop, width, height); + } + }; + } + + var parent, elem = this, area = makeArea( + this.offsetLeft, this.offsetTop, + this.offsetWidth, this.offsetHeight); + while (tools.isElement(parent = elem.parentNode)) { + var clientLeft = parent.offsetLeft + parent.clientLeft; + var clientTop = parent.offsetTop + parent.clientTop; + + // Make area relative to parent's client area. + area = area.relativeFromTo(elem, parent).translate(-clientLeft, -clientTop); + + parent.scrollLeft = withinBounds( + parent.scrollLeft, + area.right - parent.clientWidth, area.left, + parent.clientWidth); + + parent.scrollTop = withinBounds( + parent.scrollTop, + area.bottom - parent.clientHeight, area.top, + parent.clientHeight); + + // Determine actual scroll amount by reading back scroll properties. + area = area.translate(clientLeft - parent.scrollLeft, + clientTop - parent.scrollTop); + elem = parent; + } + }; + } + dom.scrollIntoViewIfNeeded(); + }, + setFirstNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[0].isFirstNode = true; + } + }, + setLastNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[children.length - 1].isLastNode = true; + } + }, + removeNode: function (setting, node) { + var root = data.getRoot(setting), + parentNode = (node.parentTId) ? node.getParentNode() : root; + + node.isFirstNode = false; + node.isLastNode = false; + node.getPreNode = function () { + return null; + }; + node.getNextNode = function () { + return null; + }; + + if (!data.getNodeCache(setting, node.tId)) { + return; + } + + $$(node, setting).remove(); + data.removeNodeCache(setting, node); + data.removeSelectedNode(setting, node); + + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i].tId == node.tId) { + children.splice(i, 1); + break; + } + } + view.setFirstNode(setting, parentNode); + view.setLastNode(setting, parentNode); + + var tmp_ulObj, tmp_switchObj, tmp_icoObj, + childLength = children.length; + + //repair nodes old parent + if (!setting.data.keep.parent && childLength == 0) { + //old parentNode has no child nodes + data.nodeIsParent(setting, parentNode, false); + parentNode.open = false; + delete parentNode[setting.data.key.children]; + tmp_ulObj = $$(parentNode, consts.id.UL, setting); + tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting); + tmp_icoObj = $$(parentNode, consts.id.ICON, setting); + var dir = parentNode.directory; + console.log("dir:" + dir); + if (dir == 0) { + view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.OPEN); + view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.OPEN); + } else if (dir == 1) { + view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.OPEN2); + view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.OPEN2); + } else { + view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU); + } + + tmp_ulObj.css("display", "none"); + + } else if (setting.view.showLine && childLength > 0) { + //old parentNode has child nodes + var newLast = children[childLength - 1]; + tmp_ulObj = $$(newLast, consts.id.UL, setting); + tmp_switchObj = $$(newLast, consts.id.SWITCH, setting); + tmp_icoObj = $$(newLast, consts.id.ICON, setting); + if (parentNode == root) { + if (children.length == 1) { + //node was root, and ztree has only one root after move node + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT); + } else { + var tmp_first_switchObj = $$(children[0], consts.id.SWITCH, setting); + view.replaceSwitchClass(children[0], tmp_first_switchObj, consts.line.ROOTS); + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + } else { + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + tmp_ulObj.removeClass(consts.line.LINE); + } + }, + replaceIcoClass: function (node, obj, newName) { + if (!obj || node.isAjaxing) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.folder.OPEN: + case consts.folder.OPEN2: + case consts.folder.CLOSE2: + case consts.folder.CLOSE: + case consts.folder.DOCU: + tmpList[tmpList.length - 1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + }, + replaceSwitchClass: function (node, obj, newName) { + if (!obj) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.line.ROOT: + case consts.line.ROOTS: + case consts.line.CENTER: + case consts.line.BOTTOM: + case consts.line.NOLINE: + tmpList[0] = view.makeNodeLineClassEx(node) + newName; + break; + case consts.folder.OPEN: + case consts.folder.CLOSE: + case consts.folder.DOCU: + case consts.folder.OPEN2: + case consts.folder.CLOSE2: + tmpList[1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + if (newName !== consts.folder.DOCU) { + obj.removeAttr("disabled"); + } else { + obj.attr("disabled", "disabled"); + } + }, + selectNode: function (setting, node, addFlag) { + if (!addFlag) { + view.cancelPreSelectedNode(setting, null, node); + } + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED); + data.addSelectedNode(setting, node); + setting.treeObj.trigger(consts.event.SELECTED, [setting.treeId, node]); + }, + setNodeFontCss: function (setting, treeNode) { + var aObj = $$(treeNode, consts.id.A, setting), + fontCss = view.makeNodeFontCss(setting, treeNode); + if (fontCss) { + aObj.css(fontCss); + } + }, + setNodeLineIcos: function (setting, node) { + if (!node) return; + var switchObj = $$(node, consts.id.SWITCH, setting), + ulObj = $$(node, consts.id.UL, setting), + icoObj = $$(node, consts.id.ICON, setting), + ulLine = view.makeUlLineClass(setting, node); + if (ulLine.length == 0) { + ulObj.removeClass(consts.line.LINE); + } else { + ulObj.addClass(ulLine); + } + switchObj.attr("class", view.makeNodeLineClass(setting, node)); + if (data.nodeIsParent(setting, node)) { + switchObj.removeAttr("disabled"); + } else { + switchObj.attr("disabled", "disabled"); + } + icoObj.removeAttr("style"); + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + icoObj.attr("class", view.makeNodeIcoClass(setting, node)); + }, + setNodeName: function (setting, node) { + var title = data.nodeTitle(setting, node), + nObj = $$(node, consts.id.SPAN, setting); + nObj.empty(); + if (setting.view.nameIsHTML) { + nObj.html(data.nodeName(setting, node)); + } else { + nObj.text(data.nodeName(setting, node)); + } + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("title", !title ? "" : title); + } + }, + setNodeTarget: function (setting, node) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("target", view.makeNodeTarget(node)); + }, + setNodeUrl: function (setting, node) { + var aObj = $$(node, consts.id.A, setting), + url = view.makeNodeUrl(setting, node); + if (url == null || url.length == 0) { + aObj.removeAttr("href"); + } else { + aObj.attr("href", url); + } + }, + switchNode: function (setting, node) { + if (node.open || !tools.canAsync(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + } else if (setting.async.enable) { + if (!view.asyncNode(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + return; + } + } else if (node) { + view.expandCollapseNode(setting, node, !node.open); + } + } + }; + // zTree defind + $.fn.zTree = { + consts: _consts, + _z: { + tools: tools, + view: view, + event: event, + data: data + }, + getZTreeObj: function (treeId) { + var o = data.getZTreeTools(treeId); + return o ? o : null; + }, + destroy: function (treeId) { + if (!!treeId && treeId.length > 0) { + view.destroy(data.getSetting(treeId)); + } else { + for (var s in settings) { + view.destroy(settings[s]); + } + } + }, + init: function (obj, zSetting, zNodes) { + var setting = tools.clone(_setting); + $.extend(true, setting, zSetting); + setting.treeId = obj.attr("id"); + setting.treeObj = obj; + setting.treeObj.empty(); + settings[setting.treeId] = setting; + //For some older browser,(e.g., ie6) + if (typeof document.body.style.maxHeight === "undefined") { + setting.view.expandSpeed = ""; + } + data.initRoot(setting); + var root = data.getRoot(setting); + zNodes = zNodes ? tools.clone(tools.isArray(zNodes) ? zNodes : [zNodes]) : []; + if (setting.data.simpleData.enable) { + data.nodeChildren(setting, root, data.transformTozTreeFormat(setting, zNodes)); + } else { + data.nodeChildren(setting, root, zNodes); + } + + data.initCache(setting); + event.unbindTree(setting); + event.bindTree(setting); + event.unbindEvent(setting); + event.bindEvent(setting); + + var zTreeTools = { + setting: setting, + addNodes: function (parentNode, index, newNodes, isSilent) { + if (!parentNode) parentNode = null; + var isParent = data.nodeIsParent(setting, parentNode); + if (parentNode && !isParent && setting.data.keep.leaf) return null; + + var i = parseInt(index, 10); + if (isNaN(i)) { + isSilent = !!newNodes; + newNodes = index; + index = -1; + } else { + index = i; + } + if (!newNodes) return null; + + + var xNewNodes = tools.clone(tools.isArray(newNodes) ? newNodes : [newNodes]); + + function addCallback() { + view.addNodes(setting, parentNode, index, xNewNodes, (isSilent == true)); + } + + if (tools.canAsync(setting, parentNode)) { + view.asyncNode(setting, parentNode, isSilent, addCallback); + } else { + addCallback(); + } + return xNewNodes; + }, + cancelSelectedNode: function (node) { + view.cancelPreSelectedNode(setting, node); + }, + destroy: function () { + view.destroy(setting); + }, + expandAll: function (expandFlag) { + expandFlag = !!expandFlag; + view.expandCollapseSonNode(setting, null, expandFlag, true); + return expandFlag; + }, + expandNode: function (node, expandFlag, sonSign, focus, callbackFlag) { + if (!node || !data.nodeIsParent(setting, node)) return null; + if (expandFlag !== true && expandFlag !== false) { + expandFlag = !node.open; + } + callbackFlag = !!callbackFlag; + + if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) { + return null; + } else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) { + return null; + } + if (expandFlag && node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false); + } + if (expandFlag === node.open && !sonSign) { + return null; + } + + data.getRoot(setting).expandTriggerFlag = callbackFlag; + if (!tools.canAsync(setting, node) && sonSign) { + view.expandCollapseSonNode(setting, node, expandFlag, true, showNodeFocus); + } else { + node.open = !expandFlag; + view.switchNode(this.setting, node); + showNodeFocus(); + } + return expandFlag; + + function showNodeFocus() { + var a = $$(node, setting).get(0); + if (a && focus !== false) { + view.scrollIntoView(setting, a); + } + } + }, + getNodes: function () { + return data.getNodes(setting); + }, + getNodeByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodeByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodeByTId: function (tId) { + return data.getNodeCache(setting, tId); + }, + getNodesByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByParamFuzzy: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParamFuzzy(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByFilter: function (filter, isSingle, parentNode, invokeParam) { + isSingle = !!isSingle; + if (!filter || (typeof filter != "function")) return (isSingle ? null : []); + return data.getNodesByFilter(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), filter, isSingle, invokeParam); + }, + getNodeIndex: function (node) { + if (!node) return null; + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] == node) return i; + } + return -1; + }, + getSelectedNodes: function () { + var r = [], list = data.getRoot(setting).curSelectedList; + for (var i = 0, l = list.length; i < l; i++) { + r.push(list[i]); + } + return r; + }, + isSelectedNode: function (node) { + return data.isSelectedNode(setting, node); + }, + reAsyncChildNodesPromise: function (parentNode, reloadType, isSilent) { + var promise = new Promise(function (resolve, reject) { + try { + zTreeTools.reAsyncChildNodes(parentNode, reloadType, isSilent, function () { + resolve(parentNode); + }); + } catch (e) { + reject(e); + } + }); + return promise; + }, + reAsyncChildNodes: function (parentNode, reloadType, isSilent, callback) { + if (!this.setting.async.enable) return; + var isRoot = !parentNode; + if (isRoot) { + parentNode = data.getRoot(setting); + } + if (reloadType == "refresh") { + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children ? children.length : 0; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + data.removeSelectedNode(setting); + data.nodeChildren(setting, parentNode, []); + if (isRoot) { + this.setting.treeObj.empty(); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + ulObj.empty(); + } + } + view.asyncNode(this.setting, isRoot ? null : parentNode, !!isSilent, callback); + }, + refresh: function () { + this.setting.treeObj.empty(); + var root = data.getRoot(setting), + nodes = data.nodeChildren(setting, root); + data.initRoot(setting); + data.nodeChildren(setting, root, nodes); + data.initCache(setting); + view.createNodes(setting, 0, data.nodeChildren(setting, root), null, -1); + }, + removeChildNodes: function (node) { + if (!node) return null; + var nodes = data.nodeChildren(setting, node); + view.removeChildNodes(setting, node); + return nodes ? nodes : null; + }, + removeNode: function (node, callbackFlag) { + if (!node) return; + callbackFlag = !!callbackFlag; + if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return; + view.removeNode(setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + } + }, + selectNode: function (node, addFlag, isSilent) { + if (!node) return; + if (tools.uCanDo(setting)) { + addFlag = setting.view.selectedMulti && addFlag; + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, false, showNodeFocus); + } else if (!isSilent) { + try { + $$(node, setting).focus().blur(); + } catch (e) { + } + } + view.selectNode(setting, node, addFlag); + } + + function showNodeFocus() { + if (isSilent) { + return; + } + var a = $$(node, setting).get(0); + view.scrollIntoView(setting, a); + } + }, + transformTozTreeNodes: function (simpleNodes) { + return data.transformTozTreeFormat(setting, simpleNodes); + }, + transformToArray: function (nodes) { + return data.transformToArrayFormat(setting, nodes); + }, + updateNode: function (node, checkTypeFlag) { + if (!node) return; + var nObj = $$(node, setting); + if (nObj.get(0) && tools.uCanDo(setting)) { + view.setNodeName(setting, node); + view.setNodeTarget(setting, node); + view.setNodeUrl(setting, node); + view.setNodeLineIcos(setting, node); + view.setNodeFontCss(setting, node); + } + } + }; + root.treeTools = zTreeTools; + data.setZTreeTools(setting, zTreeTools); + var children = data.nodeChildren(setting, root); + if (children && children.length > 0) { + view.createNodes(setting, 0, children, null, -1); + } else if (setting.async.enable && setting.async.url && setting.async.url !== '') { + view.asyncNode(setting); + } + return zTreeTools; + } + }; + + var zt = $.fn.zTree, + $$ = tools.$, + consts = zt.consts; +})(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.core.min.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.core.min.js new file mode 100755 index 00000000..7fe85921 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.core.min.js @@ -0,0 +1,10 @@ +(function($){var settings={},roots={},caches={},_consts={className:{BUTTON:"button",LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",DOCU:"docu",OPEN2:"open2",CLOSE2:"close2"},node:{CURSELECTED:"curSelectedNode"}},_setting={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:true,dblClickExpand:true,expandSpeed:"fast",fontCss:{},nameIsHTML:false,selectedMulti:true,showIcon:true,showLine:true,showTitle:true,txtSelectedEnable:false},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:false,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:false,leaf:false}},async:{enable:false,contentType:"application/x-www-form-urlencoded",type:"post",dataType:"text",url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},_initRoot=function(setting){var r=data.getRoot(setting);if(!r){r={};data.setRoot(setting,r)}data.nodeChildren(setting,r,[]);r.expandTriggerFlag=false;r.curSelectedList=[];r.noSelection=true;r.createdNodes=[];r.zId=0;r._ver=(new Date()).getTime()},_initCache=function(setting){var c=data.getCache(setting);if(!c){c={};data.setCache(setting,c)}c.nodes=[];c.doms=[]},_bindEvent=function(setting){var o=setting.treeObj,c=consts.event;o.bind(c.NODECREATED,function(event,treeId,node){tools.apply(setting.callback.onNodeCreated,[event,treeId,node])});o.bind(c.CLICK,function(event,srcEvent,treeId,node,clickFlag){tools.apply(setting.callback.onClick,[srcEvent,treeId,node,clickFlag])});o.bind(c.EXPAND,function(event,treeId,node){tools.apply(setting.callback.onExpand,[event,treeId,node])});o.bind(c.COLLAPSE,function(event,treeId,node){tools.apply(setting.callback.onCollapse,[event,treeId,node])});o.bind(c.ASYNC_SUCCESS,function(event,treeId,node,msg){tools.apply(setting.callback.onAsyncSuccess,[event,treeId,node,msg])});o.bind(c.ASYNC_ERROR,function(event,treeId,node,XMLHttpRequest,textStatus,errorThrown){tools.apply(setting.callback.onAsyncError,[event,treeId,node,XMLHttpRequest,textStatus,errorThrown])});o.bind(c.REMOVE,function(event,treeId,treeNode){tools.apply(setting.callback.onRemove,[event,treeId,treeNode])});o.bind(c.SELECTED,function(event,treeId,node){tools.apply(setting.callback.onSelected,[treeId,node])});o.bind(c.UNSELECTED,function(event,treeId,node){tools.apply(setting.callback.onUnSelected,[treeId,node])})},_unbindEvent=function(setting){var o=setting.treeObj,c=consts.event;o.unbind(c.NODECREATED).unbind(c.CLICK).unbind(c.EXPAND).unbind(c.COLLAPSE).unbind(c.ASYNC_SUCCESS).unbind(c.ASYNC_ERROR).unbind(c.REMOVE).unbind(c.SELECTED).unbind(c.UNSELECTED)},_eventProxy=function(event){var target=event.target,setting=data.getSetting(event.data.treeId),tId="",node=null,nodeEventType="",treeEventType="",nodeEventCallback=null,treeEventCallback=null,tmp=null;if(tools.eqs(event.type,"mousedown")){treeEventType="mousedown"}else{if(tools.eqs(event.type,"mouseup")){treeEventType="mouseup"}else{if(tools.eqs(event.type,"contextmenu")){treeEventType="contextmenu"}else{if(tools.eqs(event.type,"click")){if(tools.eqs(target.tagName,"span")&&target.getAttribute("treeNode"+consts.id.SWITCH)!==null){tId=tools.getNodeMainDom(target).id;nodeEventType="switchNode"}else{tmp=tools.getMDom(setting,target,[{tagName:"a",attrName:"treeNode"+consts.id.A}]);if(tmp){tId=tools.getNodeMainDom(tmp).id;nodeEventType="clickNode"}}}else{if(tools.eqs(event.type,"dblclick")){treeEventType="dblclick";tmp=tools.getMDom(setting,target,[{tagName:"a",attrName:"treeNode"+consts.id.A}]);if(tmp){tId=tools.getNodeMainDom(tmp).id;nodeEventType="switchNode"}}}}}}if(treeEventType.length>0&&tId.length==0){tmp=tools.getMDom(setting,target,[{tagName:"a",attrName:"treeNode"+consts.id.A}]);if(tmp){tId=tools.getNodeMainDom(tmp).id}}if(tId.length>0){node=data.getNodeCache(setting,tId);switch(nodeEventType){case"switchNode":var isParent=data.nodeIsParent(setting,node);if(!isParent){nodeEventType=""}else{if(tools.eqs(event.type,"click")||(tools.eqs(event.type,"dblclick")&&tools.apply(setting.view.dblClickExpand,[setting.treeId,node],setting.view.dblClickExpand))){nodeEventCallback=handler.onSwitchNode}else{nodeEventType=""}}break;case"clickNode":nodeEventCallback=handler.onClickNode;break +}}switch(treeEventType){case"mousedown":treeEventCallback=handler.onZTreeMousedown;break;case"mouseup":treeEventCallback=handler.onZTreeMouseup;break;case"dblclick":treeEventCallback=handler.onZTreeDblclick;break;case"contextmenu":treeEventCallback=handler.onZTreeContextmenu;break}var proxyResult={stop:false,node:node,nodeEventType:nodeEventType,nodeEventCallback:nodeEventCallback,treeEventType:treeEventType,treeEventCallback:treeEventCallback};return proxyResult},_initNode=function(setting,level,n,parentNode,isFirstNode,isLastNode,openFlag){if(!n){return}var r=data.getRoot(setting),children=data.nodeChildren(setting,n);n.level=level;n.tId=setting.treeId+"_"+(++r.zId);n.parentTId=parentNode?parentNode.tId:null;n.open=(typeof n.open=="string")?tools.eqs(n.open,"true"):!!n.open;var isParent=data.nodeIsParent(setting,n);if(tools.isArray(children)&&!(isParent===false||(typeof isParent=="string"&&tools.eqs(isParent,"false")))){data.nodeIsParent(setting,n,true);n.zAsync=true}else{isParent=data.nodeIsParent(setting,n,isParent);n.open=(isParent&&!setting.async.enable)?n.open:false;n.zAsync=!isParent}n.isFirstNode=isFirstNode;n.isLastNode=isLastNode;n.getParentNode=function(){return data.getNodeCache(setting,n.parentTId)};n.getPreNode=function(){return data.getPreNode(setting,n)};n.getNextNode=function(){return data.getNextNode(setting,n)};n.getIndex=function(){return data.getNodeIndex(setting,n)};n.getPath=function(){return data.getNodePath(setting,n)};n.isAjaxing=false;data.fixPIdKeyValue(setting,n)},_init={bind:[_bindEvent],unbind:[_unbindEvent],caches:[_initCache],nodes:[_initNode],proxys:[_eventProxy],roots:[_initRoot],beforeA:[],afterA:[],innerBeforeA:[],innerAfterA:[],zTreeTools:[]},data={addNodeCache:function(setting,node){data.getCache(setting).nodes[data.getNodeCacheId(node.tId)]=node},getNodeCacheId:function(tId){return tId.substring(tId.lastIndexOf("_")+1)},addAfterA:function(afterA){_init.afterA.push(afterA)},addBeforeA:function(beforeA){_init.beforeA.push(beforeA)},addInnerAfterA:function(innerAfterA){_init.innerAfterA.push(innerAfterA)},addInnerBeforeA:function(innerBeforeA){_init.innerBeforeA.push(innerBeforeA)},addInitBind:function(bindEvent){_init.bind.push(bindEvent)},addInitUnBind:function(unbindEvent){_init.unbind.push(unbindEvent)},addInitCache:function(initCache){_init.caches.push(initCache)},addInitNode:function(initNode){_init.nodes.push(initNode)},addInitProxy:function(initProxy,isFirst){if(!!isFirst){_init.proxys.splice(0,0,initProxy)}else{_init.proxys.push(initProxy)}},addInitRoot:function(initRoot){_init.roots.push(initRoot)},addNodesData:function(setting,parentNode,index,nodes){var children=data.nodeChildren(setting,parentNode),params;if(!children){children=data.nodeChildren(setting,parentNode,[]);index=-1}else{if(index>=children.length){index=-1}}if(children.length>0&&index===0){children[0].isFirstNode=false;view.setNodeLineIcos(setting,children[0])}else{if(children.length>0&&index<0){children[children.length-1].isLastNode=false;view.setNodeLineIcos(setting,children[children.length-1])}}data.nodeIsParent(setting,parentNode,true);if(index<0){data.nodeChildren(setting,parentNode,children.concat(nodes))}else{params=[index,0].concat(nodes);children.splice.apply(children,params)}},addSelectedNode:function(setting,node){var root=data.getRoot(setting);if(!data.isSelectedNode(setting,node)){root.curSelectedList.push(node)}},addCreatedNode:function(setting,node){if(!!setting.callback.onNodeCreated||!!setting.view.addDiyDom){var root=data.getRoot(setting);root.createdNodes.push(node)}},addZTreeTools:function(zTreeTools){_init.zTreeTools.push(zTreeTools)},exSetting:function(s){$.extend(true,_setting,s)},fixPIdKeyValue:function(setting,node){if(setting.data.simpleData.enable){node[setting.data.simpleData.pIdKey]=node.parentTId?node.getParentNode()[setting.data.simpleData.idKey]:setting.data.simpleData.rootPId}},getAfterA:function(setting,node,array){for(var i=0,j=_init.afterA.length;i-1){result.push(node)}var children=data.nodeChildren(setting,node);result=result.concat(data.getNodesByParamFuzzy(setting,children,key,value))}return result},getNodesByFilter:function(setting,nodes,filter,isSingle,invokeParam){if(!nodes){return(isSingle?null:[])}var result=isSingle?null:[];for(var i=0,l=nodes.length;i0)))},clone:function(obj){if(obj===null){return null}var o=tools.isArray(obj)?[]:{};for(var i in obj){o[i]=(obj[i] instanceof Date)?new Date(obj[i].getTime()):(typeof obj[i]==="object"?tools.clone(obj[i]):obj[i])}return o},eqs:function(str1,str2){return str1.toLowerCase()===str2.toLowerCase()},isArray:function(arr){return Object.prototype.toString.apply(arr)==="[object Array]" + },isElement:function(o){return(typeof HTMLElement==="object"?o instanceof HTMLElement:o&&typeof o==="object"&&o!==null&&o.nodeType===1&&typeof o.nodeName==="string")},$:function(node,exp,setting){if(!!exp&&typeof exp!="string"){setting=exp;exp=""}if(typeof node=="string"){return $(node,setting?setting.treeObj.get(0).ownerDocument:null)}else{return $("#"+node.tId+exp,setting?setting.treeObj:null)}},getMDom:function(setting,curDom,targetExpr){if(!curDom){return null}while(curDom&&curDom.id!==setting.treeId){for(var i=0,l=targetExpr.length;curDom.tagName&&i0)},uCanDo:function(setting,e){return true}},view={addNodes:function(setting,parentNode,index,newNodes,isSilent){var isParent=data.nodeIsParent(setting,parentNode);if(setting.data.keep.leaf&&parentNode&&!isParent){return}if(!tools.isArray(newNodes)){newNodes=[newNodes]}if(setting.data.simpleData.enable){newNodes=data.transformTozTreeFormat(setting,newNodes)}if(parentNode){var target_switchObj=$$(parentNode,consts.id.SWITCH,setting),target_icoObj=$$(parentNode,consts.id.ICON,setting),target_ulObj=$$(parentNode,consts.id.UL,setting);if(!parentNode.open){view.replaceSwitchClass(parentNode,target_switchObj,consts.folder.CLOSE);view.replaceIcoClass(parentNode,target_icoObj,consts.folder.CLOSE);parentNode.open=false;target_ulObj.css({"display":"none"})}data.addNodesData(setting,parentNode,index,newNodes);view.createNodes(setting,parentNode.level+1,newNodes,parentNode,index);if(!isSilent){view.expandCollapseParentNode(setting,parentNode,true)}}else{data.addNodesData(setting,data.getRoot(setting),index,newNodes);view.createNodes(setting,0,newNodes,null,index)}},appendNodes:function(setting,level,nodes,parentNode,index,initFlag,openFlag){if(!nodes){return[]}var html=[];var tmpPNode=(parentNode)?parentNode:data.getRoot(setting),tmpPChild=data.nodeChildren(setting,tmpPNode),isFirstNode,isLastNode;if(!tmpPChild||index>=tmpPChild.length-nodes.length){index=-1}for(var i=0,l=nodes.length;i0){childHtml=view.appendNodes(setting,level+1,children,node,-1,initFlag,openFlag&&node.open)}if(openFlag){view.makeDOMNodeMainBefore(html,setting,node);view.makeDOMNodeLine(html,setting,node);data.getBeforeA(setting,node,html);view.makeDOMNodeNameBefore(html,setting,node);data.getInnerBeforeA(setting,node,html);view.makeDOMNodeIcon(html,setting,node);data.getInnerAfterA(setting,node,html);view.makeDOMNodeNameAfter(html,setting,node);data.getAfterA(setting,node,html);if(isParent&&node.open){view.makeUlHtml(setting,node,html,childHtml.join(""))}view.makeDOMNodeMainAfter(html,setting,node);data.addCreatedNode(setting,node)}}return html},appendParentULDom:function(setting,node){var html=[],nObj=$$(node,setting);if(!nObj.get(0)&&!!node.parentTId){view.appendParentULDom(setting,node.getParentNode());nObj=$$(node,setting)}var ulObj=$$(node,consts.id.UL,setting);if(ulObj.get(0)){ulObj.remove()}var children=data.nodeChildren(setting,node),childHtml=view.appendNodes(setting,node.level+1,children,node,-1,false,true);view.makeUlHtml(setting,node,html,childHtml.join(""));nObj.append(html.join(""))},asyncNode:function(setting,node,isSilent,callback){var i,l;var isParent=data.nodeIsParent(setting,node);if(node&&!isParent){tools.apply(callback);return false}else{if(node&&node.isAjaxing){return false}else{if(tools.apply(setting.callback.beforeAsync,[setting.treeId,node],true)==false){tools.apply(callback);return false}}}if(node){node.isAjaxing=true;var icoObj=$$(node,consts.id.ICON,setting);icoObj.attr({"style":"","class":consts.className.BUTTON+" "+consts.className.ICO_LOADING})}var tmpParam={};var autoParam=tools.apply(setting.async.autoParam,[setting.treeId,node],setting.async.autoParam);for(i=0,l=autoParam.length;node&&i1){spKey=pKey[1];pKey=pKey[0]}tmpParam[spKey]=node[pKey]}var otherParam=tools.apply(setting.async.otherParam,[setting.treeId,node],setting.async.otherParam);if(tools.isArray(otherParam)){for(i=0,l=otherParam.length;i-1?JSON.stringify(tmpParam):tmpParam,dataType:setting.async.dataType,success:function(msg){if(_tmpV!=data.getRoot(setting)._ver){return + }var newNodes=[];try{if(!msg||msg.length==0){newNodes=[]}else{if(typeof msg=="string"){newNodes=eval("("+msg+")")}else{newNodes=msg}}}catch(err){newNodes=msg}if(node){node.isAjaxing=null;node.zAsync=true}view.setNodeLineIcos(setting,node);if(newNodes&&newNodes!==""){newNodes=tools.apply(setting.async.dataFilter,[setting.treeId,node,newNodes],newNodes);view.addNodes(setting,node,-1,!!newNodes?tools.clone(newNodes):[],!!isSilent)}else{view.addNodes(setting,node,-1,[],!!isSilent)}setting.treeObj.trigger(consts.event.ASYNC_SUCCESS,[setting.treeId,node,msg]);tools.apply(callback)},error:function(XMLHttpRequest,textStatus,errorThrown){if(_tmpV!=data.getRoot(setting)._ver){return}if(node){node.isAjaxing=null}view.setNodeLineIcos(setting,node);setting.treeObj.trigger(consts.event.ASYNC_ERROR,[setting.treeId,node,XMLHttpRequest,textStatus,errorThrown])}});return true},cancelPreSelectedNode:function(setting,node,excludeNode){var list=data.getRoot(setting).curSelectedList,i,n;for(i=list.length-1;i>=0;i--){n=list[i];if(node===n||(!node&&(!excludeNode||excludeNode!==n))){$$(n,consts.id.A,setting).removeClass(consts.node.CURSELECTED);if(node){data.removeSelectedNode(setting,node);break}else{list.splice(i,1);setting.treeObj.trigger(consts.event.UNSELECTED,[setting.treeId,n])}}}},createNodeCallback:function(setting){if(!!setting.callback.onNodeCreated||!!setting.view.addDiyDom){var root=data.getRoot(setting);while(root.createdNodes.length>0){var node=root.createdNodes.shift();tools.apply(setting.view.addDiyDom,[setting.treeId,node]);if(!!setting.callback.onNodeCreated){setting.treeObj.trigger(consts.event.NODECREATED,[setting.treeId,node])}}}},createNodes:function(setting,level,nodes,parentNode,index){if(!nodes||nodes.length==0){return}var root=data.getRoot(setting),openFlag=!parentNode||parentNode.open||!!$$(data.nodeChildren(setting,parentNode)[0],setting).get(0);root.createdNodes=[];var zTreeHtml=view.appendNodes(setting,level,nodes,parentNode,index,true,openFlag),parentObj,nextObj;if(!parentNode){parentObj=setting.treeObj}else{var ulObj=$$(parentNode,consts.id.UL,setting);if(ulObj.get(0)){parentObj=ulObj}}if(parentObj){if(index>=0){nextObj=parentObj.children()[index]}if(index>=0&&nextObj){$(nextObj).before(zTreeHtml.join(""))}else{parentObj.append(zTreeHtml.join(""))}}view.createNodeCallback(setting)},destroy:function(setting){if(!setting){return}data.initCache(setting);data.initRoot(setting);event.unbindTree(setting);event.unbindEvent(setting);setting.treeObj.empty();delete settings[setting.treeId]},expandCollapseNode:function(setting,node,expandFlag,animateFlag,callback){var root=data.getRoot(setting);var tmpCb,_callback;if(!node){tools.apply(callback,[]);return}var children=data.nodeChildren(setting,node);var isParent=data.nodeIsParent(setting,node);if(root.expandTriggerFlag){_callback=callback;tmpCb=function(){if(_callback){_callback()}if(node.open){setting.treeObj.trigger(consts.event.EXPAND,[setting.treeId,node])}else{setting.treeObj.trigger(consts.event.COLLAPSE,[setting.treeId,node])}};callback=tmpCb;root.expandTriggerFlag=false}if(!node.open&&isParent&&((!$$(node,consts.id.UL,setting).get(0))||(children&&children.length>0&&!$$(children[0],setting).get(0)))){view.appendParentULDom(setting,node);view.createNodeCallback(setting)}if(node.open==expandFlag){tools.apply(callback,[]);return}var ulObj=$$(node,consts.id.UL,setting),switchObj=$$(node,consts.id.SWITCH,setting),icoObj=$$(node,consts.id.ICON,setting);if(isParent){node.open=!node.open;if(node.iconOpen&&node.iconClose){icoObj.attr("style",view.makeNodeIcoStyle(setting,node))}var dir=node.directory;if(node.open){if(dir==1){view.replaceSwitchClass(node,switchObj,consts.folder.OPEN2);view.replaceIcoClass(node,icoObj,consts.folder.OPEN2)}else{view.replaceSwitchClass(node,switchObj,consts.folder.OPEN);view.replaceIcoClass(node,icoObj,consts.folder.OPEN)}if(animateFlag==false||setting.view.expandSpeed==""){ulObj.show();tools.apply(callback,[])}else{if(children&&children.length>0){ulObj.slideDown(setting.view.expandSpeed,callback)}else{ulObj.show();tools.apply(callback,[])}}}else{if(dir==1){view.replaceSwitchClass(node,switchObj,consts.folder.CLOSE2);view.replaceIcoClass(node,icoObj,consts.folder.CLOSE2)}else{view.replaceSwitchClass(node,switchObj,consts.folder.CLOSE);view.replaceIcoClass(node,icoObj,consts.folder.CLOSE)}if(animateFlag==false||setting.view.expandSpeed==""||!(children&&children.length>0)){ulObj.hide();tools.apply(callback,[])}else{ulObj.slideUp(setting.view.expandSpeed,callback)}}}else{tools.apply(callback,[])}},expandCollapseParentNode:function(setting,node,expandFlag,animateFlag,callback){if(!node){return}if(!node.parentTId){view.expandCollapseNode(setting,node,expandFlag,animateFlag,callback);return}else{view.expandCollapseNode(setting,node,expandFlag,animateFlag)}if(node.parentTId){view.expandCollapseParentNode(setting,node.getParentNode(),expandFlag,animateFlag,callback)}},expandCollapseSonNode:function(setting,node,expandFlag,animateFlag,callback){var root=data.getRoot(setting),treeNodes=(node)?data.nodeChildren(setting,node):data.nodeChildren(setting,root),selfAnimateSign=(node)?false:animateFlag,expandTriggerFlag=data.getRoot(setting).expandTriggerFlag; + data.getRoot(setting).expandTriggerFlag=false;if(treeNodes){for(var i=0,l=treeNodes.length;i=0;i--){if(node===list[i]){return true}}return false},makeDOMNodeIcon:function(html,setting,node){var nameStr=data.nodeName(setting,node),name=setting.view.nameIsHTML?nameStr:nameStr.replace(/&/g,"&").replace(//g,">");html.push("",name,"")},makeDOMNodeLine:function(html,setting,node){html.push("")},makeDOMNodeMainAfter:function(html,setting,node){html.push("
                • ")},makeDOMNodeMainBefore:function(html,setting,node){html.push("
                • ")},makeDOMNodeNameAfter:function(html,setting,node){html.push("")},makeDOMNodeNameBefore:function(html,setting,node){var title=data.nodeTitle(setting,node),url=view.makeNodeUrl(setting,node),fontcss=view.makeNodeFontCss(setting,node),fontStyle=[];for(var f in fontcss){fontStyle.push(f,":",fontcss[f],";")}html.push("0)?"href='"+url+"'":"")," target='",view.makeNodeTarget(node),"' style='",fontStyle.join(""),"'");if(tools.apply(setting.view.showTitle,[setting.treeId,node],setting.view.showTitle)&&title){html.push("title='",title.replace(/'/g,"'").replace(//g,">"),"'")}html.push(">")},makeNodeFontCss:function(setting,node){var fontCss=tools.apply(setting.view.fontCss,[setting.treeId,node],setting.view.fontCss);return(fontCss&&((typeof fontCss)!="function"))?fontCss:{}},makeNodeIcoClass:function(setting,node){var icoCss=["ico"];if(!node.isAjaxing){icoCss[0]=(node.iconSkin?node.iconSkin+"_":"")+icoCss[0];var dir=node.directory;if(dir==0){icoCss.push(node.open?consts.folder.OPEN:consts.folder.CLOSE)}else{if(dir==1){icoCss.push(node.open?consts.folder.OPEN2:consts.folder.CLOSE2)}else{icoCss.push(consts.folder.DOCU)}}}return consts.className.BUTTON+" "+icoCss.join("_")},makeNodeIcoStyle:function(setting,node){var icoStyle=[];if(!node.isAjaxing){var isParent=data.nodeIsParent(setting,node);var icon=(isParent&&node.iconOpen&&node.iconClose)?(node.open?node.iconOpen:node.iconClose):node[setting.data.key.icon];if(icon){icoStyle.push("background:url(",icon,") 0 0 no-repeat;")}if(setting.view.showIcon==false||!tools.apply(setting.view.showIcon,[setting.treeId,node],true)){icoStyle.push("width:0px;height:0px;")}}return icoStyle.join("")},makeNodeLineClass:function(setting,node){var lineClass=[];if(setting.view.showLine){if(node.level==0&&node.isFirstNode&&node.isLastNode){lineClass.push(consts.line.ROOT)}else{if(node.level==0&&node.isFirstNode){lineClass.push(consts.line.ROOTS)}else{if(node.isLastNode){lineClass.push(consts.line.BOTTOM)}else{lineClass.push(consts.line.CENTER)}}}}else{lineClass.push(consts.line.NOLINE)}if(data.nodeIsParent(setting,node)){lineClass.push(node.open?consts.folder.OPEN:consts.folder.CLOSE)}else{lineClass.push(consts.folder.DOCU)}return view.makeNodeLineClassEx(node)+lineClass.join("_")},makeNodeLineClassEx:function(node){return consts.className.BUTTON+" "+consts.className.LEVEL+node.level+" "+consts.className.SWITCH+" "},makeNodeTarget:function(node){return(node.target||"_blank")},makeNodeUrl:function(setting,node){var urlKey=setting.data.key.url;return node[urlKey]?node[urlKey]:null},makeUlHtml:function(setting,node,html,content){html.push("
                    ");html.push(content);html.push("
                  ")},makeUlLineClass:function(setting,node){return((setting.view.showLine&&!node.isLastNode)?consts.line.LINE:"")},removeChildNodes:function(setting,node){if(!node){return}var nodes=data.nodeChildren(setting,node);if(!nodes){return}for(var i=0,l=nodes.length;icontRect.bottom||findMeRect.right>contRect.right||findMeRect.left0){children[0].isFirstNode=true}},setLastNode:function(setting,parentNode){var children=data.nodeChildren(setting,parentNode);if(children.length>0){children[children.length-1].isLastNode=true}},removeNode:function(setting,node){var root=data.getRoot(setting),parentNode=(node.parentTId)?node.getParentNode():root;node.isFirstNode=false;node.isLastNode=false;node.getPreNode=function(){return null};node.getNextNode=function(){return null};if(!data.getNodeCache(setting,node.tId)){return}$$(node,setting).remove();data.removeNodeCache(setting,node);data.removeSelectedNode(setting,node);var children=data.nodeChildren(setting,parentNode);for(var i=0,l=children.length;i0){var newLast=children[childLength-1];tmp_ulObj=$$(newLast,consts.id.UL,setting);tmp_switchObj=$$(newLast,consts.id.SWITCH,setting);tmp_icoObj=$$(newLast,consts.id.ICON,setting);if(parentNode==root){if(children.length==1){view.replaceSwitchClass(newLast,tmp_switchObj,consts.line.ROOT)}else{var tmp_first_switchObj=$$(children[0],consts.id.SWITCH,setting);view.replaceSwitchClass(children[0],tmp_first_switchObj,consts.line.ROOTS);view.replaceSwitchClass(newLast,tmp_switchObj,consts.line.BOTTOM)}}else{view.replaceSwitchClass(newLast,tmp_switchObj,consts.line.BOTTOM)}tmp_ulObj.removeClass(consts.line.LINE)}}},replaceIcoClass:function(node,obj,newName){if(!obj||node.isAjaxing){return}var tmpName=obj.attr("class");if(tmpName==undefined){return}var tmpList=tmpName.split("_");switch(newName){case consts.folder.OPEN:case consts.folder.OPEN2:case consts.folder.CLOSE2:case consts.folder.CLOSE:case consts.folder.DOCU:tmpList[tmpList.length-1]=newName;break}obj.attr("class",tmpList.join("_"))},replaceSwitchClass:function(node,obj,newName){if(!obj){return}var tmpName=obj.attr("class");if(tmpName==undefined){return}var tmpList=tmpName.split("_"); + switch(newName){case consts.line.ROOT:case consts.line.ROOTS:case consts.line.CENTER:case consts.line.BOTTOM:case consts.line.NOLINE:tmpList[0]=view.makeNodeLineClassEx(node)+newName;break;case consts.folder.OPEN:case consts.folder.CLOSE:case consts.folder.DOCU:case consts.folder.OPEN2:case consts.folder.CLOSE2:tmpList[1]=newName;break}obj.attr("class",tmpList.join("_"));if(newName!==consts.folder.DOCU){obj.removeAttr("disabled")}else{obj.attr("disabled","disabled")}},selectNode:function(setting,node,addFlag){if(!addFlag){view.cancelPreSelectedNode(setting,null,node)}$$(node,consts.id.A,setting).addClass(consts.node.CURSELECTED);data.addSelectedNode(setting,node);setting.treeObj.trigger(consts.event.SELECTED,[setting.treeId,node])},setNodeFontCss:function(setting,treeNode){var aObj=$$(treeNode,consts.id.A,setting),fontCss=view.makeNodeFontCss(setting,treeNode);if(fontCss){aObj.css(fontCss)}},setNodeLineIcos:function(setting,node){if(!node){return}var switchObj=$$(node,consts.id.SWITCH,setting),ulObj=$$(node,consts.id.UL,setting),icoObj=$$(node,consts.id.ICON,setting),ulLine=view.makeUlLineClass(setting,node);if(ulLine.length==0){ulObj.removeClass(consts.line.LINE)}else{ulObj.addClass(ulLine)}switchObj.attr("class",view.makeNodeLineClass(setting,node));if(data.nodeIsParent(setting,node)){switchObj.removeAttr("disabled")}else{switchObj.attr("disabled","disabled")}icoObj.removeAttr("style");icoObj.attr("style",view.makeNodeIcoStyle(setting,node));icoObj.attr("class",view.makeNodeIcoClass(setting,node))},setNodeName:function(setting,node){var title=data.nodeTitle(setting,node),nObj=$$(node,consts.id.SPAN,setting);nObj.empty();if(setting.view.nameIsHTML){nObj.html(data.nodeName(setting,node))}else{nObj.text(data.nodeName(setting,node))}if(tools.apply(setting.view.showTitle,[setting.treeId,node],setting.view.showTitle)){var aObj=$$(node,consts.id.A,setting);aObj.attr("title",!title?"":title)}},setNodeTarget:function(setting,node){var aObj=$$(node,consts.id.A,setting);aObj.attr("target",view.makeNodeTarget(node))},setNodeUrl:function(setting,node){var aObj=$$(node,consts.id.A,setting),url=view.makeNodeUrl(setting,node);if(url==null||url.length==0){aObj.removeAttr("href")}else{aObj.attr("href",url)}},switchNode:function(setting,node){if(node.open||!tools.canAsync(setting,node)){view.expandCollapseNode(setting,node,!node.open)}else{if(setting.async.enable){if(!view.asyncNode(setting,node)){view.expandCollapseNode(setting,node,!node.open);return}}else{if(node){view.expandCollapseNode(setting,node,!node.open)}}}}};$.fn.zTree={consts:_consts,_z:{tools:tools,view:view,event:event,data:data},getZTreeObj:function(treeId){var o=data.getZTreeTools(treeId);return o?o:null},destroy:function(treeId){if(!!treeId&&treeId.length>0){view.destroy(data.getSetting(treeId))}else{for(var s in settings){view.destroy(settings[s])}}},init:function(obj,zSetting,zNodes){var setting=tools.clone(_setting);$.extend(true,setting,zSetting);setting.treeId=obj.attr("id");setting.treeObj=obj;setting.treeObj.empty();settings[setting.treeId]=setting;if(typeof document.body.style.maxHeight==="undefined"){setting.view.expandSpeed=""}data.initRoot(setting);var root=data.getRoot(setting);zNodes=zNodes?tools.clone(tools.isArray(zNodes)?zNodes:[zNodes]):[];if(setting.data.simpleData.enable){data.nodeChildren(setting,root,data.transformTozTreeFormat(setting,zNodes))}else{data.nodeChildren(setting,root,zNodes)}data.initCache(setting);event.unbindTree(setting);event.bindTree(setting);event.unbindEvent(setting);event.bindEvent(setting);var zTreeTools={setting:setting,addNodes:function(parentNode,index,newNodes,isSilent){if(!parentNode){parentNode=null}var isParent=data.nodeIsParent(setting,parentNode);if(parentNode&&!isParent&&setting.data.keep.leaf){return null}var i=parseInt(index,10);if(isNaN(i)){isSilent=!!newNodes;newNodes=index;index=-1}else{index=i}if(!newNodes){return null}var xNewNodes=tools.clone(tools.isArray(newNodes)?newNodes:[newNodes]);function addCallback(){view.addNodes(setting,parentNode,index,xNewNodes,(isSilent==true))}if(tools.canAsync(setting,parentNode)){view.asyncNode(setting,parentNode,isSilent,addCallback)}else{addCallback()}return xNewNodes},cancelSelectedNode:function(node){view.cancelPreSelectedNode(setting,node)},destroy:function(){view.destroy(setting)},expandAll:function(expandFlag){expandFlag=!!expandFlag;view.expandCollapseSonNode(setting,null,expandFlag,true);return expandFlag},expandNode:function(node,expandFlag,sonSign,focus,callbackFlag){if(!node||!data.nodeIsParent(setting,node)){return null}if(expandFlag!==true&&expandFlag!==false){expandFlag=!node.open}callbackFlag=!!callbackFlag;if(callbackFlag&&expandFlag&&(tools.apply(setting.callback.beforeExpand,[setting.treeId,node],true)==false)){return null}else{if(callbackFlag&&!expandFlag&&(tools.apply(setting.callback.beforeCollapse,[setting.treeId,node],true)==false)){return null}}if(expandFlag&&node.parentTId){view.expandCollapseParentNode(setting,node.getParentNode(),expandFlag,false) + }if(expandFlag===node.open&&!sonSign){return null}data.getRoot(setting).expandTriggerFlag=callbackFlag;if(!tools.canAsync(setting,node)&&sonSign){view.expandCollapseSonNode(setting,node,expandFlag,true,showNodeFocus)}else{node.open=!expandFlag;view.switchNode(this.setting,node);showNodeFocus()}return expandFlag;function showNodeFocus(){var a=$$(node,setting).get(0);if(a&&focus!==false){view.scrollIntoView(setting,a)}}},getNodes:function(){return data.getNodes(setting)},getNodeByParam:function(key,value,parentNode){if(!key){return null}return data.getNodeByParam(setting,parentNode?data.nodeChildren(setting,parentNode):data.getNodes(setting),key,value)},getNodeByTId:function(tId){return data.getNodeCache(setting,tId)},getNodesByParam:function(key,value,parentNode){if(!key){return null}return data.getNodesByParam(setting,parentNode?data.nodeChildren(setting,parentNode):data.getNodes(setting),key,value)},getNodesByParamFuzzy:function(key,value,parentNode){if(!key){return null}return data.getNodesByParamFuzzy(setting,parentNode?data.nodeChildren(setting,parentNode):data.getNodes(setting),key,value)},getNodesByFilter:function(filter,isSingle,parentNode,invokeParam){isSingle=!!isSingle;if(!filter||(typeof filter!="function")){return(isSingle?null:[])}return data.getNodesByFilter(setting,parentNode?data.nodeChildren(setting,parentNode):data.getNodes(setting),filter,isSingle,invokeParam)},getNodeIndex:function(node){if(!node){return null}var parentNode=(node.parentTId)?node.getParentNode():data.getRoot(setting);var children=data.nodeChildren(setting,parentNode);for(var i=0,l=children.length;i0){view.createNodes(setting,0,children,null,-1)}else{if(setting.async.enable&&setting.async.url&&setting.async.url!==""){view.asyncNode(setting)}}return zTreeTools}};var zt=$.fn.zTree,$$=tools.$,consts=zt.consts})(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.excheck.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.excheck.js new file mode 100755 index 00000000..c4cfff66 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.excheck.js @@ -0,0 +1,651 @@ +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of excheck + var _consts = { + event: { + CHECK: "ztree_check" + }, + id: { + CHECK: "_check" + }, + checkbox: { + STYLE: "checkbox", + DEFAULT: "chk", + DISABLED: "disable", + FALSE: "false", + TRUE: "true", + FULL: "full", + PART: "part", + FOCUS: "focus" + }, + radio: { + STYLE: "radio", + TYPE_ALL: "all", + TYPE_LEVEL: "level" + } + }, + //default setting of excheck + _setting = { + check: { + enable: false, + autoCheckTrigger: false, + chkStyle: _consts.checkbox.STYLE, + nocheckInherit: false, + chkDisabledInherit: false, + radioType: _consts.radio.TYPE_LEVEL, + chkboxType: { + "Y": "ps", + "N": "ps" + } + }, + data: { + key: { + checked: "checked" + } + }, + callback: { + beforeCheck: null, + onCheck: null + } + }, + //default root of excheck + _initRoot = function (setting) { + var r = data.getRoot(setting); + r.radioCheckedList = []; + }, + //default cache of excheck + _initCache = function (treeId) { + }, + //default bind event of excheck + _bindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.bind(c.CHECK, function (event, srcEvent, treeId, node) { + event.srcEvent = srcEvent; + tools.apply(setting.callback.onCheck, [event, treeId, node]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.unbind(c.CHECK); + }, + //default event proxy of excheck + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null; + + if (tools.eqs(e.type, "mouseover")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoverCheck"; + } + } else if (tools.eqs(e.type, "mouseout")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoutCheck"; + } + } else if (tools.eqs(e.type, "click")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "checkNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "checkNode" : + nodeEventCallback = _handler.onCheckNode; + break; + case "mouseoverCheck" : + nodeEventCallback = _handler.onMouseoverCheck; + break; + case "mouseoutCheck" : + nodeEventCallback = _handler.onMouseoutCheck; + break; + } + } + var proxyResult = { + stop: nodeEventType === "checkNode", + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of excheck + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var checked = data.nodeChecked(setting, n); + n.checkedOld = checked; + if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true"); + n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck); + if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true"); + n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled); + if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true"); + n.halfCheck = !!n.halfCheck; + n.check_Child_State = -1; + n.check_Focus = false; + n.getCheckStatus = function () { + return data.getCheckStatus(setting, n); + }; + + if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && checked) { + var r = data.getRoot(setting); + r.radioCheckedList.push(n); + } + }, + //add dom for check + _beforeA = function (setting, node, html) { + if (setting.check.enable) { + data.makeChkFlag(setting, node); + html.push(""); + } + }, + //update zTreeObj, add method of check + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.checkNode = function (node, checked, checkTypeFlag, callbackFlag) { + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) return; + if (checked !== true && checked !== false) { + checked = !nodeChecked; + } + callbackFlag = !!callbackFlag; + + if (nodeChecked === checked && !checkTypeFlag) { + return; + } else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) { + return; + } + if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) { + data.nodeChecked(setting, node, checked); + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]); + } + } + } + + zTreeTools.checkAllNodes = function (checked) { + view.repairAllChk(this.setting, !!checked); + } + + zTreeTools.getCheckedNodes = function (checked) { + var checked = (checked !== false); + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeCheckedNodes(this.setting, children, checked); + } + + zTreeTools.getChangeCheckedNodes = function () { + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeChangeCheckedNodes(this.setting, children); + } + + zTreeTools.setChkDisabled = function (node, disabled, inheritParent, inheritChildren) { + disabled = !!disabled; + inheritParent = !!inheritParent; + inheritChildren = !!inheritChildren; + view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren); + view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent); + } + + var _updateNode = zTreeTools.updateNode; + zTreeTools.updateNode = function (node, checkTypeFlag) { + if (_updateNode) _updateNode.apply(zTreeTools, arguments); + if (!node || !this.setting.check.enable) return; + var nObj = $$(node, this.setting); + if (nObj.get(0) && tools.uCanDo(this.setting)) { + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + } + } + }, + //method of operate data + _data = { + getRadioCheckedList: function (setting) { + var checkedList = data.getRoot(setting).radioCheckedList; + for (var i = 0, j = checkedList.length; i < j; i++) { + if (!data.getNodeCache(setting, checkedList[i].tId)) { + checkedList.splice(i, 1); + i--; + j--; + } + } + return checkedList; + }, + getCheckStatus: function (setting, node) { + if (!setting.check.enable || node.nocheck || node.chkDisabled) return null; + var checked = data.nodeChecked(setting, node), + r = { + checked: checked, + half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (checked ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0))) + }; + return r; + }, + getTreeCheckedNodes: function (setting, nodes, checked, results) { + if (!nodes) return []; + var onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL); + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked == checked) { + results.push(node); + if (onlyOne) { + break; + } + } + data.getTreeCheckedNodes(setting, children, checked, results); + if (onlyOne && results.length > 0) { + break; + } + } + return results; + }, + getTreeChangeCheckedNodes: function (setting, nodes, results) { + if (!nodes) return []; + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked != node.checkedOld) { + results.push(node); + } + data.getTreeChangeCheckedNodes(setting, children, results); + } + return results; + }, + makeChkFlag: function (setting, node) { + if (!node) return; + var chkFlag = -1; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var cNode = children[i]; + var nodeChecked = data.nodeChecked(setting, cNode); + var tmp = -1; + if (setting.check.chkStyle == consts.radio.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 2; + } else if (nodeChecked) { + tmp = 2; + } else { + tmp = cNode.check_Child_State > 0 ? 2 : 0; + } + if (tmp == 2) { + chkFlag = 2; + break; + } else if (tmp == 0) { + chkFlag = 0; + } + } else if (setting.check.chkStyle == consts.checkbox.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 1; + } else if (nodeChecked) { + tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1; + } else { + tmp = (cNode.check_Child_State > 0) ? 1 : 0; + } + if (tmp === 1) { + chkFlag = 1; + break; + } else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) { + chkFlag = 1; + break; + } else if (chkFlag === 2 && tmp > -1 && tmp < 2) { + chkFlag = 1; + break; + } else if (tmp > -1) { + chkFlag = tmp; + } + } + } + } + node.check_Child_State = chkFlag; + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onCheckNode: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true; + var nodeChecked = data.nodeChecked(setting, node); + data.nodeChecked(setting, node, !nodeChecked); + view.checkNodeRelation(setting, node); + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + view.repairParentChkClassWithSelf(setting, node); + setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]); + return true; + }, + onMouseoverCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = true; + view.setChkClass(setting, checkObj, node); + return true; + }, + onMouseoutCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = false; + view.setChkClass(setting, checkObj, node); + return true; + } + }, + //method of tools for zTree + _tools = {}, + //method of operate ztree dom + _view = { + checkNodeRelation: function (setting, node) { + var pNode, i, l, + r = consts.radio; + var nodeChecked = data.nodeChecked(setting, node); + if (setting.check.chkStyle == r.STYLE) { + var checkedList = data.getRadioCheckedList(setting); + if (nodeChecked) { + if (setting.check.radioType == r.TYPE_ALL) { + for (i = checkedList.length - 1; i >= 0; i--) { + pNode = checkedList[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + checkedList.splice(i, 1); + + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + if (pNode.parentTId != node.parentTId) { + view.repairParentChkClassWithSelf(setting, pNode); + } + } + } + checkedList.push(node); + } else { + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (i = 0, l = children.length; i < l; i++) { + pNode = children[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + } + } + } + } else if (setting.check.radioType == r.TYPE_ALL) { + for (i = 0, l = checkedList.length; i < l; i++) { + if (node == checkedList[i]) { + checkedList.splice(i, 1); + break; + } + } + } + + } else { + var children = data.nodeChildren(setting, node); + if (nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.Y.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, true); + } + if (!nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.N.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, false); + } + if (nodeChecked && setting.check.chkboxType.Y.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, true); + } + if (!nodeChecked && setting.check.chkboxType.N.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, false); + } + } + }, + makeChkClass: function (setting, node) { + var c = consts.checkbox, r = consts.radio, + fullStyle = ""; + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) { + fullStyle = c.DISABLED; + } else if (node.halfCheck) { + fullStyle = c.PART; + } else if (setting.check.chkStyle == r.STYLE) { + fullStyle = (node.check_Child_State < 1) ? c.FULL : c.PART; + } else { + fullStyle = nodeChecked ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL : c.PART) : ((node.check_Child_State < 1) ? c.FULL : c.PART); + } + var chkName = setting.check.chkStyle + "_" + (nodeChecked ? c.TRUE : c.FALSE) + "_" + fullStyle; + chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName; + return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName; + }, + repairAllChk: function (setting, checked) { + if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) { + var root = data.getRoot(setting); + var children = data.nodeChildren(setting, root); + for (var i = 0, l = children.length; i < l; i++) { + var node = children[i]; + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, checked); + } + view.setSonNodeCheckBox(setting, node, checked); + } + } + }, + repairChkClass: function (setting, node) { + if (!node) return; + data.makeChkFlag(setting, node); + if (node.nocheck !== true) { + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + } + }, + repairParentChkClass: function (setting, node) { + if (!node || !node.parentTId) return; + var pNode = node.getParentNode(); + view.repairChkClass(setting, pNode); + view.repairParentChkClass(setting, pNode); + }, + repairParentChkClassWithSelf: function (setting, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + view.repairParentChkClass(setting, children[0]); + } else { + view.repairParentChkClass(setting, node); + } + }, + repairSonChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + var children = data.nodeChildren(setting, node); + if (children && inherit) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit); + } + } + }, + repairParentChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled && inherit) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit); + }, + setChkClass: function (setting, obj, node) { + if (!obj) return; + if (node.nocheck === true) { + obj.hide(); + } else { + obj.show(); + } + obj.attr('class', view.makeChkClass(setting, node)); + }, + setParentNodeCheckBox: function (setting, node, value, srcNode) { + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + data.makeChkFlag(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + if (node.parentTId) { + var pSign = true; + if (!value) { + var pNodes = data.nodeChildren(setting, node.getParentNode()); + for (var i = 0, l = pNodes.length; i < l; i++) { + var pNode = pNodes[i]; + var nodeChecked = data.nodeChecked(setting, pNode); + if ((pNode.nocheck !== true && pNode.chkDisabled !== true && nodeChecked) + || ((pNode.nocheck === true || pNode.chkDisabled === true) && pNode.check_Child_State > 0)) { + pSign = false; + break; + } + } + } + if (pSign) { + view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode); + } + } + }, + setSonNodeCheckBox: function (setting, node, value, srcNode) { + if (!node) return; + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + + var hasDisable = false; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.setSonNodeCheckBox(setting, sNode, value, srcNode); + if (sNode.chkDisabled === true) hasDisable = true; + } + } + + if (node != data.getRoot(setting) && node.chkDisabled !== true) { + if (hasDisable && node.nocheck !== true) { + data.makeChkFlag(setting, node); + } + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + if (!hasDisable) node.check_Child_State = (children && children.length > 0) ? (value ? 2 : 0) : -1; + } else { + node.check_Child_State = -1; + } + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.nodeChecked = function (setting, node, newChecked) { + if (!node) { + return false; + } + var key = setting.data.key.checked; + if (typeof newChecked !== 'undefined') { + if (typeof newChecked === "string") { + newChecked = tools.eqs(newChecked, "true"); + } + newChecked = !!newChecked; + node[key] = newChecked; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy, true); + data.addInitRoot(_initRoot); + data.addBeforeA(_beforeA); + data.addZTreeTools(_zTreeTools); + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) _createNodes.apply(view, arguments); + if (!nodes) return; + view.repairParentChkClassWithSelf(setting, parentNode); + } + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var parentNode = node.getParentNode(); + if (_removeNode) _removeNode.apply(view, arguments); + if (!node || !parentNode) return; + view.repairChkClass(setting, parentNode); + view.repairParentChkClass(setting, parentNode); + } + + var _appendNodes = view.appendNodes; + view.appendNodes = function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + var html = ""; + if (_appendNodes) { + html = _appendNodes.apply(view, arguments); + } + if (parentNode) { + data.makeChkFlag(setting, parentNode); + } + return html; + } +})(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.excheck.min.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.excheck.min.js new file mode 100755 index 00000000..9089c774 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.excheck.min.js @@ -0,0 +1,34 @@ +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(m){var p,q,r,o={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},v={check:{enable:!1,autoCheckTrigger:!1,chkStyle:o.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:o.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};p=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=f.nodeChecked(b,a);f.nodeChecked(b,a,!d);e.checkNodeRelation(b,a);d=n(a,h.id.CHECK,b);e.setChkClass(b,d,a);e.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};q=function(c,a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!0;e.setChkClass(b,d,a);return!0};r=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!1;e.setChkClass(b,d,a);return!0};m.extend(!0,m.fn.zTree.consts,o);m.extend(!0,m.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=f.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=f.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=f.nodeChecked(c,b);k&&b!=a&&(f.nodeChecked(c,b,!1),g.splice(d,1),e.setChkClass(c, +n(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&e.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():f.getRoot(c);g=f.nodeChildren(c,g);for(d=0,j=g.length;d-1)&&e.setSonNodeCheckBox(c,a, +!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=f.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART: +a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=f.getRoot(c),b=f.nodeChildren(c,b),d=0,j=b.length;d0?e.repairParentChkClass(c,b[0]):e.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;e.repairChkClass(c,a);if((a=f.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j0){j=!1;break}}j&&e.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=n(a,h.id.CHECK,c);d||(d=a);var g=!1,k=f.nodeChildren(c,a);if(k)for(var i=0,l=k.length;i0?b?2:0:-1}else a.check_Child_State=-1;e.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=f.getRoot(c).radioCheckedList,b=0,d=a.length;b-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,e=a.length;g0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=e.nocheck===!0||e.chkDisabled===!0?e.check_Child_State:e.halfCheck===!0?1:i?e.check_Child_State===-1||e.check_Child_State===2?2:1:e.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!== +b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var m=m.fn.zTree,i=m._z.tools,h=m.consts,e=m._z.view,f=m._z.data,n=i.$;f.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"?(typeof b==="string"&&(b=i.eqs(b,"true")),a[c]=!!b):a[c]=typeof a[c]=="string"?i.eqs(a[c],"true"):!!a[c];return a[c]};f.exSetting(v);f.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a, +d,e])})});f.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)});f.addInitCache(function(){});f.addInitNode(function(c,a,b,d){if(b){a=f.nodeChecked(c,b);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck, +"true");b.halfCheck=!!b.halfCheck;b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return f.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&f.getRoot(c).radioCheckedList.push(b)}});f.addInitProxy(function(c){var a=c.target,b=f.getSetting(c.data.treeId),d="",e=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type, +"mouseout")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(e=f.getNodeCache(b,d),g){case "checkNode":k=p;break;case "mouseoverCheck":k=q;break;case "mouseoutCheck":k=r}return{stop:g==="checkNode",node:e,nodeEventType:g,nodeEventCallback:k, +treeEventType:"",treeEventCallback:null}},!0);f.addInitRoot(function(c){f.getRoot(c).radioCheckedList=[]});f.addBeforeA(function(c,a,b){c.check.enable&&(f.makeChkFlag(c,a),b.push(""))});f.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var m=f.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!m),k=!!k,(m!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck, +[this.setting.treeId,a],!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))f.nodeChecked(c,a,b),b=n(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,a),e.setChkClass(this.setting,b,a),e.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){e.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b= +f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,f){b=!!b;c=!!c;e.repairSonChkDisabled(this.setting,a,b,!!f);e.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,f){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&n(c,this.setting).get(0)&& +i.uCanDo(this.setting)){var g=n(c,h.id.CHECK,this.setting);(f==!0||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,c);e.setChkClass(this.setting,g,c);e.repairParentChkClassWithSelf(this.setting,c)}}});var s=e.createNodes;e.createNodes=function(c,a,b,d,f){s&&s.apply(e,arguments);b&&e.repairParentChkClassWithSelf(c,d)};var t=e.removeNode;e.removeNode=function(c,a){var b=a.getParentNode();t&&t.apply(e,arguments);a&&b&&(e.repairChkClass(c,b),e.repairParentChkClass(c,b))}; +var u=e.appendNodes;e.appendNodes=function(c,a,b,d,h,g,i){var m="";u&&(m=u.apply(e,arguments));d&&f.makeChkFlag(c,d);return m}})(jQuery); diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exedit.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exedit.js new file mode 100755 index 00000000..57358d86 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exedit.js @@ -0,0 +1,1203 @@ +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of exedit + var _consts = { + event: { + DRAG: "ztree_drag", + DROP: "ztree_drop", + RENAME: "ztree_rename", + DRAGMOVE: "ztree_dragmove" + }, + id: { + EDIT: "_edit", + INPUT: "_input", + REMOVE: "_remove" + }, + move: { + TYPE_INNER: "inner", + TYPE_PREV: "prev", + TYPE_NEXT: "next" + }, + node: { + CURSELECTED_EDIT: "curSelectedNode_Edit", + TMPTARGET_TREE: "tmpTargetzTree", + TMPTARGET_NODE: "tmpTargetNode" + } + }, + //default setting of exedit + _setting = { + edit: { + enable: false, + editNameSelectAll: false, + showRemoveBtn: true, + showRenameBtn: true, + removeTitle: "remove", + renameTitle: "rename", + drag: { + autoExpandTrigger: false, + isCopy: true, + isMove: true, + prev: true, + next: true, + inner: true, + minMoveSize: 5, + borderMax: 10, + borderMin: -5, + maxShowNodeNum: 5, + autoOpenTime: 500 + } + }, + view: { + addHoverDom: null, + removeHoverDom: null + }, + callback: { + beforeDrag: null, + beforeDragOpen: null, + beforeDrop: null, + beforeEditName: null, + beforeRename: null, + onDrag: null, + onDragMove: null, + onDrop: null, + onRename: null + } + }, + //default root of exedit + _initRoot = function (setting) { + var r = data.getRoot(setting), rs = data.getRoots(); + r.curEditNode = null; + r.curEditInput = null; + r.curHoverNode = null; + r.dragFlag = 0; + r.dragNodeShowBefore = []; + r.dragMaskList = new Array(); + rs.showHoverDom = true; + }, + //default cache of exedit + _initCache = function (treeId) { + }, + //default bind event of exedit + _bindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) { + tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]); + }); + + o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DRAGMOVE, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDragMove, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) { + tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.unbind(c.RENAME); + o.unbind(c.DRAG); + o.unbind(c.DRAGMOVE); + o.unbind(c.DROP); + }, + //default event proxy of exedit + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + relatedTarget = e.relatedTarget, + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null, + tmp = null; + + if (tools.eqs(e.type, "mouseover")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "hoverOverNode"; + } + } else if (tools.eqs(e.type, "mouseout")) { + tmp = tools.getMDom(setting, relatedTarget, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (!tmp) { + tId = "remove"; + nodeEventType = "hoverOutNode"; + } + } else if (tools.eqs(e.type, "mousedown")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "mousedownNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "mousedownNode" : + nodeEventCallback = _handler.onMousedownNode; + break; + case "hoverOverNode" : + nodeEventCallback = _handler.onHoverOverNode; + break; + case "hoverOutNode" : + nodeEventCallback = _handler.onHoverOutNode; + break; + } + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of exedit + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + n.isHover = false; + n.editNameFlag = false; + }, + //update zTreeObj, add method of edit + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.cancelEditName = function (newName) { + var root = data.getRoot(this.setting); + if (!root.curEditNode) return; + view.cancelCurEditNode(this.setting, newName ? newName : null, true); + } + zTreeTools.copyNode = function (targetNode, node, moveType, isSilent) { + if (!node) return null; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null; + var _this = this, + newNode = tools.clone(node); + if (!targetNode) { + targetNode = null; + moveType = consts.move.TYPE_INNER; + } + if (moveType == consts.move.TYPE_INNER) { + function copyCallback() { + view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent); + } + + if (tools.canAsync(this.setting, targetNode)) { + view.asyncNode(this.setting, targetNode, isSilent, copyCallback); + } else { + copyCallback(); + } + } else { + view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent); + view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent); + } + return newNode; + } + zTreeTools.editName = function (node) { + if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return; + if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true); + view.editNode(this.setting, node) + } + zTreeTools.moveNode = function (targetNode, node, moveType, isSilent) { + if (!node) return node; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) { + return null; + } else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) { + return null; + } else if (!targetNode) { + targetNode = null; + } + var _this = this; + + function moveCallback() { + view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent); + } + + if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) { + view.asyncNode(this.setting, targetNode, isSilent, moveCallback); + } else { + moveCallback(); + } + return node; + } + zTreeTools.setEditable = function (editable) { + this.setting.edit.enable = editable; + return this.refresh(); + } + }, + //method of operate data + _data = { + setSonNodeLevel: function (setting, parentNode, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + node.level = (parentNode) ? parentNode.level + 1 : 0; + if (!children) return; + for (var i = 0, l = children.length; i < l; i++) { + if (children[i]) data.setSonNodeLevel(setting, node, children[i]); + } + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onHoverOverNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode != node) { + _handler.onHoverOutNode(event); + } + root.curHoverNode = node; + view.addHoverDom(setting, node); + }, + onHoverOutNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) { + view.removeTreeDom(setting, root.curHoverNode); + root.curHoverNode = null; + } + }, + onMousedownNode: function (eventMouseDown, _node) { + var i, l, + setting = data.getSetting(eventMouseDown.data.treeId), + root = data.getRoot(setting), roots = data.getRoots(); + //right click can't drag & drop + if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true; + + //input of edit node name can't drag & drop + var target = eventMouseDown.target, + _nodes = data.getRoot(setting).curSelectedList, + nodes = []; + if (!data.isSelectedNode(setting, _node)) { + nodes = [_node]; + } else { + for (i = 0, l = _nodes.length; i < l; i++) { + if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode" + consts.id.INPUT) !== null) { + return true; + } + nodes.push(_nodes[i]); + if (nodes[0].parentTId !== _nodes[i].parentTId) { + nodes = [_node]; + break; + } + } + } + + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + + var doc = $(setting.treeObj.get(0).ownerDocument), + body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget, + isOtherTree = false, + targetSetting = setting, + sourceSetting = setting, + preNode, nextNode, + preTmpTargetNodeId = null, + preTmpMoveType = null, + tmpTargetNodeId = null, + moveType = consts.move.TYPE_INNER, + mouseDownX = eventMouseDown.clientX, + mouseDownY = eventMouseDown.clientY, + startTime = (new Date()).getTime(); + + if (tools.uCanDo(setting)) { + doc.bind("mousemove", _docMouseMove); + } + + function _docMouseMove(event) { + //avoid start drag after click node + if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize + && Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) { + return true; + } + var i, l, tmpNode, tmpDom, tmpNodes; + body.css("cursor", "pointer"); + + if (root.dragFlag == 0) { + if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) { + _docMouseUp(event); + return true; + } + + for (i = 0, l = nodes.length; i < l; i++) { + if (i == 0) { + root.dragNodeShowBefore = []; + } + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + root.dragNodeShowBefore[tmpNode.tId] = true; + } else { + root.dragNodeShowBefore[tmpNode.tId] = false; + } + } + + root.dragFlag = 1; + roots.showHoverDom = false; + tools.showIfameMask(setting, true); + + //sort + var isOrder = true, lastIndex = -1; + if (nodes.length > 1) { + var pNodes = nodes[0].parentTId ? data.nodeChildren(setting, nodes[0].getParentNode()) : data.getNodes(setting); + tmpNodes = []; + for (i = 0, l = pNodes.length; i < l; i++) { + if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) { + if (isOrder && lastIndex > -1 && (lastIndex + 1) !== i) { + isOrder = false; + } + tmpNodes.push(pNodes[i]); + lastIndex = i; + } + if (nodes.length === tmpNodes.length) { + nodes = tmpNodes; + break; + } + } + } + if (isOrder) { + preNode = nodes[0].getPreNode(); + nextNode = nodes[nodes.length - 1].getNextNode(); + } + + //set node in selected + curNode = $$("
                    ", setting); + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + tmpNode.editNameFlag = false; + view.selectNode(setting, tmpNode, i > 0); + view.removeTreeDom(setting, tmpNode); + + if (i > setting.edit.drag.maxShowNodeNum - 1) { + continue; + } + + tmpDom = $$("
                  • ", setting); + tmpDom.append($$(tmpNode, consts.id.A, setting).clone()); + tmpDom.css("padding", "0"); + tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED); + curNode.append(tmpDom); + if (i == setting.edit.drag.maxShowNodeNum - 1) { + tmpDom = $$("
                  • ...
                  • ", setting); + curNode.append(tmpDom); + } + } + curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp"); + curNode.addClass(setting.treeObj.attr("class")); + curNode.appendTo(body); + + tmpArrow = $$("", setting); + tmpArrow.attr("id", "zTreeMove_arrow_tmp"); + tmpArrow.appendTo(body); + + setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]); + } + + if (root.dragFlag == 1) { + if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft() + 2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) { + var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget); + event.target = (xT.length > 0) ? xT.get(0) : event.target; + } else if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tmpTarget = null; + tmpTargetNodeId = null; + + //judge drag & drop in multi ztree + isOtherTree = false; + targetSetting = setting; + var settings = data.getSettings(); + for (var s in settings) { + if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId + && (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length > 0)) { + isOtherTree = true; + targetSetting = settings[s]; + } + } + + var docScrollTop = doc.scrollTop(), + docScrollLeft = doc.scrollLeft(), + treeOffset = targetSetting.treeObj.offset(), + scrollHeight = targetSetting.treeObj.get(0).scrollHeight, + scrollWidth = targetSetting.treeObj.get(0).scrollWidth, + dTop = (event.clientY + docScrollTop - treeOffset.top), + dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop), + dLeft = (event.clientX + docScrollLeft - treeOffset.left), + dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft), + isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin), + isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin), + isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin), + isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin), + isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin, + isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0), + isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height() + 10) >= scrollHeight), + isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0), + isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width() + 10) >= scrollWidth); + + if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //get node
                  • dom + var targetObj = event.target; + while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) { + targetObj = targetObj.parentNode; + } + + var canMove = true; + //don't move to self or children of self + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (targetObj.id === tmpNode.tId) { + canMove = false; + break; + } else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) { + canMove = false; + break; + } + } + if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) { + tmpTarget = $(targetObj); + tmpTargetNodeId = targetObj.id; + } + } + + //the mouse must be in zTree + tmpNode = nodes[0]; + if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //judge mouse move in root of ztree + if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) { + tmpTarget = targetSetting.treeObj; + } + //auto scroll top + if (isTop) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() - 10); + } else if (isBottom) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() + 10); + } + if (isLeft) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() - 10); + } else if (isRight) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + 10); + } + //auto scroll left + if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + tmpTarget.offset().left - targetSetting.treeObj.offset().left); + } + } + + curNode.css({ + "top": (event.clientY + docScrollTop + 3) + "px", + "left": (event.clientX + docScrollLeft + 3) + "px" + }); + + var dX = 0; + var dY = 0; + if (tmpTarget && tmpTarget.attr("id") != targetSetting.treeId) { + var tmpTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId), + isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy), + isPrev = !!(preNode && tmpTargetNodeId === preNode.tId), + isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId), + isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId), + canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev), + canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next), + canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !data.nodeIsParent(setting, tmpTargetNode)) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner); + + function clearMove() { + tmpTarget = null; + tmpTargetNodeId = ""; + moveType = consts.move.TYPE_INNER; + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null + } + } + + if (!canPrev && !canNext && !canInner) { + clearMove(); + } else { + var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget), + tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()), + tmpTop = tmpTargetA.offset().top, + tmpLeft = tmpTargetA.offset().left, + prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1)) : -1, + nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0)) : -1, + dY_percent = (event.clientY + docScrollTop - tmpTop) / tmpTargetA.height(); + + if ((prevPercent == 1 || dY_percent <= prevPercent && dY_percent >= -.2) && canPrev) { + dX = 1 - tmpArrow.width(); + dY = tmpTop - tmpArrow.height() / 2; + moveType = consts.move.TYPE_PREV; + } else if ((nextPercent == 0 || dY_percent >= nextPercent && dY_percent <= 1.2) && canNext) { + dX = 1 - tmpArrow.width(); + dY = (tmpNextA == null || (data.nodeIsParent(setting, tmpTargetNode) && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height() / 2) : (tmpNextA.offset().top - tmpArrow.height() / 2); + moveType = consts.move.TYPE_NEXT; + } else if (canInner) { + dX = 5 - tmpArrow.width(); + dY = tmpTop; + moveType = consts.move.TYPE_INNER; + } else { + clearMove(); + } + + if (tmpTarget) { + tmpArrow.css({ + "display": "block", + "top": dY + "px", + "left": (tmpLeft + dX) + "px" + }); + tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType); + + if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) { + startTime = (new Date()).getTime(); + } + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && moveType == consts.move.TYPE_INNER) { + var startTimer = true; + if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) { + startTimer = false; + } + if (startTimer) { + window.zTreeMoveTimer = setTimeout(function () { + if (moveType != consts.move.TYPE_INNER) return; + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime + && tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) { + view.switchNode(targetSetting, tmpTargetNode); + if (targetSetting.edit.drag.autoExpandTrigger) { + targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]); + } + } + }, targetSetting.edit.drag.autoOpenTime + 50); + window.zTreeMoveTargetNodeTId = tmpTargetNode.tId; + } + } + } + } + } else { + moveType = consts.move.TYPE_INNER; + if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) { + tmpTarget.addClass(consts.node.TMPTARGET_TREE); + } else { + tmpTarget = null; + } + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + } + preTmpTargetNodeId = tmpTargetNodeId; + preTmpMoveType = moveType; + + setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]); + } + return false; + } + + doc.bind("mouseup", _docMouseUp); + + function _docMouseUp(event) { + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + preTmpTargetNodeId = null; + preTmpMoveType = null; + doc.unbind("mousemove", _docMouseMove); + doc.unbind("mouseup", _docMouseUp); + doc.unbind("selectstart", _docSelect); + body.css("cursor", ""); + if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tools.showIfameMask(setting, false); + + roots.showHoverDom = true; + if (root.dragFlag == 0) return; + root.dragFlag = 0; + + var i, l, tmpNode; + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + delete root.dragNodeShowBefore[tmpNode.tId]; + } + } + + if (curNode) curNode.remove(); + if (tmpArrow) tmpArrow.remove(); + + var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy); + if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId == nodes[0].parentTId && moveType == consts.move.TYPE_INNER) { + tmpTarget = null; + } + if (tmpTarget) { + var dragTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId); + if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) { + view.selectNodes(sourceSetting, nodes); + return; + } + var newNodes = isCopy ? tools.clone(nodes) : nodes; + + function dropCallback() { + if (isOtherTree) { + if (!isCopy) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.removeNode(setting, nodes[i]); + } + } + if (moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } + } else { + if (isCopy && moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else if (isCopy) { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } else { + if (moveType != consts.move.TYPE_NEXT) { + for (i = 0, l = newNodes.length; i < l; i++) { + view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false); + } + } else { + for (i = -1, l = newNodes.length - 1; i < l; l--) { + view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false); + } + } + } + } + view.selectNodes(targetSetting, newNodes); + + var a = $$(newNodes[0], setting).get(0); + view.scrollIntoView(setting, a); + + setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]); + } + + if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) { + view.asyncNode(targetSetting, dragTargetNode, false, dropCallback); + } else { + dropCallback(); + } + + } else { + view.selectNodes(sourceSetting, nodes); + setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]); + } + } + + doc.bind("selectstart", _docSelect); + + function _docSelect() { + return false; + } + + // 2018-03-30 FireFox has fixed this issue. + //Avoid FireFox's Bug + //If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error. + // if(eventMouseDown.preventDefault) { + // eventMouseDown.preventDefault(); + // } + return true; + } + }, + //method of tools for zTree + _tools = { + getAbs: function (obj) { + var oRect = obj.getBoundingClientRect(), + scrollTop = document.body.scrollTop + document.documentElement.scrollTop, + scrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft; + return [oRect.left + scrollLeft, oRect.top + scrollTop]; + }, + inputFocus: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + tools.setCursorPosition(inputObj.get(0), inputObj.val().length); + } + }, + inputSelect: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + inputObj.select(); + } + }, + setCursorPosition: function (obj, pos) { + if (obj.setSelectionRange) { + obj.focus(); + obj.setSelectionRange(pos, pos); + } else if (obj.createTextRange) { + var range = obj.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, + showIfameMask: function (setting, showSign) { + var root = data.getRoot(setting); + //clear full mask + while (root.dragMaskList.length > 0) { + root.dragMaskList[0].remove(); + root.dragMaskList.shift(); + } + if (showSign) { + //show mask + var iframeList = $$("iframe", setting); + for (var i = 0, l = iframeList.length; i < l; i++) { + var obj = iframeList.get(i), + r = tools.getAbs(obj), + dragMask = $$("
                    ", setting); + dragMask.appendTo($$("body", setting)); + root.dragMaskList.push(dragMask); + } + } + } + }, + //method of operate ztree dom + _view = { + addEditBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + editStr = ""; + aObj.append(editStr); + + $$(node, consts.id.EDIT, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false; + view.editNode(setting, node); + return false; + } + ).show(); + }, + addRemoveBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + removeStr = ""; + aObj.append(removeStr); + + $$(node, consts.id.REMOVE, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false; + view.removeNode(setting, node); + setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + return false; + } + ).bind('mousedown', + function (eventMouseDown) { + return true; + } + ).show(); + }, + addHoverDom: function (setting, node) { + if (data.getRoots().showHoverDom) { + node.isHover = true; + if (setting.edit.enable) { + view.addEditBtn(setting, node); + view.addRemoveBtn(setting, node); + } + tools.apply(setting.view.addHoverDom, [setting.treeId, node]); + } + }, + cancelCurEditNode: function (setting, forceName, isCancel) { + var root = data.getRoot(setting), + node = root.curEditNode; + + if (node) { + var inputObj = root.curEditInput, + newName = forceName ? forceName : (isCancel ? data.nodeName(setting, node) : inputObj.val()); + if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) { + return false; + } + data.nodeName(setting, node, newName); + var aObj = $$(node, consts.id.A, setting); + aObj.removeClass(consts.node.CURSELECTED_EDIT); + inputObj.unbind(); + view.setNodeName(setting, node); + node.editNameFlag = false; + root.curEditNode = null; + root.curEditInput = null; + view.selectNode(setting, node, false); + setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]); + } + root.noSelection = true; + return true; + }, + editNode: function (setting, node) { + var root = data.getRoot(setting); + view.editNodeBlur = false; + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + setTimeout(function () { + tools.inputFocus(root.curEditInput); + }, 0); + return; + } + node.editNameFlag = true; + view.removeTreeDom(setting, node); + view.cancelCurEditNode(setting); + view.selectNode(setting, node, false); + $$(node, consts.id.SPAN, setting).html(""); + var inputObj = $$(node, consts.id.INPUT, setting); + inputObj.attr("value", data.nodeName(setting, node)); + if (setting.edit.editNameSelectAll) { + tools.inputSelect(inputObj); + } else { + tools.inputFocus(inputObj); + } + + inputObj.bind('blur', function (event) { + if (!view.editNodeBlur) { + view.cancelCurEditNode(setting); + } + }).bind('keydown', function (event) { + if (event.keyCode == "13") { + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + } else if (event.keyCode == "27") { + view.cancelCurEditNode(setting, null, true); + } + }).bind('click', function (event) { + return false; + }).bind('dblclick', function (event) { + return false; + }); + + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT); + root.curEditInput = inputObj; + root.noSelection = false; + root.curEditNode = node; + }, + moveNode: function (setting, targetNode, node, moveType, animateFlag, isSilent) { + var root = data.getRoot(setting); + if (targetNode == node) return; + if (setting.data.keep.leaf && targetNode && !data.nodeIsParent(setting, targetNode) && moveType == consts.move.TYPE_INNER) return; + var oldParentNode = (node.parentTId ? node.getParentNode() : root), + targetNodeIsRoot = (targetNode === null || targetNode == root); + if (targetNodeIsRoot && targetNode === null) targetNode = root; + if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER; + var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root); + + if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) { + moveType = consts.move.TYPE_INNER; + } + + if (moveType == consts.move.TYPE_INNER) { + if (targetNodeIsRoot) { + //parentTId of root node is null + node.parentTId = null; + } else { + if (!data.nodeIsParent(setting, targetNode)) { + data.nodeIsParent(setting, targetNode, true); + targetNode.open = !!targetNode.open; + view.setNodeLineIcos(setting, targetNode); + } + node.parentTId = targetNode.tId; + } + } + + //move node Dom + var targetObj, target_ulObj; + if (targetNodeIsRoot) { + targetObj = setting.treeObj; + target_ulObj = targetObj; + } else { + if (!isSilent && moveType == consts.move.TYPE_INNER) { + view.expandCollapseNode(setting, targetNode, true, false); + } else if (!isSilent) { + view.expandCollapseNode(setting, targetNode.getParentNode(), true, false); + } + targetObj = $$(targetNode, setting); + target_ulObj = $$(targetNode, consts.id.UL, setting); + if (!!targetObj.get(0) && !target_ulObj.get(0)) { + var ulstr = []; + view.makeUlHtml(setting, targetNode, ulstr, ''); + targetObj.append(ulstr.join('')); + } + target_ulObj = $$(targetNode, consts.id.UL, setting); + } + var nodeDom = $$(node, setting); + if (!nodeDom.get(0)) { + nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join(''); + } else if (!targetObj.get(0)) { + nodeDom.remove(); + } + if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) { + target_ulObj.append(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) { + targetObj.before(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) { + targetObj.after(nodeDom); + } + + //repair the data after move + var i, l, + tmpSrcIndex = -1, + tmpTargetIndex = 0, + oldNeighbor = null, + newNeighbor = null, + oldLevel = node.level; + var oldChildren = data.nodeChildren(setting, oldParentNode); + var targetParentChildren = data.nodeChildren(setting, targetParentNode); + var targetChildren = data.nodeChildren(setting, targetNode); + if (node.isFirstNode) { + tmpSrcIndex = 0; + if (oldChildren.length > 1) { + oldNeighbor = oldChildren[1]; + oldNeighbor.isFirstNode = true; + } + } else if (node.isLastNode) { + tmpSrcIndex = oldChildren.length - 1; + oldNeighbor = oldChildren[tmpSrcIndex - 1]; + oldNeighbor.isLastNode = true; + } else { + for (i = 0, l = oldChildren.length; i < l; i++) { + if (oldChildren[i].tId == node.tId) { + tmpSrcIndex = i; + break; + } + } + } + if (tmpSrcIndex >= 0) { + oldChildren.splice(tmpSrcIndex, 1); + } + if (moveType != consts.move.TYPE_INNER) { + for (i = 0, l = targetParentChildren.length; i < l; i++) { + if (targetParentChildren[i].tId == targetNode.tId) tmpTargetIndex = i; + } + } + if (moveType == consts.move.TYPE_INNER) { + if (!targetChildren) { + targetChildren = data.nodeChildren(setting, targetNode, []); + } + if (targetChildren.length > 0) { + newNeighbor = targetChildren[targetChildren.length - 1]; + newNeighbor.isLastNode = false; + } + targetChildren.splice(targetChildren.length, 0, node); + node.isLastNode = true; + node.isFirstNode = (targetChildren.length == 1); + } else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + newNeighbor = targetNode; + newNeighbor.isFirstNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = true; + node.isLastNode = false; + + } else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + newNeighbor = targetNode; + newNeighbor.isLastNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = true; + + } else { + if (moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + } else { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + } + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = false; + } + data.fixPIdKeyValue(setting, node); + data.setSonNodeLevel(setting, node.getParentNode(), node); + + //repair node what been moved + view.setNodeLineIcos(setting, node); + view.repairNodeLevelClass(setting, node, oldLevel); + + //repair node's old parentNode dom + if (!setting.data.keep.parent && oldChildren.length < 1) { + //old parentNode has no child nodes + data.nodeIsParent(setting, oldParentNode, false); + oldParentNode.open = false; + var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting), + tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting), + tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting); + view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU); + tmp_ulObj.css("display", "none"); + + } else if (oldNeighbor) { + //old neigbor node + view.setNodeLineIcos(setting, oldNeighbor); + } + + //new neigbor node + if (newNeighbor) { + view.setNodeLineIcos(setting, newNeighbor); + } + + //repair checkbox / radio + if (!!setting.check && setting.check.enable && view.repairChkClass) { + view.repairChkClass(setting, oldParentNode); + view.repairParentChkClassWithSelf(setting, oldParentNode); + if (oldParentNode != node.parent) + view.repairParentChkClassWithSelf(setting, node); + } + + //expand parents after move + if (!isSilent) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag); + } + }, + removeEditBtn: function (setting, node) { + $$(node, consts.id.EDIT, setting).unbind().remove(); + }, + removeRemoveBtn: function (setting, node) { + $$(node, consts.id.REMOVE, setting).unbind().remove(); + }, + removeTreeDom: function (setting, node) { + node.isHover = false; + view.removeEditBtn(setting, node); + view.removeRemoveBtn(setting, node); + tools.apply(setting.view.removeHoverDom, [setting.treeId, node]); + }, + repairNodeLevelClass: function (setting, node, oldLevel) { + if (oldLevel === node.level) return; + var liObj = $$(node, setting), + aObj = $$(node, consts.id.A, setting), + ulObj = $$(node, consts.id.UL, setting), + oldClass = consts.className.LEVEL + oldLevel, + newClass = consts.className.LEVEL + node.level; + liObj.removeClass(oldClass); + liObj.addClass(newClass); + aObj.removeClass(oldClass); + aObj.addClass(newClass); + ulObj.removeClass(oldClass); + ulObj.addClass(newClass); + }, + selectNodes: function (setting, nodes) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.selectNode(setting, nodes[i], i > 0); + } + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy); + data.addInitRoot(_initRoot); + data.addZTreeTools(_zTreeTools); + + var _cancelPreSelectedNode = view.cancelPreSelectedNode; + view.cancelPreSelectedNode = function (setting, node) { + var list = data.getRoot(setting).curSelectedList; + for (var i = 0, j = list.length; i < j; i++) { + if (!node || node === list[i]) { + view.removeTreeDom(setting, list[i]); + if (node) break; + } + } + if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments); + } + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) { + _createNodes.apply(view, arguments); + } + if (!nodes) return; + if (view.repairParentChkClassWithSelf) { + view.repairParentChkClassWithSelf(setting, parentNode); + } + } + + var _makeNodeUrl = view.makeNodeUrl; + view.makeNodeUrl = function (setting, node) { + return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments)); + } + + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var root = data.getRoot(setting); + if (root.curEditNode === node) root.curEditNode = null; + if (_removeNode) { + _removeNode.apply(view, arguments); + } + } + + var _selectNode = view.selectNode; + view.selectNode = function (setting, node, addFlag) { + var root = data.getRoot(setting); + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + return false; + } + if (_selectNode) _selectNode.apply(view, arguments); + view.addHoverDom(setting, node); + return true; + } + + var _uCanDo = tools.uCanDo; + tools.uCanDo = function (setting, e) { + var root = data.getRoot(setting); + if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) { + return true; + } + if (root.curEditNode) { + view.editNodeBlur = false; + root.curEditInput.focus(); + } + return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true); + } +})(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exedit.min.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exedit.min.js new file mode 100755 index 00000000..cd9b2684 --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exedit.min.js @@ -0,0 +1,53 @@ +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a= +i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("
                      ", +f);for(b=0,c=n.length;b0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("
                    • ",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("
                    • ...
                    • ",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("", +f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER)); +w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=cf.edit.drag.borderMin,o=Ef.edit.drag.borderMin,F=rf.edit.drag.borderMin,v=sf.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!= +h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+ +10);t&&t!=h.treeObj&&t.offset().left=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f, +A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND, +[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId= +null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,b){if(!(b.editNameFlag|| +q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},addRemoveBtn:function(a, +b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,b);a.treeObj.trigger(d.event.REMOVE, +[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,a).removeClass(d.node.CURSELECTED_EDIT); +o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l; +c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId= +b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null, +m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode= +u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a, +c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a, +b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a, +b){for(var c=0,d=b.length;c0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode; +break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b, +l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting, +a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable= +a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d"); + }, + showNode: function (setting, node, options) { + data.isHidden(setting, node, false); + data.initShowForExCheck(setting, node); + $$(node, setting).show(); + }, + showNodes: function (setting, nodes, options) { + if (!nodes || nodes.length == 0) { + return; + } + var pList = {}, i, j; + for (i = 0, j = nodes.length; i < j; i++) { + var n = nodes[i]; + if (!pList[n.parentTId]) { + var pn = n.getParentNode(); + pList[n.parentTId] = (pn === null) ? data.getRoot(setting) : n.getParentNode(); + } + view.showNode(setting, n, options); + } + for (var tId in pList) { + var children = data.nodeChildren(setting, pList[tId]); + view.setFirstNodeForShow(setting, children); + view.setLastNodeForShow(setting, children); + } + }, + hideNode: function (setting, node, options) { + data.isHidden(setting, node, true); + node.isFirstNode = false; + node.isLastNode = false; + data.initHideForExCheck(setting, node); + view.cancelPreSelectedNode(setting, node); + $$(node, setting).hide(); + }, + hideNodes: function (setting, nodes, options) { + if (!nodes || nodes.length == 0) { + return; + } + var pList = {}, i, j; + for (i = 0, j = nodes.length; i < j; i++) { + var n = nodes[i]; + if ((n.isFirstNode || n.isLastNode) && !pList[n.parentTId]) { + var pn = n.getParentNode(); + pList[n.parentTId] = (pn === null) ? data.getRoot(setting) : n.getParentNode(); + } + view.hideNode(setting, n, options); + } + for (var tId in pList) { + var children = data.nodeChildren(setting, pList[tId]); + view.setFirstNodeForHide(setting, children); + view.setLastNodeForHide(setting, children); + } + }, + setFirstNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + var isHidden = data.isHidden(setting, children[0], false); + if (children.length > 0 && !isHidden) { + children[0].isFirstNode = true; + } else if (children.length > 0) { + view.setFirstNodeForHide(setting, children); + } + }, + setLastNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + var isHidden = data.isHidden(setting, children[0]); + if (children.length > 0 && !isHidden) { + children[children.length - 1].isLastNode = true; + } else if (children.length > 0) { + view.setLastNodeForHide(setting, children); + } + }, + setFirstNodeForHide: function (setting, nodes) { + var n, i, j; + for (i = 0, j = nodes.length; i < j; i++) { + n = nodes[i]; + if (n.isFirstNode) { + break; + } + var isHidden = data.isHidden(setting, n); + if (!isHidden && !n.isFirstNode) { + n.isFirstNode = true; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return n; + }, + setFirstNodeForShow: function (setting, nodes) { + var n, i, j, first, old; + for (i = 0, j = nodes.length; i < j; i++) { + n = nodes[i]; + var isHidden = data.isHidden(setting, n); + if (!first && !isHidden && n.isFirstNode) { + first = n; + break; + } else if (!first && !isHidden && !n.isFirstNode) { + n.isFirstNode = true; + first = n; + view.setNodeLineIcos(setting, n); + } else if (first && n.isFirstNode) { + n.isFirstNode = false; + old = n; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return {"new": first, "old": old}; + }, + setLastNodeForHide: function (setting, nodes) { + var n, i; + for (i = nodes.length - 1; i >= 0; i--) { + n = nodes[i]; + if (n.isLastNode) { + break; + } + var isHidden = data.isHidden(setting, n); + if (!isHidden && !n.isLastNode) { + n.isLastNode = true; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return n; + }, + setLastNodeForShow: function (setting, nodes) { + var n, i, j, last, old; + for (i = nodes.length - 1; i >= 0; i--) { + n = nodes[i]; + var isHidden = data.isHidden(setting, n); + if (!last && !isHidden && n.isLastNode) { + last = n; + break; + } else if (!last && !isHidden && !n.isLastNode) { + n.isLastNode = true; + last = n; + view.setNodeLineIcos(setting, n); + } else if (last && n.isLastNode) { + n.isLastNode = false; + old = n; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return {"new": last, "old": old}; + } + }, + + _z = { + view: _view, + data: _data + }; + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.isHidden = function (setting, node, newIsHidden) { + if (!node) { + return false; + } + var key = setting.data.key.isHidden; + if (typeof newIsHidden !== 'undefined') { + if (typeof newIsHidden === "string") { + newIsHidden = tools.eqs(newIsHidden, "true"); + } + newIsHidden = !!newIsHidden; + node[key] = newIsHidden; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }; + + data.exSetting(_setting); + data.addInitNode(_initNode); + data.addBeforeA(_beforeA); + data.addZTreeTools(_zTreeTools); + +// Override method in core + var _dInitNode = data.initNode; + data.initNode = function (setting, level, node, parentNode, isFirstNode, isLastNode, openFlag) { + var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting), + children = tmpPNode[setting.data.key.children]; + data.tmpHideFirstNode = view.setFirstNodeForHide(setting, children); + data.tmpHideLastNode = view.setLastNodeForHide(setting, children); + if (openFlag) { + view.setNodeLineIcos(setting, data.tmpHideFirstNode); + view.setNodeLineIcos(setting, data.tmpHideLastNode); + } + isFirstNode = (data.tmpHideFirstNode === node); + isLastNode = (data.tmpHideLastNode === node); + if (_dInitNode) _dInitNode.apply(data, arguments); + if (openFlag && isLastNode) { + view.clearOldLastNode(setting, node, openFlag); + } + }; + + var _makeChkFlag = data.makeChkFlag; + if (!!_makeChkFlag) { + data.makeChkFlag = function (setting, node) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _makeChkFlag.apply(data, arguments); + } + } + + var _getTreeCheckedNodes = data.getTreeCheckedNodes; + if (!!_getTreeCheckedNodes) { + data.getTreeCheckedNodes = function (setting, nodes, checked, results) { + if (!!nodes && nodes.length > 0) { + var p = nodes[0].getParentNode(); + if (!!p && !!data.isHidden(setting, p)) { + return []; + } + } + return _getTreeCheckedNodes.apply(data, arguments); + } + } + + var _getTreeChangeCheckedNodes = data.getTreeChangeCheckedNodes; + if (!!_getTreeChangeCheckedNodes) { + data.getTreeChangeCheckedNodes = function (setting, nodes, results) { + if (!!nodes && nodes.length > 0) { + var p = nodes[0].getParentNode(); + if (!!p && !!data.isHidden(setting, p)) { + return []; + } + } + return _getTreeChangeCheckedNodes.apply(data, arguments); + } + } + + var _expandCollapseSonNode = view.expandCollapseSonNode; + if (!!_expandCollapseSonNode) { + view.expandCollapseSonNode = function (setting, node, expandFlag, animateFlag, callback) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _expandCollapseSonNode.apply(view, arguments); + } + } + + var _setSonNodeCheckBox = view.setSonNodeCheckBox; + if (!!_setSonNodeCheckBox) { + view.setSonNodeCheckBox = function (setting, node, value, srcNode) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _setSonNodeCheckBox.apply(view, arguments); + } + } + + var _repairParentChkClassWithSelf = view.repairParentChkClassWithSelf; + if (!!_repairParentChkClassWithSelf) { + view.repairParentChkClassWithSelf = function (setting, node) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _repairParentChkClassWithSelf.apply(view, arguments); + } + } +})(jQuery); \ No newline at end of file diff --git a/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exhide.min.js b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exhide.min.js new file mode 100755 index 00000000..85125efc --- /dev/null +++ b/hera-admin/src/main/resources/static/plugins/ztree/js/jquery.ztree.exhide.min.js @@ -0,0 +1,23 @@ +/* + * JQuery zTree exHideNodes v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(j){j.extend(!0,j.fn.zTree._z,{view:{clearOldFirstNode:function(c,a){for(var b=a.getNextNode();b;){if(b.isFirstNode){b.isFirstNode=!1;e.setNodeLineIcos(c,b);break}if(b.isLastNode)break;b=b.getNextNode()}},clearOldLastNode:function(c,a,b){for(a=a.getPreNode();a;){if(a.isLastNode){a.isLastNode=!1;b&&e.setNodeLineIcos(c,a);break}if(a.isFirstNode)break;a=a.getPreNode()}},makeDOMNodeMainBefore:function(c,a,b){a=d.isHidden(a,b);c.push("
                    • ")},showNode:function(c,a){d.isHidden(c,a,!1);d.initShowForExCheck(c,a);k(a,c).show()},showNodes:function(c,a,b){if(a&&a.length!=0){var f={},g,i;for(g=0,i=a.length;g0&&!f?b[0].isFirstNode=!0:b.length>0&&e.setFirstNodeForHide(c,b)},setLastNode:function(c,a){var b=d.nodeChildren(c,a),f=d.isHidden(c,b[0]);b.length>0&&!f?b[b.length-1].isLastNode=!0:b.length>0&&e.setLastNodeForHide(c,b)},setFirstNodeForHide:function(c,a){var b,f,g;for(f=0,g=a.length;f=0;f--){b=a[f];if(b.isLastNode)break;if(!d.isHidden(c,b)&&!b.isLastNode){b.isLastNode=!0;e.setNodeLineIcos(c,b);break}else b=null}return b},setLastNodeForShow:function(c, +a){var b,f,g,i;for(f=a.length-1;f>=0;f--){b=a[f];var h=d.isHidden(c,b);if(!g&&!h&&b.isLastNode){g=b;break}else if(!g&&!h&&!b.isLastNode)b.isLastNode=!0,g=b,e.setNodeLineIcos(c,b);else if(g&&b.isLastNode){b.isLastNode=!1;i=b;e.setNodeLineIcos(c,b);break}}return{"new":g,old:i}}},data:{initHideForExCheck:function(c,a){if(d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck=="undefined")a._nocheck=!!a.nocheck,a.nocheck=!0;a.check_Child_State=-1;e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c, +a)}},initShowForExCheck:function(c,a){if(!d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck!="undefined")a.nocheck=a._nocheck,delete a._nocheck;if(e.setChkClass){var b=k(a,m.id.CHECK,c);e.setChkClass(c,b,a)}e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c,a)}}}});var j=j.fn.zTree,l=j._z.tools,m=j.consts,e=j._z.view,d=j._z.data,k=l.$;d.isHidden=function(c,a,b){if(!a)return!1;c=c.data.key.isHidden;typeof b!=="undefined"?(typeof b==="string"&&(b=l.eqs(b,"true")),a[c]=!!b): +a[c]=typeof a[c]=="string"?l.eqs(a[c],"true"):!!a[c];return a[c]};d.exSetting({data:{key:{isHidden:"isHidden"}}});d.addInitNode(function(c,a,b){a=d.isHidden(c,b);d.isHidden(c,b,a);d.initHideForExCheck(c,b)});d.addBeforeA(function(){});d.addZTreeTools(function(c,a){a.showNodes=function(a,b){e.showNodes(c,a,b)};a.showNode=function(a,b){a&&e.showNodes(c,[a],b)};a.hideNodes=function(a,b){e.hideNodes(c,a,b)};a.hideNode=function(a,b){a&&e.hideNodes(c,[a],b)};var b=a.checkNode;if(b)a.checkNode=function(f, +e,i,h){(!f||!d.isHidden(c,f))&&b.apply(a,arguments)}});var n=d.initNode;d.initNode=function(c,a,b,f,g,i,h){var j=(f?f:d.getRoot(c))[c.data.key.children];d.tmpHideFirstNode=e.setFirstNodeForHide(c,j);d.tmpHideLastNode=e.setLastNodeForHide(c,j);h&&(e.setNodeLineIcos(c,d.tmpHideFirstNode),e.setNodeLineIcos(c,d.tmpHideLastNode));g=d.tmpHideFirstNode===b;i=d.tmpHideLastNode===b;n&&n.apply(d,arguments);h&&i&&e.clearOldLastNode(c,b,h)};var o=d.makeChkFlag;if(o)d.makeChkFlag=function(c,a){(!a||!d.isHidden(c, +a))&&o.apply(d,arguments)};var p=d.getTreeCheckedNodes;if(p)d.getTreeCheckedNodes=function(c,a,b,f){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return p.apply(d,arguments)};var q=d.getTreeChangeCheckedNodes;if(q)d.getTreeChangeCheckedNodes=function(c,a,b){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return q.apply(d,arguments)};var r=e.expandCollapseSonNode;if(r)e.expandCollapseSonNode=function(c,a,b,f,g){(!a||!d.isHidden(c,a))&&r.apply(e, +arguments)};var s=e.setSonNodeCheckBox;if(s)e.setSonNodeCheckBox=function(c,a,b,f){(!a||!d.isHidden(c,a))&&s.apply(e,arguments)};var t=e.repairParentChkClassWithSelf;if(t)e.repairParentChkClassWithSelf=function(c,a){(!a||!d.isHidden(c,a))&&t.apply(e,arguments)}})(jQuery); diff --git a/hera-admin/src/main/resources/templates/admin.ftl b/hera-admin/src/main/resources/templates/admin.ftl new file mode 100755 index 00000000..470e6c49 --- /dev/null +++ b/hera-admin/src/main/resources/templates/admin.ftl @@ -0,0 +1,112 @@ + + + + 赫拉任务调度系统 + + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + + + + + + + + + + + + +<@netCommon.commonScript /> + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/bugReport.ftl b/hera-admin/src/main/resources/templates/bugReport.ftl new file mode 100755 index 00000000..79e5479a --- /dev/null +++ b/hera-admin/src/main/resources/templates/bugReport.ftl @@ -0,0 +1,49 @@ + + + + 建议&留言 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + +
                      + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "adviceController" /> + +
                      + +
                      +
                      + +
                      +
                      +
                      + <#list allMsg as msg> +
                      +

                      ${msg.createTime}

                      +

                      ${msg.msg}

                      +

                      来自: ${msg.address}

                      +
                      + + +
                      +
                      +
                      +
                      + +<@netCommon.commonScript /> + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/common/common.macro.ftl b/hera-admin/src/main/resources/templates/common/common.macro.ftl new file mode 100755 index 00000000..c0ac4b7d --- /dev/null +++ b/hera-admin/src/main/resources/templates/common/common.macro.ftl @@ -0,0 +1,256 @@ +<#macro commonStyle> +<#-- favicon --> + + + + + + + + + + + + + + + + + + + + + +<#macro commonScript> + + + + + + + + + + + + + + + + + +<#macro commonHeader> +
                      + + +
                      + + +<#macro commonLeft pageName > + + + + +<#macro commonControl > + + + + +
                      + + +<#macro commonFooter > +
                      + Powered by hera 2.4.2 + +
                      + + diff --git a/hera-admin/src/main/resources/templates/developCenter/developCenter.index.ftl b/hera-admin/src/main/resources/templates/developCenter/developCenter.index.ftl new file mode 100755 index 00000000..e899855b --- /dev/null +++ b/hera-admin/src/main/resources/templates/developCenter/developCenter.index.ftl @@ -0,0 +1,244 @@ + + + + 开发中心 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                      +
                      +
                      +
                      +
                      +
                        +
                        +
                        +
                          +
                        • 增加文件夹
                        • +
                        • 新建Hive
                        • +
                        • 新建Shell
                        • +
                        • 新建Spark
                        • +
                        • 重命名
                        • +
                        • 删除
                        • +
                        +
                        +
                        + +
                        +
                        + + + + + +
                        + <#--tab框--> +
                        +
                        +
                        +
                        +
                        +
                        +
                        + +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                          +
                          +
                          +
                          +
                          +
                          +
                          + 查看日志 + 历史日志 +
                          +
                          +
                          +
                        • +
                          + + + + + + + + + + + + + + + +
                          +

                          +
                          + + + + +<@netCommon.commonScript /> + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/error.ftl b/hera-admin/src/main/resources/templates/error.ftl new file mode 100755 index 00000000..b954e0aa --- /dev/null +++ b/hera-admin/src/main/resources/templates/error.ftl @@ -0,0 +1,33 @@ + + + + + 404 - 对不起,您查找的页面不存在!- JS代码站 + + + + +
                          +
                          + +
                          +

                          温馨提示

                          +

                          ${content}

                          +
                          + +
                          +
                          + diff --git a/hera-admin/src/main/resources/templates/help.ftl b/hera-admin/src/main/resources/templates/help.ftl new file mode 100755 index 00000000..0bf8d791 --- /dev/null +++ b/hera-admin/src/main/resources/templates/help.ftl @@ -0,0 +1,28 @@ + + + + + 帮助文档 + + + + + + +
                          + + + + diff --git a/hera-admin/src/main/resources/templates/home.ftl b/hera-admin/src/main/resources/templates/home.ftl new file mode 100755 index 00000000..d53b1ce4 --- /dev/null +++ b/hera-admin/src/main/resources/templates/home.ftl @@ -0,0 +1,173 @@ + + + + 任务调度中心 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + +
                          + + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "index" /> + + +
                          + + + +
                          + + +
                          +
                          +
                          +

                          任务数统计

                          +
                          + + +
                          +
                          +
                          +
                          + +
                          +
                          +

                           

                          + +

                          今日总任务数

                          +
                          +
                          + +
                          + More info +
                          +
                          + +
                          + +
                          +
                          +

                           

                          +

                          失败任务数

                          +
                          +
                          + +
                          + More info +
                          +
                          + +
                          + +
                          +
                          +

                           

                          +

                          任务队列详情

                          +
                          +
                          + +
                          + More info +
                          +
                          +
                          +
                          +
                          + +
                          +
                          +
                          +
                          +

                          实时任务状态

                          +
                          + + +
                          +
                          +
                          +
                          +
                          +
                          +
                          +
                          +

                          任务执行状态

                          +
                          + + +
                          +
                          +
                          +
                          +
                          + +
                          +
                          +
                          +
                          +
                          +

                          任务时长TOP10

                          +
                          + + +
                          +
                          +
                          +
                          +
                          +
                          + +
                          + +
                          + + + + <@netCommon.commonFooter /> + +
                          + +<@netCommon.commonScript /> + + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/jobManage/jobDag.index.ftl b/hera-admin/src/main/resources/templates/jobManage/jobDag.index.ftl new file mode 100755 index 00000000..daf4d315 --- /dev/null +++ b/hera-admin/src/main/resources/templates/jobManage/jobDag.index.ftl @@ -0,0 +1,126 @@ + + + + 任务依赖 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + +
                          + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                          +
                          +
                          +
                          +

                          任务链路图

                          +
                          +
                          + +
                          + +
                          + + + + +
                          + +
                          + +
                          +
                          + +
                          +
                          + + + + +
                          +
                          +
                          +
                          +
                          + + +<@netCommon.commonScript /> + + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/jobManage/jobDetail.index.ftl b/hera-admin/src/main/resources/templates/jobManage/jobDetail.index.ftl new file mode 100755 index 00000000..dced9da5 --- /dev/null +++ b/hera-admin/src/main/resources/templates/jobManage/jobDetail.index.ftl @@ -0,0 +1,212 @@ + + + + + 任务历史详情 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + + + +
                          + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                          +
                          +
                          +
                          +
                          + + + + + + + +
                          +
                          +
                          +
                          +
                          +
                          +
                          + + + + + + + + + + + + + + + + + + +<@netCommon.commonScript /> + + + + + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/jobManage/jobInstLog.index.ftl b/hera-admin/src/main/resources/templates/jobManage/jobInstLog.index.ftl new file mode 100755 index 00000000..46f8b0c7 --- /dev/null +++ b/hera-admin/src/main/resources/templates/jobManage/jobInstLog.index.ftl @@ -0,0 +1,30 @@ + + + + 任务执行日志 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + +
                          +
                          +
                          +
                          + + + + +<@netCommon.commonScript /> + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/jobManage/jobSearch.index.ftl b/hera-admin/src/main/resources/templates/jobManage/jobSearch.index.ftl new file mode 100755 index 00000000..bd7649ca --- /dev/null +++ b/hera-admin/src/main/resources/templates/jobManage/jobSearch.index.ftl @@ -0,0 +1,112 @@ + + + + + 任务搜索 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + +
                          + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                          +
                          +
                          +
                          +
                          +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          + +
                          +
                          +
                          +
                          +
                          +
                          +
                          + + + + + +<@netCommon.commonScript /> + + + + + + + + \ No newline at end of file diff --git a/hera-admin/src/main/resources/templates/jobManage/record.index.ftl b/hera-admin/src/main/resources/templates/jobManage/record.index.ftl new file mode 100755 index 00000000..25136961 --- /dev/null +++ b/hera-admin/src/main/resources/templates/jobManage/record.index.ftl @@ -0,0 +1,66 @@ + + + + 日志记录 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + + + +
                          + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                          +
                          +
                          +
                          +
                          +
                          +
                          +
                          +
                          + + <#--content-wrapper--> +
                          +<@netCommon.commonScript /> + + + + + + + + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/jobManage/rerun.index.ftl b/hera-admin/src/main/resources/templates/jobManage/rerun.index.ftl new file mode 100755 index 00000000..9a8ec879 --- /dev/null +++ b/hera-admin/src/main/resources/templates/jobManage/rerun.index.ftl @@ -0,0 +1,150 @@ + + + + + 任务重跑 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + +
                          + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                          +
                          +
                          +
                          +

                          任务重跑

                          +
                          +
                          +
                          +
                          +
                          + +
                          +
                          +
                          + + + + + + +<@netCommon.commonScript /> + + + + + diff --git a/hera-admin/src/main/resources/templates/login.ftl b/hera-admin/src/main/resources/templates/login.ftl new file mode 100755 index 00000000..7ea3f52e --- /dev/null +++ b/hera-admin/src/main/resources/templates/login.ftl @@ -0,0 +1,115 @@ + + + + 赫拉任务调度系统 + + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + + + + + + + + + + + + +<@netCommon.commonScript /> + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/machineInfo.ftl b/hera-admin/src/main/resources/templates/machineInfo.ftl new file mode 100755 index 00000000..067f870e --- /dev/null +++ b/hera-admin/src/main/resources/templates/machineInfo.ftl @@ -0,0 +1,152 @@ + + + + 任务调度中心 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + +
                          + + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "index" /> + + +
                          + + + +
                          + + +
                          +
                          +
                          +
                          +

                          系统概况

                          +
                          + + + +
                          +
                          +
                          +
                          +
                          + + + +

                          用户占用

                          +
                          +
                          +
                          + +
                          +

                          系统占用

                          +
                          +
                          +
                          +
                          +
                          +
                          + +
                          +

                          CPU空闲

                          +
                          +
                          +
                          + +
                          +

                          Swap空闲

                          +
                          +
                          +
                          +
                          +
                          +
                          +
                          +
                          +
                          +
                          +

                          进程监控

                          + +
                          + + +
                          +
                          + +
                          +
                          +
                          + +
                          +
                          +
                          +
                          +
                          +

                          机器信息

                          +
                          + + +
                          +
                          +
                          +
                          +
                          + +
                          +
                          + +
                          + + + + <@netCommon.commonFooter /> + +
                          + +<@netCommon.commonScript /> + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/scheduleCenter/scheduleCenter.index.ftl b/hera-admin/src/main/resources/templates/scheduleCenter/scheduleCenter.index.ftl new file mode 100755 index 00000000..0e6204ba --- /dev/null +++ b/hera-admin/src/main/resources/templates/scheduleCenter/scheduleCenter.index.ftl @@ -0,0 +1,1244 @@ + + + + 任务调度中心 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                          + +
                          +
                          +
                          +
                          +
                          + +
                          + +
                          +
                          +
                          +
                          + + +
                          +
                            +
                              +
                              +
                              +
                              +
                              +
                              + + + + +
                              + +
                              + + + + + + + + + + + + + +
                              + + + + + + +
                              + +
                              + + + + + + + + +
                              +
                              +
                              +
                              + +
                              + + + + + + + + + + + + + + + + +<#--定时表达式模态框--> + + + +
                              +

                              +
                              + + + + + + + + + +<@netCommon.commonScript /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/systemManage/basicManage.index.ftl b/hera-admin/src/main/resources/templates/systemManage/basicManage.index.ftl new file mode 100755 index 00000000..1647d7e0 --- /dev/null +++ b/hera-admin/src/main/resources/templates/systemManage/basicManage.index.ftl @@ -0,0 +1,47 @@ + + + + 基础运维 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + +
                              + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                              +
                              +
                              +

                              管理运维界面

                              +
                              +
                              +
                              + +
                              +
                              + +
                              +
                              +
                              + +
                              +
                              + + +<@netCommon.commonScript /> + + + + + + + diff --git a/hera-admin/src/main/resources/templates/systemManage/hostGroupManage.index.ftl b/hera-admin/src/main/resources/templates/systemManage/hostGroupManage.index.ftl new file mode 100755 index 00000000..f5b7d479 --- /dev/null +++ b/hera-admin/src/main/resources/templates/systemManage/hostGroupManage.index.ftl @@ -0,0 +1,283 @@ + + + + 机器组管理 + + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + +
                              + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "hostgroup"/> +
                              +
                              +
                              +
                              + + + + + + + + + + + + +<@netCommon.commonScript /> + + + + + + diff --git a/hera-admin/src/main/resources/templates/systemManage/jobMonitor.index.ftl b/hera-admin/src/main/resources/templates/systemManage/jobMonitor.index.ftl new file mode 100755 index 00000000..f560d4d6 --- /dev/null +++ b/hera-admin/src/main/resources/templates/systemManage/jobMonitor.index.ftl @@ -0,0 +1,73 @@ + + + + 监控管理 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + +
                              + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                              +
                              +
                              +
                              +
                              +
                              +
                              + +
                              + + <#--content-wrapper--> +
                              +<@netCommon.commonScript /> + + + + + + + + + + + + diff --git a/hera-admin/src/main/resources/templates/systemManage/userManage.index.ftl b/hera-admin/src/main/resources/templates/systemManage/userManage.index.ftl new file mode 100755 index 00000000..1aef8ba4 --- /dev/null +++ b/hera-admin/src/main/resources/templates/systemManage/userManage.index.ftl @@ -0,0 +1,159 @@ + + + + 用户管理中心 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + + +
                              + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                              + + +
                              +
                              +
                              +
                              +
                              +
                              + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + + + + +<@netCommon.commonScript /> + + + + + + diff --git a/hera-admin/src/main/resources/templates/systemManage/workManage.index.ftl b/hera-admin/src/main/resources/templates/systemManage/workManage.index.ftl new file mode 100755 index 00000000..44e7ecde --- /dev/null +++ b/hera-admin/src/main/resources/templates/systemManage/workManage.index.ftl @@ -0,0 +1,86 @@ + + + + 机器管理 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + + + + + +
                              + + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "developCenter" /> + +
                              +
                              +
                              +
                              +

                              机器管理

                              +
                              +
                              + +
                              +
                              +
                              + +
                              +
                              + +<#--content-wrapper--> +
                              +<@netCommon.commonScript /> + + + + + + + + + + + + diff --git a/hera-admin/src/test/java/com/dfire/api/HierarchyPropertiesTest.java b/hera-admin/src/test/java/com/dfire/api/HierarchyPropertiesTest.java new file mode 100755 index 00000000..1f36a635 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/api/HierarchyPropertiesTest.java @@ -0,0 +1,31 @@ +package com.dfire.api; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author: 凌霄 + * @time: Created in 下午5:05 2018/6/22 + * @desc + */ +@ComponentScan(basePackages = "com.dfire") +@MapperScan(basePackages = "com.dfire.common.mapper") +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = HierarchyPropertiesTest.class) +public class HierarchyPropertiesTest { + + @Test + public void groupBeanTest() { + + } + + @Test + public void buildGlobalGraphTest() { + } + + +} diff --git a/hera-admin/src/test/java/com/dfire/api/LombokTest.java b/hera-admin/src/test/java/com/dfire/api/LombokTest.java new file mode 100755 index 00000000..b14d02e1 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/api/LombokTest.java @@ -0,0 +1,72 @@ +package com.dfire.api; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.List; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.junit.Test; + +import java.util.ArrayList; + + +/** + * @author: 凌霄 + * @time: Created in 19:53 2018/3/28 + * @desc + */ +public class LombokTest { + + @Data + @EqualsAndHashCode(exclude={"id", "shape"}) + public class EqualsAndHashCodeExample { + private transient int transientVar = 10; + private int id; + private String name; + private double score; + private Square shape = new Square(5, 10); + private String[] tags; + + +// @EqualsAndHashCode(callSuper=true) + @EqualsAndHashCode + public class Square { + private final int width, height; + + public Square(int width, int height) { + this.width = width; + this.height = height; + } + } + } + + @Test + public void deepEqualsTest() { + EqualsAndHashCodeExample e1 = new EqualsAndHashCodeExample(); + EqualsAndHashCodeExample e2 = new EqualsAndHashCodeExample(); + e1.setId(1); + e2.setId(2); + System.out.println(e1.equals(e2)); + + List list1 = new ArrayList<>(); + List list2 = new ArrayList<>(); + list1.add(e1); + list1.add(e2); + + list2.add(e2); + list2.add(e1); + System.out.println(Arrays.deepEquals(list1.toArray(), list2.toArray())); + + } + + @Test + public void ip() throws UnknownHostException { + String host = InetAddress.getLocalHost().getHostAddress(); + System.out.println(host); + + int p1 = 3; + int p2 = 3; + System.out.println( p1 == p2 ? 0 : (p1 > p2 ? 1 : -1)); + } +} diff --git a/hera-admin/src/test/java/com/dfire/common/util/ActionUtilTest.java b/hera-admin/src/test/java/com/dfire/common/util/ActionUtilTest.java new file mode 100755 index 00000000..9ad7fd08 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/common/util/ActionUtilTest.java @@ -0,0 +1,20 @@ +package com.dfire.common.util; + +import com.dfire.common.kv.Tuple; +import org.junit.Test; + +import java.util.Date; + +/** + * Created by xiaosuda on 2018/7/17. + */ +public class ActionUtilTest { + + @Test + public void getNextDayString() { + Tuple dayString = ActionUtil.getNextDayString(); + + System.out.println(dayString.getSource()); + System.out.println(dayString.getTarget()); + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/common/util/BeanConvertUtilsTest.java b/hera-admin/src/test/java/com/dfire/common/util/BeanConvertUtilsTest.java new file mode 100755 index 00000000..a9fd4718 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/common/util/BeanConvertUtilsTest.java @@ -0,0 +1,47 @@ +package com.dfire.common.util; + +import com.alibaba.fastjson.JSONArray; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.vo.HeraJobVo; +import com.dfire.common.processor.JobProcessor; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by xiaosuda on 2018/6/13. + */ +public class BeanConvertUtilsTest { + + @Test + public void convertToHeraJob() { + HeraJobVo heraJobVo = new HeraJobVo(); + HeraJob heraJob = BeanConvertUtils.convertToHeraJob(heraJobVo); + + System.out.println(heraJob.getResources()); + } + + @Test + public void stringToMap() { + String x = "a=b"; + Map res = new HashMap<>(); + + BeanConvertUtils.stringToMap(x, res); + Assert.assertTrue(res.size() == 1); + } + @Test + public void jsonTest() { + String preProcessor = "[]"; + if (preProcessor != null + && !"".equals(preProcessor)) { + JSONArray preArray = JSONArray.parseArray(preProcessor); + List preProcessers = new ArrayList<>(); + System.out.println(preArray.size()); + + } + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/common/util/DagLoopUtilTest.java b/hera-admin/src/test/java/com/dfire/common/util/DagLoopUtilTest.java new file mode 100755 index 00000000..7c68e060 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/common/util/DagLoopUtilTest.java @@ -0,0 +1,40 @@ +package com.dfire.common.util; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by xiaosuda on 2018/7/10. + */ +public class DagLoopUtilTest { + + @Test + public void isLoop() { + + DagLoopUtil dagLoopUtil = new DagLoopUtil(10); + dagLoopUtil.addEdge(1, 2); + dagLoopUtil.addEdge(2, 3); + dagLoopUtil.addEdge(3, 1); + assertTrue(dagLoopUtil.isLoop()); + System.out.println(dagLoopUtil.getLoop()); + dagLoopUtil.init(); + dagLoopUtil.addEdge(1, 2); + dagLoopUtil.addEdge(2, 1); + assertTrue(dagLoopUtil.isLoop()); + + System.out.println(dagLoopUtil.getLoop()); + + dagLoopUtil.init(); + dagLoopUtil.addEdge(2, 4); + dagLoopUtil.addEdge(3, 4); + dagLoopUtil.addEdge(1, 2); + dagLoopUtil.addEdge(1, 3); + dagLoopUtil.addEdge(4, 1); + + assertTrue(dagLoopUtil.isLoop()); + System.out.println(dagLoopUtil.getLoop()); + + } + +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/common/util/DumpStacks.java b/hera-admin/src/test/java/com/dfire/common/util/DumpStacks.java new file mode 100755 index 00000000..e8d8fb99 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/common/util/DumpStacks.java @@ -0,0 +1,90 @@ +package com.dfire.common.util; + +import java.lang.management.*; + +/** + * Created by xiaosuda on 2019/1/14. + */ +public class DumpStacks { + + public static void main(String[] args) { + + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); + + for (ThreadInfo threadInfo : threadMXBean.dumpAllThreads(true, true)) { + System.out.println(getThreadDumpInfo(threadInfo)); + } + + } + + private static String getThreadDumpInfo(ThreadInfo threadInfo) { + + StringBuilder sb = new StringBuilder("\"" + threadInfo.getThreadName() + "\"" + + " Id=" + threadInfo.getThreadId() + " " + + threadInfo.getThreadState()); + if (threadInfo.getLockName() != null) { + sb.append(" on ").append(threadInfo.getLockName()); + } + if (threadInfo.getLockOwnerName() != null) { + sb.append(" owned by \"").append(threadInfo.getLockOwnerName()).append("\" Id=").append(threadInfo.getLockOwnerId()); + } + if (threadInfo.isSuspended()) { + sb.append(" (suspended)"); + } + if (threadInfo.isInNative()) { + sb.append(" (in native)"); + } + sb.append('\n'); + int i = 0; + + StackTraceElement[] stackTrace = threadInfo.getStackTrace(); + MonitorInfo[] lockedMonitors = threadInfo.getLockedMonitors(); + for (; i < stackTrace.length && i < 32; i++) { + StackTraceElement ste = stackTrace[i]; + sb.append("\tat ").append(ste.toString()); + sb.append('\n'); + if (i == 0 && threadInfo.getLockInfo() != null) { + Thread.State ts = threadInfo.getThreadState(); + switch (ts) { + case BLOCKED: + sb.append("\t- blocked on ").append(threadInfo.getLockInfo()); + sb.append('\n'); + break; + case WAITING: + sb.append("\t- waiting on ").append(threadInfo.getLockInfo()); + sb.append('\n'); + break; + case TIMED_WAITING: + sb.append("\t- waiting on ").append(threadInfo.getLockInfo()); + sb.append('\n'); + break; + default: + } + } + + for (MonitorInfo mi : lockedMonitors) { + if (mi.getLockedStackDepth() == i) { + sb.append("\t- locked ").append(mi); + sb.append('\n'); + } + } + } + if (i < stackTrace.length) { + sb.append("\t..."); + sb.append('\n'); + } + + LockInfo[] locks = threadInfo.getLockedSynchronizers(); + if (locks.length > 0) { + sb.append("\n\tNumber of locked synchronizers = ").append(locks.length); + sb.append('\n'); + for (LockInfo li : locks) { + sb.append("\t- ").append(li); + sb.append('\n'); + } + } + sb.append('\n'); + return sb.toString(); + } + +} diff --git a/hera-admin/src/test/java/com/dfire/common/util/StringUtilTest.java b/hera-admin/src/test/java/com/dfire/common/util/StringUtilTest.java new file mode 100755 index 00000000..86f79627 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/common/util/StringUtilTest.java @@ -0,0 +1,47 @@ +package com.dfire.common.util; + +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Created by xiaosuda on 2018/6/26. + */ +public class StringUtilTest { + + @Test + public void convertMapToString() { + Map map = new HashMap<>(); + map.put("1223", "456"); + map.put("1233", "456"); + map.put("1234", "456"); + System.out.println(StringUtil.convertMapToString(map)); + } + + @Test + public void convertStringToMap() { + String str = "{\"roll.back.times\":\"3\",\"columns\":\"\"id,name,package_url,url,code_url,qr_code_memo,icon_path,app_name,publish_time,version_code,version,size,guide,attention,blong_to,release_sataus,app_code,is_valid,create_time,op_time,update_property,update_version,update_guide,hash_url,force_update_version,channel\"\",\"roll.back.wait.time\":\"10\",\"run.priority.level\":\"3\",\"table\":\"as_app\",\"zeus.dependency.cycle\":\"sameday\"}"; + Map map = StringUtil.convertStringToMap("{\"run.priority.level\":\"1\",\"roll.back.wait.time\":\"1\",\"roll.back.times\":\"0\"}"); + + + } + + + @Test + public void streamTest() { + Stream.of("one", "two", "three", "four") + .filter(e -> e.length() > 3) + .peek(e -> System.out.println("Filtered value: " + e)) + .map(String::toUpperCase) + .peek(e -> System.out.println("Mapped value: " + e)) + .collect(Collectors.toList()); + } + + @Test + public void md5Test() { + System.out.println(StringUtil.EncoderByMd5("baseimport")); + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/event/handler/JobHandlerTest.java b/hera-admin/src/test/java/com/dfire/core/event/handler/JobHandlerTest.java new file mode 100755 index 00000000..12239ebd --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/event/handler/JobHandlerTest.java @@ -0,0 +1,20 @@ +package com.dfire.core.event.handler; + +import com.dfire.common.util.StringUtil; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by xiaosuda on 2018/7/12. + */ +public class JobHandlerTest { + + @Test + public void getActionId() { + + boolean b = StringUtil.actionIdToJobId("201807060000000001", "1"); + System.out.println(b); + + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/job/ProcessJobTest.java b/hera-admin/src/test/java/com/dfire/core/job/ProcessJobTest.java new file mode 100755 index 00000000..db1a5eb6 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/job/ProcessJobTest.java @@ -0,0 +1,49 @@ +package com.dfire.core.job; + +import java.io.*; + +/** + * Created by xiaosuda on 2018/7/11. + */ +public class ProcessJobTest { + + public static void main(String[] args) throws IOException, InterruptedException { + + + String[] commands = {"sudo","-u","pjx","sh","/opt/logs/spring-boot/2018-07-16/debug-480/tmp.sh"}; + ProcessBuilder processBuilder = new ProcessBuilder(commands); + processBuilder.directory(new File("/")); + Process process = processBuilder.start(); + + StreamThread thread = new StreamThread(process.getInputStream(), "task"); + thread.start(); + process.waitFor(); + System.out.println("结束任务"); + + } + + private static class StreamThread extends Thread { + private InputStream inputStream; + private String threadName; + + public StreamThread(InputStream inputStream, String threadName) { + this.inputStream = inputStream; + this.threadName = threadName; + } + + @Override + public void run() { + try { + System.out.println(threadName); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/hera-admin/src/test/java/com/dfire/core/netty/listener/WorkResponseListenerTest.java b/hera-admin/src/test/java/com/dfire/core/netty/listener/WorkResponseListenerTest.java new file mode 100755 index 00000000..3a428c60 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/netty/listener/WorkResponseListenerTest.java @@ -0,0 +1,19 @@ +package com.dfire.core.netty.listener; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by xiaosuda on 2018/7/31. + */ +public class WorkResponseListenerTest { + + @Test + public void onWebResponse() { + + WorkResponseListener responseListener = new WorkResponseListener(); + + + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/netty/master/MasterHandlerTest.java b/hera-admin/src/test/java/com/dfire/core/netty/master/MasterHandlerTest.java new file mode 100755 index 00000000..e03d31cc --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/netty/master/MasterHandlerTest.java @@ -0,0 +1,24 @@ +package com.dfire.core.netty.master; + +import org.junit.Test; + +import java.util.concurrent.*; + +/** + * Created by xiaosuda on 2018/6/20. + */ +public class MasterHandlerTest { + + + @Test + public void testFutureTask() throws InterruptedException, ExecutionException { + CompletionService x = new ExecutorCompletionService<>(Executors.newCachedThreadPool()); + x.submit(() -> "77"); + + Future take = x.take(); + + System.out.println(take.get()); + + + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/netty/timer/HashWheelTimerTest.java b/hera-admin/src/test/java/com/dfire/core/netty/timer/HashWheelTimerTest.java new file mode 100755 index 00000000..5037ddc8 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/netty/timer/HashWheelTimerTest.java @@ -0,0 +1,64 @@ +package com.dfire.core.netty.timer; + +import com.dfire.common.util.NamedThreadFactory; +import io.netty.util.HashedWheelTimer; +import io.netty.util.Timeout; +import io.netty.util.TimerTask; +import org.junit.Test; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * @author: 凌霄 + * @time: Created in 下午7:01 2018/8/29 + * @desc + */ +public class HashWheelTimerTest { + + @Test + public void test3() throws InterruptedException { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + HashedWheelTimer timer = new HashedWheelTimer(new NamedThreadFactory("timer-task"), 1, TimeUnit.MILLISECONDS,8); + TimerTask timerTask = new TimerTask() { + @Override + public void run(Timeout timeout) throws Exception { + System.out.println("hello world" + LocalDateTime.now().format(formatter)); + timer.newTimeout(this, 2, TimeUnit.SECONDS); + } + }; + + TimerTask timerTask2 = new TimerTask() { + @Override + public void run(Timeout timeout) throws Exception { + float error = 3 / 2; + System.out.println(error); + timer.newTimeout(this, 2, TimeUnit.SECONDS); + } + }; + timer.newTimeout(timerTask, 4, TimeUnit.SECONDS); + timer.newTimeout(timerTask2, 4, TimeUnit.SECONDS); + System.out.println("------"); + + Thread.currentThread().join(); + } + + + @Test + public void schedulePool() throws InterruptedException { + ScheduledExecutorService schedule = Executors.newScheduledThreadPool(2); + Runnable runnable1 = () -> System.out.println("hello world"); + Runnable runnable2 = () -> { + float error = 3 / 0; + System.out.println(error); + }; + schedule.scheduleAtFixedRate(runnable1, 1, 2, TimeUnit.SECONDS); + schedule.scheduleAtFixedRate(runnable2, 1, 3, TimeUnit.SECONDS); + + Thread.currentThread().join(); + + } +} diff --git a/hera-admin/src/test/java/com/dfire/core/netty/worker/WorkHandlerTest.java b/hera-admin/src/test/java/com/dfire/core/netty/worker/WorkHandlerTest.java new file mode 100755 index 00000000..c8aa85ac --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/netty/worker/WorkHandlerTest.java @@ -0,0 +1,45 @@ +package com.dfire.core.netty.worker; + +import org.junit.Test; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +/** + * Created by xiaosuda on 2018/6/27. + */ +public class WorkHandlerTest { + + + @Test + public void TestExecutorCompletionService() { + ExecutorCompletionService service = new ExecutorCompletionService<>(Executors.newCachedThreadPool()); + + for (int i = 0; i < 10; i++) { + int index = i; + service.submit(() -> { + if (index == 0) { + throw new RuntimeException(); + } + return index; + }); + } + + + for (; ; ) { + Future future = service.poll(); + try { + if (future.isDone()) { + System.out.println(future.get()); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + } + +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/quartz/QuartzSchedulerServiceTest.java b/hera-admin/src/test/java/com/dfire/core/quartz/QuartzSchedulerServiceTest.java new file mode 100755 index 00000000..5afddcb5 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/quartz/QuartzSchedulerServiceTest.java @@ -0,0 +1,29 @@ +package com.dfire.core.quartz; + +import org.junit.Test; +import org.quartz.*; + +import java.io.IOException; + +/** + * Created by xiaosuda on 2018/6/26. + */ +public class QuartzSchedulerServiceTest { + + + + @Test + public void start() throws IOException, SchedulerException, InterruptedException { + + QuartzSchedulerService quartzSchedulerService = new QuartzSchedulerService(); + quartzSchedulerService.start(); + + + JobDetail jobDetail = JobBuilder.newJob(HeraQuartzJob.class).withIdentity("hera").build(); + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?"); + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("hera").withSchedule(scheduleBuilder).build(); + quartzSchedulerService.getScheduler().scheduleJob(jobDetail, trigger); + + Thread.sleep(1000 * 100); + } +} diff --git a/hera-admin/src/test/java/com/dfire/core/tool/RunShellTest.java b/hera-admin/src/test/java/com/dfire/core/tool/RunShellTest.java new file mode 100755 index 00000000..86a71961 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/tool/RunShellTest.java @@ -0,0 +1,22 @@ +package com.dfire.core.tool; + +import org.junit.Test; + +import java.io.IOException; + +/** + * Created by xiaosuda on 2018/8/6. + */ +public class RunShellTest { + + @Test + public void runShell() throws IOException { + + RunShell shell = new RunShell("sh x.sh"); + shell.setDirectory("/Users/wyr/Desktop"); + shell.run(); + + System.out.println(shell.getResult()); + + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/util/CronParseTest.java b/hera-admin/src/test/java/com/dfire/core/util/CronParseTest.java new file mode 100755 index 00000000..2fbe6a01 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/util/CronParseTest.java @@ -0,0 +1,21 @@ +package com.dfire.core.util; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Created by xiaosuda on 2018/7/13. + */ +public class CronParseTest { + + @Test + public void parser() { + List x = new ArrayList<>(); + CronParse.Parser("0 0 0/1 * * ?", "2018-07-18", x); + x.forEach(System.out::println); + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/util/JwtUtilsTest.java b/hera-admin/src/test/java/com/dfire/core/util/JwtUtilsTest.java new file mode 100755 index 00000000..5c472878 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/util/JwtUtilsTest.java @@ -0,0 +1,31 @@ +package com.dfire.core.util; + +import org.junit.Test; + +import java.io.UnsupportedEncodingException; + +import static org.junit.Assert.*; + +/** + * Created by xiaosuda on 2018/7/13. + */ +public class JwtUtilsTest { + + @Test + public void createToken() { + + } + + @Test + public void verifyToken() { + String token = JwtUtils.createToken("小苏打", "2", null, null); + assertTrue(JwtUtils.verifyToken(token)); + } + + @Test + public void getObjectFromToken() { + String token = JwtUtils.createToken("小苏打", "1", null, null); + assertEquals(JwtUtils.getObjectFromToken(token, "username"), "小苏打"); + assertEquals(JwtUtils.getObjectFromToken(token, "userId"), "1"); + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/core/util/NetUtilsTest.java b/hera-admin/src/test/java/com/dfire/core/util/NetUtilsTest.java new file mode 100755 index 00000000..ab04e1bc --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/core/util/NetUtilsTest.java @@ -0,0 +1,16 @@ +package com.dfire.core.util; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by xiaosuda on 2018/6/13. + */ +public class NetUtilsTest { + + @Test + public void getLocalAddress() { + System.out.println(NetUtils.getLocalAddress()); + } +} \ No newline at end of file diff --git a/hera-admin/src/test/java/com/dfire/dao/HeraBaseDaoTest.java b/hera-admin/src/test/java/com/dfire/dao/HeraBaseDaoTest.java new file mode 100755 index 00000000..42846edd --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/dao/HeraBaseDaoTest.java @@ -0,0 +1,322 @@ +package com.dfire.dao; + +import com.dfire.common.entity.*; +import com.dfire.common.entity.model.HeraJobBean; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.service.*; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.entity.vo.HeraHostGroupVo; +import com.dfire.core.lock.DistributeLock; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.schedule.HeraSchedule; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.monitor.service.JobManageService; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author: 凌霄 + * @time: Created in 下午5:15 2018/5/14 + * @desc + */ +@ComponentScan(basePackages = "com.dfire") +@MapperScan(basePackages = "com.dfire.common.mapper") +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = HeraBaseDaoTest.class) +public class HeraBaseDaoTest { + + @Autowired + HeraJobActionService heraJobActionService; + @Autowired + HeraPermissionService heraPermissionService; + @Autowired + HeraDebugHistoryService heraDebugHistoryService; + @Autowired + HeraFileService heraFileService; + @Autowired + HeraGroupService heraGroupService; + @Autowired + HeraLockService heraLockService; + @Autowired + HeraHostRelationService heraHostRelationService; + @Autowired + HeraHostGroupService heraHostGroupService; + @Autowired + HeraJobService heraJobService; + + @Autowired + JobManageService jobManageService; + + HeraAction heraAction; + HeraPermission heraPermission; + HeraDebugHistory heraDebugHistory; + HeraFile heraFile; + HeraGroup heraGroup; + HeraLock heraLock; + + @Autowired + DistributeLock distributeLock; + + + @Before + public void doBefore() { + heraAction = HeraAction.builder() + .id(1111111111111111111L) + .jobId(6666) + .gmtCreate(new Date()) + .gmtModified(new Date()) + .groupId(1) + .name("lx") + .owner("lx") + .build(); + + heraPermission = HeraPermission + .builder() + .gmtCreate(new Date()) + .build(); + + heraDebugHistory = HeraDebugHistory + .builder() + .fileId(1) + .hostGroupId(1) + .owner("import") + .gmtCreate(new Date()) + .gmtModified(new Date()) + .startTime(new Date()) + .endTime(new Date()) + .build(); + + heraFile = HeraFile.builder() + .build(); + + heraGroup = HeraGroup.builder().build(); + heraLock = HeraLock.builder() + .subgroup("test") + .host("127.0.0.1") + .serverUpdate(new Date()) + .build(); + + + } + + + @Test + public void heraActionDaoTest() { + HeraAction action = HeraAction.builder().id(201801010010000350L).jobId(350).build(); + System.out.println(heraAction.getGmtCreate()); + List list = heraJobActionService.getAll(); + System.out.println(list.get(5).getJobDependencies()); + heraJobActionService.insert(heraAction, Long.parseLong(ActionUtil.getCurrActionVersion())); + heraJobActionService.delete(1L); + + HeraAction heraAction = heraJobActionService.findById("201806190000000002"); + System.out.println(heraAction.getJobDependencies()); + + } + + @Test + public void heraActionBatchDaoTest() { +// heraJobActionService.delete("1111111111111111111"); + +// heraJobActionService.insert(heraAction); + HeraAction heraAction = heraJobActionService.findById("201806190000000002"); + List list = Arrays.asList(heraAction); + + heraJobActionService.batchInsert(list, Long.parseLong(ActionUtil.getCurrActionVersion())); +// +// HeraAction heraAction = heraJobActionService.findById("201806190000000002"); +// System.out.println(heraAction.getJobDependencies()); + + } + + + + + @Test + public void heraDebugHistoryDaoTest() { + HeraDebugHistoryVo debugHistory = heraDebugHistoryService.findById(271L); + debugHistory.setStatus(StatusEnum.FAILED); + heraDebugHistoryService.update(BeanConvertUtils.convert(debugHistory)); + HeraDebugHistory history = BeanConvertUtils.convert(debugHistory); + history.setLog("test11ssss1"); + history.setGmtCreate(new Date()); + history.setGmtModified(new Date()); + heraDebugHistoryService.update(history); + System.out.println(debugHistory.getStatus().toString()); + System.out.println(history.getLog()); + + } + + @Test + public void heraFileDaoTest() { + heraFile = heraFileService.findById(2); + System.out.println(heraFile.getName()); + + heraFile.setContent("test"); + heraFileService.update(heraFile); + + List list = Arrays.asList(new Integer[]{new Integer(20), new Integer(12)}); + List heraFileList = heraFileService.findByIds(list); + System.out.println(heraFileList.size()); + + heraFileService.delete(3); + + List subList = heraFileService.findByParent(3); + System.out.println(subList.size()); + + List pList = heraFileService.findByOwner("biadmin"); + System.out.println(pList.size()); + + heraFile = HeraFile.builder().owner("test").name("test").type(2).build(); + heraFileService.insert(heraFile); + + } + + @Test + public void heraFileContent() { + HeraFile heraFile = HeraFile.builder().id(4).content("ls /").build(); + heraFileService.updateContent(heraFile); + + } + + @Test + public void heraGroupDaoTest() { + heraGroup = heraGroupService.findById(3579); + System.out.println(heraGroup.getConfigs()); + heraGroup.setConfigs("test"); + heraGroupService.update(heraGroup); + + HeraGroup group = heraGroupService.findById(3587); + System.out.println(group.getConfigs()); + + List list = Arrays.asList(new Integer[]{new Integer(3607), new Integer(3608)}); + List groups = heraGroupService.findByIds(list); + System.out.println(groups.get(0).getOwner()); + + + List subGroup = heraGroupService.findByParent(3578); + System.out.println(subGroup.size()); + + List userGroup = heraGroupService.findByOwner("biadmin"); + System.out.println(userGroup.size()); + + heraGroupService.delete(3580); + + } + + @Test + public void JobGraphTest() { + HeraJobBean jobBean = heraGroupService.getUpstreamJobBean(90); + System.out.println(jobBean.getUpStream().size()); + } + + @Test + public void heraLockDaoTest() { + HeraLock lock = heraLockService.findBySubgroup("online"); + lock.setServerUpdate(new Date()); + heraLockService.update(lock); + + heraLockService.insert(heraLock); + } + + @Test + public void heraHostGroupDaoTest() { + HeraHostGroup group = heraHostGroupService.findById(1); + System.out.println(group.getName()); + + Map map = heraHostGroupService.getAllHostGroupInfo(); + System.out.println(map.toString()); + + } + + @Test + public void heraJobDaoTest() { + + } + + @Test + public void jobManageTest() { +// JsonResponse jsonResponse = jobManageService.findJobHistoryByStatus("failed"); +// System.out.println(jsonResponse.getData()); + + JsonResponse top10 = jobManageService.findJobRunTimeTop10(); + System.out.println(top10.getData()); + } + + @Test + public void dagTest() { + + } + + @Test + public void generateActionTest() { + + try { + + Field heraScheduleField = distributeLock.getClass().getDeclaredField("heraSchedule"); + heraScheduleField.setAccessible(true); + HeraSchedule heraSchedule = (HeraSchedule) heraScheduleField.get(distributeLock); + heraSchedule.startup(); + if(heraSchedule != null) { + Field masterContextField = heraSchedule.getClass().getDeclaredField("masterContext"); + masterContextField.setAccessible(true); + MasterContext masterContext = (MasterContext) masterContextField.get(heraSchedule); + if(masterContext != null) { + Master master = masterContext.getMaster(); + + Calendar calendar = Calendar.getInstance(); + Date now = calendar.getTime(); + + Map actionMap = new HashMap<>(); + + List heraJobList = heraJobService.getAll(); + String cronDate = ActionUtil.getActionVersionPrefix(now); + + } + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + } + + @Test + public void generateSingleAction() { + try { + + Field heraScheduleField = distributeLock.getClass().getDeclaredField("heraSchedule"); + heraScheduleField.setAccessible(true); + HeraSchedule heraSchedule = (HeraSchedule) heraScheduleField.get(distributeLock); + heraSchedule.startup(); + if(heraSchedule != null) { + Field masterContextField = heraSchedule.getClass().getDeclaredField("masterContext"); + masterContextField.setAccessible(true); + MasterContext masterContext = (MasterContext) masterContextField.get(heraSchedule); + if(masterContext != null) { + Master master = masterContext.getMaster(); + master.generateBatchAction(false); + } + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + +} diff --git a/hera-admin/src/test/java/com/dfire/exception/ExceptionTest.java b/hera-admin/src/test/java/com/dfire/exception/ExceptionTest.java new file mode 100755 index 00000000..1ec6dbbe --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/exception/ExceptionTest.java @@ -0,0 +1,72 @@ +package com.dfire.exception; + +/** + * @author: 凌霄 + * @time: Created in 下午5:02 2018/6/11 + * @desc + */ +public class ExceptionTest { + + + boolean testEx() throws Exception { + boolean ret = true; + try { + ret = testEx1(); + } catch (Exception e) { + System.out.println("testEx, catch exception"); + ret = false; + throw e; + } finally { + System.out.println("testEx, finally; return value=" + ret); + return ret; + } + } + + boolean testEx1() throws Exception { + boolean ret = true; + try { + ret = testEx2(); + if (!ret) { + return false; + } + System.out.println("testEx1, at the end of try"); + return ret; + } catch (Exception e) { + System.out.println("testEx1, catch exception"); + ret = false; + throw e; + } finally { + System.out.println("testEx1, finally; return value=" + ret); + return ret; + } + } + + boolean testEx2() throws Exception { + boolean ret = true; + try { + int b = 12; + int c; + for (int i = 2; i >= -2; i--) { + c = b / i; + System.out.println("i=" + i); + } + return true; + } catch (Exception e) { + System.out.println("testEx2, catch exception"); + ret = false; + throw e; + } finally { + System.out.println("testEx2, finally; return value=" + ret); + return ret; + } + } + + public static void main(String[] args) { + ExceptionTest testException1 = new ExceptionTest(); + try { + testException1.testEx(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/hera-admin/src/test/java/com/dfire/exception/ThreadPoolExecutorTest.java b/hera-admin/src/test/java/com/dfire/exception/ThreadPoolExecutorTest.java new file mode 100755 index 00000000..de97a57d --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/exception/ThreadPoolExecutorTest.java @@ -0,0 +1,82 @@ +package com.dfire.exception; + +import java.util.concurrent.*; + +/** + * Created by xiaosuda on 2018/7/23. + */ +public class ThreadPoolExecutorTest { + + public static void main(String[] args) { + int core = 2; + ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 2 * core, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy()); + + Future one = executor.submit(() -> { + try { + Thread.sleep(10 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "第一个测试:慢请求"; + }); + + Future two = executor.submit(() -> { + try { + Thread.sleep(10 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "第二个测试:慢请求"; + }); + + Future three = executor.submit(() -> { + return "快请求"; + }); + + try { + System.out.println("--------尝试获得第一个-------------"); + String s = one.get(5, TimeUnit.SECONDS); + System.out.println(s); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } catch (TimeoutException e) { + e.printStackTrace(); + one.cancel(true); + System.out.println("activeCount:" + executor.getActiveCount() + " largestPoolSize:" + executor.getLargestPoolSize()); + + } + + try { + System.out.println("--------尝试获得第二个-------------"); + String s = two.get(5, TimeUnit.SECONDS); + System.out.println(s); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } catch (TimeoutException e) { + e.printStackTrace(); + two.cancel(true); + System.out.println("activeCount:" + executor.getActiveCount() + " coresNum:" + executor.getLargestPoolSize()); + } + + try { + System.out.println("--------尝试获得第三个-------------"); + String s = three.get(5, TimeUnit.SECONDS); + System.out.println(s); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } catch (TimeoutException e) { + e.printStackTrace(); + three.cancel(true); + System.out.println("activeCount:" + executor.getActiveCount() + " coresNum:" + executor.getLargestPoolSize()); + } + + executor.shutdown(); + + } +} diff --git a/hera-admin/src/test/java/com/dfire/monitor/EmailTest.java b/hera-admin/src/test/java/com/dfire/monitor/EmailTest.java new file mode 100755 index 00000000..7c213431 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/monitor/EmailTest.java @@ -0,0 +1,37 @@ +package com.dfire.monitor; + +import com.dfire.common.service.EmailService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.mail.MessagingException; +import java.util.Arrays; + +/** + * @author 火锅 + * @time 2018/11/21 + */ +@ComponentScan(basePackages = "com.dfire") +@MapperScan(basePackages = "com.dfire.common.mapper") +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = EmailTest.class) +public class EmailTest { + + @Autowired + EmailService emailService; + + @Test + public void sendEmail() { + try { + emailService.sendEmail("test1", "content1", "xiaosuda@2dfire.com"); + } catch (MessagingException e) { + e.printStackTrace(); + } + } + +} diff --git a/hera-admin/src/test/java/com/dfire/threadpool/JvmTest.java b/hera-admin/src/test/java/com/dfire/threadpool/JvmTest.java new file mode 100755 index 00000000..ff80840e --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/threadpool/JvmTest.java @@ -0,0 +1,32 @@ +package com.dfire.threadpool; + +import java.io.*; + +/** + * Created by xiaosuda on 2018/12/17. + */ +public class JvmTest { + + private static final int _1MB = 100 * 1024 * 1024; + + + public static void main(String[] args) { + File file = new File("/Users/wyr/Desktop/csdn.txt"); + try (InputStream inputStream = new FileInputStream(file)) { + int fileSize = inputStream.available(); + System.out.println("文件大小为:" + fileSize +"byte"); + byte[] buffer = new byte[1024]; + int len; + while ((len = inputStream.read(buffer)) != -1) { + System.out.println(new String(buffer, 0, len)); + System.out.println("-------------------------"); + } + + } catch (FileNotFoundException e) { + System.out.println("目录不存在:" + e.getMessage()); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/hera-admin/src/test/java/com/dfire/threadpool/QueueTest.java b/hera-admin/src/test/java/com/dfire/threadpool/QueueTest.java new file mode 100755 index 00000000..10bd9ccd --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/threadpool/QueueTest.java @@ -0,0 +1,43 @@ +package com.dfire.threadpool; + +import com.dfire.common.vo.JobElement; +import org.junit.Test; + +import java.util.Comparator; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; + +/** + * desc: + * + * @author scx + * @create 2019/04/15 + */ +public class QueueTest { + + + @Test + + public void test() throws InterruptedException { + BlockingQueue scheduleQueue = new PriorityBlockingQueue<>(10000, Comparator.comparing(JobElement::getPriorityLevel).reversed()); + + scheduleQueue.put(JobElement.builder().jobId(1L).priorityLevel(1).build()); + scheduleQueue.put(JobElement.builder().jobId(2L).priorityLevel(2).build()); + scheduleQueue.put(JobElement.builder().jobId(3L).priorityLevel(3).build()); + scheduleQueue.put(JobElement.builder().jobId(4L).priorityLevel(3).build()); + scheduleQueue.put(JobElement.builder().jobId(5L).priorityLevel(4).build()); + scheduleQueue.put(JobElement.builder().jobId(6L).priorityLevel(5).build()); + scheduleQueue.put(JobElement.builder().jobId(7L).priorityLevel(5).build()); + scheduleQueue.put(JobElement.builder().jobId(8L).priorityLevel(6).build()); + + + while(!scheduleQueue.isEmpty()) { + Thread.sleep(500); + + JobElement take = scheduleQueue.take(); + + System.out.println(take.getJobId()); + } + } + +} diff --git a/hera-admin/src/test/java/com/dfire/threadpool/SchedulePoolTest.java b/hera-admin/src/test/java/com/dfire/threadpool/SchedulePoolTest.java new file mode 100755 index 00000000..8fcbe3c2 --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/threadpool/SchedulePoolTest.java @@ -0,0 +1,120 @@ +package com.dfire.threadpool; + +import org.joda.time.DateTime; +import org.joda.time.DurationFieldType; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * Created by xiaosuda on 2018/11/8. + */ +public class SchedulePoolTest { + + + static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10); + + public static void main(String[] args) { + + test6(); + + } + + + + public static void test6() { + CompletableFuture one = CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("first"); + return "first"; + }); + + CompletableFuture two = CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("second"); + return "second"; + }); + + CompletableFuture allOf = CompletableFuture.allOf(one, two); + + allOf.join(); + + System.out.println("全部完成"); + + } + + public static void test5() { + + int maxNum = 9000000; + List list = new ArrayList<>(maxNum); + + for (int i = 0; i <= maxNum; i++) { + list.add(i); + } + + long start = System.currentTimeMillis(); + list.parallelStream().forEach((x) -> { + if (x == maxNum) { + System.out.println("last"); + } + }); + System.out.println(System.currentTimeMillis() - start); + + } + + + public static void test4() { + DateTime now = new DateTime(); + executor.scheduleWithFixedDelay(() -> { + System.out.println(new DateTime()); + }, 60 - now.getSecondOfMinute(), 5, TimeUnit.MINUTES); + } + + /** + * 根据上一次的成功时间来计时下一次 + */ + public static void test3() { + executor.scheduleWithFixedDelay(() -> { + System.out.println(DateTime.now()); + try { + TimeUnit.SECONDS.sleep(5); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }, 0, 2, TimeUnit.SECONDS); + } + + /** + * 只执行一次 + */ + public static void test2() { + executor.schedule(() -> { + System.out.println(DateTime.now()); + }, 2, TimeUnit.SECONDS); + } + + /** + * 根据程序的具体执行时间 + */ + public static void test1() { + executor.scheduleAtFixedRate(() -> { + System.out.println(DateTime.now()); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }, 0, 1, TimeUnit.SECONDS); + } +} diff --git a/hera-admin/src/test/java/com/dfire/threadpool/ThreadPoolTest.java b/hera-admin/src/test/java/com/dfire/threadpool/ThreadPoolTest.java new file mode 100755 index 00000000..984fcb3a --- /dev/null +++ b/hera-admin/src/test/java/com/dfire/threadpool/ThreadPoolTest.java @@ -0,0 +1,56 @@ +package com.dfire.threadpool; + +import java.util.concurrent.*; + +/** + * Created by xiaosuda on 2018/11/7. + */ +public class ThreadPoolTest { + private static CompletionService completionService = new ExecutorCompletionService<>(Executors.newCachedThreadPool()); + + + + public static void main(String[] args) { + + for (int i = 0 ; i < 10; i++) { + int time = i; + completionService.submit(() -> { + Response response = new Response(); + response.setX(time); + TimeUnit.SECONDS.sleep(10 - time); + return response; + }); + } + + new Thread(() -> { + + while(true) { + try { + System.out.println("1。。。。"); + Future take = completionService.take(); + System.out.println("2。。。。"); + Response response = take.get(); + System.out.println(response.getX()); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + }).start(); + + } +} + +class Response { + + private Integer x; + + public void setX(Integer x) { + this.x = x; + } + + public Integer getX() { + return x; + } +} diff --git a/hera-common/pom.xml b/hera-common/pom.xml new file mode 100755 index 00000000..75537e84 --- /dev/null +++ b/hera-common/pom.xml @@ -0,0 +1,100 @@ + + 4.0.0 + + + com.dfire.hera + hera + 2.4.2 + + + hera-common + jar + ${hera.common.version} + hera-common + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + mysql + mysql-connector-java + + + org.projectlombok + lombok + + + + com.github.pagehelper + pagehelper + 5.1.2 + + + + + com.google.guava + guava + + + + com.alibaba + fastjson + + + + junit + junit + + + + commons-lang + commons-lang + + + + javax.mail + mail + 1.4.5 + + + + org.apache.velocity + velocity + + + com.sun.mail + javax.mail + 1.5.4 + + + joda-time + joda-time + + + org.apache.httpcomponents + httpclient + + + com.fasterxml.jackson.core + jackson-databind + 2.10.2 + compile + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + + + + + + + diff --git a/hera-common/src/main/java/com/dfire/common/config/Alarm.java b/hera-common/src/main/java/com/dfire/common/config/Alarm.java new file mode 100755 index 00000000..343190c6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/config/Alarm.java @@ -0,0 +1,21 @@ +package com.dfire.common.config; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Service; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by xiaosuda on 2019/3/6. + */ +@Service +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Alarm { + + @AliasFor(annotation = Service.class, attribute = "value") + String value() default ""; +} diff --git a/hera-common/src/main/java/com/dfire/common/config/ExecuteFilter.java b/hera-common/src/main/java/com/dfire/common/config/ExecuteFilter.java new file mode 100755 index 00000000..41b61a84 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/config/ExecuteFilter.java @@ -0,0 +1,15 @@ +package com.dfire.common.config; + +import com.dfire.common.vo.JobElement; + +/** + * @author scx + */ +public interface ExecuteFilter { + + void onExecute(JobElement element); + + + void onResponse(JobElement element); + +} diff --git a/hera-common/src/main/java/com/dfire/common/config/Filter.java b/hera-common/src/main/java/com/dfire/common/config/Filter.java new file mode 100755 index 00000000..ef916297 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/config/Filter.java @@ -0,0 +1,18 @@ +package com.dfire.common.config; + + +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Service; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Service +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Filter { + @AliasFor(annotation = Service.class, attribute = "value") + String value() default ""; +} diff --git a/hera-common/src/main/java/com/dfire/common/config/FilterType.java b/hera-common/src/main/java/com/dfire/common/config/FilterType.java new file mode 100755 index 00000000..9247ecd7 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/config/FilterType.java @@ -0,0 +1,12 @@ +package com.dfire.common.config; + +public enum FilterType { + /** + * 执行之前 + */ + execute, + /** + * 执行之后 + */ + response +} diff --git a/hera-common/src/main/java/com/dfire/common/config/ServiceLoader.java b/hera-common/src/main/java/com/dfire/common/config/ServiceLoader.java new file mode 100755 index 00000000..1c97a2a0 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/config/ServiceLoader.java @@ -0,0 +1,69 @@ +package com.dfire.common.config; + +import com.dfire.common.exception.UnsupportedTypeException; +import com.dfire.common.service.JobFailAlarm; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author xiaosuda + * @date 2019/2/26 + */ +@Component +public class ServiceLoader implements ApplicationContextAware { + + private static List alarms = new ArrayList<>(); + + private static List filters = new ArrayList<>(); + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + setAlarms(applicationContext); + setFilters(applicationContext); + } + + /** + * 通过@Alarms 注解 找到所有需要告警的实现类 + * + * @param applicationContext applicationContext + */ + private void setAlarms(ApplicationContext applicationContext) { + Map alarmBeans = applicationContext.getBeansWithAnnotation(Alarm.class); + for (Object bean : alarmBeans.values()) { + if (!(bean instanceof JobFailAlarm)) { + throw new UnsupportedTypeException("不支持的告警类型:" + bean.getClass().getName() + ",@Alarm注解只能放在" + JobFailAlarm.class + "的实现类上"); + } + ServiceLoader.alarms.add((JobFailAlarm) bean); + } + } + + /** + * 通过@Filter 注解 找到所有需要告警的实现类 + * + * @param applicationContext applicationContext + */ + private void setFilters(ApplicationContext applicationContext) { + Map alarmBeans = applicationContext.getBeansWithAnnotation(Filter.class); + for (Object bean : alarmBeans.values()) { + if (!(bean instanceof ExecuteFilter)) { + throw new UnsupportedTypeException("不支持的拦截器类型:" + bean.getClass().getName() + ",@Filter注解只能放在" + ExecuteFilter.class + "的实现类上"); + } + ServiceLoader.filters.add((ExecuteFilter) bean); + } + } + + + public static List getAlarms() { + return alarms; + } + + public static List getFilters() { + return filters; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/config/SkipColumn.java b/hera-common/src/main/java/com/dfire/common/config/SkipColumn.java new file mode 100755 index 00000000..151a406a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/config/SkipColumn.java @@ -0,0 +1,18 @@ +package com.dfire.common.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * desc: + * + * @author scx + * @create 2019/05/15 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface SkipColumn { + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/constants/Constants.java b/hera-common/src/main/java/com/dfire/common/constants/Constants.java new file mode 100755 index 00000000..dc25e91d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/constants/Constants.java @@ -0,0 +1,211 @@ +package com.dfire.common.constants; + +/** + * @author xiaosuda + * @date 2018/7/2 + */ +public class Constants { + + public final static String HERA_GROUP = "heraGroup"; + + public final static String GROUP_PREFIX = "group_"; + + public final static String PRE_ENV = "pre"; + + public final static String PUB_ENV = "public"; + + public final static String DAILY_ENV = "daily"; + + public final static String WORK_PREFIX = "worker-"; + + public final static String MASTER_PREFIX = "master-"; + + public final static String STATUS_NONE = "none"; + + public final static Integer HTML_FONT_SIZE = 1; + + public final static Integer AVAILABLE_CORES = Runtime.getRuntime().availableProcessors(); + + public final static String HTML_FONT_RED_LEFT = ""; + + public final static String HTML_FONT_GREEN_LEFT = ""; + + public final static String HTML_FONT_BLUE_LEFT = ""; + + public final static String HTML_FONT_LEFT = ""; + + public final static String HTML_FONT_RIGHT = ""; + + + public final static String LEFT_BRACKET = "("; + + public final static String RIGHT_BRACKET = ")"; + + public final static Long ALL_JOB_ID = -1024L; + + public final static String CANCEL_JOB_MESSAGE = "任务手动取消"; + + /** + * jwt 过期时间 单位 天 + */ + public final static Integer JWT_TIME_OUT = 5; + /** + * cookie过期时间 单位 秒 + */ + public final static Integer LOGIN_TIME_OUT = JWT_TIME_OUT * 60 * 60 * 24; + + + /** + * 退出码相关 + */ + + public final static int SUCCESS_EXIT_CODE = 0; + + public final static int DEFAULT_EXIT_CODE = -1; + + public final static int WAIT_EXIT_CODE = 38; + + public final static int LOG_EXIT_CODE = WAIT_EXIT_CODE + 1; + + public final static int INTERRUPTED_EXIT_CODE = WAIT_EXIT_CODE + 2; + + + public final static String SPARK_FILE = "spark"; + + public final static String HIVE_FILE = "hive"; + + public final static String SHELL_FILE = "shell"; + + + public final static String POINT = "."; + + public final static String COMMA = ","; + + public final static String SEMICOLON = ";"; + + + public final static String SHELL_SUFFIX = POINT + "sh"; + + public final static String HIVE_SUFFIX = POINT + HIVE_FILE; + + public final static String SPARK_SUFFIX = POINT + SPARK_FILE; + + public final static String NEW_LINE = "\n"; + + public final static String BLANK_SPACE = " "; + + public final static String HTML_NEW_LINE = "
                              "; + + + public final static String LOG_SPLIT = "

                              "; + + public final static String FILE_ALL_NAME = "all"; + + public final static String FILE_SELF = "个人文档"; + + public final static String FILE_ALL = "共享文档"; + + public final static String OPEN_STATUS = "开启"; + + public final static String CLOSE_STATUS = "关闭"; + + public final static String INVALID_STATUS = "失效"; + + + public final static String QUARTZ_ID = "actionId"; + + public final static String QUARTZ_DISPATCHER = "dispatcher"; + + /** + * 所有区域任务 + */ + public final static String ALL_AREA = "all"; + + public final static String SSH_PREFIX = "<< eeooff"; + + public final static String SSH_SUFFIX = "eeooff"; + + public final static String HERA_EMR_FIXED = "hera.emr.fixed"; + + public final static String HERA_EMR_FIXED_HOST = "hera.emr.fixed.host"; + + public final static String AREA_INDIA = "IND"; + + public final static String AREA_EUROPE = "EU"; + + public final static String AREA_US = "US"; + + public final static String AREA_UE = "UE"; + + public final static String AREA_CHINA = "AY"; + + public final static String HERA_SPARK_CONF = "hera.spark.conf"; + + public final static String EMR_SELECT_WORK = "emr.select.work"; + + public final static String TMP_PATH = "/tmp"; + + + public final static String SESSION_USERNAME = "username"; + + public final static String SESSION_USER_ID = "userId"; + + public final static String SESSION_SSO_ID = "ssoId"; + + public final static String SESSION_SSO_NAME = "sso_name"; + + public final static String TOKEN_NAME = "HERA_Token"; + + public final static String DEFAULT_ID = "-1"; + + public final static String PASSWORD_WORD = "password"; + + public final static String HERA_SCRIPT_ECHO = "hera.script.echo"; + + public final static String KAFKA_TOPIC = "hera_notice"; + + public final static String ACTION_DONE = "action_done"; + + public final static String ACTION_PROCESS_NUM = "action_process_num"; + + public final static String ACTION_FAILED_NUM = "action_failed_num"; + + public final static String ACTION_ALL_NUM = "action_all_num"; + + public final static String RERUN_THREAD = "rerun_thread"; + + public final static String RERUN_FAILED = "rerun_failed"; + + public final static String RERUN_ID = "rerun_id"; + + public final static String LAST_RERUN_ID = "last_rerun_id"; + + public final static String APP_ID = "applicationId"; + public final static String HADOOP_ID = "hadoopJobId"; + public final static String FILE_CONTENT = "fileContent"; + + public final static String EMR_ADDRESS = "emr_address"; + + public final static String COLON = ":"; + + public final static String SECRET_PREFIX = "secret."; + + public final static String RERUN_COUNT = "single"; + public final static String RERUN_INDEX = "index"; + + public final static String RERUN_START_TIME = "startTime_"; + + public final static String RERUN_END_TIME = "endTime_"; + + public final static String RUN_FIXED_HOST = "run_fixed_host"; + + public final static String FILE_COUNT_ECHO = "输出表最后一个分区统计信息:"; + + public final static String ANYHOST_VALUE = "0.0.0.0"; + + public final static String SERVER_KEY = "server.ip"; + + public final static String LOCALHOST_VALUE = "127.0.0.1"; + + +} diff --git a/hera-common/src/main/java/com/dfire/common/constants/LogConstant.java b/hera-common/src/main/java/com/dfire/common/constants/LogConstant.java new file mode 100755 index 00000000..c10f58ea --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/constants/LogConstant.java @@ -0,0 +1,28 @@ +package com.dfire.common.constants; + +/** + * @author: 凌霄 + * @time: Created in 下午3:02 2018/6/19 + * @desc 某些固定状态下的任务日志内容 + */ +public class LogConstant { + + public static final String SERVER_START_JOB_LOG = "启动服务器发现正在running状态,判断状态已经丢失,进行重试操作\n"; + + public static final String WORK_DISCONNECT_LOG = "work断开连接,主动取消该任务\n"; + + public static final String DEPENDENT_READY_LOG = "依赖任务全部到位,开始执行\n"; + + public static final String SUPER_RECOVER_LOG = "超级恢复依赖触发\n"; + + public static final String LOST_JOB_LOG = "漏跑任务,自动恢复执行\n"; + + public static final String CHECK_QUEUE_LOG = "已经在调度队列中,无法再次运行,请稍后再试\n"; + + public static final String CANCEL_JOB_LOG = "已经在队列中,无法再次运行\n"; + + public static final String FAIL_JOB_RETRY = "失败任务重试,开始执行\n"; + + public static final String RETRY_JOB = "重试任务\n"; + +} diff --git a/hera-common/src/main/java/com/dfire/common/constants/RunningJobKeyConstant.java b/hera-common/src/main/java/com/dfire/common/constants/RunningJobKeyConstant.java new file mode 100755 index 00000000..2fc0f0b7 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/constants/RunningJobKeyConstant.java @@ -0,0 +1,48 @@ +package com.dfire.common.constants; + +/** + * @author: 凌霄 + * @time: Created in 14:31 2018/3/23 + * @desc Job运行所需要的配置信息 + */ +public class RunningJobKeyConstant { + + /** + * 需要执行的shell文件路径 + */ + public static final String RUN_SHELL_PATH = "shell.localfile"; + + /** + * 需要执行的hive文件路径 + */ + public static final String RUN_HIVE_PATH = "hive.localfile"; + + /** + * 需要执行的spark文件路径 + */ + public static final String RUN_SPARK_PATH = "spark.localfile"; + + /** + * 需要执行的spark2文件路径 + */ + public static final String RUN_SPARK2_PATH = "spark2.localfile"; + + /** + * 任务类型 + */ + public static final String JOB_RUN_TYPE = "job.jobtype"; + + public static final String JOB_SCRIPT = "job.script"; + + /** + * 依赖周期key + */ + public static final String DEPENDENCY_CYCLE = "hera.dependency.cycle"; + + /** + * 依赖周期value + */ + public static final String DEPENDENCY_CYCLE_VALUE = "sameday"; + + +} diff --git a/hera-common/src/main/java/com/dfire/common/constants/TimeFormatConstant.java b/hera-common/src/main/java/com/dfire/common/constants/TimeFormatConstant.java new file mode 100755 index 00000000..42acebda --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/constants/TimeFormatConstant.java @@ -0,0 +1,12 @@ +package com.dfire.common.constants; + +/** + * 时间格式化 + * @author 火锅 + * @time 2018/10/25 + */ +public class TimeFormatConstant { + public static final String YYYYMMDD = "yyyyMMdd"; + public static final String YYYY_MM_DD = "yyyy-MM-dd"; + public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/EmrConf.java b/hera-common/src/main/java/com/dfire/common/entity/EmrConf.java new file mode 100755 index 00000000..3d1a19c4 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/EmrConf.java @@ -0,0 +1,50 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * desc: + * emr 信息 + * + * @author scx + * @create 2019/03/18 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EmrConf { + private String loginURl; + + private String clusterName; + + private String masterInstanceType; + + private int numCoreNodes; + + private int numTaskNodes; + + private String coreInstanceType; + + private String taskInstanceType; + + private String emrManagedMasterSecurityGroup; + + private String emrManagedSlaveSecurityGroup; + + private String additionalMasterSecurityGroups; + + private String additionalSlaveSecurityGroups; + + private String serviceAccessSecurityGroup; + + private String ec2SubnetId; + + private String keyPairName; + +} + diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraAction.java b/hera-common/src/main/java/com/dfire/common/entity/HeraAction.java new file mode 100755 index 00000000..39547415 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraAction.java @@ -0,0 +1,91 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 17:31 2018/1/11 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraAction { + + private Long id; + + private Integer jobId; + + private Integer auto = 0; + + private String configs; + + private String cronExpression; + + private String cycle; + + private String dependencies; + + private String jobDependencies; + + private String description; + + private Date gmtCreate; + + private Date gmtModified; + + + private Integer groupId; + + private Long historyId; + + private String host; + + private Date lastEndTime; + + private String lastResult; + + private String name; + + private Integer offset; + + private String owner; + + private String postProcessors; + + private String preProcessors; + + private String readyDependency; + + private String resources; + + private String runType; + + private Integer scheduleType; + + private String script; + + private Date startTime; + + private Long startTimestamp; + + private Date statisticStartTime; + + private Date statisticEndTime; + + private String status; + + private String timezone; + + private int hostGroupId; + + private String batchId; + + + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraAdvice.java b/hera-common/src/main/java/com/dfire/common/entity/HeraAdvice.java new file mode 100755 index 00000000..2d741a5a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraAdvice.java @@ -0,0 +1,24 @@ +package com.dfire.common.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author xiaosuda + * @date 2018/12/5 + */ +@Data +@ApiModel("建议/留言对象") +public class HeraAdvice { + @ApiModelProperty("id") + private Integer id; + @ApiModelProperty("消息内容") + private String msg; + @ApiModelProperty("地址") + private String address; + @ApiModelProperty("颜色") + private String color; + @ApiModelProperty("创建时间") + private String createTime; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraArea.java b/hera-common/src/main/java/com/dfire/common/entity/HeraArea.java new file mode 100755 index 00000000..22f814b6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraArea.java @@ -0,0 +1,24 @@ +package com.dfire.common.entity; + +import lombok.Data; + +import java.util.Date; + +/** + * @author xiaosuda + * @date 2018/12/14 + */ +@Data +public class HeraArea { + + private Integer id; + + private String timezone; + + private String name; + + private Date gmtCreate; + + private Date gmtModified; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraDebugHistory.java b/hera-common/src/main/java/com/dfire/common/entity/HeraDebugHistory.java new file mode 100755 index 00000000..ec2960e3 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraDebugHistory.java @@ -0,0 +1,48 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 14:29 2018/3/22 + * @desc + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class HeraDebugHistory { + + private Long id; + + private Integer fileId; + + private Date startTime; + + private Date endTime; + + private String executeHost; + + private String status; + + private String owner; + + private Date gmtCreate ; + + private Date gmtModified; + + private String script; + + private String runType; + + private String log; + + private int hostGroupId; + + private Integer jobId; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraEmrHost.java b/hera-common/src/main/java/com/dfire/common/entity/HeraEmrHost.java new file mode 100755 index 00000000..e69de29b diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraFile.java b/hera-common/src/main/java/com/dfire/common/entity/HeraFile.java new file mode 100755 index 00000000..8f4cdf57 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraFile.java @@ -0,0 +1,55 @@ +package com.dfire.common.entity; + +import com.dfire.common.config.SkipColumn; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 17:32 2018/1/11 + * @desc 开发中心脚本记录 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "hera开发中心脚本ø对象") +public class HeraFile { + @ApiModelProperty(value = "ID") + private Integer id; + @ApiModelProperty(value = "脚本名称") + private String name; + @ApiModelProperty(value = "所有人") + private String owner; + @ApiModelProperty(value = "父目录") + private Integer parent; + + /** + * 脚本内容 + */ + @ApiModelProperty(value = "脚本内容") + private String content; + /** + * 1 文件夹 2 文件 + */ + @ApiModelProperty(value = "类型:1 文件夹 2 文件") + private Integer type; + @SkipColumn + @ApiModelProperty(value = "创建时间") + private Date gmtCreate; + @SkipColumn + @ApiModelProperty(value = "更新时间") + private Date gmtModified; + + @ApiModelProperty(value = "执行机器组id") + private int hostGroupId; + @ApiModelProperty(value = "关联调度任务id") + private Integer jobId; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraFollow.java b/hera-common/src/main/java/com/dfire/common/entity/HeraFollow.java new file mode 100755 index 00000000..16f04206 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraFollow.java @@ -0,0 +1,41 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: 凌霄 + * @time: Created in 17:32 2018/1/11 + * @desc + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraFollow { + + public static final Integer GroupType=1; + public static final Integer JobType=2; + public static final Integer isFirst=1; + public static final Integer notFirst=0; + private Long id; + /** + * 关注的类型 + * 1:group 2:Job + */ + private Integer type; + private String uid; + /** + * 关注的目标id + * 如果关注group 则这里是group id + * 如果关注的是Job 则这里是Job id + */ + private String targetId; + /** + * false表示不是重要联系人,true表示是重要联系人 + */ + private boolean important; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraGroup.java b/hera-common/src/main/java/com/dfire/common/entity/HeraGroup.java new file mode 100755 index 00000000..69dc39f6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraGroup.java @@ -0,0 +1,55 @@ +package com.dfire.common.entity; + +import com.dfire.common.config.SkipColumn; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + + +/** + * @author: 凌霄 + * @time: Created in 下午4:46 2018/4/17 + * @desc + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "hera任务组对象") +public class HeraGroup { + + @ApiModelProperty(value = "组ID") + private Integer id; + @ApiModelProperty(value = "json格式的配置") + + private String configs; + @ApiModelProperty(value = "描述") + + private String description; + @ApiModelProperty(value = "0大目录,1小目录") + private Integer directory; + + @SkipColumn + @ApiModelProperty(value = "创建时间") + private Date gmtCreate; + + @SkipColumn + private Date gmtModified; + + + private String name; + @ApiModelProperty(value = "所有人") + private String owner; + @ApiModelProperty(value = "父目录id") + private Integer parent; + @ApiModelProperty(value = "目前无用") + private String resources; + @ApiModelProperty(value = "0删除,1存在") + private Integer existed; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraHostGroup.java b/hera-common/src/main/java/com/dfire/common/entity/HeraHostGroup.java new file mode 100755 index 00000000..d508ef1d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraHostGroup.java @@ -0,0 +1,33 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 17:32 2018/1/11 + * @desc + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraHostGroup { + + private Integer id; + + private String name; + + private Integer effective; + + private String description; + + private Date gmtCreate; + + private Date gmtModified; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraHostRelation.java b/hera-common/src/main/java/com/dfire/common/entity/HeraHostRelation.java new file mode 100755 index 00000000..a9ddb39c --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraHostRelation.java @@ -0,0 +1,28 @@ +package com.dfire.common.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: 凌霄 + * @time: Created in 17:33 2018/1/11 + * @desc + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel("机器组管理对象") +public class HeraHostRelation { + + @ApiModelProperty("id") + private Integer id; + @ApiModelProperty("ip") + private String host; + @ApiModelProperty("机器组id") + private Integer hostGroupId; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraJob.java b/hera-common/src/main/java/com/dfire/common/entity/HeraJob.java new file mode 100755 index 00000000..d9a7abbd --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraJob.java @@ -0,0 +1,124 @@ +package com.dfire.common.entity; + +import com.dfire.common.config.SkipColumn; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.Objects; + +/** + * @author: 凌霄 + * @time: Created in 13:59 2017/12/30 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "hera任务对象") +public class HeraJob { + @ApiModelProperty(value = "组ID") + private int id; + @ApiModelProperty(value = "是否开启,1:开启,0:关闭") + private Integer auto; + @ApiModelProperty(value = "任务配置参数,json格式") + private String configs; + @ApiModelProperty(value = "定时表达式") + private String cronExpression; + @ApiModelProperty(value = "周期任务,目前只有一个:SELF_LAST") + private String cycle; + @ApiModelProperty(value = "依赖任务id,多个,分割") + private String dependencies; + @ApiModelProperty(value = "任务描述") + private String description; + @ApiModelProperty(value = "创建时间") + @SkipColumn + private Date gmtCreate; + @ApiModelProperty(value = "更改时间") + @SkipColumn + private Date gmtModified; + + @ApiModelProperty(value = "组id") + private Integer groupId; + @ApiModelProperty(value = "废弃") + private Long historyId; + @ApiModelProperty(value = "废弃") + private String host; + @ApiModelProperty(value = "废弃") + private Date lastEndTime; + @ApiModelProperty(value = "废弃") + private String lastResult; + @ApiModelProperty(value = "任务名称") + private String name; + @ApiModelProperty(value = "告警级别,0:邮件,1:微信,2电话") + private Integer offset; + @ApiModelProperty(value = "任务管理者所在组") + private String owner; + @ApiModelProperty(value = "废弃") + private String postProcessors; + @ApiModelProperty(value = "废弃") + private String preProcessors; + @ApiModelProperty(value = "废弃") + private String readyDependency; + @ApiModelProperty(value = "废弃") + private String resources; + @ApiModelProperty(value = "执行类型,shell,spark,hive") + private String runType; + @ApiModelProperty(value = "调度类型,0:自动调度,1:依赖调度") + private Integer scheduleType; + @ApiModelProperty(value = "脚本内容") + private String script; + @ApiModelProperty(value = "废弃") + private Date startTime; + @ApiModelProperty(value = "废弃") + private Long startTimestamp; + @ApiModelProperty(value = "废弃") + private Date statisticEndTime; + @ApiModelProperty(value = "废弃") + private Date statisticStartTime; + @ApiModelProperty(value = "废弃") + private String status; + @ApiModelProperty(value = "废弃") + private String timezone; + @ApiModelProperty(value = "执行的机器组id") + private int hostGroupId; + @ApiModelProperty(value = "执行的区域集合,多个,分割") + private String areaId; + @ApiModelProperty(value = "任务的最大执行分钟数") + private int mustEndMinute; + @ApiModelProperty(value = "应该完成时间点,从0点开始按照分钟计时,比如要在1:20分钟完成任务,该值为80") + private int estimatedEndHour; + @ApiModelProperty(value = "是否允许重复执行") + private short repeatRun; + @ApiModelProperty(value = "0已删除,1存在") + private Integer isValid; + @ApiModelProperty(value = "调度周期") + private String cronPeriod; + @ApiModelProperty(value = "基准时间") + private int cronInterval; + @ApiModelProperty(value = "业务标签") + private String bizLabel; + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + HeraJob job = (HeraJob) o; + return id == job.getId(); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraJobHistory.java b/hera-common/src/main/java/com/dfire/common/entity/HeraJobHistory.java new file mode 100755 index 00000000..053ea625 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraJobHistory.java @@ -0,0 +1,62 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 17:31 2018/1/11 + * @desc + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraJobHistory { + + private Long id; + + private Long actionId; + + private Integer jobId; + + private Date startTime; + + private Date endTime; + + private String executeHost; + + private String operator; + + private String status; + + private Integer triggerType; + + private String illustrate; + + private Date statisticEndTime; + + private String log ; + + private String timezone; + + private String cycle; + + private int hostGroupId; + + private String batchId; + + private String bizLabel; + + private Date gmtCreate; + + String properties ; + + + + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraJobMonitor.java b/hera-common/src/main/java/com/dfire/common/entity/HeraJobMonitor.java new file mode 100755 index 00000000..c59bc21d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraJobMonitor.java @@ -0,0 +1,21 @@ +package com.dfire.common.entity; + +import lombok.Data; + +/** + * + * @author xiaosuda + * @date 2018/8/1 + */ +@Data +public class HeraJobMonitor { + + /** + * 任务Id + */ + private Integer jobId; + /** + * 监控人ID ,分割 + */ + private String userIds; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraLock.java b/hera-common/src/main/java/com/dfire/common/entity/HeraLock.java new file mode 100755 index 00000000..4d13f19a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraLock.java @@ -0,0 +1,28 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 20:43 2018/1/10 + * @desc hera的分布式锁基于数据库实现 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraLock { + + private Integer id; + private String host; + private Date serverUpdate; + private Date gmtCreate ; + private Date gmtModified; + private String subgroup; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraPermission.java b/hera-common/src/main/java/com/dfire/common/entity/HeraPermission.java new file mode 100755 index 00000000..76ad6b06 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraPermission.java @@ -0,0 +1,40 @@ +package com.dfire.common.entity; + +import com.dfire.common.config.SkipColumn; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 17:34 2018/1/11 + * @desc + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HeraPermission { + + + private int id; + + private String type; + + private Long targetId; + + private String uid; + + @SkipColumn + private Date gmtCreate; + + @SkipColumn + private Date gmtModified; + + private Integer isValid; + + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraProfile.java b/hera-common/src/main/java/com/dfire/common/entity/HeraProfile.java new file mode 100755 index 00000000..a2d49fe9 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraProfile.java @@ -0,0 +1,28 @@ +package com.dfire.common.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 17:35 2018/1/11 + * @desc + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraProfile { + + private String id; + private String uid; + private String hadoopConf; + private Date gmtCreate; + private Date gmtModified; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraRecord.java b/hera-common/src/main/java/com/dfire/common/entity/HeraRecord.java new file mode 100755 index 00000000..6cf91491 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraRecord.java @@ -0,0 +1,42 @@ +package com.dfire.common.entity; + +import com.dfire.common.config.SkipColumn; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * desc: hera操作日志 以及脚本的历史版本恢复 + * + * @author scx + * @create 2019/07/16 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HeraRecord { + + private int id; + + private int type; + + private String content; + + private String sso; + + private Integer gid; + + private String logType; + + private Integer logId; + + private Long gmtCreate; + + private Long gmtModified; + + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraRerun.java b/hera-common/src/main/java/com/dfire/common/entity/HeraRerun.java new file mode 100755 index 00000000..c8fe0a28 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraRerun.java @@ -0,0 +1,43 @@ +package com.dfire.common.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: 凌霄 + * @time: Created in 17:32 2018/1/11 + * @desc 开发中心脚本记录 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "任务重跑对象") + +public class HeraRerun { + @ApiModelProperty(value = "id") + private Integer id; + @ApiModelProperty(value = "任务id") + private Integer jobId; + @ApiModelProperty(value = "是否结束") + private Integer isEnd; + @ApiModelProperty(value = "重跑名称") + private String name; + @ApiModelProperty(value = "任务开始日期") + private Long startMillis; + @ApiModelProperty(value = "任务结束日期") + private Long endMillis; + @ApiModelProperty(value = "创建时间戳") + private Long gmtCreate; + @ApiModelProperty(value = "创建人name") + private String ssoName; + @ApiModelProperty(value = "其它配置") + private String extra; + @ApiModelProperty(value = "当前执行的版本") + private Long actionNow; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraSso.java b/hera-common/src/main/java/com/dfire/common/entity/HeraSso.java new file mode 100755 index 00000000..2c8bfec8 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraSso.java @@ -0,0 +1,34 @@ +package com.dfire.common.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * desc: + * + * @author scx + * @create 2019/06/10 + */ +@Data +@ApiModel(value = "hera用户对象") +public class HeraSso { + @ApiModelProperty(value = "id") + private Integer id; + @ApiModelProperty(value = "用户名") + private String name; + @ApiModelProperty(value = "密码") + private String password; + @ApiModelProperty(value = "用户组id") + private Integer gid; + @ApiModelProperty(value = "电话") + private String phone; + @ApiModelProperty(value = "邮箱") + private String email; + @ApiModelProperty(value = "工号") + private String jobNumber; + @ApiModelProperty(value = "更改时间戳") + private Long gmtModified; + @ApiModelProperty(value = "0已删除,1存在") + private Integer isValid; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/HeraUser.java b/hera-common/src/main/java/com/dfire/common/entity/HeraUser.java new file mode 100755 index 00000000..0b17423b --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/HeraUser.java @@ -0,0 +1,49 @@ +package com.dfire.common.entity; + +import com.dfire.common.config.SkipColumn; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("用户组对象") +public class HeraUser { + @ApiModelProperty(value = "id") + private Integer id; + @ApiModelProperty(value = "邮箱") + private String email; + + @SkipColumn + @ApiModelProperty(value = "创建时间") + private Date gmtCreate; + @SkipColumn + @ApiModelProperty(value = "更新时间") + private Date gmtModified; + + @ApiModelProperty(value = "名称") + private String name; + @ApiModelProperty(value = "电话") + private String phone; + @ApiModelProperty(value = "废弃") + private String uid; + @ApiModelProperty(value = "废弃") + private String wangwang; + @ApiModelProperty(value = "密码md5") + private String password; + @ApiModelProperty(value = "废弃") + private int userType; + @ApiModelProperty(value = "是否有效,0:已删除,1有效") + private int isEffective; + @ApiModelProperty(value = "描述") + private String description; + + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/Judge.java b/hera-common/src/main/java/com/dfire/common/entity/Judge.java new file mode 100755 index 00000000..ccd107e7 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/Judge.java @@ -0,0 +1,19 @@ +package com.dfire.common.entity; + +import lombok.Data; + +import java.util.Date; + +/** + * @author xiaosuda + * @date 2018/12/3 + */ +@Data +public class Judge { + + public Date lastModified; + public Integer maxId; + public Integer count; + public Date stamp; +} + diff --git a/hera-common/src/main/java/com/dfire/common/entity/form/HeraRerunForm.java b/hera-common/src/main/java/com/dfire/common/entity/form/HeraRerunForm.java new file mode 100755 index 00000000..79f8599b --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/form/HeraRerunForm.java @@ -0,0 +1,20 @@ +package com.dfire.common.entity.form; + +import lombok.Data; + +/** + * desc: + * + * @author scx + * @create 2019/11/28 + */ +@Data +public class HeraRerunForm { + private Integer id; + private Integer jobId; + private String name; + private String startTime; + private String endTime; + private String threads; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/model/HeraGroupBean.java b/hera-common/src/main/java/com/dfire/common/entity/model/HeraGroupBean.java new file mode 100755 index 00000000..360418c0 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/model/HeraGroupBean.java @@ -0,0 +1,68 @@ +package com.dfire.common.entity.model; + +import com.dfire.common.entity.vo.HeraGroupVo; +import com.dfire.common.util.HierarchyProperties; +import lombok.Builder; +import lombok.Data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 上午10:37 2018/5/8 + * @desc + */ +@Builder +@Data +public class HeraGroupBean { + + private HeraGroupBean parentGroupBean; + private HeraGroupVo groupVo; + private Map jobBeanMap; + private List child; + + public HierarchyProperties getHierarchyProperties() { + if (parentGroupBean != null) { + return new HierarchyProperties(parentGroupBean.getHierarchyProperties(), groupVo.getConfigs()); + } + return new HierarchyProperties(groupVo.getConfigs()); + } + + public Map getProperties() { + return groupVo.getConfigs(); + } + + public List> getHierarchyResources() { + List> local = new ArrayList<>(); + if (groupVo.getResources() != null && groupVo.getResources().size() > 0) { + local = groupVo.getResources(); + } + if (parentGroupBean != null) { + local.addAll(parentGroupBean.getHierarchyResources()); + } + return local; + } + + public Map getAllSubGroupBeans() { + Map map = new HashMap<>(1024); + for (HeraGroupBean gb : getChild()) { + for (HeraGroupBean child : getChild()) { + map.put(String.valueOf(child.getGroupVo().getId()), child); + } + map.putAll(gb.getAllSubGroupBeans()); + } + return map; + } + + public Map getAllSubJobBeans() { + Map map = new HashMap<>(1024); + for (HeraGroupBean groupBean : getChild()) { + map.putAll(groupBean.getAllSubJobBeans()); + } + map.putAll(jobBeanMap); + return map; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/model/HeraJobBean.java b/hera-common/src/main/java/com/dfire/common/entity/model/HeraJobBean.java new file mode 100755 index 00000000..049c2e02 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/model/HeraJobBean.java @@ -0,0 +1,64 @@ +package com.dfire.common.entity.model; + +import com.dfire.common.entity.HeraJob; +import com.dfire.common.util.HierarchyProperties; +import com.dfire.common.util.StringUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author: 凌霄 + * @time: Created in 上午10:35 2018/5/8 + * @desc + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class HeraJobBean { + + private HeraJob heraJob; + + private HeraGroupBean groupBean; + + private Set upStream; + + private Set downStream; + + public HierarchyProperties getHierarchyProperties() { + if (groupBean != null) { + return new HierarchyProperties(groupBean.getHierarchyProperties(), StringUtil.convertStringToMap(heraJob.getConfigs())); + } + return new HierarchyProperties(StringUtil.convertStringToMap(heraJob.getConfigs())); + } + + public List> getHierarchyResources() { + List existList = new ArrayList<>(); + List> local = new ArrayList<>(StringUtil.convertResources(heraJob.getResources())); + + + for (Map map : local) { + if (map.get("name") != null && !existList.contains(map.get("name"))) { + existList.add(map.get("name")); + } + } + if (groupBean != null) { + List> parent = groupBean.getHierarchyResources(); + for (Map map : parent) { + if (map.get("name") != null && !existList.contains(map.get("name"))) { + existList.add(map.get("name")); + local.add(map); + } + } + } + return local; + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/model/JobGroupCache.java b/hera-common/src/main/java/com/dfire/common/entity/model/JobGroupCache.java new file mode 100755 index 00000000..cb3c2e85 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/model/JobGroupCache.java @@ -0,0 +1,44 @@ +package com.dfire.common.entity.model; + +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.kv.Tuple; +import com.dfire.common.service.HeraJobActionService; +import com.dfire.common.vo.JobStatus; +import lombok.Builder; + +/** + * @author: 凌霄 + * @time: Created in 下午10:37 2018/5/6 + * @desc 版本运行状态缓存 + */ +@Builder +public class JobGroupCache { + + + private final Long actionId; + private HeraActionVo heraActionVo; + + private HeraJobActionService heraJobActionService; + + public HeraActionVo getHeraActionVo() { + if(heraActionVo == null) { + Tuple jobStatusTuple = heraJobActionService.findHeraActionVo(actionId); + if(jobStatusTuple != null) { + heraActionVo = jobStatusTuple.getSource(); + } else { + heraActionVo = null; + + } + } + return heraActionVo; + } + + public void refresh() { + Tuple jobStatusTuple = heraJobActionService.findHeraActionVo(actionId); + if(jobStatusTuple != null) { + heraActionVo = jobStatusTuple.getSource(); + } else { + heraActionVo = null; + } + } +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/model/JsonResponse.java b/hera-common/src/main/java/com/dfire/common/entity/model/JsonResponse.java new file mode 100755 index 00000000..ca4afc82 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/model/JsonResponse.java @@ -0,0 +1,51 @@ +package com.dfire.common.entity.model; + +import com.alibaba.fastjson.JSONObject; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 下午10:37 2018/5/6 + * @desc http请求返回结果 + */ + +@Data +@Builder +@NoArgsConstructor +public class JsonResponse implements Serializable { + + private String message; + private boolean success; + private Object data; + + public JsonResponse(boolean success, String message) { + this.message = message; + this.success = success; + } + + public JsonResponse(boolean success, Object data) { + this.data = data; + this.success = success; + } + + public JsonResponse(String message, boolean success, Object data) { + this.message = message; + this.success = success; + this.data = data; + } + public JsonResponse(boolean success, String message, Object data) { + this.message = message; + this.success = success; + this.data = data; + } + + public Map toMap() { + return (Map) JSONObject.toJSON(this); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/model/TablePageForm.java b/hera-common/src/main/java/com/dfire/common/entity/model/TablePageForm.java new file mode 100755 index 00000000..c7d20e63 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/model/TablePageForm.java @@ -0,0 +1,28 @@ +package com.dfire.common.entity.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * layui table分页工具 + * + * @author xiaosuda + * @date 2018/12/8 + */ +@Data +@ApiModel("layui分页对象") +public class TablePageForm { + + @ApiModelProperty("当前页码") + private Integer page; + @ApiModelProperty("页面大小") + private Integer limit; + @ApiModelProperty("总数据量") + private Integer count; + + + public Integer getStartPos() { + return (page - 1) * limit; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/model/TableResponse.java b/hera-common/src/main/java/com/dfire/common/entity/model/TableResponse.java new file mode 100755 index 00000000..fbd93591 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/model/TableResponse.java @@ -0,0 +1,43 @@ +package com.dfire.common.entity.model; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +import java.util.Map; + +/** + * layui table返回专用 + * + * @author xiaosuda + * @date 2018/12/5 + */ +@Data +public class TableResponse { + + private String msg; + private Integer count; + private Integer code; + private Object data; + + + public TableResponse(String msg, Integer code, Object data) { + this.msg = msg; + this.code = code; + this.data = data; + } + + public TableResponse(Integer code, String msg) { + this.msg = msg; + this.code = code; + } + + public TableResponse(Integer count, Integer code, Object data) { + this.count = count; + this.code = code; + this.data = data; + } + + public Map toMap() { + return (Map) JSONObject.toJSON(this); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraActionVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraActionVo.java new file mode 100755 index 00000000..8dcc8204 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraActionVo.java @@ -0,0 +1,103 @@ +package com.dfire.common.entity.vo; + +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.enums.JobScheduleTypeEnum; +import com.dfire.common.processor.Processor; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 上午11:00 2018/5/16 + * @desc + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class HeraActionVo { + + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + private Integer jobId; + + private Boolean auto; + + private Map configs; + + private String cronExpression; + + private String cycle; + + private List dependencies; + + private List jobDependencies; + + private String description; + + private Date gmtCreate; + + private Date gmtModified; + + private Integer groupId; + + private String historyId; + + private String host; + + private Date lastEndTime; + + private String lastResult; + + private String name; + + private Integer offset; + + private String owner; + + private List postProcessors; + + private List preProcessors; + + private List readyDependency; + + private List> resources; + + private JobRunTypeEnum runType; + + private JobScheduleTypeEnum scheduleType; + + private String script; + + private Date startTime; + + private Long startTimestamp; + + private Date statisticStartTime; + + private Date statisticEndTime; + + private String status; + + private String timezone; + + private int hostGroupId; + + //private String cronPeriod; + + //private int cronInterval; + + private String batchId; + + //private String bizLabel; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraDebugHistoryVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraDebugHistoryVo.java new file mode 100755 index 00000000..ce9c31a4 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraDebugHistoryVo.java @@ -0,0 +1,55 @@ +package com.dfire.common.entity.vo; + +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.vo.LogContent; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + + +/** + * @author: 凌霄 + * @time: Created in 下午12:05 2018/5/16 + * @desc + */ + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class HeraDebugHistoryVo { + + private Long id; + + private Integer fileId; + + private String startTime; + + private String endTime; + + private String executeHost; + + private StatusEnum status; + + private String owner; + + private String gmtCreate; + + private String gmtModified; + + private String script; + + private JobRunTypeEnum runType; + + private LogContent log ; + + private String host; + + private int hostGroupId; + + private Integer jobId; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraFileTreeNodeVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraFileTreeNodeVo.java new file mode 100755 index 00000000..53c9f86d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraFileTreeNodeVo.java @@ -0,0 +1,29 @@ +package com.dfire.common.entity.vo; + +import lombok.Builder; +import lombok.Data; + + +/** + * @author: 凌霄 + * @time: Created in 下午4:49 2018/4/11 + * @desc + */ +@Data +@Builder +public class HeraFileTreeNodeVo { + + Integer id; + Integer parent; + String name; + boolean isParent; + + public boolean getIsParent() { + return isParent; + } + + public void setIsParent(boolean isParent) { + this.isParent = isParent; + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraFileVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraFileVo.java new file mode 100755 index 00000000..9e4bb80d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraFileVo.java @@ -0,0 +1,38 @@ +package com.dfire.common.entity.vo; + +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + + + +/** + * @author: 凌霄 + * @time: Created in 下午4:51 2018/4/17 + * @desc 日志 + */ +@Data +@Builder +public class HeraFileVo { + + private String id; + private String parent; + private Date createDate; + private Date modifiedDate; + private String name; + private boolean folder; + private String content; + private String owner; + private boolean admin; + private int hostGroupId; + + @Override + public String toString() { + return "HeraFileVo{" + + "id='" + id + '\'' + + ", parent='" + parent + '\'' + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraGroupVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraGroupVo.java new file mode 100755 index 00000000..479f9850 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraGroupVo.java @@ -0,0 +1,49 @@ +package com.dfire.common.entity.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 下午4:51 2018/4/17 + * @desc + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class HeraGroupVo { + + private Integer id; + + + private String description; + + private Integer directory; + + private Date gmtCreate; + + private Date gmtModified; + + private String name; + + private String owner; + + private Integer parent; + + private String uIdS; + + private boolean existed; + + private String selfConfigs; + private Map configs; + private List> resources; + + private Map inheritConfig; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraHostGroupVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraHostGroupVo.java new file mode 100755 index 00000000..f7c77be8 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraHostGroupVo.java @@ -0,0 +1,31 @@ +package com.dfire.common.entity.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 16:33 2018/1/12 + * @desc + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraHostGroupVo { + + private String id; + + private String name; + + private String description; + + private List hosts; + + private int nextPos; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobHistoryVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobHistoryVo.java new file mode 100755 index 00000000..943dcf94 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobHistoryVo.java @@ -0,0 +1,61 @@ +package com.dfire.common.entity.vo; + +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.vo.JobStatus; +import com.dfire.common.vo.LogContent; +import lombok.Builder; +import lombok.Data; + +import java.util.Date; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 上午7:21 2018/5/12 + * @desc + */ +@Builder +@Data +public class HeraJobHistoryVo { + + private Long id; + + private Long actionId; + + private Integer jobId; + + private Date startTime; + + private Date endTime; + + private String executeHost; + + private String operator; + + private StatusEnum statusEnum; + + private TriggerTypeEnum triggerType; + + private String illustrate; + + private Date statisticsEndTime; + + private LogContent log; + + private String timezone; + + private String cycle; + + private int hostGroupId; + + private Map properties; + + private String batchId; + private String bizLabel; + + + + + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobMonitorVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobMonitorVo.java new file mode 100755 index 00000000..68aa5095 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobMonitorVo.java @@ -0,0 +1,41 @@ +package com.dfire.common.entity.vo; + +import lombok.Data; + +import java.util.List; + +/** + * desc: + * + * @author scx + * @create 2019/06/14 + */ +@Data +public class HeraJobMonitorVo { + + /** + * 任务Id + */ + private Integer id; + + /** + * 任务名称 + */ + private String jobName; + + /** + * 任务描述 + */ + private String description; + + /** + * 监控人员 + */ + private String userIds; + + /** + * 监控人 + */ + private List monitors; + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobTreeNodeVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobTreeNodeVo.java new file mode 100755 index 00000000..779b20a3 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobTreeNodeVo.java @@ -0,0 +1,45 @@ +package com.dfire.common.entity.vo; + +import lombok.Builder; +import lombok.Data; + +import java.util.Objects; + +/** + * @author: 凌霄 + * @time: Created in 下午4:40 2018/5/19 + * @desc + */ +@Data +@Builder +public class HeraJobTreeNodeVo { + String id; + String parent; + String name; + Integer directory; + String jobName; + Integer jobId; + boolean isParent; + + public boolean getIsParent() { + return isParent; + } + + public void setIsParent(boolean isParent) { + this.isParent = isParent; + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + HeraJobTreeNodeVo that = (HeraJobTreeNodeVo) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobVo.java new file mode 100755 index 00000000..7bc198f5 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraJobVo.java @@ -0,0 +1,124 @@ +package com.dfire.common.entity.vo; + +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.processor.Processor; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.*; + +/** + * @author: 凌霄 + * @time: Created in 下午11:38 2018/4/23 + * @desc + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class HeraJobVo { + + private int id; + + private String auto; + + private Map configs; + + private String cronExpression; + + private String cycle; + + private String dependencies; + + private String description; + + private Date gmtCreate; + + private Date gmtModified; + + private Integer groupId; + + private String historyId; + + private String host; + + private Date lastEndTime; + + private String lastResult; + + private String name; + + private String alarmLevel; + + private Integer offset; + + private String owner; + + private List postProcessors; + + private List preProcessors; + + private String readyDependency; + + private List> resources; + + private JobRunTypeEnum runType; + + private Integer scheduleType; + + private String script; + + private Date startTime; + + private Long startTimestamp; + + private Date statisticEndTime; + + private Date statisticStartTime; + + private String status; + + private String timezone; + + private int hostGroupId; + + private String hostGroupName; + + private int mustEndMinute; + + private String rollBackTimes; + + private String rollBackWaitTime; + + private String runPriorityLevel; + + private String selfConfigs; + + private String resource; + + private Map inheritConfig; + + private boolean focus; + + private String uIdS; + + private String areaId; + + private String focusUser; + + private short repeatRun; + + private String cronPeriod; + + private int cronInterval; + + private String bizLabel; + + private Integer isValid; + + private String estimatedEndHour; + + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraProfileVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraProfileVo.java new file mode 100755 index 00000000..6c5e4bc0 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraProfileVo.java @@ -0,0 +1,23 @@ +package com.dfire.common.entity.vo; + +import lombok.Builder; +import lombok.Data; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 上午10:47 2018/5/2 + * @desc + */ +@Builder +@Data +public class HeraProfileVo { + private String id; + private String uid; + private Map hadoopConf = new HashMap(); + private Date gmtCreate = new Date(); + private Date gmtModified = new Date(); +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraRecordVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraRecordVo.java new file mode 100755 index 00000000..46ae73e6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraRecordVo.java @@ -0,0 +1,30 @@ +package com.dfire.common.entity.vo; + +import lombok.Data; + +/** + * desc: + * + * @author scx + * @create 2019/07/17 + */ +@Data +public class HeraRecordVo { + + + private String type; + + private String content; + + private String sso; + + private String gName; + + private String logType; + + private Integer logId; + + private String createTime; + + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraRerunVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraRerunVo.java new file mode 100755 index 00000000..259955f1 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraRerunVo.java @@ -0,0 +1,43 @@ +package com.dfire.common.entity.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * desc: + * + * @author scx + * @create 2019/11/25 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeraRerunVo { + + private Integer id; + + private Integer jobId; + + private Integer isEnd; + + private String name; + + private String startTime; + + private String endTime; + + private String gmtCreate; + + private String ssoName; + + private Map extra; + + private Long actionNow; + + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraSsoVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraSsoVo.java new file mode 100755 index 00000000..1eb1eea2 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraSsoVo.java @@ -0,0 +1,27 @@ +package com.dfire.common.entity.vo; + +import lombok.Data; + +/** + * @author xiaosuda + * @date 2018/12/28 + */ +@Data +public class HeraSsoVo { + + private Integer id; + + private String name; + + private String gName; + + private String phone; + + private String email; + + private String jobNumber; + + private Long gmtModified; + + private Integer isValid; +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HeraUserVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraUserVo.java new file mode 100755 index 00000000..66535b37 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HeraUserVo.java @@ -0,0 +1,36 @@ +package com.dfire.common.entity.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author xiaosuda + * @date 2018/12/28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HeraUserVo { + + private int id; + + private String email; + + private String createTime; + + private String opTime; + + private String name; + + private String phone; + + private String wangwang; + + private int isEffective; + + private String description; + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/HostGroupVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/HostGroupVo.java new file mode 100755 index 00000000..ee3d5428 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/HostGroupVo.java @@ -0,0 +1,20 @@ +package com.dfire.common.entity.vo; + +import lombok.Builder; +import lombok.Data; + +/** + * + * @author xiaosuda + * @date 2018/4/20 + */ +@Data +public class HostGroupVo { + + private Integer id; + private String name; + private boolean effective; + private String gmtCreate; + private String gmtModified; + private String description; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/JobLogHistoryVo.java b/hera-common/src/main/java/com/dfire/common/entity/vo/JobLogHistoryVo.java new file mode 100755 index 00000000..4e54cd60 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/JobLogHistoryVo.java @@ -0,0 +1,48 @@ +package com.dfire.common.entity.vo; + +import lombok.Data; + +/** + * @author xiaosuda + * @date 2019/1/24 + */ +@Data +public class JobLogHistoryVo { + + private Long id; + + private String actionId; + + private String endTime; + + private String startTime; + + private int jobId; + + private String status; + + private String executeHost; + + private String operator; + + private String illustrate; + + private String triggerType; + + private String batchId; + + private String bizLabel; + + private String jobName; + + private String description; + + private String groupId; + + private String groupName; + + private String dur240px; + + private String begintime240px; + +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/PageHelper.java b/hera-common/src/main/java/com/dfire/common/entity/vo/PageHelper.java new file mode 100755 index 00000000..a296d0ee --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/PageHelper.java @@ -0,0 +1,15 @@ +package com.dfire.common.entity.vo; + +import lombok.Data; + +/** + * + * @author xiaosuda + * @date 2018/7/30 + */ +@Data +public class PageHelper { + private Integer offset; + private Integer pageSize; + private Integer jobId; +} diff --git a/hera-common/src/main/java/com/dfire/common/entity/vo/PageHelperTimeRange.java b/hera-common/src/main/java/com/dfire/common/entity/vo/PageHelperTimeRange.java new file mode 100755 index 00000000..8b0cef88 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/entity/vo/PageHelperTimeRange.java @@ -0,0 +1,18 @@ +package com.dfire.common.entity.vo; + +import lombok.Data; + +/** + * + * @author jet + * @date 2019-12-20 + */ +@Data +public class PageHelperTimeRange { + private Integer offset; + private Integer pageSize; + private Integer jobId; + private String jobType; + private String beginDt; + private String endDt; +} diff --git a/hera-common/src/main/java/com/dfire/common/enums/AlarmLevel.java b/hera-common/src/main/java/com/dfire/common/enums/AlarmLevel.java new file mode 100755 index 00000000..831d4cff --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/AlarmLevel.java @@ -0,0 +1,55 @@ +package com.dfire.common.enums; + +import java.util.Arrays; +import java.util.Optional; + +/** + * desc: + * + * @author scx + * @create 2019/06/13 + */ +public enum AlarmLevel { + /** + * 发邮件 + */ + EMAIL(0, "邮件"), + + /** + * 企业微信告警 + */ + WE_CHAT(1, "微信"), + + /** + * 打电话 + */ + PHONE(2, "电话"); + + private Integer level; + private String name; + + AlarmLevel(Integer level, String name) { + this.level = level; + this.name = name; + } + + public static boolean lessThan(Integer level, AlarmLevel alarmLevel) { + return Optional.ofNullable(level).orElse(AlarmLevel.PHONE.level) < alarmLevel.level; + } + + + public static AlarmLevel parseByLevel(Integer level) { + return Arrays.stream(AlarmLevel.values()) + .filter(alarmLevel -> alarmLevel.level.equals(level)) + .findAny() + .orElse(AlarmLevel.PHONE); + } + + public static String getName(Integer level) { + return parseByLevel(level).name; + } + + public static String getName(AlarmLevel level) { + return level.name; + } +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/enums/CycleEnum.java b/hera-common/src/main/java/com/dfire/common/enums/CycleEnum.java new file mode 100755 index 00000000..f33b28fd --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/CycleEnum.java @@ -0,0 +1,62 @@ +package com.dfire.common.enums; + +/** + * desc: + * + * @author scx + * @create 2020/04/14 + */ +public enum CycleEnum { + /** + * 自依赖,依赖于当前任务的上一周期,如果是今天第一个,则依赖昨天最后一个周期 + */ + SELF_LAST("自依赖,依赖于当前任务的上一周期"), + + + /** + * 等待上游任务的最后一个周期 + */ + UP_LAST("依赖上游任务的最后一个周期"), + + /** + * 等待下游任务的最后一个周期 + */ + DOWN_LAST("依赖下游任务的最后一个周期"), + + /** + * 无 + */ + NONE("无"); + + + + String desc; + + CycleEnum(String desc) { + this.desc = desc; + } + + + public String getDesc() { + return desc; + } + + public static CycleEnum parse(String desc) { + + CycleEnum[] values = CycleEnum.values(); + + for (CycleEnum value : values) { + if(value.desc.equals(desc) || value.name().equals(desc)) { + return value; + } + } + return CycleEnum.NONE; + + } + + + public static boolean isSelfDep(String name) { + return CycleEnum.SELF_LAST.name().equals(name); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/enums/JobRunTypeEnum.java b/hera-common/src/main/java/com/dfire/common/enums/JobRunTypeEnum.java new file mode 100755 index 00000000..69a24071 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/JobRunTypeEnum.java @@ -0,0 +1,50 @@ +package com.dfire.common.enums; + +/** + * @author: 凌霄 + * @time: Created in 14:31 2018/3/22 + * @desc + */ +public enum JobRunTypeEnum { + + /** + * shell任务 + */ + Shell("shell"), + /** + * hive任务 + */ + Hive("hive"), + /** + * spark任务 + */ + Spark("spark"), + /** + * spark2任务 + */ + Spark2("spark2"); + + private final String id; + + JobRunTypeEnum(String s) { + this.id = s; + } + + @Override + public String toString() { + return id; + } + + public static JobRunTypeEnum parser(String v) { + for (JobRunTypeEnum type : JobRunTypeEnum.values()) { + if (type.toString().equals(v)) { + return type; + } + } + return null; + } + + public static void main(String[] args) { + System.out.println(JobRunTypeEnum.Shell.toString()); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/enums/JobScheduleTypeEnum.java b/hera-common/src/main/java/com/dfire/common/enums/JobScheduleTypeEnum.java new file mode 100755 index 00000000..683b7df8 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/JobScheduleTypeEnum.java @@ -0,0 +1,43 @@ +package com.dfire.common.enums; + +/** + * @author: 凌霄 + * @time: Created in 下午11:43 2018/4/23 + * @desc + */ +public enum JobScheduleTypeEnum { + /** + * 定时任务 + */ + Independent(0), + + /** + * 依赖任务 + */ + Dependent(1); + private Integer type; + + JobScheduleTypeEnum(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return type.toString(); + } + + + public static JobScheduleTypeEnum parser(Integer v) { + for (JobScheduleTypeEnum t : JobScheduleTypeEnum.values()) { + if (t.getType().equals(v)) { + return t; + } + } + return null; + } + + public Integer getType() { + return type; + } +} + diff --git a/hera-common/src/main/java/com/dfire/common/enums/JobStatus.java b/hera-common/src/main/java/com/dfire/common/enums/JobStatus.java new file mode 100755 index 00000000..fad89dd1 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/JobStatus.java @@ -0,0 +1,24 @@ +package com.dfire.common.enums; + +/** + * desc: + * + * @author scx + * @create 2019/04/28 + */ +public enum JobStatus { + + /** + * 等待集群创建完成 + */ + waitCluster, + /** + * 任务运行中 + */ + running, + /** + * 任务执行完成 + */ + complete + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/enums/LogTypeEnum.java b/hera-common/src/main/java/com/dfire/common/enums/LogTypeEnum.java new file mode 100755 index 00000000..c1f7d3f0 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/LogTypeEnum.java @@ -0,0 +1,49 @@ +package com.dfire.common.enums; + +import java.util.Arrays; + +/** + * desc: + * + * @author scx + * @create 2019/07/17 + */ +public enum LogTypeEnum { + + + /** + * job类型的日志 + */ + JOB("job"), + /** + * group + */ + GROUP("group"), + /** + * debug类型的日志 + */ + DEBUG("debug"), + + UPLOAD("upload"), + /** + * 用户类型的日志 + */ + USER("user"); + + private String name; + + + LogTypeEnum(String name) { + this.name = name; + } + + + public static LogTypeEnum parseByName(String name) { + return Arrays.stream(LogTypeEnum.values()).filter(typeEnum -> typeEnum.name.equals(name)).findAny().orElse(null); + + } + + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/enums/OperatorSystemEnum.java b/hera-common/src/main/java/com/dfire/common/enums/OperatorSystemEnum.java new file mode 100755 index 00000000..315799d4 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/OperatorSystemEnum.java @@ -0,0 +1,34 @@ +package com.dfire.common.enums; + +/** + * + * @author xiaosuda + * @date 2018/11/22 + */ +public enum OperatorSystemEnum { + /** + * mac os 系统机器 + */ + MAC, + /** + * linux系统机器 + */ + LINUX, + /** + * windows系统机器 + */ + WIN; + + public static boolean isLinux(OperatorSystemEnum systemEnum) { + return systemEnum == LINUX; + } + + public static boolean isMac(OperatorSystemEnum systemEnum) { + return systemEnum == MAC; + } + + + public static boolean isWindows(OperatorSystemEnum systemEnum) { + return systemEnum == WIN; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/enums/RecordTypeEnum.java b/hera-common/src/main/java/com/dfire/common/enums/RecordTypeEnum.java new file mode 100755 index 00000000..afbd8294 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/RecordTypeEnum.java @@ -0,0 +1,86 @@ +package com.dfire.common.enums; + +import java.util.Arrays; + +/** + * desc: + * + * @author scx + * @create 2019/07/16 + */ +public enum RecordTypeEnum { + + /** + * 任务执行的操作 + */ + Execute("执行任务", 1), + + /** + * 任务添加的操作 + */ + Add("添加任务", 2), + /** + * 调度中心脚本修改的操作 + */ + SCRIPT("更新脚本内容", 3), + /** + * 开启关闭任务的操作 + */ + SWITCH("任务开启/关闭状态", 4), + + RUN_TYPE("执行类型", 5), + + + DEPEND("依赖关系", 6), + + CRON("定时表达式", 7), + + AREA("执行区域", 8), + + CONFIG("任务配置", 9), + + CANCEL("取消任务", 10), + + REMOTE("远程调用", 11), + + MOVE("移动任务/组", 12), + + DELETE("删除任务/组", 13), + + LOGIN("登录", 14), + + UPLOAD("上传", 15), + + /** + * 除之上的操作的所有操作 + */ + Other("其它操作", 0); + + + private String type; + + private Integer id; + + + RecordTypeEnum(String type, Integer id) { + this.type = type; + this.id = id; + } + + + public static RecordTypeEnum parseById(Integer id) { + return Arrays.stream(RecordTypeEnum.values()).filter(record -> record.id.equals(id)).findAny().orElse(null); + } + + public static RecordTypeEnum parseByName(String name) { + return Arrays.stream(RecordTypeEnum.values()).filter(record -> record.type.equals(name)).findAny().orElse(null); + } + + public Integer getId() { + return id; + } + + public String getType() { + return type; + } +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/enums/RunAuthType.java b/hera-common/src/main/java/com/dfire/common/enums/RunAuthType.java new file mode 100755 index 00000000..c64e88f0 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/RunAuthType.java @@ -0,0 +1,30 @@ +package com.dfire.common.enums; + +/** + * desc: + * + * @author scx + * @create 2019/06/20 + */ +public enum RunAuthType { + + /** + * 任务类型 + */ + JOB("job"), + /** + * 组类型 + */ + GROUP("group"); + + private String name; + + + RunAuthType(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/enums/StatusEnum.java b/hera-common/src/main/java/com/dfire/common/enums/StatusEnum.java new file mode 100755 index 00000000..7ac5af91 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/StatusEnum.java @@ -0,0 +1,47 @@ +package com.dfire.common.enums; + + +/** + * @author: 凌霄 + * @time: Created in 22:41 2018/1/12 + * @desc 任务状态 + */ +public enum StatusEnum { + + /** + * 等待状态 + */ + WAIT("wait"), + /** + * 运行状态 + */ + RUNNING("running"), + /** + * 成功状态 + */ + SUCCESS("success"), + /** + * 失败状态 + */ + FAILED("failed"); + + private String status; + + StatusEnum(String status) { + this.status = status; + } + + public static StatusEnum parse(String v) { + for (StatusEnum s : StatusEnum.values()) { + if (s.status.equalsIgnoreCase(v)) { + return s; + } + } + return null; + } + + @Override + public String toString() { + return status; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/enums/TriggerTypeEnum.java b/hera-common/src/main/java/com/dfire/common/enums/TriggerTypeEnum.java new file mode 100755 index 00000000..db94bb73 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/enums/TriggerTypeEnum.java @@ -0,0 +1,67 @@ +package com.dfire.common.enums; + +/** + * @author: 凌霄 + * @time: Created in 23:21 2018/1/12 + * @desc 任务触发类型 + */ +public enum TriggerTypeEnum { + + NONE(0, "无"), + /** + * 定时任务 + */ + SCHEDULE(1, "自动调度"), + /** + * 手动执行任务 + */ + MANUAL(2, "手动触发"), + /** + * 手动恢复任务 + */ + MANUAL_RECOVER(3, "手动恢复"), + /** + * 开发中心任务 + */ + DEBUG(4, "开发执行"), + /** + * 自动重跑 + */ + + AUTO_RERUN(5, "自动重跑"), + /** + * 超级恢复 + */ + SUPER_RECOVER(6, "超级恢复"); + + private Integer id; + + private String name; + + TriggerTypeEnum(Integer id, String name) { + this.id = id; + this.name = name; + } + + public static TriggerTypeEnum parser(Integer v) { + for (TriggerTypeEnum type : TriggerTypeEnum.values()) { + if (type.getId().equals(v)) { + return type; + } + } + return NONE; + } + + @Override + public String toString() { + return id.toString(); + } + + public String toName() { + return name; + } + + public Integer getId() { + return id; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/exception/HeraCaughtExceptionHandler.java b/hera-common/src/main/java/com/dfire/common/exception/HeraCaughtExceptionHandler.java new file mode 100755 index 00000000..cb1524d2 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/exception/HeraCaughtExceptionHandler.java @@ -0,0 +1,17 @@ +package com.dfire.common.exception; + +import com.dfire.logs.ErrorLog; + +/** + * @author: 凌霄 + * @time: Created in 下午3:23 2018/6/12 + * @desc + */ +public class HeraCaughtExceptionHandler implements Thread.UncaughtExceptionHandler { + + @Override + public void uncaughtException(Thread t, Throwable e) { + ErrorLog.error("Thread pool caught thread exception " + e); + throw new RuntimeException(e); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/exception/HeraException.java b/hera-common/src/main/java/com/dfire/common/exception/HeraException.java new file mode 100755 index 00000000..fc976bf8 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/exception/HeraException.java @@ -0,0 +1,25 @@ +package com.dfire.common.exception; + +/** + * @author: 凌霄 + * @time: Created in 下午3:18 2018/4/25 + * @desc + */ +public class HeraException extends Exception { + + public HeraException(){ + super(); + } + + public HeraException(String message){ + super(message); + } + + public HeraException(Throwable e){ + super(e); + } + + public HeraException(String msg,Throwable e){ + super(msg, e); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/exception/HostGroupNotExistsException.java b/hera-common/src/main/java/com/dfire/common/exception/HostGroupNotExistsException.java new file mode 100755 index 00000000..0b4f6647 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/exception/HostGroupNotExistsException.java @@ -0,0 +1,24 @@ +package com.dfire.common.exception; + + +/** + * @author scx + */ +public class HostGroupNotExistsException extends Exception { + + public HostGroupNotExistsException(){ + super(); + } + + public HostGroupNotExistsException(String message){ + super(message); + } + + public HostGroupNotExistsException(Throwable e){ + super(e); + } + + public HostGroupNotExistsException(String msg, Throwable e){ + super(msg, e); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/exception/NoPermissionException.java b/hera-common/src/main/java/com/dfire/common/exception/NoPermissionException.java new file mode 100755 index 00000000..f0ab3096 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/exception/NoPermissionException.java @@ -0,0 +1,26 @@ +package com.dfire.common.exception; + + +/** + * 权限异常 + * + * @author scx + */ +public class NoPermissionException extends RuntimeException { + + public NoPermissionException() { + super(); + } + + public NoPermissionException(String message) { + super(message); + } + + public NoPermissionException(Throwable e) { + super(e); + } + + public NoPermissionException(String msg, Throwable e) { + super(msg, e); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/exception/UnsupportedTypeException.java b/hera-common/src/main/java/com/dfire/common/exception/UnsupportedTypeException.java new file mode 100755 index 00000000..fe62113e --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/exception/UnsupportedTypeException.java @@ -0,0 +1,25 @@ +package com.dfire.common.exception; + + + +/** + * @author scx + */ +public class UnsupportedTypeException extends RuntimeException { + + public UnsupportedTypeException(){ + super(); + } + + public UnsupportedTypeException(String message){ + super(message); + } + + public UnsupportedTypeException(Throwable e){ + super(e); + } + + public UnsupportedTypeException(String msg, Throwable e){ + super(msg, e); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/kv/Tuple.java b/hera-common/src/main/java/com/dfire/common/kv/Tuple.java new file mode 100755 index 00000000..1861e0ad --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/kv/Tuple.java @@ -0,0 +1,24 @@ +package com.dfire.common.kv; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: 凌霄 + * @time: Created in 16:27 2018/1/16 + * @desc 原始数据格式变为列表,方便构建Job目录树和Job DAG + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Tuple { + + private S source; + + private T target; + + +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraAdviceMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraAdviceMapper.java new file mode 100755 index 00000000..1c417f8d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraAdviceMapper.java @@ -0,0 +1,29 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraAdvice; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Lang; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/5 + */ +public interface HeraAdviceMapper { + + @Insert("insert into hera_advice (#{heraAdvice})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + Integer insert(HeraAdvice heraAdvice); + + + @Select("select * from hera_advice") + @Lang(HeraSelectLangDriver.class) + List getAll(); + +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraAreaMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraAreaMapper.java new file mode 100755 index 00000000..af160be0 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraAreaMapper.java @@ -0,0 +1,46 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraArea; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraListInLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/14 + */ +public interface HeraAreaMapper { + + + @Insert("insert into hera_area (#{heraArea})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + Integer insert(HeraArea heraArea); + + + @Select("select * from hera_area") + @Lang(HeraSelectLangDriver.class) + List selectAll(); + + + @Update("update hera_area (#{heraArea}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int updateById(HeraArea heraArea); + + + @Select("select * from hera_area where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraArea selectById(Integer id); + + + @Select("select * from hera_area where id in (#{list})") + @Lang(HeraListInLangDriver.class) + List selectByIdList(@Param("list") List list); + + @Select("delete from hera_area where id = #{id}") + Integer deleteById(Integer id); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraDebugHistoryMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraDebugHistoryMapper.java new file mode 100755 index 00000000..6803e02c --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraDebugHistoryMapper.java @@ -0,0 +1,62 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraDebugHistory; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraListInLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午7:25 2018/4/16 + * @desc 开发中心脚本运行记录dao + */ +public interface HeraDebugHistoryMapper { + + + @Insert("insert into hera_debug_history (#{heraDebugHistory})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraDebugHistory heraDebugHistory); + + @Delete("delete from hera_debug_history where id = #{id}") + int delete(@Param("id") Long id); + + @Update("update hera_debug_history (#{heraDebugHistory}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraDebugHistory heraDebugHistory); + + @Select("select * from hera_debug_history order by id desc") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + @Select("select * from hera_debug_history where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraDebugHistory findById(Long id); + + @Select("select * from hera_debug_history where id in (#{list})") + @Lang(HeraListInLangDriver.class) + List findByIds(@Param("list") List list); + + @Select("select * from hera_debug_history where file_id = #{fileId} order by id desc ") + @Lang(HeraSelectLangDriver.class) + List findByFileId(Integer fileId); + + @Update("update hera_debug_history set status = #{status}, end_time = #{endTime} where id = #{id}") + int updateStatus(HeraDebugHistory heraDebugHistory); + + @Update("update hera_debug_history set log = #{log} where id = #{id}") + int updateLog(HeraDebugHistory heraDebugHistory); + + @Select("select * from hera_debug_history where id = #{id}") + HeraDebugHistory findLogById(Integer id); + + @Update("update hera_debug_history set status=#{status},log=#{msg},end_time = #{endTime} where id = #{id} ") + void updateStatusAndLog(@Param("id") Long id, + @Param("msg") String msg, + @Param("status") String status, + @Param("endTime") String endTime); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraFileMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraFileMapper.java new file mode 100755 index 00000000..37581c00 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraFileMapper.java @@ -0,0 +1,69 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraFile; +import com.dfire.common.entity.Judge; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraListInLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 16:54 2018/1/17 + * @desc 开发中心文件管理 + */ +public interface HeraFileMapper { + + + @Insert("insert into hera_file (#{heraFile})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraFile heraFile); + + @Delete("delete from hera_file where id = #{id}") + int delete(@Param("id") Integer id); + + @Update("update hera_file (#{heraFile}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraFile heraFile); + + @Select("select * from hera_file") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + @Select("select * from hera_file where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraFile findById(Integer id); + + @Select("select * from hera_file where id in (#{list})") + @Lang(HeraListInLangDriver.class) + List findByIds(@Param("list") List list); + + + @Select("select * from hera_file where parent = #{parent}") + @Lang(HeraSelectLangDriver.class) + List findByParent(Integer parent); + + @Select("select * from hera_file where owner = #{owner}") + @Lang(HeraSelectLangDriver.class) + List findByOwner(String owner); + + @Update("update hera_file set content = #{content} where id = #{id}") + int updateContent(HeraFile heraFile); + + @Update("update hera_file set name = #{name} where id = #{id}") + int updateFileName(HeraFile heraFile); + + + @Select("select count(*) count, max(id) maxId, max(gmt_modified) lastModified from hera_file") + Judge selectTableInfo(); + + @Select("select * from hera_file where owner = #{owner} and name='个人文档'") + HeraFile findDocByOwner(String owner); + + @Update("update hera_file set parent = #{parent} where id = #{id} ") + Integer updateParentById(@Param("id") Integer id, @Param("parent") Integer parent); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraGroupMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraGroupMapper.java new file mode 100755 index 00000000..c7730581 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraGroupMapper.java @@ -0,0 +1,61 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraGroup; +import com.dfire.common.entity.Judge; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraListInLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午4:59 2018/4/17 + * @desc + */ +public interface HeraGroupMapper { + + @Insert("insert into hera_group (#{heraGroup})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraGroup heraGroup); + + @Update("update hera_group set existed = 0 where id = #{id}") + int delete(@Param("id") int id); + + @Update("update hera_group (#{heraGroup}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraGroup heraGroup); + + @Select("select * from hera_group") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + @Select("select * from hera_group where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraGroup findById(Integer id); + + @Select("select * from hera_group where id in (#{list}) and existed = 1") + @Lang(HeraListInLangDriver.class) + List findByIds(@Param("list") List list); + + + @Select("select * from hera_group where parent = #{parent} and existed = 1") + @Lang(HeraSelectLangDriver.class) + List findByParent(Integer parent); + + @Select("select * from hera_group where owner = #{owner} and existed = 1") + @Lang(HeraSelectLangDriver.class) + List findByOwner(String owner); + + @Select("select id,configs,parent from hera_group where id = #{id}") + HeraGroup selectConfigById(Integer id); + + @Select("select count(*) count, max(id) maxId, max(gmt_modified) lastModified from hera_group") + Judge selectTableInfo(); + + @Update("update hera_group set parent = #{parent} where id = #{id}") + Integer changeParent(@Param("id") Integer id, @Param("parent") Integer parent); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraHostGroupMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraHostGroupMapper.java new file mode 100755 index 00000000..c0984832 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraHostGroupMapper.java @@ -0,0 +1,37 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraHostGroup; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 20:48 2018/1/10 + * @desc + */ +public interface HeraHostGroupMapper { + + @Insert("insert into hera_host_group (#{heraHostGroup})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraHostGroup heraHostGroup); + + @Update("delete from hera_host_group where id = #{id}") + int delete(@Param("id") int id); + + @Update("update hera_host_group (#{heraHostGroup}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraHostGroup heraHostGroup); + + @Select("select * from hera_host_group") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + @Select("select * from hera_host_group where id = #{id} and effective = 1") + @Lang(HeraSelectLangDriver.class) + HeraHostGroup findById(HeraHostGroup heraHostGroup); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraHostRelationMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraHostRelationMapper.java new file mode 100755 index 00000000..bb18be24 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraHostRelationMapper.java @@ -0,0 +1,42 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraHostRelation; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 17:05 2018/1/12 + * @desc + */ +public interface HeraHostRelationMapper { + + @Insert("insert into hera_host_relation (#{heraHostRelation})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraHostRelation heraHostRelation); + + @Update("delete from hera_host_relation where id = #{id}") + int delete(@Param("id") int id); + + @Update("update hera_host_relation (#{heraHostRelation}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraHostRelation heraHostRelation); + + @Select("select * from hera_host_relation") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + @Select("select * from hera_host_relation where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraHostRelation findById(HeraHostRelation heraHostRelation); + + @Select("select host from hera_host_relation where host_group_id = #{groupId}") + @Lang(HeraSelectLangDriver.class) + List findPreemptionGroup(@Param("groupId") int groupId); + +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraJobActionMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobActionMapper.java new file mode 100755 index 00000000..8682c355 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobActionMapper.java @@ -0,0 +1,117 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraListInLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import com.dfire.common.mybatis.action.HeraActionBatchInsertDriver; +import com.dfire.common.mybatis.action.HeraActionBatchUpdateDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 上午11:03 2018/5/16 + * @desc 版本运行历史查询 + */ +public interface HeraJobActionMapper { + + @Insert("insert into hera_action (#{heraAction})") + @Lang(HeraInsertLangDriver.class) + int insert(HeraAction heraAction1); + + @Insert("insert into hera_action (#{list})") + @Lang(HeraActionBatchInsertDriver.class) + int batchInsert(@Param("list") List list); + + + @Insert("update hera_action (#{list})") + @Lang(HeraActionBatchUpdateDriver.class) + int batchUpdate(@Param("list") List list); + + @Delete("delete from hera_action where id = #{id}") + int delete(@Param("id") Long id); + + @Update("update hera_action (#{heraJobHistory}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraAction heraJobHistory); + + @Select("select * from hera_action") + List getAll(); + + @Select("select * from hera_action where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraAction findById(Long id); + + + @Select("select * from hera_action where job_id = #{jobId} order by id desc limit 1") + HeraAction findLatestByJobId(Long jobId); + + @Select("select * from hera_action where job_id = #{jobId} order by id") + List findByJobId(Long jobId); + + @Update("update hera_action set status = #{status} where id = #{id}") + Integer updateStatus(@Param("id") Long id, + @Param("status") String status); + + @Update("update hera_action set status = #{status},ready_dependency=#{readyDependency} where id = #{id}") + Integer updateStatusAndReadDependency(HeraAction heraAction); + + @Select("select * from hera_action where id >= #{action}") + List selectAfterAction(long action); + + /** + * 根据JobId 获取版本 + * + * @param jobId + * @return + */ + @Select("select id from hera_action where job_id = #{jobId} order by id desc limit 24") + List getActionVersionByJobId(Long jobId); + + @Select("select id,job_id,owner,auto from hera_action where id <= CURRENT_TIMESTAMP()* 10000 and id >= CURRENT_DATE () * 10000000000 and schedule_type = 0 and auto = 1 and status != 'success' group by job_id") + List getNotRunScheduleJob(); + + @Select("select id,job_id,owner,auto from hera_action where id <= CURRENT_TIMESTAMP()* 10000 and id >= CURRENT_DATE () * 10000000000 and status = 'failed' and auto = 1 group by job_id") + List getFailedJob(); + + + /** + * selectList 只能传递一个参数 需要封装为map或者对象 + * + * @param params + * @return + */ + @Select("select id,job_id,status,ready_dependency,dependencies,schedule_type,last_result,name from hera_action where job_id in (#{list}) and id >= #{startDate} * 10000000000 and id <= #{endDate} * 10000000000 " + + " and status=#{status} " + + " limit #{page},#{limit}") + @Lang(HeraListInLangDriver.class) + List findByJobIdsAndPage(Map params); + + @Select("select count(1) from hera_action where job_id in (#{list}) and id >= #{startDate} * 10000000000 and id <= #{endDate} * 10000000000 " + + " and status=#{status} ") + @Lang(HeraListInLangDriver.class) + Integer findByJobIdsCount(Map params); + + @Delete("delete from hera_action where id < DATE_SUB(CURRENT_DATE(),INTERVAL #{beforeDay} DAY) * 10000000000;") + Integer deleteHistoryRecord(Integer beforeDay); + + @Select("select * from hera_action where job_id = #{jobId} and id > #{startAction} and id <= #{endAction} limit #{limit}") + List selectByStartAndEnd(@Param("startAction") Long startAction, + @Param("endAction") Long endAction, + @Param("jobId") Integer jobId, + @Param("limit") Integer limit); + + + @Delete("delete from hera_action where job_id = #{jobId} and id >= #{startAction} and id <=#{endAction} ") + Integer deleteAction(@Param("startAction") long startAction, + @Param("endAction") long endAction, + @Param("jobId") Integer jobId); + + @Select("select * from hera_action where job_id = #{jobId} and status = 'success' and id >= CURRENT_DATE () * 10000000000 limit 1") + HeraAction selectTodaySuccessByJobId(int jobId); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraJobHistoryMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobHistoryMapper.java new file mode 100755 index 00000000..afdba153 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobHistoryMapper.java @@ -0,0 +1,224 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.vo.JobLogHistoryVo; +import com.dfire.common.entity.vo.PageHelperTimeRange; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.Date; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午5:08 2018/4/23 + * @desc + */ +public interface HeraJobHistoryMapper { + + String SELECT_BY_PAGE_GROUP_WHERE = " where ( b.group_id = #{jobId} )" + + " and (a.start_time>=CAST(#{beginDt,jdbcType=VARCHAR} AS date) and a.start_time< ADDDATE( CAST(#{endDt,jdbcType=VARCHAR} AS date) ,1) ) "; + String SELECT_BY_PAGE_GROUP_ORDER_LIMIT = " order by a.id asc limit #{offset,jdbcType=INTEGER},#{pageSize,jdbcType=INTEGER} "; + String SELECT_BY_PAGE_JOB_WHERE = " where ( a.job_id = #{jobId} )" + + " and (a.start_time>=CAST(#{beginDt,jdbcType=VARCHAR} AS date) and a.start_time< ADDDATE( CAST(#{endDt,jdbcType=VARCHAR} AS date) ,1) ) "; + String SELECT_BY_PAGE_JOB_ORDER_LIMIT = " order by a.id desc limit #{offset,jdbcType=INTEGER},#{pageSize,jdbcType=INTEGER} "; + + String COLUMNS_SELECT240PX = " , CASE WHEN a.start_time IS NULL and a.end_time is null THEN 0 ELSE CEIL(TIMESTAMPDIFF(SECOND, a.start_time, case when a.end_time is not null then a.end_time else mm.end_time_max end)/mm.rang_unit) END AS dur240px" + + " ,CASE WHEN a.start_time IS NULL THEN 240 ELSE CEIL(TIMESTAMPDIFF(SECOND, mm.start_time_min, a.start_time)/mm.rang_unit) END AS begintime240px "; + + String INSIDE_JOIN_SELECT_FROM240PX = "select MIN(inside.start_time) start_time_min ,CASE WHEN MAX(inside.start_time)>=MAX(inside.end_time) then now() ELSE MAX(inside.end_time) END as end_time_max" + + " ,TIMESTAMPDIFF(SECOND,MIN(inside.start_time),CASE WHEN MAX(inside.start_time)>=MAX(inside.end_time) then now() ELSE MAX(inside.end_time) END )/240.0 AS rang_unit" + + " from "; + + @Insert("insert into hera_action_history (#{heraJobHistory})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraJobHistory heraJobHistory); + + @Delete("delete from hera_action_history where id = #{id}") + int delete(@Param("id") Long id); + + @Update("update hera_action_history (#{heraJobHistory}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraJobHistory heraJobHistory); + + @Select("select * from hera_action_history") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + @Select("select * from hera_action_history where id = #{id}") + HeraJobHistory findById(@Param("id") Long id); + + @Select("select * from hera_action_history where action_id = #{actionId}") + List findByActionId(@Param("actionId") Long actionId); + + /** + * 更新日志 + * + * @param heraJobHistory + * @return + */ + @Update("update hera_action_history set log = #{log} where id = #{id}") + int updateHeraJobHistoryLog(HeraJobHistory heraJobHistory); + + /** + * 更新状态 + * + * @param heraJobHistory + * @return + */ + @Update("update hera_action_history set status = #{status} where id = #{id}") + int updateHeraJobHistoryStatus(HeraJobHistory heraJobHistory); + + /** + * 更新日志和状态 + * + * @param heraJobHistory + * @return + */ + @Update("update hera_action_history set log = #{log},status = #{status},end_time = #{endTime},illustrate=#{illustrate} where id = #{id}") + Integer updateHeraJobHistoryLogAndStatus(HeraJobHistory heraJobHistory); + + /** + * 更新properties + * + * @param heraJobHistory + * @return + */ + @Update("update hera_action_history set properties = #{properties} where id = #{id}") + Integer updateHeraJobHistoryProperties(HeraJobHistory heraJobHistory); + + /** + * 根据jobId查询运行历史 + * + * @param jobId + * @return + */ + @Select("select * from hera_action_history where job_id = #{job_id} order by id desc") + List findByJobId(@Param("job_id") Long jobId); + + /** + * 根据ID查询日志逆袭 + * + * @param id + * @return + */ + @Select("select log,status from hera_action_history where id = #{id}") + HeraJobHistory selectLogById(Integer id); + + + @Select("select count(1) from hera_action_history where job_id = #{id}") + Integer selectCountById(Integer id); + + + /** + * 获取jobid的时间范围的执行个数 + * + * @param pageHelperTimeRange + * @return + */ + @Select("select count(1) as cnt " + + "from hera_action_history a " + + "where ( a.job_id = #{jobId} )" + + "and (a.start_time>=CAST(#{beginDt,jdbcType=VARCHAR} AS date) and a.start_time< ADDDATE( CAST(#{endDt,jdbcType=VARCHAR} AS date) ,1) ) " + ) + Integer selectCountByPageJob(PageHelperTimeRange pageHelperTimeRange); + + /** + * 获取jobid的时间范围的执行历史明细 + * + * @param pageHelperTimeRange + * @return + */ + @Select("select a.id,a.action_id,a.job_id,a.start_time,a.end_time,a.execute_host,a.operator,a.status,a.trigger_type,a.illustrate,a.host_group_id,a.batch_id,a.biz_label" + + ",b.name as job_name,b.description ,b.group_id,c.name as group_name " + + COLUMNS_SELECT240PX + + " from hera_action_history a " + + " inner join hera_job b on a.job_id=b.id " + + " inner join hera_group c on b.group_id=c.id " + + " inner join ( " + INSIDE_JOIN_SELECT_FROM240PX + "(select a.start_time ,a.end_time from hera_action_history a " + SELECT_BY_PAGE_JOB_WHERE + SELECT_BY_PAGE_JOB_ORDER_LIMIT + ") inside ) mm on 1=1 " + + SELECT_BY_PAGE_JOB_WHERE + + SELECT_BY_PAGE_JOB_ORDER_LIMIT) + List selectByPageJob(PageHelperTimeRange pageHelperTimeRange); + + + /** + * 获取groupId下的时间范围的执行历史个数 + * + * @param pageHelperTimeRange + * @return + */ + @Select("select count(1) as cnt " + + "from hera_action_history a " + + "inner join hera_job b on a.job_id=b.id " + + SELECT_BY_PAGE_GROUP_WHERE + ) + Integer selectCountByPageGroup(PageHelperTimeRange pageHelperTimeRange); + + /** + * 获取groupId下的时间范围的执行历史明细 + * mm子查询(只有1行,范围内的最小开始时间与最大结束时间),240px指在网页全长为240px长度,为dur240px-执行时长,begintime240px-开始时间的位置 + * + * @param pageHelperTimeRange + * @return + */ + @Select("select a.id,a.action_id,a.job_id,a.start_time,a.end_time,a.execute_host,a.operator,a.status,a.trigger_type,a.illustrate,a.host_group_id,a.batch_id,a.biz_label" + + ",b.name as job_name,b.description ,b.group_id,c.name as group_name " + + COLUMNS_SELECT240PX + + " from hera_action_history a " + + " inner join hera_job b on a.job_id=b.id " + + " inner join hera_group c on b.group_id=c.id " + + " inner join ( " + INSIDE_JOIN_SELECT_FROM240PX + " (select a.start_time,a.end_time from hera_action_history a inner join hera_job b on a.job_id=b.id " + + SELECT_BY_PAGE_GROUP_WHERE + SELECT_BY_PAGE_GROUP_ORDER_LIMIT + " ) inside ) mm on 1=1 " + + SELECT_BY_PAGE_GROUP_WHERE + + SELECT_BY_PAGE_GROUP_ORDER_LIMIT) + List selectByPageGroup(PageHelperTimeRange pageHelperTimeRange); + + + @Select("select job_id,start_time,end_time,status from hera_action_history where action_id >= CURRENT_DATE () * 10000000000") + List findTodayJobHistory(); + + @Update("update hera_action_history set illustrate=#{illustrate},status=#{status},end_time=#{endTime} where id=#{id} ") + int updateStatusAndIllustrate(@Param("id") Long id, + @Param("status") String status, + @Param("illustrate") String illustrate, + @Param("endTime") Date endTime); + + @Delete("delete from hera_action_history where action_id < DATE_SUB(CURRENT_DATE(),INTERVAL #{beforeDay} DAY) * 10000000000;") + Integer deleteHistoryRecord(Integer beforeDay); + + @Select("select * from hera_action_history where job_id = #{jobId} order by id desc limit 1") + HeraJobHistory findNewest(Integer jobId); + + + @Select("select id,job_id,properties from hera_action_history where id = #{id}") + HeraJobHistory findPropertiesBy(Long id); + + + @Select("select action_id,start_time,end_time from hera_action_history " + + "where action_id >#{action_id} and job_id = #{jobId} and status='failed' and json_extract(properties,'$.rerun_id')=#{rerunId} limit #{startPos},#{limit} ") + List findRerunFailed(@Param("jobId") Integer jobId, + @Param("rerunId") String rerunId, + @Param("action_id") long actionId, + @Param("startPos") Integer startPos, + @Param("limit") Integer limit); + + + @Select("select action_id,host_group_id,operator from hera_action_history " + + "where action_id>#{lastId} and job_id = #{jobId} and status='failed' and json_extract(properties,'$.rerun_id')=#{rerunId} order by id limit #{limit} ") + List findRerunFailedIdsByLimit(@Param("lastId") Long lastId, + @Param("jobId") Integer jobId, + @Param("rerunId") String rerunId, + @Param("limit") Integer limit); + + @Select("select job_id,start_time,end_time,status from hera_action_history where action_id >= #{date} * 10000000000 && action_id < (#{date}+1) * 10000000000") + List findJobHistoryLimitDate(@Param("date") Integer date); + + @Select("select count(1) from hera_action_history " + + "where action_id >#{action_id} and job_id = #{jobId} and status='failed' and json_extract(properties,'$.rerun_id')=#{rerunId} ") + Integer findRerunFailedCount(@Param("jobId") Integer jobId, + @Param("rerunId") String rerunId, + @Param("action_id") long actionId); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraJobMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobMapper.java new file mode 100755 index 00000000..b6ce4cad --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobMapper.java @@ -0,0 +1,83 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.Judge; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraListInLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 14:24 2017/12/30 + * @desc + */ +public interface HeraJobMapper { + + + @Insert("insert into hera_job (#{heraJob})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraJob heraJob); + + @Delete("update hera_job set is_valid = 0 where id = #{id}") + int delete(@Param("id") int id); + + @Update("update hera_job (#{heraJob}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraJob heraJob); + + @Select("select * from hera_job") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + + @Select("select id,group_id,name,owner from hera_job") + @Lang(HeraSelectLangDriver.class) + List selectAll(); + + @Select("select * from hera_job where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraJob findById(Integer id); + + @Select("select * from hera_job where id in (#{list})") + @Lang(HeraListInLangDriver.class) + List findByIds(@Param("list") List list); + + @Select("select * from hera_job where group_id = #{groupId}") + List findByPid(Integer groupId); + + + @Update("update hera_job set auto = #{status} where id = #{id}") + Integer updateSwitch(@Param("id") Integer id, @Param("status") Integer status); + + + @Select("select max(id) from hera_job") + Integer selectMaxId(); + + @Select("select `name`,id,dependencies,auto from hera_job") + List getAllJobRelations(); + + @Select("select count(*) count, max(id) maxId, max(gmt_modified) lastModified from hera_job") + Judge selectTableInfo(); + + + @Update("update hera_job set group_id = #{parentId} where id = #{newId}") + Integer changeParent(@Param("newId") Integer newId, @Param("parentId") Integer parentId); + + @Select("select repeat_run from hera_job where id = #{jobId}") + Integer findRepeat(Integer jobId); + + @Update("update hera_job set script= #{script} where id = #{id}") + Integer updateScript(@Param("id") Integer id, @Param("script") String script); + + @Select("select must_end_minute from hera_job where id = #{id}") + Integer findMustEndMinute(int id); + + @Select("select id,name, estimated_end_hour from hera_job where auto > 0 and is_valid > 0 and estimated_end_hour > 0 and estimated_end_hour >= #{startTime} and estimated_end_hour < #{endTime}") + List findEstimatedEndHours(@Param("startTime") int startTime, + @Param("endTime") int endTime); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraJobMonitorMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobMonitorMapper.java new file mode 100755 index 00000000..a955e457 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraJobMonitorMapper.java @@ -0,0 +1,43 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraJobMonitor; +import com.dfire.common.entity.vo.HeraJobMonitorVo; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/8/1 + */ +public interface HeraJobMonitorMapper { + + + @Insert("insert into hera_job_monitor (job_id,user_ids) values(#{jobId}, #{userIds})") + Integer insert(HeraJobMonitor monitor); + + + @Update("update hera_job_monitor set user_ids = concat(user_ids,#{userIds}) where job_id = #{jobId}") + Integer insertUser(HeraJobMonitor monitor); + + + @Select("select * from hera_job_monitor where job_id = #{jobId} limit 1") + HeraJobMonitor findByJobId(Integer jobId); + + @Select("select * from hera_job_monitor") + List selectAll(); + + @Select("select m.job_id id,m.user_ids,job.name job_name,job.description from hera_job_monitor m left join hera_job job on m.job_id = job.id") + List selectAllVo(); + + + @Update("update hera_job_monitor set user_ids =#{userIds} where job_id = #{jobId} ") + Integer update(@Param("jobId") Integer jobId, + @Param("userIds") String userIds); + + @Select("select job_id from hera_job_monitor where find_in_set(#{ssoId},user_ids)") + List selectByUser(Integer ssoId); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraLockMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraLockMapper.java new file mode 100755 index 00000000..53f17568 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraLockMapper.java @@ -0,0 +1,46 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraLock; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 14:25 2018/1/12 + * @desc + */ +public interface HeraLockMapper { + + @Select("select * from hera_lock where subgroup = #{subgroup}") + @Lang(HeraSelectLangDriver.class) + HeraLock findBySubgroup(String subgroup); + + @Insert("insert into hera_lock (#{heraLock})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + Integer insert(HeraLock heraLock); + + + @Update("update hera_lock (#{heraLock}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraLock heraLock); + + /** + * 根据上一次的master ip 更新抢占的master信息 保证三者抢占只有一个成功 + * @param host 新的master抢占ip + * @param serverUpdate 更新时间 + * @param gmtModified 修改时间 + * @param lastHost 老master ip + * @return + */ + @Update("update hera_lock set gmt_modified = #{gmtModified},host = #{host},server_update = #{serverUpdate} where host = #{lastHost}") + Integer updateLock(@Param("host") String host, + @Param("serverUpdate") Date serverUpdate, + @Param("gmtModified") Date gmtModified, + @Param("lastHost") String lastHost); +} + diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraPermissionMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraPermissionMapper.java new file mode 100755 index 00000000..b1a8c88d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraPermissionMapper.java @@ -0,0 +1,47 @@ +package com.dfire.common.mapper; + + +import com.dfire.common.entity.HeraPermission; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午3:49 2018/5/15 + * @desc + */ +public interface HeraPermissionMapper { + + @Insert("insert into hera_permission (#{heraPermission})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraPermission heraPermission); + + + @Select("select * from hera_permission where target_id =#{targetId} and is_valid = #{isValid} and type = #{type}") + List findByTargetId(@Param("targetId") Integer targetId, + @Param("type") String type, + @Param("isValid") Integer isValid); + + @Select("select * from hera_permission where target_id = #{id} and is_valid = 1 and uid = #{owner} and type=#{type}") + HeraPermission findByCond(@Param("id") Integer id, + @Param("owner") String owner, + @Param("type") String type); + + @Delete("update hera_permission set is_valid = #{is_valid} where target_id = #{id} and type = #{type} and uid=#{uid}") + Integer updateByUid(@Param("id") Integer id, + @Param("type") String type, + @Param("is_valid") Integer isValid, + @Param("uid") String uId); + + @Insert({""}) + Integer insertList(@Param("list") List permissions); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraProfileMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraProfileMapper.java new file mode 100755 index 00000000..d300108c --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraProfileMapper.java @@ -0,0 +1,16 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraProfile; + +/** + * @author: 凌霄 + * @time: Created in 下午3:46 2018/5/1 + * @desc + */ +public interface HeraProfileMapper { + + void update(String uid, HeraProfile p); + + public HeraProfile findByUid(String uid); + +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraRecordMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraRecordMapper.java new file mode 100755 index 00000000..df2d8876 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraRecordMapper.java @@ -0,0 +1,48 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraRecord; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * desc: + * + * @author scx + * @create 2019/06/10 + */ +public interface HeraRecordMapper { + + @Insert("insert into hera_record (#{heraRecord})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraRecord heraRecord); + + + @Select("select * from hera_record order by id desc limit #{startPos},#{limit}") + List selectByPage(@Param("startPos") Integer startPos, + @Param("limit") Integer limit); + + @Select("select * from hera_record where gid = #{gid} order by id desc limit #{startPos},#{limit}") + List selectByGid(@Param("startPos") Integer startPos, + @Param("limit") Integer limit, + @Param("gid") Integer gid); + + + @Select("select count(1) from hera_record where log_id = #{logId}") + Integer selectCountById(Integer logId); + + + @Select("select * from hera_record where log_id = #{logId} order by id desc limit #{startPos},#{limit}") + List findPageByLogId(@Param("startPos") Integer startPos, + @Param("limit") Integer limit, + @Param("logId") Integer logId); + + @Select("select count(1) from hera_record") + Integer allCount(); + + @Select("select count(1) from hera_record where gid = #{gid} ") + Integer countByGid(Integer gid); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraRerunMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraRerunMapper.java new file mode 100755 index 00000000..7a909987 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraRerunMapper.java @@ -0,0 +1,72 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraRerun; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/14 + */ +public interface HeraRerunMapper { + + + String COLUMN = " id,is_end,action_now,job_id,name,start_millis,end_millis,sso_name,extra,gmt_create "; + String TABLE = " hera_rerun "; + + @Insert("insert into " + TABLE + " (#{heraRerun})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + Integer insert(HeraRerun heraRerun); + + + @Select("select " + COLUMN + " from " + TABLE + "order by id desc limit #{startPos},#{limit} ") + List selectAll(@Param("startPos") Integer startPos, + @Param("limit") Integer limit); + + + @Update("update " + TABLE + " (#{heraRerun}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + Integer updateById(HeraRerun heraRerun); + + + @Select("select " + COLUMN + " from " + TABLE + " where id = #{id}") + HeraRerun selectById(Integer id); + + + @Select("delete from " + TABLE + " where id = #{id}") + Integer deleteById(Integer id); + + @Select("select " + COLUMN + "from " + TABLE + "where is_end =#{isEnd}") + List selectByEnd(int isEnd); + + + @Select("select " + COLUMN + "from" + TABLE + "where job_id=#{jobId} and is_end =#{isEnd} and start_millis <= #{millis} and end_millis >=#{millis} limit 1") + HeraRerun selectRecordByTime(@Param("millis") Long millis, + @Param("jobId") Integer jobId, + @Param("isEnd") int isEnd); + + @Select("select " + COLUMN + "from" + TABLE + " where job_id=#{jobId} and is_end =#{isEnd} limit 1") + HeraRerun selectByIdAndEnd(@Param("jobId") Integer jobId, + @Param("isEnd") int isEnd); + + @Select("select count(1) from " + TABLE) + Integer selectCount(); + + @Select("select count(1) from " + TABLE + "where job_id=#{jobId} and is_end = #{isEnd}") + Integer selectCountByJob(@Param("jobId") Integer jobId, + @Param("isEnd") int isEnd); + + + @Select("select " + COLUMN + " from " + TABLE + " where is_end = #{status} order by id desc limit #{startPos},#{limit} ") + List selectAllByStatus(@Param("startPos") Integer startPos, + @Param("limit") Integer limit, + @Param("status") Integer status); + + + @Select("select count(1) from " + TABLE + " where is_end = #{status}") + Integer selectCountByStatus(Integer status); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraSsoMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraSsoMapper.java new file mode 100755 index 00000000..ccf1e10e --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraSsoMapper.java @@ -0,0 +1,55 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.vo.HeraSsoVo; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * desc: + * + * @author scx + * @create 2019/06/10 + */ +public interface HeraSsoMapper { + + @Insert("insert into hera_sso (#{heraSso})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + Integer insert(HeraSso heraSso); + + @Delete("delete from hera_sso where id = #{id}") + Integer delete(Integer id); + + @Update("update hera_sso (#{heraSso}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + Integer update(HeraSso heraSso); + + + @Select("select * from hera_sso where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraSso findById(Integer id); + + @Select("SELECT * FROM hera_sso WHERE name = #{name}") + HeraSso findByName(String name); + + @Select("select count(1) from hera_sso where name = #{name}") + Integer checkExistByName(String name); + + @Select("select id,name,gid,job_number,email,phone,is_valid from hera_sso") + List selectAll(); + + @Update("update hera_sso set is_valid=#{is_valid},gmt_modified=#{op_time} where id = #{id}") + Integer updateValid(@Param("id") Integer id, + @Param("is_valid") Integer val, + @Param("op_time") long opTime); + + @Select("select sso.id,sso.name,sso.email,user.name g_name from \n" + + "(select id,name,email,gid from hera_sso where id = #{id} ) sso \n" + + "left join hera_user user on sso.gid = user.id") + HeraSsoVo findSsoVoById(Integer id); +} diff --git a/hera-common/src/main/java/com/dfire/common/mapper/HeraUserMapper.java b/hera-common/src/main/java/com/dfire/common/mapper/HeraUserMapper.java new file mode 100755 index 00000000..575364d9 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mapper/HeraUserMapper.java @@ -0,0 +1,59 @@ +package com.dfire.common.mapper; + +import com.dfire.common.entity.HeraUser; +import com.dfire.common.mybatis.HeraInsertLangDriver; +import com.dfire.common.mybatis.HeraListInLangDriver; +import com.dfire.common.mybatis.HeraSelectLangDriver; +import com.dfire.common.mybatis.HeraUpdateLangDriver; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 23:55 2017/12/29 + * @desc + */ +public interface HeraUserMapper { + + + @Insert("insert into hera_user (#{heraUser})") + @Lang(HeraInsertLangDriver.class) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + int insert(HeraUser heraUser); + + @Delete("delete from hera_user where id = #{id}") + int delete(@Param("id") Integer id); + + @Update("update hera_user (#{heraUser}) where id = #{id}") + @Lang(HeraUpdateLangDriver.class) + int update(HeraUser heraUser); + + @Select("select id,email,name,phone,is_effective,description,gmt_create,gmt_modified from hera_user") + @Lang(HeraSelectLangDriver.class) + List getAll(); + + @Select("select name from hera_user") + @Lang(HeraSelectLangDriver.class) + List getAllName(); + + @Select("select * from hera_user where id = #{id}") + @Lang(HeraSelectLangDriver.class) + HeraUser findById(Integer id); + + @Select("SELECT * FROM hera_user WHERE NAME = #{name} limit 1") + @Lang(HeraUpdateLangDriver.class) + HeraUser getByName(HeraUser heraUser); + + @Select("select * from hera_user where id in (#{list})") + @Lang(HeraListInLangDriver.class) + List findByIds(@Param("list") List list); + + @Update("update hera_user set is_effective = #{isEffective} where id = #{id}") + int updateEffective(@Param("id") Integer id, @Param("isEffective") String effective); + + + @Select("select id,name from hera_user where is_effective = 1") + List selectGroups(); + +} diff --git a/hera-common/src/main/java/com/dfire/common/mybatis/HeraInsertLangDriver.java b/hera-common/src/main/java/com/dfire/common/mybatis/HeraInsertLangDriver.java new file mode 100755 index 00000000..e1e5479f --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mybatis/HeraInsertLangDriver.java @@ -0,0 +1,59 @@ +package com.dfire.common.mybatis; + +import com.dfire.common.config.SkipColumn; +import com.dfire.common.constants.Constants; +import com.google.common.base.CaseFormat; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; + +import java.lang.reflect.Field; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author: 凌霄 + * @time: Created in 上午11:13 2018/5/17 + * @desc + */ +public class HeraInsertLangDriver extends XMLLanguageDriver implements LanguageDriver { + + private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)"); + + @Override + public SqlSource createSqlSource(Configuration configuration, String script, Class parameterType) { + + Matcher matcher = inPattern.matcher(script); + if (matcher.find()) { + StringBuilder columns = new StringBuilder(); + StringBuilder values = new StringBuilder(); + columns.append(""); + values.append(""); + + + + for (Field field : parameterType.getDeclaredFields()) { + SkipColumn skipColumn = field.getAnnotation(SkipColumn.class); + if (skipColumn == null) { + columns.append(""); + columns.append(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName())).append(Constants.COMMA); + columns.append(""); + + + values.append(""); + values.append("#{").append(field.getName()).append("}").append(Constants.COMMA); + + values.append(""); + } + } + columns.append(""); + values.append(""); + + + script = matcher.replaceAll(columns.append(values).toString()); + script = ""; + } + return super.createSqlSource(configuration, script, parameterType); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/mybatis/HeraListInLangDriver.java b/hera-common/src/main/java/com/dfire/common/mybatis/HeraListInLangDriver.java new file mode 100755 index 00000000..d3ec8814 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mybatis/HeraListInLangDriver.java @@ -0,0 +1,33 @@ +package com.dfire.common.mybatis; + +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author: 凌霄 + * @time: Created in 上午11:09 2018/5/17 + * @desc + */ +public class HeraListInLangDriver extends XMLLanguageDriver implements LanguageDriver { + + private static final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)"); + + @Override + public SqlSource createSqlSource(Configuration configuration, String script, Class parameterType) { + + Matcher matcher = inPattern.matcher(script); + if (matcher.find()) { + script = matcher.replaceAll(" #{_item} "); + } + + script = ""; + return super.createSqlSource(configuration, script, parameterType); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/mybatis/HeraSelectLangDriver.java b/hera-common/src/main/java/com/dfire/common/mybatis/HeraSelectLangDriver.java new file mode 100755 index 00000000..97a09bc3 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mybatis/HeraSelectLangDriver.java @@ -0,0 +1,45 @@ +package com.dfire.common.mybatis; + +import com.google.common.base.CaseFormat; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; + +import java.lang.reflect.Field; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author: 凌霄 + * @time: Created in 上午11:20 2018/5/17 + * @desc + */ + +public class HeraSelectLangDriver extends XMLLanguageDriver implements LanguageDriver { + + private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)"); + + @Override + public SqlSource createSqlSource(Configuration configuration, String script, Class parameterType) { + + Matcher matcher = inPattern.matcher(script); + if (matcher.find()) { + StringBuilder sb = new StringBuilder(); + sb.append(""); + + for (Field field : parameterType.getDeclaredFields()) { + String tmp = "AND _column=#{_field}"; + sb.append(tmp.replaceAll("_field", field.getName()).replaceAll("_column", + CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName()))); + } + + sb.append(""); + + script = matcher.replaceAll(sb.toString()); + script = ""; + } + + return super.createSqlSource(configuration, script, parameterType); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/mybatis/HeraUpdateLangDriver.java b/hera-common/src/main/java/com/dfire/common/mybatis/HeraUpdateLangDriver.java new file mode 100755 index 00000000..1b3d2ca6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mybatis/HeraUpdateLangDriver.java @@ -0,0 +1,52 @@ +package com.dfire.common.mybatis; + +import com.dfire.common.config.SkipColumn; +import com.google.common.base.CaseFormat; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; + +import java.lang.reflect.Field; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author: 凌霄 + * @time: Created in 上午11:11 2018/5/17 + * @desc + */ +public class HeraUpdateLangDriver extends XMLLanguageDriver implements LanguageDriver { + + private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)"); + + @Override + public SqlSource createSqlSource(Configuration configuration, String script, Class parameterType) { + Matcher matcher = inPattern.matcher(script); + if (matcher.find()) { + StringBuilder sb = new StringBuilder(); + sb.append(""); + + for (Field field : parameterType.getDeclaredFields()) { + SkipColumn skipColumn = field.getAnnotation(SkipColumn.class); + if (skipColumn == null) { + String tmp = "_column=#{_field},"; + if ("id".equalsIgnoreCase(field.getName())) { + continue; + } + sb.append(tmp.replaceAll("_field", field.getName()).replaceAll("_column", + CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName()))); + } + } + + + sb.deleteCharAt(sb.lastIndexOf(",")); + sb.append(""); + + script = matcher.replaceAll(sb.toString()); + script = ""; + } + + return super.createSqlSource(configuration, script, parameterType); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/mybatis/action/HeraActionBatchInsertDriver.java b/hera-common/src/main/java/com/dfire/common/mybatis/action/HeraActionBatchInsertDriver.java new file mode 100755 index 00000000..efe82121 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mybatis/action/HeraActionBatchInsertDriver.java @@ -0,0 +1,47 @@ +package com.dfire.common.mybatis.action; + +import com.dfire.common.entity.HeraAction; +import com.google.common.base.CaseFormat; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; + +import java.lang.reflect.Field; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 仅仅用于heraAction + * @author: 火锅 + * @time: Created in 上午11:13 2018/5/17 + * @desc + */ +public class HeraActionBatchInsertDriver extends XMLLanguageDriver implements LanguageDriver { + + private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)"); + + @Override + public SqlSource createSqlSource(Configuration configuration, String script, Class parameterType) { + + Matcher matcher = inPattern.matcher(script); + if (matcher.find()) { + StringBuilder sb = new StringBuilder(); + StringBuilder tmp = new StringBuilder(); + sb.append(" ("); + + for (Field field : HeraAction.class.getDeclaredFields()) { + sb.append(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName()) + ","); + tmp.append("#{item." + field.getName() + "},"); + } + sb.deleteCharAt(sb.lastIndexOf(",")); + tmp.deleteCharAt(tmp.lastIndexOf(",")); + sb.append(") values "); + script = matcher.replaceAll(sb + " ("+tmp.toString()+")"); + + script = ""; + } + return super.createSqlSource(configuration, script, parameterType); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/mybatis/action/HeraActionBatchUpdateDriver.java b/hera-common/src/main/java/com/dfire/common/mybatis/action/HeraActionBatchUpdateDriver.java new file mode 100755 index 00000000..643b8581 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/mybatis/action/HeraActionBatchUpdateDriver.java @@ -0,0 +1,57 @@ +package com.dfire.common.mybatis.action; + +import com.dfire.common.entity.HeraAction; +import com.google.common.base.CaseFormat; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; + +import java.lang.reflect.Field; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 仅仅用于heraAction + * @author: 火锅 + * @time: Created in 上午11:13 2018/5/17 + * @desc + */ +public class HeraActionBatchUpdateDriver extends XMLLanguageDriver implements LanguageDriver { + + private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)"); + + @Override + public SqlSource createSqlSource(Configuration configuration, String script, Class parameterType) { + + Matcher matcher = inPattern.matcher(script); + if (matcher.find()) { + StringBuilder sb = new StringBuilder(" SET "); + for (Field field : HeraAction.class.getDeclaredFields()) { + if(field.getName().equalsIgnoreCase("id")) { + continue; + } + String dbName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName()); + String fieldName = field.getName(); + String tmp = dbName +" = CASE id "+ + " " + + " WHEN #{item.id,jdbcType=BIGINT} THEN #{item."+fieldName+"}" + + " END ,"; + sb.append(tmp); + } + sb.deleteCharAt(sb.lastIndexOf(",")); + sb.append(" where id in "); + String whereSql = " #{item.id,jdbcType=BIGINT} "; + sb.append(whereSql); + + script = matcher.replaceAll(sb.toString()); + + + script = ""; + } + return super.createSqlSource(configuration, script, parameterType); + } + + +} diff --git a/hera-common/src/main/java/com/dfire/common/processor/DownProcessor.java b/hera-common/src/main/java/com/dfire/common/processor/DownProcessor.java new file mode 100755 index 00000000..548d3236 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/processor/DownProcessor.java @@ -0,0 +1,24 @@ +package com.dfire.common.processor; + +/** + * @author: 凌霄 + * @time: Created in 上午11:37 2018/5/2 + * @desc + */ +public class DownProcessor implements Processor { + + @Override + public String getId() { + return "download"; + } + + @Override + public String getConfig() { + return ""; + } + + @Override + public void parse(String config) { + + } +} diff --git a/hera-common/src/main/java/com/dfire/common/processor/JobProcessor.java b/hera-common/src/main/java/com/dfire/common/processor/JobProcessor.java new file mode 100755 index 00000000..8946954b --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/processor/JobProcessor.java @@ -0,0 +1,54 @@ +package com.dfire.common.processor; + + +import com.alibaba.fastjson.JSONObject; +import lombok.Builder; +import lombok.Data; + +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 17:45 2018/1/11 + * @desc 可以将其他Job作为一个Processor处理单元,嵌入到当前Job中 + */ +@Builder +@Data +public class JobProcessor implements Processor { + + public static final String name = "JobProcessor"; + + private String jobId; + private Map kvConfig; + + @Override + public String getId() { + return name; + } + + @Override + public String getConfig() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("actionId", jobId); + JSONObject kv = new JSONObject(); + if (kvConfig != null) { + kvConfig.keySet() + .stream() + .filter(key -> key.startsWith("instance.")) + .forEach(value -> kv.put(value, kvConfig.get(value))); + } + jsonObject.put("kvConfig", kv); + return jsonObject.toString(); + } + + @Override + public void parse(String config) { + JSONObject jsonObject = JSONObject.parseObject(config); + jobId = jsonObject.getString("actionId"); + kvConfig = jsonObject.getJSONObject("kvConfig").entrySet().stream() + .filter(ks -> jsonObject.getString(ks.toString()) != null) + .collect(Collectors.toMap(k -> k.toString(), v -> jsonObject.getString(v.toString()), (s, t) -> t)); + + } +} diff --git a/hera-common/src/main/java/com/dfire/common/processor/Processor.java b/hera-common/src/main/java/com/dfire/common/processor/Processor.java new file mode 100755 index 00000000..9e0afc5f --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/processor/Processor.java @@ -0,0 +1,18 @@ +package com.dfire.common.processor; + +import java.io.Serializable; + +/** + * @author: 凌霄 + * @time: Created in 17:40 2018/1/11 + * @desc 可以提供Job运行的前置处理或者后置处理,处理日志运行日志 + */ +public interface Processor extends Serializable { + + String getId(); + + String getConfig(); + + void parse(String config); + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/EmailService.java b/hera-common/src/main/java/com/dfire/common/service/EmailService.java new file mode 100755 index 00000000..e165b059 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/EmailService.java @@ -0,0 +1,19 @@ +package com.dfire.common.service; + +import javax.mail.MessagingException; + +/** + * @author xiaosuda + * @date 2018/7/31 + */ +public interface EmailService { + + /** + * 发送邮件 + * @param title 邮件标题 + * @param content 邮件内容 + * @param address 收件人,多个用,隔开 + * @throws MessagingException + */ + void sendEmail(String title, String content, String address) throws MessagingException; +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraAdviceService.java b/hera-common/src/main/java/com/dfire/common/service/HeraAdviceService.java new file mode 100755 index 00000000..7bf2574e --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraAdviceService.java @@ -0,0 +1,16 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraAdvice; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/5 + */ +public interface HeraAdviceService { + + boolean addAdvice(HeraAdvice heraAdvice); + + List getAll(); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraAreaService.java b/hera-common/src/main/java/com/dfire/common/service/HeraAreaService.java new file mode 100755 index 00000000..35759331 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraAreaService.java @@ -0,0 +1,26 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraArea; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/14 + */ +public interface HeraAreaService { + + Integer add(HeraArea heraArea); + + HeraArea findById(Integer id); + + List findByIdList(List idList); + + Integer updateById(HeraArea heraArea); + + Integer deleteById(Integer id); + + List findAll(); + + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraDebugHistoryService.java b/hera-common/src/main/java/com/dfire/common/service/HeraDebugHistoryService.java new file mode 100755 index 00000000..be6e8d4c --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraDebugHistoryService.java @@ -0,0 +1,35 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraDebugHistory; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午2:55 2018/4/16 + * @desc + */ +public interface HeraDebugHistoryService { + + Long insert(HeraDebugHistory heraDebugHistory); + + int delete(Long id); + + int update(HeraDebugHistory heraDebugHistory); + + List getAll(); + + HeraDebugHistoryVo findById(Long id); + + List findByFileId(Integer fileId); + + int updateStatus(HeraDebugHistory heraDebugHistory); + + int updateLog(HeraDebugHistory heraDebugHistory); + + + HeraDebugHistory findLogById(Integer id); + + void updateStatus(Long id, String msg, String status); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraFileService.java b/hera-common/src/main/java/com/dfire/common/service/HeraFileService.java new file mode 100755 index 00000000..a11062ab --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraFileService.java @@ -0,0 +1,42 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraFile; +import com.dfire.common.entity.vo.HeraFileTreeNodeVo; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 19:19 2018/1/12 + * @desc 开发中心文件文件管理 + */ +public interface HeraFileService { + + + Integer insert(HeraFile heraFile); + + int delete(Integer id); + + int update(HeraFile heraFile); + + List getAll(); + + HeraFile findById(Integer id); + + List findByIds(List list); + + List findByParent(Integer parent); + + List findByOwner(String heraFile); + + List buildFileTree(String user); + + int updateContent(HeraFile heraFile); + + int updateFileName(HeraFile heraFile); + + HeraFile findDocByOwner(String owner); + + + boolean updateParentById(Integer id, Integer parent); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraGroupService.java b/hera-common/src/main/java/com/dfire/common/service/HeraGroupService.java new file mode 100755 index 00000000..5e1693d6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraGroupService.java @@ -0,0 +1,48 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraGroup; +import com.dfire.common.entity.model.HeraJobBean; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午5:01 2018/4/17 + * @desc + */ +public interface HeraGroupService { + + HeraGroup getRootGroup(); + + /** + * 获取上游任务以及组 + * + * @param jobId + * @return + */ + HeraJobBean getUpstreamJobBean(Integer jobId); + + int insert(HeraGroup heraGroup); + + int delete(int id); + + int update(HeraGroup heraGroup); + + List getAll(); + + HeraGroup findById(Integer id); + + List findByIds(List list); + + List findByParent(Integer parentId); + + List findByOwner(String owner); + + HeraGroup findConfigById(Integer id); + + + boolean changeParent(Integer id, Integer parent); + + List findDownStreamGroup(Integer groupId); + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraHostGroupService.java b/hera-common/src/main/java/com/dfire/common/service/HeraHostGroupService.java new file mode 100755 index 00000000..e9b50344 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraHostGroupService.java @@ -0,0 +1,34 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraHostGroup; +import com.dfire.common.entity.vo.HeraHostGroupVo; + +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 20:49 2018/1/10 + * @desc + */ +public interface HeraHostGroupService { + + + int insert(HeraHostGroup heraHostGroup); + + int delete(int id); + + int update(HeraHostGroup heraHostGroup); + + List getAll(); + + HeraHostGroup findById(int id); + + /** + * 查询出所有的host组 如:本地 测试 etc. + * @return + */ + Map getAllHostGroupInfo(); + + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraHostRelationService.java b/hera-common/src/main/java/com/dfire/common/service/HeraHostRelationService.java new file mode 100755 index 00000000..393722d6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraHostRelationService.java @@ -0,0 +1,25 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraHostRelation; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 17:07 2018/1/12 + * @desc + */ +public interface HeraHostRelationService { + + int insert(HeraHostRelation heraHostRelation); + + int delete(int id); + + int update(HeraHostRelation heraHostRelation); + + List getAll(); + + HeraHostRelation findById(HeraHostRelation heraHostRelation); + + List findPreemptionGroup(int id); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraJobActionService.java b/hera-common/src/main/java/com/dfire/common/service/HeraJobActionService.java new file mode 100755 index 00000000..53a10ab6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraJobActionService.java @@ -0,0 +1,90 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.kv.Tuple; +import com.dfire.common.vo.GroupTaskVo; +import com.dfire.common.vo.JobStatus; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午3:41 2018/5/16 + * @desc + */ +public interface HeraJobActionService { + + + int insert(HeraAction heraAction, Long nowAction); + + /** + * 批量插入 + * + * @param heraActionList + * @return + */ + List batchInsert(List heraActionList, Long nowAction); + + int delete(Long id); + + int update(HeraAction heraAction); + + List getAll(); + + HeraAction findById(Long actionId); + + HeraAction findById(String actionId); + + HeraAction findLatestByJobId(Long jobId); + + List findByJobId(Long jobId); + + int updateStatus(JobStatus jobStatus); + + Tuple findHeraActionVo(Long jobId); + + /** + * 查找当前版本的运行状态 + * + * @param actionId + * @return + */ + JobStatus findJobStatus(Long actionId); + + + JobStatus findJobStatusByJobId(Long jobId); + + + Integer updateStatus(Long id, String status); + + Integer updateStatusAndReadDependency(HeraAction heraAction); + + + List getAfterAction(Long action); + + /** + * 根据jobId 获取所有的版本 + * + * @param jobId + * @return + */ + List getActionVersionByJobId(Long jobId); + + List getNotRunScheduleJob(); + + List getFailedJob(); + + List findByJobIds(List idList, String startDate, String endDate, TablePageForm pageForm, String status); + + void deleteHistoryRecord(Integer beforeDay); + + void deleteAllHistoryRecord(Integer beforeDay); + + List findByStartAndEnd(Long startAction, Long endAction, Integer jobId,Integer limit); + + boolean deleteAction(long startAction, long endAction, Integer jobId); + + HeraAction findTodaySuccessByJobId(int id); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraJobHistoryService.java b/hera-common/src/main/java/com/dfire/common/service/HeraJobHistoryService.java new file mode 100755 index 00000000..8351a4d3 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraJobHistoryService.java @@ -0,0 +1,72 @@ +package com.dfire.common.service; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.PageHelper; +import com.dfire.common.entity.vo.PageHelperTimeRange; +import com.dfire.common.util.Pair; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 19:18 2018/1/12 + * @desc + */ +public interface HeraJobHistoryService { + + int updateHeraJobHistoryStatus(HeraJobHistory jobStatus); + + int updateHeraJobHistoryLog(HeraJobHistory heraJobHistory); + + int insert(HeraJobHistory heraJobHistory); + + int delete(Long id); + + int update(HeraJobHistory heraJobHistory); + + int updateProperties(HeraJobHistory heraJobHistory); + + int updateStatusAndIllustrate(Long id, String status, String illustrate, Date endTime); + + List getAll(); + + HeraJobHistory findById(Long id); + + List findByActionId(Long actionId); + + Integer updateHeraJobHistoryLogAndStatus(HeraJobHistory build); + + /** + * 根据jobId查询运行历史 + * + * @param jobId + * @return + */ + List findByJobId(Long jobId); + + HeraJobHistory findLogById(Integer id); + + Map findLogByPage(PageHelperTimeRange pageHelperTimeRange); + + List findTodayJobHistory(); + + void deleteHistoryRecord(Integer beforeDay); + + HeraJobHistory findNewest(Integer jobId); + + HeraJobHistory findPropertiesById(Long id); + + + Pair> findRerunFailed(Integer jobId, String rerunId, long actionId, TablePageForm pageForm); + + List findRerunFailedIdsByLimit(Long lastId, Integer jobId, String rerunId, Integer limit); + + + Integer findRerunFailedCount(Integer jobId, + String rerunId, + long actionId); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraJobMonitorService.java b/hera-common/src/main/java/com/dfire/common/service/HeraJobMonitorService.java new file mode 100755 index 00000000..37523880 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraJobMonitorService.java @@ -0,0 +1,32 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraJobMonitor; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.vo.HeraJobMonitorVo; + +import java.util.List; +import java.util.Set; + +/** + * @author xiaosuda + * @date 2018/8/1 + */ +public interface HeraJobMonitorService { + + + boolean addMonitor(String userId, Integer jobId); + + boolean removeMonitor(String userId, Integer jobId); + + HeraJobMonitor findByJobId(Integer jobId); + + Set getMonitorUser(Integer jobId); + + List findAll(); + + List findAllVo(); + + boolean updateMonitor(String userIds, Integer jobId); + + List findBySsoId(Integer ssoId); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraJobService.java b/hera-common/src/main/java/com/dfire/common/service/HeraJobService.java new file mode 100755 index 00000000..9826ef77 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraJobService.java @@ -0,0 +1,69 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.vo.HeraJobTreeNodeVo; +import com.dfire.common.enums.RunAuthType; + +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 2:08 2018/1/11 + * @desc + */ +public interface HeraJobService { + + int insert(HeraJob heraJob); + + int delete(int id); + + Integer update(HeraJob heraJob); + + List getAll(); + + HeraJob findById(int id); + + Integer findMustEndMinute(int id); + + List findEstimatedEndHours(int startTime, int endTime); + + HeraJob findMemById(int id); + + List findByIds(List list); + + List findByPid(int groupId); + + /** + * 构建job树形目录结构 + * + * @return + */ + Map> buildJobTree(String owner,Integer ssoId); + + boolean changeSwitch(Integer id, Integer status); + + + Map findCurrentJobGraph(int jobId, Integer type); + + + List findJobImpact(int jobId, Integer type); + + + List findDownStreamJob(Integer jobId); + + List findUpStreamJob(Integer jobId); + + List getAllJobDependencies(); + + + boolean changeParent(Integer newId, Integer parentId); + + boolean isRepeat(Integer jobId); + + Integer updateScript(Integer id, String script); + + Integer selectMaxId(); + + String checkDependencies(Integer xId, RunAuthType type); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraLockService.java b/hera-common/src/main/java/com/dfire/common/service/HeraLockService.java new file mode 100755 index 00000000..ca9720d3 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraLockService.java @@ -0,0 +1,21 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraLock; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 14:28 2018/1/12 + * @desc + */ +public interface HeraLockService { + + HeraLock findBySubgroup(String group); + + Integer insert(HeraLock heraLock); + + int update(HeraLock heraLock); + + Integer changeLock(String host, Date serverUpdate, Date gmtModified, String lastHost); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraPermissionService.java b/hera-common/src/main/java/com/dfire/common/service/HeraPermissionService.java new file mode 100755 index 00000000..0338b407 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraPermissionService.java @@ -0,0 +1,25 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraPermission; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午3:41 2018/5/16 + * @desc + */ +public interface HeraPermissionService { + + int insert(HeraPermission heraPermission); + + List findByTargetId(Integer targetId, String type, Integer isValid); + + HeraPermission findByCond(Integer id, String owner, String type); + + Integer updateByUid(Integer id, String type, Integer isValid, String uId); + + + Integer insertList(List permissions); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraProfileService.java b/hera-common/src/main/java/com/dfire/common/service/HeraProfileService.java new file mode 100755 index 00000000..ba3cb197 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraProfileService.java @@ -0,0 +1,19 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraProfile; +import com.dfire.common.entity.vo.HeraProfileVo; +import org.springframework.stereotype.Service; + +/** + * @author: 凌霄 + * @time: Created in 19:22 2018/1/12 + * @desc + */ +public interface HeraProfileService { + + HeraProfileVo findByOwner(String owner); + + void insert(HeraProfile profile); + + void update(HeraProfile profile); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraRecordService.java b/hera-common/src/main/java/com/dfire/common/service/HeraRecordService.java new file mode 100755 index 00000000..b3da5fd6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraRecordService.java @@ -0,0 +1,26 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraRecord; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.PageHelper; +import com.dfire.common.util.Pair; + +import java.util.List; +import java.util.Map; + +/** + * desc: + * + * @author scx + * @create 2019/07/16 + */ +public interface HeraRecordService { + + boolean add(HeraRecord record); + + Pair> selectByPage(TablePageForm pageForm); + + Pair> selectByPage(TablePageForm pageForm, Integer gid); + + Map findPageByLogId(PageHelper pageHelper); +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraRerunService.java b/hera-common/src/main/java/com/dfire/common/service/HeraRerunService.java new file mode 100755 index 00000000..c7e78abf --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraRerunService.java @@ -0,0 +1,38 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraRerun; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.HeraRerunVo; +import com.dfire.common.util.Pair; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/14 + */ +public interface HeraRerunService { + + boolean add(HeraRerunVo heraRerun); + + HeraRerun findById(Integer id); + + HeraRerunVo findVoById(Integer id); + + boolean updateById(HeraRerun heraRerun); + + boolean updateById(HeraRerunVo heraRerunVo); + + boolean deleteById(Integer id); + + Pair> findByPage(TablePageForm pageForm,Integer status); + + List findByEnd(Integer isEnd); + + HeraRerunVo findRecordByTime(Long millis, Integer jobId, int isEnd); + + HeraRerunVo findByIdAndEnd(Integer jobId, int i); + + Integer findCntByJob(Integer jobId, int isEnd); + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraSsoService.java b/hera-common/src/main/java/com/dfire/common/service/HeraSsoService.java new file mode 100755 index 00000000..9ddf6909 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraSsoService.java @@ -0,0 +1,29 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.vo.HeraSsoVo; + +import java.util.List; +import java.util.Set; + +public interface HeraSsoService { + + boolean addSso(HeraSso heraSso); + + List getAll(); + + boolean deleteSsoById(Integer id); + + boolean updateHeraSsoById(HeraSso heraSso); + + HeraSso findSsoById(Integer id); + + HeraSsoVo findSsoVoById(Integer id); + + HeraSso findSsoByName(String name); + + boolean checkByName(String name); + + boolean setValid(Integer id,Integer val); + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/HeraUserService.java b/hera-common/src/main/java/com/dfire/common/service/HeraUserService.java new file mode 100755 index 00000000..e67dfdeb --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/HeraUserService.java @@ -0,0 +1,35 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraUser; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 0:35 2017/12/30 + * @desc + */ + +public interface HeraUserService { + + int insert(HeraUser heraUser); + + int delete(Integer id); + + boolean update(HeraUser heraUser); + + List getAll(); + + HeraUser findById(Integer id); + + HeraUser findByName(String name); + + List findByIds(List list); + + int updateEffective(Integer id, String effective); + + List findAllName(); + + List getGroups(); + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/JobFailAlarm.java b/hera-common/src/main/java/com/dfire/common/service/JobFailAlarm.java new file mode 100755 index 00000000..894a6584 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/JobFailAlarm.java @@ -0,0 +1,31 @@ +package com.dfire.common.service; + +import com.dfire.common.entity.HeraSso; +import com.dfire.common.vo.JobElement; +import com.dfire.event.HeraJobFailedEvent; + +import java.util.Set; + +/** + * @author xiaosuda + * @date 2019/2/25 + */ +public interface JobFailAlarm { + + + /** + * 任务失败告警接口,自己可以自定义实现 默认:com.dfire.monitor.service.impl.EmailJobFailAlarm + * 一定要把实现类使用spring管理 + * + * @param failedEvent HeraJobFailedEvent + * @param monitorUser + */ + void alarm(HeraJobFailedEvent failedEvent, Set monitorUser); + + /** + * 任务执行超时告警 + * + * @param element + */ + void alarm(JobElement element, Set monitorUser); +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/EmailServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/EmailServiceImpl.java new file mode 100755 index 00000000..474f4892 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/EmailServiceImpl.java @@ -0,0 +1,70 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.constants.Constants; +import com.dfire.common.service.EmailService; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.MonitorLog; +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Service; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * @author xiaosuda + * @date 2018/7/31 + */ +@Service("emailServiceImpl") +public class EmailServiceImpl implements EmailService { + + @Override + public void sendEmail(String title, String content, String address) throws MessagingException { + if (StringUtils.isEmpty(address)) { + return; + } + List userEmails = Arrays.stream(address.split(Constants.SEMICOLON)).distinct().collect(Collectors.toList()); + int len = userEmails.size(); + InternetAddress[] addresses = new InternetAddress[len]; + for (int i = 0; i < len; i++) { + addresses[i] = new InternetAddress(userEmails.get(i)); + } + Properties properties = new Properties(); + properties.put("mail.smtp.host", HeraGlobalEnv.getMailHost()); + properties.put("mail.transport.protocol", HeraGlobalEnv.getMailProtocol()); + properties.put("mail.smtp.auth", "true"); + properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + properties.put("mail.smtp.socketFactory.fallback", "false"); + properties.put("mail.smtp.port", HeraGlobalEnv.getMailPort()); + properties.put("mail.smtp.socketFactory.port", HeraGlobalEnv.getMailPort()); + + Session session = Session.getInstance(properties); + + session.setDebug(false); + + Transport transport = session.getTransport(); + + transport.connect(HeraGlobalEnv.getMailHost(), HeraGlobalEnv.getMailUser(), HeraGlobalEnv.getMailPassword()); + + Message message = createSimpleMessage(session, title, content, addresses); + transport.sendMessage(message, message.getAllRecipients()); + MonitorLog.info("发送邮件成功,Title:{}, 联系人:{}", title, address); + transport.close(); + } + + private Message createSimpleMessage(Session session, String title, String content, InternetAddress[] addresses) throws MessagingException { + MimeMessage mimeMessage = new MimeMessage(session); + mimeMessage.setFrom(new InternetAddress(HeraGlobalEnv.getMailUser())); + mimeMessage.setRecipients(Message.RecipientType.TO, addresses); + mimeMessage.setSubject(title); + mimeMessage.setContent(content, "text/html;charset=UTF-8"); + return mimeMessage; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraAreaServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraAreaServiceImpl.java new file mode 100755 index 00000000..6a365275 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraAreaServiceImpl.java @@ -0,0 +1,51 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraArea; +import com.dfire.common.mapper.HeraAreaMapper; +import com.dfire.common.service.HeraAreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/14 + */ +@Service("heraAreaServiceImpl") +public class HeraAreaServiceImpl implements HeraAreaService { + + + @Autowired + private HeraAreaMapper heraAreaMapper; + + @Override + public Integer add(HeraArea heraArea) { + return heraAreaMapper.insert(heraArea); + } + + @Override + public HeraArea findById(Integer id) { + return heraAreaMapper.selectById(id); + } + + @Override + public List findByIdList(List idList) { + return heraAreaMapper.selectByIdList(idList); + } + + @Override + public Integer updateById(HeraArea heraArea) { + return heraAreaMapper.updateById(heraArea); + } + + @Override + public Integer deleteById(Integer id) { + return heraAreaMapper.deleteById(id); + } + + @Override + public List findAll() { + return heraAreaMapper.selectAll(); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraDebugHistoryServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraDebugHistoryServiceImpl.java new file mode 100755 index 00000000..eb1b9b9a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraDebugHistoryServiceImpl.java @@ -0,0 +1,78 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraDebugHistory; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.mapper.HeraDebugHistoryMapper; +import com.dfire.common.service.HeraDebugHistoryService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午7:27 2018/4/16 + * @desc + */ +@Service("heraDebugHistoryService") +public class HeraDebugHistoryServiceImpl implements HeraDebugHistoryService { + + @Autowired + HeraDebugHistoryMapper heraDebugHistoryMapper; + + @Override + public Long insert(HeraDebugHistory heraDebugHistory) { + heraDebugHistoryMapper.insert(heraDebugHistory); + return heraDebugHistory.getId(); + } + + @Override + public int delete(Long id) { + return heraDebugHistoryMapper.delete(id); + } + + @Override + public int update(HeraDebugHistory heraDebugHistory) { + return heraDebugHistoryMapper.update(heraDebugHistory); + } + + @Override + public List getAll() { + return heraDebugHistoryMapper.getAll(); + } + + @Override + public HeraDebugHistoryVo findById(Long id) { + return BeanConvertUtils.convert(heraDebugHistoryMapper.findById(id)); + } + + @Override + public List findByFileId(Integer fileId) { + return heraDebugHistoryMapper.findByFileId(fileId); + } + + @Override + public int updateStatus(HeraDebugHistory heraDebugHistory) { + return heraDebugHistoryMapper.updateStatus(heraDebugHistory); + } + + @Override + public int updateLog(HeraDebugHistory heraDebugHistory) { + return heraDebugHistoryMapper.updateLog(heraDebugHistory); + } + + @Override + public HeraDebugHistory findLogById(Integer id) { + return heraDebugHistoryMapper.findLogById(id); + } + + @Override + public void updateStatus(Long id, String msg, String status) { + heraDebugHistoryMapper.updateStatusAndLog(id, msg, status, ActionUtil.getTodayString()); + } + + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraFileMemoryServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraFileMemoryServiceImpl.java new file mode 100755 index 00000000..79b11dd5 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraFileMemoryServiceImpl.java @@ -0,0 +1,60 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraFile; +import com.dfire.common.entity.Judge; +import com.dfire.logs.HeraLog; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author xiaosuda + * @date 2018/12/5 + */ +@Service("heraFileMemoryService") +public class HeraFileMemoryServiceImpl extends HeraFileServiceImpl { + + + private volatile Judge judge; + + private Map memoryJob; + + private Map getMemoryJob() { + Judge newJudge = heraFileMapper.selectTableInfo(); + if (newJudge.getMaxId() == null || newJudge.getLastModified() == null || newJudge.getCount() == null) { + return new HashMap<>(0); + } + if (judge == null || !newJudge.getCount().equals(judge.getCount()) || !newJudge.getLastModified().equals(judge.getLastModified()) || !newJudge.getMaxId().equals(judge.getMaxId())) { + synchronized (this) { + if (judge == null || !newJudge.getCount().equals(judge.getCount()) || !newJudge.getLastModified().equals(judge.getLastModified()) || !newJudge.getMaxId().equals(judge.getMaxId())) { + HeraLog.info("刷新hera_file库"); + judge = newJudge; + List all = heraFileMapper.getAll(); + Map jobMap = new HashMap<>(all.size()); + all.forEach(file -> jobMap.put(file.getId(), file)); + memoryJob = jobMap; + } + } + } + judge.setStamp(new Date()); + return memoryJob; + } + + + @Override + public List getAll() { + return new ArrayList<>(getMemoryJob().values()); + } + + @Override + public List findByOwner(String owner) { + return getMemoryJob().values().stream().filter(heraFile -> heraFile.getOwner().equals(owner)).collect(Collectors.toList()); + } + + @Override + public List findByParent(Integer parent) { + return getMemoryJob().values().stream().filter(heraFile -> heraFile.getParent().equals(parent)).collect(Collectors.toList()); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraFileServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraFileServiceImpl.java new file mode 100755 index 00000000..78bb7821 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraFileServiceImpl.java @@ -0,0 +1,113 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraFile; +import com.dfire.common.entity.vo.HeraFileTreeNodeVo; +import com.dfire.common.mapper.HeraFileMapper; +import com.dfire.common.service.HeraFileService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 19:20 2018/1/12 + * @desc + */ +@Service("heraFileService") +public class HeraFileServiceImpl implements HeraFileService { + + @Autowired + protected HeraFileMapper heraFileMapper; + + @Override + public Integer insert(HeraFile heraFile) { + heraFileMapper.insert(heraFile); + return heraFile.getId(); + } + + @Override + public int delete(Integer id) { + return heraFileMapper.delete(id); + } + + @Override + public int update(HeraFile heraFile) { + return heraFileMapper.update(heraFile); + } + + @Override + public List getAll() { + return heraFileMapper.getAll(); + } + + @Override + public HeraFile findById(Integer id) { + return heraFileMapper.findById(id); + } + + @Override + public List findByIds(List list) { + return heraFileMapper.findByIds(list); + } + + @Override + public List findByParent(Integer parent) { + return heraFileMapper.findByParent(parent); + } + + @Override + public List findByOwner(String owner) { + return heraFileMapper.findByOwner(owner); + } + + /** + * 构建开发中心文件树 + * + * @param user + * @return + */ + @Override + public List buildFileTree(String user) { + List fileVoList = this.findByOwner(user); + fileVoList.addAll(this.findByOwner(Constants.FILE_ALL_NAME)); + return fileVoList.parallelStream().map(file -> { + HeraFileTreeNodeVo vo = HeraFileTreeNodeVo.builder().id(file.getId()).name(file.getName()).build(); + if (file.getParent() == null) { + vo.setParent(-1); + } else { + vo.setParent(file.getParent()); + } + if (file.getType() == 1) { + vo.setIsParent(true); + } else if (file.getType() == 2) { + vo.setIsParent(false); + } + return vo; + }).collect(Collectors.toList()); + } + + @Override + public int updateContent(HeraFile heraFile) { + return heraFileMapper.updateContent(heraFile); + } + + @Override + public int updateFileName(HeraFile heraFile) { + return heraFileMapper.updateFileName(heraFile); + } + + @Override + public HeraFile findDocByOwner(String owner) { + return heraFileMapper.findDocByOwner(owner); + } + + @Override + public boolean updateParentById(Integer id, Integer parent) { + Integer update = heraFileMapper.updateParentById(id, parent); + return update != null && update > 0; + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraGroupMemoryServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraGroupMemoryServiceImpl.java new file mode 100755 index 00000000..369fbd94 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraGroupMemoryServiceImpl.java @@ -0,0 +1,63 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraGroup; +import com.dfire.common.entity.Judge; +import com.dfire.logs.HeraLog; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 对于集合类的大查找 走缓存 + * + * @author xiaosuda + * @date 2018/12/5 + */ +@Service("heraGroupMemoryService") +public class HeraGroupMemoryServiceImpl extends HeraGroupServiceImpl { + + private volatile Judge judge; + + private final Object lock = new Object(); + + private Map memoryJob; + + private Map getMemoryJob() { + Judge newJudge = heraGroupMapper.selectTableInfo(); + if (newJudge.getMaxId() == null || newJudge.getLastModified() == null || newJudge.getCount() == null) { + return new HashMap<>(0); + } + if (judge == null || !newJudge.getCount().equals(judge.getCount()) || !newJudge.getLastModified().equals(judge.getLastModified()) || !newJudge.getMaxId().equals(judge.getMaxId())) { + synchronized (lock) { + if (judge == null || !newJudge.getCount().equals(judge.getCount()) || !newJudge.getLastModified().equals(judge.getLastModified()) || !newJudge.getMaxId().equals(judge.getMaxId())) { + HeraLog.info("刷新hera_group库"); + judge = newJudge; + List all = heraGroupMapper.getAll(); + Map jobMap = new HashMap<>(all.size()); + all.forEach(group -> jobMap.put(group.getId(), group)); + memoryJob = jobMap; + } + } + } + judge.setStamp(new Date()); + return memoryJob; + } + + @Override + public List getAll() { + return new ArrayList<>(getMemoryJob().values()); + } + + + @Override + public List findByParent(Integer parentId) { + return getMemoryJob().values().stream().filter(group -> group.getExisted() == 1 && group.getParent().equals(parentId)).collect(Collectors.toList()); + } + + @Override + public List findByIds(List list) { + return getMemoryJob().values().stream().filter(group -> list.contains(group.getId())).collect(Collectors.toList()); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraGroupServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraGroupServiceImpl.java new file mode 100755 index 00000000..04cf0d74 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraGroupServiceImpl.java @@ -0,0 +1,129 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraGroup; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.model.HeraGroupBean; +import com.dfire.common.entity.model.HeraJobBean; +import com.dfire.common.mapper.HeraGroupMapper; +import com.dfire.common.service.HeraGroupService; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.util.BeanConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午5:02 2018/4/17 + * @desc + */ +@Service("heraGroupService") +public class HeraGroupServiceImpl implements HeraGroupService { + + @Autowired + protected HeraGroupMapper heraGroupMapper; + + @Autowired + private HeraJobService heraJobService; + + @Override + public HeraGroup getRootGroup() { + return this.findById(-1); + } + + @Override + public HeraJobBean getUpstreamJobBean(Integer jobId) { + HeraJob heraJob = heraJobService.findById(jobId); + if (heraJob != null) { + HeraJobBean jobBean = HeraJobBean.builder() + .heraJob(heraJob) + .build(); + jobBean.setGroupBean(getUpstreamGroupBean(heraJob.getGroupId())); + return jobBean; + } + return null; + } + + private HeraGroupBean getUpstreamGroupBean(Integer groupId) { + HeraGroup heraGroup = this.findById(groupId); + HeraGroupBean result = HeraGroupBean.builder() + .groupVo(BeanConvertUtils.convert(heraGroup)) + .build(); + if (heraGroup != null && heraGroup.getParent() != null) { + HeraGroupBean parentGroupBean = getUpstreamGroupBean(heraGroup.getParent()); + result.setParentGroupBean(parentGroupBean); + } + return result; + } + + + @Override + public int insert(HeraGroup heraGroup) { + return heraGroupMapper.insert(heraGroup); + } + + @Override + public int delete(int id) { + return heraGroupMapper.delete(id); + } + + @Override + public int update(HeraGroup heraGroup) { + return heraGroupMapper.update(heraGroup); + } + + @Override + public List getAll() { + return heraGroupMapper.getAll(); + } + + @Override + public HeraGroup findById(Integer id) { + return heraGroupMapper.findById(id); + } + + @Override + public List findByIds(List list) { + return heraGroupMapper.findByIds(list); + } + + @Override + public List findByParent(Integer parentId) { + return heraGroupMapper.findByParent(parentId); + } + + @Override + public List findByOwner(String owner) { + return heraGroupMapper.findByOwner(owner); + } + + @Override + public HeraGroup findConfigById(Integer id) { + return heraGroupMapper.selectConfigById(id); + } + + @Override + public boolean changeParent(Integer id, Integer parent) { + Integer update = heraGroupMapper.changeParent(id, parent); + return update != null && update > 0; + } + + @Override + public List findDownStreamGroup(Integer groupId) { + List res = new ArrayList<>(); + getDownStreamGroup(this.findById(groupId), res); + return res; + } + + private void getDownStreamGroup(HeraGroup heraGroup, List streamGroup) { + if (heraGroup.getDirectory() != 0) { + streamGroup.add(heraGroup); + return; + } + this.findByParent(heraGroup.getId()).forEach(group -> getDownStreamGroup(group, streamGroup)); + + + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraHeraAdviceServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraHeraAdviceServiceImpl.java new file mode 100755 index 00000000..82947759 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraHeraAdviceServiceImpl.java @@ -0,0 +1,32 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraAdvice; +import com.dfire.common.mapper.HeraAdviceMapper; +import com.dfire.common.service.HeraAdviceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/12/5 + */ +@Service("heraAdviceService") +public class HeraHeraAdviceServiceImpl implements HeraAdviceService { + + + @Autowired + private HeraAdviceMapper heraAdviceMapper; + + @Override + public boolean addAdvice(HeraAdvice heraAdvice) { + Integer res = heraAdviceMapper.insert(heraAdvice); + return res != null && res > 0; + } + + @Override + public List getAll() { + return heraAdviceMapper.getAll(); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraHostGroupServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraHostGroupServiceImpl.java new file mode 100755 index 00000000..331f478e --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraHostGroupServiceImpl.java @@ -0,0 +1,84 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraHostGroup; +import com.dfire.common.entity.HeraHostRelation; +import com.dfire.common.mapper.HeraHostGroupMapper; +import com.dfire.common.service.HeraHostRelationService; +import com.dfire.common.entity.vo.HeraHostGroupVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Service; +import com.dfire.common.service.HeraHostGroupService; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 22:26 2018/1/10 + * @desc + */ +@Service("heraHostGroupService") +public class HeraHostGroupServiceImpl implements HeraHostGroupService { + + + @Autowired + private HeraHostGroupMapper heraHostGroupMapper; + @Autowired + private HeraHostRelationService heraHostRelationService; + + @Override + public int insert(HeraHostGroup heraHostGroup) { + return heraHostGroupMapper.insert(heraHostGroup); + } + + @Override + public int delete(int id) { + return heraHostGroupMapper.delete(id); + } + + @Override + public int update(HeraHostGroup heraHostGroup) { + return heraHostGroupMapper.update(heraHostGroup); + } + + @Override + public List getAll() { + return heraHostGroupMapper.getAll(); + } + + @Override + public HeraHostGroup findById(int id) { + HeraHostGroup group = HeraHostGroup.builder().id(id).build(); + return heraHostGroupMapper.findById(group); + } + + @Override + public Map getAllHostGroupInfo() { + List groupList = this.getAll(); + Map hostGroupInfoMap = new HashMap<>(groupList.size()); + List relationList = heraHostRelationService.getAll(); + groupList.forEach(heraHostGroup -> { + if(heraHostGroup.getEffective() == 1) { + HeraHostGroupVo vo = HeraHostGroupVo.builder() + .id(String.valueOf(heraHostGroup.getId())) + .name(heraHostGroup.getName()) + .nextPos(0) + .description(heraHostGroup.getDescription()) + .build(); + List hosts = new ArrayList<>(); + relationList.forEach(heraHostRelation -> { + if(heraHostRelation.getHostGroupId() == (heraHostGroup.getId())) { + hosts.add(heraHostRelation.getHost()); + } + }); + vo.setHosts(hosts); + hostGroupInfoMap.put(heraHostGroup.getId(), vo); + } + }); + return hostGroupInfoMap; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraHostRelationServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraHostRelationServiceImpl.java new file mode 100755 index 00000000..27e163a2 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraHostRelationServiceImpl.java @@ -0,0 +1,51 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraHostRelation; +import com.dfire.common.mapper.HeraHostRelationMapper; +import com.dfire.common.service.HeraHostRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 17:08 2018/1/12 + * @desc + */ +@Service("heraHostRelationService") +public class HeraHostRelationServiceImpl implements HeraHostRelationService { + + @Autowired + private HeraHostRelationMapper heraHostRelationMapper; + + @Override + public int insert(HeraHostRelation heraHostRelation) { + return heraHostRelationMapper.insert(heraHostRelation); + } + + @Override + public int delete(int id) { + return heraHostRelationMapper.delete(id); + } + + @Override + public int update(HeraHostRelation heraHostRelation) { + return heraHostRelationMapper.update(heraHostRelation); + } + + @Override + public List getAll() { + return heraHostRelationMapper.getAll(); + } + + @Override + public HeraHostRelation findById(HeraHostRelation heraHostRelation) { + return heraHostRelationMapper.findById(heraHostRelation); + } + + @Override + public List findPreemptionGroup(int id) { + return heraHostRelationMapper.findPreemptionGroup(id); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobActionServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobActionServiceImpl.java new file mode 100755 index 00000000..5fe49f1a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobActionServiceImpl.java @@ -0,0 +1,321 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.kv.Tuple; +import com.dfire.common.mapper.HeraJobActionMapper; +import com.dfire.common.service.HeraJobActionService; +import com.dfire.common.service.HeraJobHistoryService; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.vo.GroupTaskVo; +import com.dfire.common.vo.JobStatus; +import com.dfire.logs.HeraLog; +import com.dfire.logs.ScheduleLog; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author: 凌霄 + * @time: Created in 下午3:43 2018/5/16 + * @desc + */ +@Service("heraJobActionService") +public class HeraJobActionServiceImpl implements HeraJobActionService { + + @Autowired + private HeraJobActionMapper heraJobActionMapper; + + @Autowired + @Qualifier("heraJobMemoryService") + private HeraJobService heraJobService; + + @Autowired + private HeraJobHistoryService heraJobHistoryService; + + + @Override + public List batchInsert(List heraActionList, Long nowAction) { + ScheduleLog.info("batchInsert-> batch size is :{}", heraActionList.size()); + List insertList = new ArrayList<>(); + for (HeraAction heraAction : heraActionList) { + //更新时单条更新 + //原因:批量更新时,在极端情况下,数据会有批量数据处理时间的buff + // 此时如果有其它地方修改了某条数据 会数据库中的数据被批量更新的覆盖 + if (isNeedUpdateAction(heraAction, nowAction)) { + update(heraAction); + } else { + insertList.add(heraAction); + } + } + if (insertList.size() != 0) { + heraJobActionMapper.batchInsert(insertList); + } + return heraActionList; + } + + /** + * 判断是更新该是修改 + * + * @param heraAction + * @return + */ + private boolean isNeedUpdateAction(HeraAction heraAction, Long nowAction) { + HeraAction action = heraJobActionMapper.findById(heraAction.getId()); + if (action != null) { + //如果该任务不是在运行中 + if (!StatusEnum.RUNNING.toString().equals(action.getStatus())) { + heraAction.setStatus(action.getStatus()); + heraAction.setHistoryId(action.getHistoryId()); + heraAction.setReadyDependency(action.getReadyDependency()); + heraAction.setGmtCreate(action.getGmtCreate()); + } else { + BeanUtils.copyProperties(action, heraAction); + } + heraAction.setGmtModified(new Date()); + return true; + } else { + if (heraAction.getId() < nowAction) { + heraAction.setStatus(StatusEnum.FAILED.toString()); + heraAction.setLastResult("生成action时,任务过时,直接设置为失败"); + HeraLog.info("生成action时,任务过时,直接设置为失败:" + heraAction.getId()); + } + } + return false; + + } + + @Override + public int insert(HeraAction heraAction, Long nowAction) { + if (isNeedUpdateAction(heraAction, nowAction)) { + return heraJobActionMapper.update(heraAction); + } else { + return heraJobActionMapper.insert(heraAction); + } + } + + @Override + public int delete(Long id) { + return heraJobActionMapper.delete(id); + } + + @Override + public int update(HeraAction heraAction) { + return heraJobActionMapper.update(heraAction); + } + + @Override + public List getAll() { + return heraJobActionMapper.getAll(); + } + + @Override + public HeraAction findById(Long actionId) { + return heraJobActionMapper.findById(actionId); + } + + @Override + public HeraAction findById(String actionId) { + return this.findById(Long.parseLong(actionId)); + } + + @Override + public HeraAction findLatestByJobId(Long jobId) { + return heraJobActionMapper.findLatestByJobId(jobId); + } + + @Override + public List findByJobId(Long jobId) { + return heraJobActionMapper.findByJobId(jobId); + } + + @Override + public int updateStatus(JobStatus jobStatus) { + HeraAction heraAction = findById(jobStatus.getActionId()); + heraAction.setGmtModified(new Date()); + HeraAction tmp = BeanConvertUtils.convert(jobStatus); + heraAction.setStatus(tmp.getStatus()); + heraAction.setReadyDependency(tmp.getReadyDependency()); + heraAction.setHistoryId(jobStatus.getHistoryId()); + return update(heraAction); + } + + @Override + public Tuple findHeraActionVo(Long actionId) { + HeraAction heraActionTmp = findById(actionId); + if (heraActionTmp == null) { + return null; + } + return BeanConvertUtils.convert(heraActionTmp); + } + + @Override + public JobStatus findJobStatus(Long actionId) { + Tuple tuple = findHeraActionVo(actionId); + return tuple.getTarget(); + } + + /** + * 根据jobId查询版本运行信息,只能是取最新版本信息 + * + * @param jobId + * @return + */ + @Override + public JobStatus findJobStatusByJobId(Long jobId) { + HeraAction heraAction = findLatestByJobId(jobId); + return findJobStatus(heraAction.getId()); + } + + @Override + public Integer updateStatus(Long id, String status) { + return heraJobActionMapper.updateStatus(id, status); + } + + @Override + public Integer updateStatusAndReadDependency(HeraAction heraAction) { + return heraJobActionMapper.updateStatusAndReadDependency(heraAction); + } + + @Override + public List getAfterAction(Long action) { + return heraJobActionMapper.selectAfterAction(action); + } + + @Override + public List getActionVersionByJobId(Long jobId) { + return heraJobActionMapper.getActionVersionByJobId(jobId); + } + + @Override + public List getNotRunScheduleJob() { + return heraJobActionMapper.getNotRunScheduleJob(); + } + + @Override + public List getFailedJob() { + return heraJobActionMapper.getFailedJob(); + } + + + @Override + public List findByJobIds(List idList, String startDate, String endDate, TablePageForm pageForm, String status) { + if (idList == null || idList.size() == 0) { + return null; + } + Map params = new HashMap<>(3); + + params.put("startDate", startDate); + params.put("endDate", endDate); + params.put("list", idList); + params.put("page", pageForm.getStartPos()); + params.put("limit", pageForm.getLimit()); + List actionList; + if (StringUtils.isBlank(status) || "all".equals(status)) { + params.put("status", null); + } else { + params.put("status", status); + } + + pageForm.setCount(heraJobActionMapper.findByJobIdsCount(params)); + actionList = heraJobActionMapper.findByJobIdsAndPage(params); + List res = new ArrayList<>(actionList.size()); + actionList.forEach(action -> { + GroupTaskVo taskVo = new GroupTaskVo(); + taskVo.setActionId(buildFont(String.valueOf(action.getId()), Constants.STATUS_NONE)); + taskVo.setJobId(buildFont(String.valueOf(action.getJobId()), Constants.STATUS_NONE)); + taskVo.setName(buildFont(action.getName(), Constants.STATUS_NONE)); + + if (action.getStatus() != null) { + taskVo.setStatus(buildFont(action.getStatus(), action.getStatus())); + } else { + taskVo.setStatus(buildFont("未执行", StatusEnum.FAILED.toString())); + } + taskVo.setLastResult(buildFont(action.getLastResult(), action.getLastResult())); + if (action.getScheduleType() == 0) { + taskVo.setReadyStatus(buildFont("独立任务", Constants.STATUS_NONE)); + } else { + String[] dependencies = action.getDependencies().split(Constants.COMMA); + StringBuilder builder = new StringBuilder(); + HeraAction heraAction; + for (String dependency : dependencies) { + heraAction = this.findById(Long.parseLong(dependency)); + if (heraAction != null) { + if (StatusEnum.SUCCESS.toString().equals(heraAction.getStatus())) { + builder.append(Constants.HTML_FONT_GREEN_LEFT).append("依赖任务:").append(dependency).append(",结束时间:").append(ActionUtil.getFormatterDate(ActionUtil.MON_MIN, heraAction.getStatisticEndTime())); + } else if (StatusEnum.RUNNING.toString().equals(heraAction.getStatus())) { + builder.append(Constants.HTML_FONT_BLUE_LEFT).append("依赖任务:").append(dependency).append(",执行中"); + } else if (StatusEnum.FAILED.toString().equals(heraAction.getStatus()) || StatusEnum.WAIT.toString().equals(heraAction.getStatus())) { + builder.append(Constants.HTML_FONT_RED_LEFT).append("依赖任务:").append(dependency).append(",执行失败"); + } else { + builder.append(Constants.HTML_FONT_RED_LEFT).append("依赖任务:").append(dependency).append(",未执行"); + } + } else { + builder.append(Constants.HTML_FONT_RED_LEFT).append("依赖任务:").append(dependency).append(",未找到"); + } + builder.append(Constants.HTML_FONT_RIGHT).append(Constants.HTML_NEW_LINE); + } + taskVo.setReadyStatus(builder.toString()); + } + res.add(taskVo); + }); + return res; + } + + @Override + public void deleteHistoryRecord(Integer beforeDay) { + heraJobActionMapper.deleteHistoryRecord(beforeDay); + } + + @Override + public void deleteAllHistoryRecord(Integer beforeDay) { + this.deleteHistoryRecord(beforeDay); + heraJobHistoryService.deleteHistoryRecord(beforeDay); + } + + @Override + public List findByStartAndEnd(Long startAction, Long endAction, Integer jobId, Integer limit) { + return heraJobActionMapper.selectByStartAndEnd(startAction, endAction, jobId, limit); + } + + @Override + public boolean deleteAction(long startAction, long endAction, Integer jobId) { + Integer integer = heraJobActionMapper.deleteAction(startAction, endAction, jobId); + return integer != null && integer > 0; + } + + @Override + public HeraAction findTodaySuccessByJobId(int jobId) { + return heraJobActionMapper.selectTodaySuccessByJobId(jobId); + } + + private String buildFont(String str, String type) { + if (type == null) { + return Constants.HTML_FONT_RED_LEFT + str + Constants.HTML_FONT_RIGHT; + } + + if (StatusEnum.RUNNING.toString().equals(type)) { + return Constants.HTML_FONT_BLUE_LEFT + str + Constants.HTML_FONT_RIGHT; + } + if (StatusEnum.SUCCESS.toString().equals(type)) { + return Constants.HTML_FONT_GREEN_LEFT + str + Constants.HTML_FONT_RIGHT; + } + if (StatusEnum.FAILED.toString().equals(type)) { + return Constants.HTML_FONT_RED_LEFT + str + Constants.HTML_FONT_RIGHT; + } + if (Constants.STATUS_NONE.equals(type)) { + return Constants.HTML_FONT_LEFT + str + Constants.HTML_FONT_RIGHT; + } + return Constants.HTML_FONT_RED_LEFT + str + Constants.HTML_FONT_RIGHT; + + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobHistoryServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobHistoryServiceImpl.java new file mode 100755 index 00000000..f0426aec --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobHistoryServiceImpl.java @@ -0,0 +1,172 @@ +package com.dfire.common.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.JobLogHistoryVo; +import com.dfire.common.entity.vo.PageHelperTimeRange; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.mapper.HeraJobHistoryMapper; +import com.dfire.common.service.HeraJobHistoryService; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.Pair; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author: 凌霄 + * @time: Created in 19:18 2018/1/12 + * @desc + */ +@Service("heraJobHistoryService") +public class HeraJobHistoryServiceImpl implements HeraJobHistoryService { + @Autowired + HeraJobHistoryMapper heraJobHistoryMapper; + + @Autowired + @Qualifier("heraJobMemoryService") + private HeraJobService heraJobService; + + + @Override + public int updateHeraJobHistoryLog(HeraJobHistory heraJobHistory) { + return heraJobHistoryMapper.updateHeraJobHistoryLog(heraJobHistory); + } + + @Override + public int updateHeraJobHistoryStatus(HeraJobHistory herajobhistory) { + return heraJobHistoryMapper.updateHeraJobHistoryStatus(herajobhistory); + } + + @Override + public int insert(HeraJobHistory heraJobHistory) { + return heraJobHistoryMapper.insert(heraJobHistory); + } + + @Override + public int delete(Long id) { + return heraJobHistoryMapper.delete(id); + } + + @Override + public int update(HeraJobHistory heraJobHistory) { + return heraJobHistoryMapper.update(heraJobHistory); + } + + @Override + public int updateProperties(HeraJobHistory heraJobHistory) { + return heraJobHistoryMapper.updateHeraJobHistoryProperties(heraJobHistory); + } + + @Override + public int updateStatusAndIllustrate(Long id, String status, String illustrate, Date endTime) { + return heraJobHistoryMapper.updateStatusAndIllustrate(id, status, illustrate, endTime); + } + + @Override + public List getAll() { + return heraJobHistoryMapper.getAll(); + } + + @Override + public HeraJobHistory findById(Long id) { + return heraJobHistoryMapper.findById(id); + } + + @Override + public List findByActionId(Long actionId) { + return heraJobHistoryMapper.findByActionId(actionId); + } + + @Override + public Integer updateHeraJobHistoryLogAndStatus(HeraJobHistory heraJobHistory) { + return heraJobHistoryMapper.updateHeraJobHistoryLogAndStatus(heraJobHistory); + } + + @Override + public List findByJobId(Long jobId) { + return heraJobHistoryMapper.findByJobId(jobId); + } + + @Override + public HeraJobHistory findLogById(Integer id) { + return heraJobHistoryMapper.selectLogById(id); + } + + @Override + public Map findLogByPage(PageHelperTimeRange pageHelperTimeRange) { + Map res = new HashMap<>(2); + Integer size; + List histories; + + if (pageHelperTimeRange.getJobType().equals("job")) { + size = heraJobHistoryMapper.selectCountByPageJob(pageHelperTimeRange); + histories = heraJobHistoryMapper.selectByPageJob(pageHelperTimeRange); + } else { + size = heraJobHistoryMapper.selectCountByPageGroup(pageHelperTimeRange); + histories = heraJobHistoryMapper.selectByPageGroup(pageHelperTimeRange); + } + histories.stream().filter(his -> StringUtils.isNotBlank(his.getTriggerType())).forEach(his -> his.setTriggerType(TriggerTypeEnum.parser(Integer.parseInt(his.getTriggerType())).toName())); + res.put("rows", histories); + res.put("total", size); + return res; + } + + @Override + public List findTodayJobHistory() { + return heraJobHistoryMapper.findTodayJobHistory(); + } + + @Override + public void deleteHistoryRecord(Integer beforeDay) { + heraJobHistoryMapper.deleteHistoryRecord(beforeDay); + } + + @Override + public HeraJobHistory findNewest(Integer jobId) { + return heraJobHistoryMapper.findNewest(jobId); + } + + + @Override + public HeraJobHistory findPropertiesById(Long id) { + return heraJobHistoryMapper.findPropertiesBy(id); + } + + + @Override + public Pair> findRerunFailed(Integer jobId, String rerunId, long actionId, TablePageForm pageForm) { + List rerunFailedIds = heraJobHistoryMapper.findRerunFailed(jobId, rerunId, actionId, pageForm.getStartPos(), pageForm.getLimit()); + HeraJob memById = heraJobService.findMemById(jobId); + List res = new ArrayList<>(); + for (HeraJobHistory rerunFailedId : rerunFailedIds) { + JSONObject object = new JSONObject(); + object.put("actionId", String.valueOf(rerunFailedId.getActionId())); + object.put("name", memById.getName()); + object.put("startTime", ActionUtil.getDefaultFormatterDate(rerunFailedId.getStartTime())); + object.put("endTime", ActionUtil.getDefaultFormatterDate(rerunFailedId.getEndTime())); + object.put("status", StatusEnum.FAILED.toString()); + res.add(object); + } + return Pair.of(heraJobHistoryMapper.findRerunFailedCount(jobId, rerunId, actionId), res); + } + + @Override + public List findRerunFailedIdsByLimit(Long lastId, Integer jobId, String rerunId, Integer limit) { + return heraJobHistoryMapper.findRerunFailedIdsByLimit(lastId, jobId, rerunId, limit); + } + + @Override + public Integer findRerunFailedCount(Integer jobId, String rerunId, long actionId) { + return heraJobHistoryMapper.findRerunFailedCount(jobId, rerunId, actionId); + } + + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobMemoryServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobMemoryServiceImpl.java new file mode 100755 index 00000000..061863bd --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobMemoryServiceImpl.java @@ -0,0 +1,71 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.Judge; +import com.dfire.logs.HeraLog; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 内存级别缓存job信息 + * + * @author xiaosuda + * @date 2018/12/3 + */ +@Service("heraJobMemoryService") +public class HeraJobMemoryServiceImpl extends HeraJobServiceImpl { + + private volatile Judge judge; + + private Map memoryJob; + + private Map getMemoryJob() { + Judge newJudge = heraJobMapper.selectTableInfo(); + if (newJudge.getMaxId() == null || newJudge.getLastModified() == null || newJudge.getCount() == null) { + return new HashMap<>(0); + } + if (judge == null || !newJudge.getCount().equals(judge.getCount()) || !newJudge.getLastModified().equals(judge.getLastModified()) || !newJudge.getMaxId().equals(judge.getMaxId())) { + synchronized (this) { + if (judge == null || !newJudge.getCount().equals(judge.getCount()) || !newJudge.getLastModified().equals(judge.getLastModified()) || !newJudge.getMaxId().equals(judge.getMaxId())) { + HeraLog.info("刷新hera_job库"); + judge = newJudge; + List all = heraJobMapper.getAll(); + Map jobMap = new HashMap<>(all.size()); + all.forEach(job -> jobMap.put(job.getId(), job)); + memoryJob = jobMap; + } + } + } + judge.setStamp(new Date()); + return memoryJob; + } + + + @Override + public List getAll() { + return new ArrayList<>(getMemoryJob().values()); + } + + + @Override + public HeraJob findMemById(int id) { + if (memoryJob == null) { + memoryJob = getMemoryJob(); + } + return memoryJob.get(id); + } + + @Override + public List findByIds(List list) { + List res = new ArrayList<>(); + Map memoryJob = getMemoryJob(); + list.forEach(id -> res.add(memoryJob.get(id))); + return res; + } + + @Override + public List getAllJobDependencies() { + return this.getAll(); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobMonitorServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobMonitorServiceImpl.java new file mode 100755 index 00000000..88179024 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobMonitorServiceImpl.java @@ -0,0 +1,101 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraJobMonitor; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.vo.HeraJobMonitorVo; +import com.dfire.common.mapper.HeraJobMonitorMapper; +import com.dfire.common.service.HeraJobMonitorService; +import com.dfire.common.service.HeraSsoService; +import com.dfire.common.util.ActionUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author xiaosuda + * @date 2018/8/1 + */ +@Service +public class HeraJobMonitorServiceImpl implements HeraJobMonitorService { + + @Autowired + private HeraJobMonitorMapper heraJobMonitorMapper; + + @Autowired + private HeraSsoService heraSsoService; + + @Override + public boolean addMonitor(String userId, Integer jobId) { + HeraJobMonitor res = heraJobMonitorMapper.findByJobId(jobId); + HeraJobMonitor monitor = new HeraJobMonitor(); + monitor.setUserIds(userId.endsWith(Constants.COMMA) ? userId : userId + Constants.COMMA); + monitor.setJobId(jobId); + //插入 + if (res == null) { + Integer insert = heraJobMonitorMapper.insert(monitor); + return insert != null && insert > 0; + } else { //更新 + Integer update = heraJobMonitorMapper.insertUser(monitor); + return update != null && update > 0; + } + } + + @Override + public boolean removeMonitor(String userId, Integer jobId) { + HeraJobMonitor oldMonitor = heraJobMonitorMapper.findByJobId(jobId); + StringBuilder newMonitor = new StringBuilder(); + Arrays.stream(oldMonitor.getUserIds().split(Constants.COMMA)).forEach(id -> { + if (!id.equals(userId)) { + newMonitor.append(id).append(Constants.COMMA); + } + }); + Integer res = heraJobMonitorMapper.update(jobId, newMonitor.toString()); + return res != null && res > 0; + } + + @Override + public HeraJobMonitor findByJobId(Integer jobId) { + return heraJobMonitorMapper.findByJobId(jobId); + } + + @Override + public Set getMonitorUser(Integer jobId) { + Set monitorUser = new HashSet<>(); + Optional.ofNullable(this.findByJobId(jobId)) + .map(HeraJobMonitor::getUserIds) + .ifPresent(ids -> Arrays.stream(ids.split(Constants.COMMA)) + .filter(StringUtils::isNotBlank) + .forEach(id -> { + Optional.ofNullable(heraSsoService.findSsoById(Integer.parseInt(id))) + .ifPresent(monitorUser::add); + })); + return monitorUser; + } + + @Override + public List findAll() { + return heraJobMonitorMapper.selectAll(); + } + + @Override + public List findAllVo() { + return heraJobMonitorMapper.selectAllVo(); + } + + @Override + public boolean updateMonitor(String userIds, Integer jobId) { + if (StringUtils.isNotBlank(userIds)) { + userIds = userIds.endsWith(Constants.COMMA) ? userIds : userIds + Constants.COMMA; + } + Integer update = heraJobMonitorMapper.update(jobId, userIds); + return update != null && update > 0; + } + + @Override + public List findBySsoId(Integer ssoId) { + return heraJobMonitorMapper.selectByUser(ssoId); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobServiceImpl.java new file mode 100755 index 00000000..4bd75194 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraJobServiceImpl.java @@ -0,0 +1,535 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraGroup; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.entity.vo.HeraJobTreeNodeVo; +import com.dfire.common.enums.RunAuthType; +import com.dfire.common.mapper.HeraJobMapper; +import com.dfire.common.service.HeraGroupService; +import com.dfire.common.service.HeraJobHistoryService; +import com.dfire.common.service.HeraJobMonitorService; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.DagLoopUtil; +import com.dfire.graph.DirectionGraph; +import com.dfire.graph.Edge; +import com.dfire.graph.GraphNode; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author xiaosuda + * @date 2018/11/7 + */ +@Service("heraJobService") +public class HeraJobServiceImpl implements HeraJobService { + + @Autowired + protected HeraJobMapper heraJobMapper; + @Autowired + @Qualifier("heraGroupMemoryService") + private HeraGroupService groupService; + @Autowired + private HeraJobHistoryService heraJobHistoryService; + + @Autowired + private HeraJobMonitorService heraJobMonitorService; + + @Override + public int insert(HeraJob heraJob) { + heraJob.setAuto(0); + heraJob.setIsValid(1); + return heraJobMapper.insert(heraJob); + } + + @Override + public int delete(int id) { + return heraJobMapper.delete(id); + } + + @Override + public Integer update(HeraJob heraJob) { + return heraJobMapper.update(heraJob); + } + + @Override + public List getAll() { + return heraJobMapper.getAll(); + } + + @Override + public HeraJob findById(int id) { + return heraJobMapper.findById(id); + } + + @Override + public Integer findMustEndMinute(int id) { + return heraJobMapper.findMustEndMinute(id); + } + + @Override + public List findEstimatedEndHours(int startTime, int endTime) { + return heraJobMapper.findEstimatedEndHours(startTime, endTime); + } + + @Override + public HeraJob findMemById(int id) { + return this.findById(id); + } + + @Override + public List findByIds(List list) { + return heraJobMapper.findByIds(list); + } + + @Override + public List findByPid(int groupId) { + return heraJobMapper.findByPid(groupId); + } + + @Override + public Map> buildJobTree(String owner, Integer ssoId) { + Map> treeMap = new HashMap<>(2); + List groups = Optional.of(groupService.getAll()).get(); + List jobs = Optional.of(getAll()).get(); + Map groupMap = new HashMap<>(groups.size()); + List myGroupList = new ArrayList<>(); + // 建立所有任务的树 + List allNodes = groups.stream() + .filter(group -> group.getExisted() == 1) + .map(g -> { + HeraJobTreeNodeVo groupNodeVo = HeraJobTreeNodeVo.builder() + .id(Constants.GROUP_PREFIX + g.getId()) + .parent(Constants.GROUP_PREFIX + g.getParent()) + .directory(g.getDirectory()) + .isParent(true) + .jobId(g.getId()) + .jobName(g.getName()) + .name(g.getName() + Constants.LEFT_BRACKET + g.getId() + Constants.RIGHT_BRACKET) + .build(); + if (owner.equals(g.getOwner())) { + myGroupList.add(groupNodeVo); + } + groupMap.put(groupNodeVo.getId(), groupNodeVo); + return groupNodeVo; + }) + .collect(Collectors.toList()); + Set myGroupSet = new HashSet<>(); + //建立我的任务的树 + List myNodeVos = new ArrayList<>(); + Set myJobIds = new HashSet<>(heraJobMonitorService.findBySsoId(ssoId)); + jobs.stream().filter(job -> job.getIsValid() == 1).forEach(job -> { + HeraJobTreeNodeVo build = HeraJobTreeNodeVo.builder() + .id(String.valueOf(job.getId())) + .parent(Constants.GROUP_PREFIX + job.getGroupId()) + .isParent(false) + .jobId(job.getId()) + .jobName(job.getName()) + .name(job.getName() + Constants.LEFT_BRACKET + job.getId() + Constants.RIGHT_BRACKET) + .build(); + allNodes.add(build); + if (myJobIds.contains(job.getId())) { + getPathGroup(myGroupSet, build.getParent(), groupMap); + myNodeVos.add(build); + } + }); + myGroupList.forEach(treeNode -> getPathGroup(myGroupSet, treeNode.getId(), groupMap)); + myNodeVos.addAll(myGroupSet); + //根据名称排序 + allNodes.sort(Comparator.comparing(HeraJobTreeNodeVo::getName)); + myNodeVos.sort(Comparator.comparing(HeraJobTreeNodeVo::getName)); + treeMap.put("myJob", myNodeVos); + treeMap.put("allJob", allNodes); + return treeMap; + } + + /** + * 递归获得父目录 + * + * @param myGroupSet 结果集 + * @param group 当前group + * @param allGroupMap 所有组map + */ + private void getPathGroup(Set myGroupSet, String group, Map allGroupMap) { + HeraJobTreeNodeVo groupNode = allGroupMap.get(group); + if (groupNode == null || myGroupSet.contains(groupNode)) { + return; + } + myGroupSet.add(groupNode); + getPathGroup(myGroupSet, groupNode.getParent(), allGroupMap); + } + + @Override + public boolean changeSwitch(Integer id, Integer status) { + Integer res = heraJobMapper.updateSwitch(id, status); + return res != null && res > 0; + } + + @Override + public Map findCurrentJobGraph(int jobId, Integer type) { + Map historyMap = buildHistoryMap(); + HeraJob nodeJob = findById(jobId); + if (nodeJob == null) { + return null; + } + GraphNode graphNode1 = historyMap.get(nodeJob.getId() + ""); + String remark = ""; + if (graphNode1 != null) { + remark = (String) graphNode1.getRemark(); + } + GraphNode graphNode = new GraphNode<>(nodeJob.getAuto(), nodeJob.getId(), "任务ID:" + jobId + "\n任务名称:" + nodeJob.getName() + remark, nodeJob.getName()); + return buildCurrJobGraph(historyMap, graphNode, getDirectionGraph(), type); + } + + @Override + public List findJobImpact(int jobId, Integer type) { + Set check = new HashSet<>(); + List res = new ArrayList<>(); + check.add(jobId); + res.add(jobId); + DirectionGraph graph = getDirectionGraph(); + + Queue> nodeQueue = new LinkedList<>(); + GraphNode node = new GraphNode<>(jobId, "",""); + nodeQueue.add(node); + List graphNodes; + Map> indexMap = graph.getIndexMap(); + GraphNode graphNode; + Set vis = new HashSet<>(); + while (!nodeQueue.isEmpty()) { + node = nodeQueue.remove(); + graphNodes = getNodes(node, graph, vis, type); + if (graphNodes == null) { + continue; + } + for (Integer integer : graphNodes) { + graphNode = indexMap.get(integer); + if (!check.contains(graphNode.getNodeName())) { + check.add(graphNode.getNodeName()); + res.add(graphNode.getNodeName()); + nodeQueue.add(graphNode); + } + + } + } + return res; + } + + + private List getNodes(GraphNode node, DirectionGraph graph, Set vis, Integer type) { + Integer index = graph.getNodeIndex(node); + if (index == null) { + return null; + } + if (vis.contains(index)) { + return null; + } + vis.add(index); + ArrayList graphNodes; + if (type == 0) { + graphNodes = graph.getSrcEdge()[index]; + } else { + graphNodes = graph.getTarEdge()[index]; + } + return graphNodes; + } + + @Override + public List findDownStreamJob(Integer jobId) { + return this.getStreamTask(jobId, true); + } + + @Override + public List findUpStreamJob(Integer jobId) { + return this.getStreamTask(jobId, false); + + } + + @Override + public List getAllJobDependencies() { + return heraJobMapper.getAllJobRelations(); + } + + @Override + public boolean changeParent(Integer newId, Integer parentId) { + Integer update = heraJobMapper.changeParent(newId, parentId); + return update != null && update > 0; + } + + @Override + public boolean isRepeat(Integer jobId) { + Integer repeat = heraJobMapper.findRepeat(jobId); + return repeat != null && repeat > 0; + } + + @Override + public Integer updateScript(Integer id, String script) { + return heraJobMapper.updateScript(id, script); + } + + @Override + public Integer selectMaxId() { + return heraJobMapper.selectMaxId(); + } + + + + /** + * 建立今日任务执行 Map映射 便于获取 + * + * @return Map + */ + private Map buildHistoryMap() { + List actionHistories = heraJobHistoryService.findTodayJobHistory(); + Map map = new HashMap<>(actionHistories.size()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (HeraJobHistory actionHistory : actionHistories) { + String start = "none", end = "none", status, jobId, duration; + status = actionHistory.getStatus() == null ? "none" : actionHistory.getStatus(); + jobId = actionHistory.getJobId() + ""; + duration = "none"; + if (actionHistory.getStartTime() != null) { + start = sdf.format(actionHistory.getStartTime()); + if (actionHistory.getEndTime() != null) { + duration = (actionHistory.getEndTime().getTime() - actionHistory.getStartTime().getTime()) / 1000 + "s"; + end = sdf.format(actionHistory.getEndTime()); + } + } + HeraJob job = findById(actionHistory.getJobId()); + GraphNode node = new GraphNode<>(Integer.parseInt(jobId), + "任务状态:" + status + "\n" + + "执行时间:" + start + "\n" + + "结束时间:" + end + "\n" + + "耗时:" + duration + "\n" + ,job.getName() + ); + + map.put(actionHistory.getJobId() + "", node); + } + return map; + } + + private DirectionGraph getDirectionGraph() { + return this.buildJobGraph(); + } + + + /** + * 获得上下游的任务 + * + * @param jobId 任务id + * @param down 是否为下游 + * @return + */ + + private List getStreamTask(Integer jobId, boolean down) { + GraphNode head = new GraphNode<>(); + head.setNodeName(jobId); + DirectionGraph graph = this.getDirectionGraph(); + Integer headIndex = graph.getNodeIndex(head); + Queue nodeQueue = new LinkedList<>(); + if (headIndex != null) { + nodeQueue.add(headIndex); + } + ArrayList graphNodes; + Map> indexMap = graph.getIndexMap(); + List jobList = new ArrayList<>(); + Set vis = new HashSet<>(); + while (!nodeQueue.isEmpty()) { + headIndex = nodeQueue.remove(); + if (vis.contains(headIndex)) { + continue; + } + vis.add(headIndex); + if (down) { + graphNodes = graph.getTarEdge()[headIndex]; + } else { + graphNodes = graph.getSrcEdge()[headIndex]; + } + if (graphNodes == null || graphNodes.size() == 0) { + continue; + } + + for (Integer graphNode : graphNodes) { + nodeQueue.add(graphNode); + jobList.add(indexMap.get(graphNode).getNodeName()); + } + } + + List res = new ArrayList<>(); + for (Integer id : jobList) { + res.add(this.findById(id)); + } + return res; + } + + /** + * @param historyMap 宙斯任务历史运行任务map + * @param node 当前头节点 + * @param graph 所有任务的关系图 + * @param type 展示类型 0:任务进度分析 1:影响分析 + */ + private Map buildCurrJobGraph(Map historyMap, GraphNode node, DirectionGraph graph, Integer type) { + String start = "标识节点"; + Map res = new HashMap<>(2); + List edgeList = new ArrayList<>(); + Queue> nodeQueue = new LinkedList<>(); + GraphNode headNode = new GraphNode<>(0, start,start); + res.put("headNode", headNode); + nodeQueue.add(node); + edgeList.add(new Edge(headNode, node)); + List graphNodes; + Map> indexMap = graph.getIndexMap(); + GraphNode graphNode; + Set vis = new HashSet<>(); + while (!nodeQueue.isEmpty()) { + node = nodeQueue.remove(); + graphNodes = getNodes(node, graph, vis, type); + if (graphNodes == null) { + continue; + } + for (Integer integer : graphNodes) { + graphNode = indexMap.get(integer); + GraphNode graphNode1 = historyMap.get(graphNode.getNodeName() + ""); + if (graphNode1 == null) { + graphNode1 = new GraphNode<>(graphNode.getAuto(), graphNode.getNodeName(), "" + graphNode.getRemark(),graphNode.getDescName()); + } else { + graphNode1 = new GraphNode<>(graphNode.getAuto(), graphNode.getNodeName(), "" + graphNode.getRemark() + graphNode1.getRemark(),graphNode.getDescName()); + } + edgeList.add(new Edge(node, graphNode1)); + nodeQueue.add(graphNode1); + } + } + res.put("edges", edgeList); + return res; + } + + + /** + * 定时调用的任务图 + * + * @return DirectionGraph + */ + + public DirectionGraph buildJobGraph() { + List list = this.getAllJobDependencies(); + Map map = new HashMap<>(list.size()); + Map parentAutoMap = new HashMap<>(list.size()); + for (HeraJob job : list) { + map.put(job.getId(), job.getName()); + parentAutoMap.put(job.getId(), job.getAuto()); + } + int pid, id; + String dependencies; + DirectionGraph directionGraph = new DirectionGraph<>(); + for (HeraJob job : list) { + id = job.getId(); + dependencies = job.getDependencies(); + if (StringUtils.isBlank(dependencies)) { + continue; + } + String[] parents = dependencies.split(Constants.COMMA); + for (String parent : parents) { + pid = Integer.parseInt(parent); + if (map.get(pid) == null) { + continue; + } + GraphNode graphNodeBegin = new GraphNode<>(job.getAuto(), id, "任务ID:" + id + "\n任务名称:" + map.get(id) + "\n",job.getName()); + GraphNode graphNodeEnd = new GraphNode<>(parentAutoMap.get(pid), pid, "任务ID:" + pid + "\n任务名称:" + map.get(pid) + "\n",map.get(pid)); + directionGraph.addNode(graphNodeBegin); + directionGraph.addNode(graphNodeEnd); + directionGraph.addEdge(graphNodeBegin, graphNodeEnd); + } + } + + return directionGraph; + } + + @Override + public String checkDependencies(Integer id, RunAuthType type) { + List allJobs = this.getAllJobDependencies(); + if (type == RunAuthType.GROUP) { + + HeraGroup heraGroup = groupService.findById(id); + if (heraGroup == null) { + return "组不存在"; + } else if (heraGroup.getDirectory() == 1) { + //如果是小目录 + List jobList = this.findByPid(id).stream() + .filter(job -> job.getIsValid() == 1) + .collect(Collectors.toList()); + if (jobList.size() == 0) { + return null; + } + StringBuilder openJob = new StringBuilder("无法删除存在任务的目录:[ "); + for (HeraJob job : jobList) { + openJob.append(job.getId()).append(" "); + } + openJob.append("]"); + return openJob.toString(); + } else { + //如果是大目录 + List parent = groupService.findByParent(id).stream() + .filter(group -> group.getExisted() == 1) + .collect(Collectors.toList()); + if (parent.size() == 0) { + return null; + } + StringBuilder openGroup = new StringBuilder("无法删除存在目录的目录:[ "); + for (HeraGroup group : parent) { + if (group.getExisted() == 1) { + openGroup.append(group.getId()).append(" "); + } + } + openGroup.append("]"); + return openGroup.toString(); + } + + } else { + HeraJob job = this.findById(id); + if (job.getAuto() == 1) { + return "无法删除正在开启的任务"; + } + boolean canDelete = true; + boolean isFirst = true; + String deleteJob = String.valueOf(job.getId()); + StringBuilder dependenceJob = new StringBuilder("任务依赖: "); + String[] dependenceJobs; + for (HeraJob allJob : allJobs) { + if (StringUtils.isNotBlank(allJob.getDependencies())) { + dependenceJobs = allJob.getDependencies().split(","); + for (String jobId : dependenceJobs) { + if (jobId.equals(deleteJob)) { + if (canDelete) { + canDelete = false; + } + if (isFirst) { + isFirst = false; + dependenceJob.append("[").append(job.getId()).append(" -> ").append(allJob.getId()).append(" "); + } else { + dependenceJob.append(allJob.getId()).append(" "); + } + break; + } + } + } + } + dependenceJob.append("]").append("\n"); + if (!canDelete) { + return dependenceJob.toString(); + } + return null; + } + } + + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraLockServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraLockServiceImpl.java new file mode 100755 index 00000000..0a2292e2 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraLockServiceImpl.java @@ -0,0 +1,47 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraLock; +import com.dfire.common.mapper.HeraLockMapper; +import com.dfire.common.service.HeraLockService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 14:29 2018/1/12 + * @desc hera_lock基于数据实现的分布式锁 + */ +@Service("heraLockService") +public class HeraLockServiceImpl implements HeraLockService { + + @Autowired + private HeraLockMapper heraLockMapper; + + + @Bean(name = "lock") + @Scope("prototype") + @Override + public HeraLock findBySubgroup(String group) { + return heraLockMapper.findBySubgroup(group); + } + + @Override + public Integer insert(HeraLock heraLock) { + return heraLockMapper.insert(heraLock); + } + + @Override + public int update(HeraLock heraLock) { + return heraLockMapper.update(heraLock); + } + + @Override + public Integer changeLock(String host, Date serverUpdate, Date gmtModified, String lastHost) { + return heraLockMapper.updateLock(host, serverUpdate, gmtModified, lastHost); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraPermissionServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraPermissionServiceImpl.java new file mode 100755 index 00000000..dc82f7fd --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraPermissionServiceImpl.java @@ -0,0 +1,50 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraPermission; +import com.dfire.common.mapper.HeraPermissionMapper; +import com.dfire.common.service.HeraPermissionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午3:42 2018/5/16 + * @desc + */ +@Service("heraPermissionService") +public class HeraPermissionServiceImpl implements HeraPermissionService { + + @Autowired + private HeraPermissionMapper permissionMapper; + + @Override + public int insert(HeraPermission heraPermission) { + heraPermission.setIsValid(1); + permissionMapper.insert(heraPermission); + return heraPermission.getId(); + } + + + @Override + public List findByTargetId(Integer targetId, String type, Integer isValid) { + return permissionMapper.findByTargetId(targetId, type, isValid); + } + + @Override + public HeraPermission findByCond(Integer id, String owner, String type) { + return permissionMapper.findByCond(id, owner, type); + } + + @Override + public Integer updateByUid(Integer id, String type, Integer isValid, String uId) { + return permissionMapper.updateByUid(id, type, isValid, uId); + } + + @Override + public Integer insertList(List permissions) { + return permissionMapper.insertList(permissions); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraProfileServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraProfileServiceImpl.java new file mode 100755 index 00000000..58257fce --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraProfileServiceImpl.java @@ -0,0 +1,37 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraProfile; +import com.dfire.common.entity.vo.HeraProfileVo; +import com.dfire.common.mapper.HeraProfileMapper; +import com.dfire.common.service.HeraProfileService; +import com.dfire.common.util.BeanConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: 凌霄 + * @time: Created in 19:23 2018/1/12 + * @desc + */ +@Service("heraProfileService") +public class HeraProfileServiceImpl implements HeraProfileService { + + @Autowired + private HeraProfileMapper heraProfileMapper; + + + @Override + public HeraProfileVo findByOwner(String owner) { + return null; + } + + @Override + public void insert(HeraProfile profile) { + + } + + @Override + public void update(HeraProfile profile) { + + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraRecordServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraRecordServiceImpl.java new file mode 100755 index 00000000..72cfafdf --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraRecordServiceImpl.java @@ -0,0 +1,58 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraRecord; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.PageHelper; +import com.dfire.common.mapper.HeraRecordMapper; +import com.dfire.common.service.HeraRecordService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.Pair; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * desc: + * + * @author scx + * @create 2019/07/16 + */ +@Service +public class HeraRecordServiceImpl implements HeraRecordService { + + + @Autowired + private HeraRecordMapper recordMapper; + + @Override + public boolean add(HeraRecord record) { + if (record.getContent() == null) { + record.setContent(""); + } + + record.setGmtModified(ActionUtil.getCurrentMillis()); + record.setGmtCreate(ActionUtil.getCurrentMillis()); + return recordMapper.insert(record) > 1; + } + + @Override + public Pair> selectByPage(TablePageForm pageForm) { + return Pair.of(recordMapper.allCount(), recordMapper.selectByPage(pageForm.getStartPos(), pageForm.getLimit())); + } + + @Override + public Pair> selectByPage(TablePageForm pageForm, Integer gid) { + return Pair.of(recordMapper.countByGid(gid), recordMapper.selectByGid(pageForm.getStartPos(), pageForm.getLimit(), gid)); + } + + @Override + public Map findPageByLogId(PageHelper pageHelper) { + Map res = new HashMap<>(2); + res.put("total", recordMapper.selectCountById(pageHelper.getJobId())); + res.put("rows", recordMapper.findPageByLogId(pageHelper.getOffset(), pageHelper.getPageSize(), pageHelper.getJobId())); + return res; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraRerunServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraRerunServiceImpl.java new file mode 100755 index 00000000..2f4190cc --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraRerunServiceImpl.java @@ -0,0 +1,138 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraRerun; +import com.dfire.common.entity.model.TablePageForm; +import com.dfire.common.entity.vo.HeraRerunVo; +import com.dfire.common.mapper.HeraRerunMapper; +import com.dfire.common.service.HeraRerunService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.Pair; +import com.dfire.common.util.StringUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * desc: + * + * @author scx + * @create 2019/11/25 + */ +@Service +public class HeraRerunServiceImpl implements HeraRerunService { + + + @Autowired + private HeraRerunMapper heraRerunMapper; + + @Override + public boolean add(HeraRerunVo heraRerunVo) { + HeraRerun rerun = this.getRerun(heraRerunVo); + rerun.setGmtCreate(System.currentTimeMillis()); + return heraRerunMapper.insert(this.getRerun(heraRerunVo)) > 0; + } + + @Override + public HeraRerun findById(Integer id) { + return heraRerunMapper.selectById(id); + } + + @Override + public HeraRerunVo findVoById(Integer id) { + return Optional.of(this.findById(id)) + .map(this::getVo) + .orElseThrow(() -> new NullPointerException("can not found hera_rerun record in db")); + } + + @Override + public boolean updateById(HeraRerun heraRerun) { + Integer res = heraRerunMapper.updateById(heraRerun); + return res != null && res > 0; + } + + @Override + public boolean updateById(HeraRerunVo heraRerunVo) { + return this.updateById(this.getRerun(heraRerunVo)); + } + + @Override + public boolean deleteById(Integer id) { + Integer res = heraRerunMapper.deleteById(id); + return res != null && res > 0; + } + + @Override + public Pair> findByPage(TablePageForm pageForm, Integer status) { + if(status == -1) { + return Optional.of(heraRerunMapper.selectAll(pageForm.getStartPos(), pageForm.getLimit())) + .map(rerunList -> Pair.of(heraRerunMapper.selectCount(), rerunList.stream().map(this::getVo).collect(Collectors.toList()))) + .orElseThrow(() -> new NullPointerException("can not found hera_rerun record in db")); + } + + return Optional.of(heraRerunMapper.selectAllByStatus(pageForm.getStartPos(), pageForm.getLimit(),status)) + .map(rerunList -> Pair.of(heraRerunMapper.selectCountByStatus(status), rerunList.stream().map(this::getVo).collect(Collectors.toList()))) + .orElseThrow(() -> new NullPointerException("can not found hera_rerun record in db")); + + + } + + @Override + public List findByEnd(Integer isEnd) { + return Optional.of(heraRerunMapper.selectByEnd(isEnd)) + .map(rerunList -> rerunList.stream().map(this::getVo).collect(Collectors.toList())) + .orElseThrow(() -> new NullPointerException("can not found hera_rerun record in db")); + } + + @Override + public HeraRerunVo findRecordByTime(Long millis, Integer jobId, int isEnd) { + return Optional.of(heraRerunMapper.selectRecordByTime(millis, jobId, isEnd)) + .map(this::getVo) + .orElseThrow(() -> new NullPointerException("can not found hera_rerun record in db")); + } + + @Override + public HeraRerunVo findByIdAndEnd(Integer jobId, int isEnd) { + return Optional.of(heraRerunMapper.selectByIdAndEnd(jobId, isEnd)) + .map(this::getVo) + .orElseThrow(() -> new NullPointerException("can not found hera_rerun record in db")); + } + + @Override + public Integer findCntByJob(Integer jobId, int isEnd) { + return heraRerunMapper.selectCountByJob(jobId, isEnd); + } + + private HeraRerunVo getVo(HeraRerun rerun) { + HeraRerunVo rerunVo = new HeraRerunVo(); + BeanUtils.copyProperties(rerun, rerunVo); + rerunVo.setEndTime(ActionUtil.getDefaultFormatterDate(new Date(rerun.getEndMillis()))); + rerunVo.setStartTime(ActionUtil.getDefaultFormatterDate(new Date(rerun.getStartMillis()))); + rerunVo.setGmtCreate(ActionUtil.getDefaultFormatterDate(new Date(rerun.getGmtCreate()))); + rerunVo.setExtra(StringUtil.convertStringToMap(rerun.getExtra())); + return rerunVo; + } + + private HeraRerun getRerun(HeraRerunVo heraRerunVo) { + HeraRerun rerun = new HeraRerun(); + BeanUtils.copyProperties(heraRerunVo, rerun); + if (StringUtils.isNotEmpty(heraRerunVo.getStartTime())) { + rerun.setStartMillis(ActionUtil.getMillisFromStrDate(heraRerunVo.getStartTime())); + } + if (StringUtils.isNotEmpty(heraRerunVo.getEndTime())) { + rerun.setEndMillis(ActionUtil.getMillisFromStrDate(heraRerunVo.getEndTime())); + } + if (StringUtils.isNotEmpty(heraRerunVo.getGmtCreate())) { + rerun.setGmtCreate(ActionUtil.getMillisFromStrDate(heraRerunVo.getGmtCreate())); + } + if (heraRerunVo.getExtra() != null) { + rerun.setExtra(StringUtil.convertMapToString(heraRerunVo.getExtra())); + } + return rerun; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraSsoServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraSsoServiceImpl.java new file mode 100755 index 00000000..96255cf5 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraSsoServiceImpl.java @@ -0,0 +1,77 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.vo.HeraSsoVo; +import com.dfire.common.mapper.HeraSsoMapper; +import com.dfire.common.service.HeraSsoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * desc: + * + * @author scx + * @create 2019/06/10 + */ +@Service +public class HeraSsoServiceImpl implements HeraSsoService { + + + @Autowired + private HeraSsoMapper heraSsoMapper; + + @Override + public boolean addSso(HeraSso heraSso) { + heraSso.setGmtModified(System.currentTimeMillis()); + heraSso.setIsValid(0); + Integer insert = heraSsoMapper.insert(heraSso); + return insert != null && insert > 0; + } + + @Override + public List getAll() { + return heraSsoMapper.selectAll(); + } + + @Override + public boolean deleteSsoById(Integer id) { + Integer delete = heraSsoMapper.delete(id); + return delete != null && delete > 0; + } + + @Override + public boolean updateHeraSsoById(HeraSso heraSso) { + heraSso.setGmtModified(System.currentTimeMillis()); + Integer update = heraSsoMapper.update(heraSso); + return update != null && update > 0; + } + + @Override + public HeraSso findSsoById(Integer id) { + return heraSsoMapper.findById(id); + } + + @Override + public HeraSsoVo findSsoVoById(Integer id) { + return heraSsoMapper.findSsoVoById(id); + } + + @Override + public HeraSso findSsoByName(String name) { + return heraSsoMapper.findByName(name); + } + + @Override + public boolean checkByName(String name) { + Integer exist = heraSsoMapper.checkExistByName(name); + return exist != 0 && exist >= 1; + } + + @Override + public boolean setValid(Integer id, Integer val) { + Integer integer = heraSsoMapper.updateValid(id, val, System.currentTimeMillis()); + return integer != null && integer > 0; + } +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/service/impl/HeraUserServiceImpl.java b/hera-common/src/main/java/com/dfire/common/service/impl/HeraUserServiceImpl.java new file mode 100755 index 00000000..d11fe26e --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/service/impl/HeraUserServiceImpl.java @@ -0,0 +1,77 @@ +package com.dfire.common.service.impl; + +import com.dfire.common.entity.HeraUser; +import com.dfire.common.mapper.HeraUserMapper; +import com.dfire.common.service.HeraUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 0:35 2017/12/30 + * @desc + */ +@Service("heraUserService") +public class HeraUserServiceImpl implements HeraUserService { + + @Autowired + private HeraUserMapper heraUserMapper; + + + @Override + public int insert(HeraUser heraUser) { + Date now = new Date(); + heraUser.setGmtCreate(now); + heraUser.setGmtModified(now); + return heraUserMapper.insert(heraUser); + } + + @Override + public int delete(Integer id) { + return heraUserMapper.delete(id); + } + + @Override + public boolean update(HeraUser heraUser) { + return heraUserMapper.update(heraUser) > 0; + } + + @Override + public List getAll() { + return heraUserMapper.getAll(); + } + + @Override + public HeraUser findById(Integer id) { + return heraUserMapper.findById(id); + } + + @Override + public HeraUser findByName(String name) { + HeraUser heraUser = HeraUser.builder().name(name).build(); + return heraUserMapper.getByName(heraUser); + } + + @Override + public List findByIds(List list) { + return heraUserMapper.findByIds(list); + } + + @Override + public int updateEffective(Integer id, String effective) { + return heraUserMapper.updateEffective(id, effective); + } + + @Override + public List findAllName() { + return heraUserMapper.getAllName(); + } + + @Override + public List getGroups() { + return heraUserMapper.selectGroups(); + } +} diff --git a/hera-common/src/main/java/com/dfire/common/util/ActionUtil.java b/hera-common/src/main/java/com/dfire/common/util/ActionUtil.java new file mode 100755 index 00000000..97820ade --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/ActionUtil.java @@ -0,0 +1,268 @@ +package com.dfire.common.util; + +import com.dfire.common.constants.Constants; +import com.dfire.common.kv.Tuple; +import com.dfire.logs.ErrorLog; +import org.apache.commons.lang.StringUtils; +import org.joda.time.DateTime; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * @author xiaosuda + * @date 2018/4/20 + */ +public class ActionUtil { + + public static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + /** + * 精确到分钟的时间 + */ + public static final String ACTION_MIN = "yyyyMMddHHmm"; + public static final String MON_MIN = "MM-dd HH:mm"; + /** + * ACTION 表达式 + */ + public static final String ACTION_CRON = "0 m H d M"; + + /** + * 当前时刻生成版本格式 + */ + public static final String ACTION_VERSION_CURR = "yyyyMMddHHmm000000"; + /** + * 当前小时版本格式 + */ + public static final String ACTION_VERSION_HOUR = "yyyyMMddHHmm000000"; + + /** + * 初始化今天凌晨的版本 + */ + public static final String ACTION_VERSION_INIT = "yyyyMMdd0000000000"; + /** + * 版本Action 前缀 + */ + public static final String ACTION_VERSION_PREFIX = "yyyy-MM-dd"; + + /** + * 当前时间戳 + */ + public static final String YYYY_MM_DD = "yyyy-MM-dd"; + + + /** + * 生成今天 Action版本的最晚时间 + */ + public static final int ACTION_CREATE_MAX_HOUR = 23; + + + /** + * 生成今天 Action版本的最早时间 + */ + public static final int ACTION_CREATE_MIN_HOUR = 6; + + + public static String getTodayString() { + return new DateTime().toString(DEFAULT_FORMAT); + } + + public static String getFormatterDate(String formatter, Date date) { + if (date == null) { + return ""; + } + SimpleDateFormat sdf = new SimpleDateFormat(formatter); + return sdf.format(date); + } + + public static String getDefaultFormatterDate(Date date) { + if (date == null) { + return ""; + } + SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_FORMAT); + return sdf.format(date); + } + + public static String getDefaultFormatterDate(Long millis) { + return getDefaultFormatterDate(new Date(millis)); + } + + + public static String getCurrActionVersion() { + return new DateTime().toString(ACTION_VERSION_CURR); + } + + public static String getCurrHourVersion() { + return new DateTime().toString(ACTION_VERSION_HOUR); + } + + public static Long getLongCurrActionVersion() { + return Long.parseLong(new DateTime().toString(ACTION_VERSION_CURR)); + } + + public static Long getActionByDateStr(String date) { + return Long.parseLong(new DateTime(getDateByDateStr(date, DEFAULT_FORMAT)).toString(ACTION_VERSION_CURR)); + } + + public static String getInitActionVersion() { + return new DateTime().toString(ACTION_VERSION_INIT); + + } + + public static String getActionVersionByDate(Date date) { + return new DateTime(date).toString(ACTION_VERSION_INIT); + + } + + public static String getActionVersionPrefix(Date nowTime) { + return new DateTime(nowTime).toString(ACTION_VERSION_PREFIX); + } + + public static String getCurrDate() { + return new DateTime().toString(YYYY_MM_DD); + } + + public static Tuple getNextDayString() { + DateTime dateTime = new DateTime().plusDays(1); + Tuple tuple = new Tuple<>(); + tuple.setSource(dateTime.toString(ACTION_VERSION_INIT)); + tuple.setTarget(dateTime.toDate()); + return tuple; + + } + + public static long string2Timestamp(String dateString, String timezone) + throws ParseException { + SimpleDateFormat df = new SimpleDateFormat(DEFAULT_FORMAT); + if ((timezone != null) && (!timezone.equals(""))) { + df.setTimeZone(TimeZone.getTimeZone(timezone)); + } + Date date1 = df.parse(dateString); + long temp = date1.getTime(); + return temp; + } + + public static long version2timestamp(Long version) throws ParseException { + String str = version.toString(); + String realStr = str.substring(0, 12); + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmm"); + Date parse = df.parse(realStr); + return parse.getTime(); + } + + public static Date longToDate(Long time) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DEFAULT_FORMAT); + String tmp = simpleDateFormat.format(time); + Date result = null; + try { + result = simpleDateFormat.parse(tmp); + } catch (ParseException e) { + ErrorLog.error("转换日期异常", e); + } + return result; + } + + public static boolean isCurrActionVersion(Long actionId) { + return ActionUtil.getCurrActionVersion().compareTo(String.valueOf(actionId)) <= 0; + } + + public static boolean isTodayActionVersion(String actionId) { + return ActionUtil.getInitActionVersion().compareTo(actionId) <= 0; + } + + public static boolean jobEquals(Long first, Long second) { + if (first == null || second == null) { + return false; + } + String actionA = String.valueOf(first); + String actionB = String.valueOf(second); + + + int lenA = actionA.length(); + int lenB = actionB.length(); + int len = 6; + if (lenA < len || lenB < len) { + return false; + } + return actionA.substring(lenA - len).equals(actionB.substring(lenB - len)); + } + + + public static Long getMillisFromStrDate(String date) { + return getDateByDateStr(date, DEFAULT_FORMAT).getTime(); + } + + public static Date getDateByDateStr(String date, String format) { + try { + return new SimpleDateFormat(format).parse(date); + } catch (ParseException e) { + throw new IllegalArgumentException("解析时间异常:" + date, e); + } + } + + public static Long getCurrentMillis() { + return System.currentTimeMillis(); + } + + public static Integer getJobId(String action) { + if (StringUtils.isBlank(action)) { + return null; + } + int actionLen = action.length(); + int len = 6; + if (actionLen < len) { + return null; + } + return Integer.parseInt(action.substring(actionLen - len)); + } + + public static Integer getJobId(Long action) { + return getJobId(String.valueOf(action)); + } + + /** + * 获取当前时间 的 下一天的版本 + * + * @return Long{201811290000000000} + */ + public static Long getLongNextDayActionVersion() { + return Long.parseLong(getNextDayActionVersion()); + } + + /** + * 获取当前时间 的 下一天的版本 + * + * @return String{201811290000000000} + */ + public static String getNextDayActionVersion() { + return new DateTime().plusDays(1).toString(ACTION_VERSION_INIT); + } + + + public static Long getMillisByAction(String actionId) { + return getDateByDateStr(String.valueOf(Long.parseLong(actionId) / 1000000), ACTION_MIN).getTime(); + } + + public static int hourToInt(String hour) { + String[] hours = hour.split(Constants.COLON); + if (hours.length != 2) { + throw new RuntimeException("时间格式错误:" + hour); + } + return Integer.parseInt(hours[0]) * 60 + Integer.parseInt(hours[1]); + } + + public static String intTOHour(int time) { + int hour = time / 60; + int minute = time % 60; + return (hour <= 9 ? "0" + hour : hour) + ":" + (minute <= 9 ? "0" + minute : minute); + } + + + public static Integer getHourOfDay() { + return new DateTime().getHourOfDay(); + } + + +} diff --git a/hera-common/src/main/java/com/dfire/common/util/BeanConvertUtils.java b/hera-common/src/main/java/com/dfire/common/util/BeanConvertUtils.java new file mode 100755 index 00000000..be874e7e --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/BeanConvertUtils.java @@ -0,0 +1,295 @@ +package com.dfire.common.util; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.*; +import com.dfire.common.entity.vo.*; +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.enums.JobScheduleTypeEnum; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.kv.Tuple; +import com.dfire.common.vo.JobStatus; +import com.dfire.common.vo.LogContent; +import com.dfire.logs.ErrorLog; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; + +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 上午10:52 2018/5/2 + * @desc + */ +public class BeanConvertUtils { + + public static HeraProfileVo convert(HeraProfile heraProfile) { + HeraProfileVo heraProfileVo = HeraProfileVo.builder().build(); + if (heraProfile.getHadoopConf() != null) { + heraProfileVo.setHadoopConf(StringUtil.convertStringToMap(heraProfile.getHadoopConf())); + } + BeanUtils.copyProperties(heraProfile, heraProfileVo); + return heraProfileVo; + } + + public static HeraProfile convert(HeraProfileVo heraProfileVo) { + HeraProfile heraProfile = HeraProfile.builder().build(); + if (heraProfileVo.getHadoopConf() != null) { + heraProfile.setHadoopConf(StringUtil.convertMapToString(heraProfileVo.getHadoopConf())); + } + BeanUtils.copyProperties(heraProfile, heraProfileVo); + return heraProfile; + } + + public static HeraJobHistoryVo convert(HeraJobHistory heraJobHistory) { + HeraJobHistoryVo heraJobHistoryVo = HeraJobHistoryVo.builder().build(); + BeanUtils.copyProperties(heraJobHistory, heraJobHistoryVo); + if (StringUtils.isBlank(heraJobHistory.getLog())) { + heraJobHistoryVo.setLog(new LogContent()); + } else { + heraJobHistoryVo.setLog(new LogContent(new StringBuffer(heraJobHistory.getLog()))); + } + heraJobHistoryVo.setProperties(StringUtil.convertStringToMap(heraJobHistory.getProperties())); + heraJobHistoryVo.setStatusEnum(StatusEnum.parse(heraJobHistory.getStatus())); + heraJobHistoryVo.setTriggerType(TriggerTypeEnum.parser(heraJobHistory.getTriggerType())); + heraJobHistoryVo.setHostGroupId(heraJobHistory.getHostGroupId()); + return heraJobHistoryVo; + + } + + public static HeraJobHistory convert(HeraJobHistoryVo jobHistoryVo) { + HeraJobHistory jobHistory = HeraJobHistory.builder().build(); + BeanUtils.copyProperties(jobHistoryVo, jobHistory); + jobHistory.setLog(jobHistoryVo.getLog().getContent()); + jobHistory.setStatus(jobHistoryVo.getStatusEnum() == null ? null : jobHistoryVo.getStatusEnum().toString()); + jobHistory.setProperties(StringUtil.convertMapToString(jobHistoryVo.getProperties())); + jobHistory.setTriggerType(jobHistoryVo.getTriggerType().getId()); + + return jobHistory; + } + + public static HeraDebugHistoryVo convert(HeraDebugHistory heraDebugHistory) { + HeraDebugHistoryVo heraJobHistoryVo = HeraDebugHistoryVo.builder().build(); + BeanUtils.copyProperties(heraDebugHistory, heraJobHistoryVo); + heraJobHistoryVo.setStatus(StatusEnum.parse(heraDebugHistory.getStatus())); + heraJobHistoryVo.setRunType(JobRunTypeEnum.parser(heraDebugHistory.getRunType())); + heraJobHistoryVo.setJobId(heraDebugHistory.getJobId()); + + if (heraDebugHistory.getStartTime() != null) { + heraJobHistoryVo.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(heraDebugHistory.getStartTime())); + } + if (heraDebugHistory.getEndTime() != null) { + heraJobHistoryVo.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(heraDebugHistory.getEndTime())); + } + if (heraDebugHistory.getGmtCreate() != null) { + heraJobHistoryVo.setGmtCreate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(heraDebugHistory.getGmtCreate())); + } + if (heraDebugHistory.getGmtModified() != null) { + heraJobHistoryVo.setGmtModified(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(heraDebugHistory.getGmtModified())); + } + if (StringUtils.isBlank(heraDebugHistory.getLog())) { + heraJobHistoryVo.setLog(new LogContent()); + } else { + heraJobHistoryVo.setLog(new LogContent(new StringBuffer(heraDebugHistory.getLog()))); + } + return heraJobHistoryVo; + + } + + public static HeraDebugHistory convert(HeraDebugHistoryVo jobHistoryVo) { + HeraDebugHistory jobHistory = HeraDebugHistory.builder().build(); + BeanUtils.copyProperties(jobHistoryVo, jobHistory); + jobHistory.setStatus(jobHistoryVo.getStatus().toString()); + jobHistory.setLog(jobHistoryVo.getLog().getContent()); + jobHistory.setRunType(jobHistoryVo.getRunType().toString()); + try { + if (jobHistoryVo.getStartTime() != null) { + jobHistory.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(jobHistoryVo.getStartTime())); + } + if (jobHistoryVo.getEndTime() != null) { + jobHistory.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(jobHistoryVo.getEndTime())); + } + if (jobHistoryVo.getGmtCreate() != null) { + jobHistory.setGmtCreate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(jobHistoryVo.getGmtCreate())); + } + if (jobHistoryVo.getGmtModified() != null) { + jobHistory.setGmtModified(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(jobHistoryVo.getGmtModified())); + } + } catch (Exception e) { + ErrorLog.error("解析日期异常", e); + } + return jobHistory; + } + + public static HeraJobVo convert(HeraJob heraJob) { + HeraJobVo heraJobVo = HeraJobVo.builder().build(); + BeanUtils.copyProperties(heraJob, heraJobVo); + heraJobVo.setConfigs(StringUtil.convertStringToMap(heraJob.getConfigs())); + heraJobVo.setPostProcessors(StringUtil.convertProcessorToList(heraJob.getPostProcessors())); + heraJobVo.setPreProcessors(StringUtil.convertProcessorToList(heraJob.getPreProcessors())); + heraJobVo.setResources(StringUtil.convertResources(heraJob.getResources())); + heraJobVo.setAuto(heraJob.getAuto() == 1 ? Constants.OPEN_STATUS : heraJob.getAuto() == 0 ? Constants.CLOSE_STATUS : Constants.INVALID_STATUS); + heraJobVo.setDependencies(heraJob.getDependencies()); + heraJobVo.setRunType(JobRunTypeEnum.parser(heraJob.getRunType())); + heraJobVo.setEstimatedEndHour(ActionUtil.intTOHour(heraJob.getEstimatedEndHour())); + return heraJobVo; + } + + /** + * job -> jobAction + * + * @param heraJobVo + * @return + */ + public static HeraAction convert(HeraJobVo heraJobVo) { + HeraAction heraAction = HeraAction.builder().build(); + BeanUtils.copyProperties(heraJobVo, heraAction); + heraAction.setPostProcessors(StringUtil.convertProcessorToList(heraJobVo.getPostProcessors())); + heraAction.setPreProcessors(StringUtil.convertProcessorToList(heraJobVo.getPreProcessors())); + heraAction.setResources(StringUtil.convertResourceToString(heraJobVo.getResources())); + heraAction.setConfigs(StringUtil.convertMapToString(heraJobVo.getConfigs())); + return heraAction; + } + + + /** + * job中jobVo为对应的版本id + * + * @param job + * @return + */ + public static HeraAction convert(Tuple job) { + if (job == null) { + return null; + } + HeraAction heraAction = convert(job.getSource()); + HeraAction action = convert(job.getTarget()); + heraAction.setReadyDependency(action.getReadyDependency()); + heraAction.setStatus(action.getStatus()); + heraAction.setHistoryId(action.getHistoryId()); + return heraAction; + } + + public static Tuple convert(HeraAction action) { + HeraActionVo heraActionVo = transform(action); + JobStatus jobStatus = JobStatus.builder().build(); + jobStatus.setActionId(action.getId()); + jobStatus.setHistoryId(action.getHistoryId()); + jobStatus.setStatus(StatusEnum.parse(action.getStatus())); + jobStatus.setReadyDependency(StringUtil.convertStringToMap(action.getReadyDependency())); + return new Tuple<>(heraActionVo, jobStatus); + + } + + /** + * action 版本转为job + * + * @param action + * @return + */ + public static HeraActionVo transform(HeraAction action) { + Integer auto = 1; + HeraActionVo heraActionVo = HeraActionVo.builder().build(); + BeanUtils.copyProperties(action, heraActionVo); + if (action.getDependencies() != null && !StringUtils.isBlank(action.getDependencies())) { + heraActionVo.setDependencies(Arrays.stream(action.getDependencies().split(Constants.COMMA)).map(Long::parseLong).collect(Collectors.toList())); + } + if (action.getJobDependencies() != null && !StringUtils.isBlank(action.getJobDependencies())) { + heraActionVo.setJobDependencies(Arrays.stream(action.getJobDependencies().split(Constants.COMMA)).map(Long::parseLong).collect(Collectors.toList())); + } + heraActionVo.setPostProcessors(StringUtil.convertProcessorToList(action.getPostProcessors())); + heraActionVo.setPreProcessors(StringUtil.convertProcessorToList(action.getPreProcessors())); + heraActionVo.setResources(StringUtil.convertResources(action.getResources())); + try { + heraActionVo.setConfigs(StringUtil.convertStringToMap(action.getConfigs())); + } catch (RuntimeException e) { + ErrorLog.error("json parse error on " + action.getId(), e); + } + heraActionVo.setRunType(JobRunTypeEnum.parser(action.getRunType())); + heraActionVo.setScheduleType(JobScheduleTypeEnum.parser(action.getScheduleType())); + heraActionVo.setId(action.getId()); + if (action.getAuto().equals(auto)) { + heraActionVo.setAuto(true); + } else { + heraActionVo.setAuto(false); + } + return heraActionVo; + } + + public static HeraAction convert(JobStatus jobStatus) { + HeraAction heraAction = HeraAction.builder().build(); + + if (jobStatus == null) { + return heraAction; + } + + heraAction.setId(jobStatus.getActionId()); + heraAction.setStatus(jobStatus.getStatus() == null ? null : jobStatus.getStatus().toString()); + heraAction.setHistoryId(jobStatus.getHistoryId()); + heraAction.setStartTime(jobStatus.getStartTime()); + heraAction.setLastEndTime(jobStatus.getEndTime()); + heraAction.setReadyDependency(StringUtil.convertMapToString(jobStatus.getReadyDependency())); + return heraAction; + } + + + public static HeraJob convertToHeraJob(HeraJobVo heraJobVo) { + HeraJob heraJob = new HeraJob(); + BeanUtils.copyProperties(heraJobVo, heraJob); + Map configs = new HashMap<>(64); + configs.put("roll.back.times", heraJobVo.getRollBackTimes()); + configs.put("roll.back.wait.time", heraJobVo.getRollBackWaitTime()); + configs.put("run.priority.level", heraJobVo.getRunPriorityLevel()); + Optional selfConfigs = Optional.ofNullable(heraJobVo.getSelfConfigs()); + selfConfigs.ifPresent(s -> { + stringToMap(s, configs); + heraJob.setConfigs(StringUtil.convertMapToString(configs)); + }); + heraJob.setEstimatedEndHour(ActionUtil.hourToInt(heraJobVo.getEstimatedEndHour())); + heraJob.setRunType(heraJobVo.getRunType().toString()); + return heraJob; + } + + public static HeraGroupVo convert(HeraGroup heraGroup) { + HeraGroupVo heraGroupVo = HeraGroupVo.builder().build(); + if (heraGroup == null) { + return heraGroupVo; + } + BeanUtils.copyProperties(heraGroup, heraGroupVo); + heraGroupVo.setConfigs(StringUtil.convertStringToMap(heraGroup.getConfigs())); + heraGroupVo.setResources(new ArrayList<>()); + if (heraGroup.getResources() != null) { + heraGroupVo.setResources(StringUtil.convertResources(heraGroup.getResources())); + } + heraGroupVo.setExisted(heraGroup.getExisted() == 1); + return heraGroupVo; + } + + public static HeraGroup convert(HeraGroupVo groupVo) { + HeraGroup heraGroup = new HeraGroup(); + BeanUtils.copyProperties(groupVo, heraGroup); + Map configs = new HashMap<>(); + Optional selfConfigs = Optional.ofNullable(groupVo.getSelfConfigs()); + selfConfigs.ifPresent(s -> { + stringToMap(s, configs); + heraGroup.setConfigs(StringUtil.convertMapToString(configs)); + }); + heraGroup.setResources(StringUtil.convertResourceToString(groupVo.getResources())); + + return heraGroup; + } + + public static void stringToMap(String str, Map configs) { + str = str.trim(); + String[] split = str.split("\n"); + Arrays.stream(split).forEach(x -> { + int index = x.indexOf("="); + if (index != -1) { + configs.put(x.substring(0, index).trim(), x.substring(index + 1, x.length()).trim()); + } + }); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/util/DagLoopUtil.java b/hera-common/src/main/java/com/dfire/common/util/DagLoopUtil.java new file mode 100755 index 00000000..25dc6990 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/DagLoopUtil.java @@ -0,0 +1,120 @@ +package com.dfire.common.util; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/7/10 + */ +public class DagLoopUtil { + + + private List[] edges; + + private int in[]; + + private static final Integer DEFAULT_SIZE = 10000; + + private Integer edgeSize; + + + private boolean hasLoop; + private boolean hasCheck; + + public DagLoopUtil(Integer edgeSize) { + this.edgeSize = edgeSize + 1; + init(); + } + + public DagLoopUtil() { + this(DEFAULT_SIZE); + } + + public void addEdge(Integer child, Integer parent) { + if (edges[parent] == null) { + edges[parent] = new ArrayList<>(); + } + if (!edges[parent].contains(child)) { + edges[parent].add(child); + in[child]++; + } + } + + + public boolean isLoop() { + return topSort(); + } + + private boolean topSort() { + if (hasCheck) { + return hasLoop; + } + LinkedList zeroQueue = new LinkedList<>(); + + for (int i = 0; i < edgeSize; i++) { + if (in[i] == 0) { + zeroQueue.push(i); + } + } + int sum = 0; + + while (zeroQueue.size() > 0) { + Integer node = zeroQueue.poll(); + sum++; + List list = edges[node]; + if (list != null) { + for (Integer o : list) { + if (--in[o] == 0) { + zeroQueue.push(o); + } + } + list.clear(); + } + } + + hasCheck = true; + return hasLoop = sum != edgeSize; + } + + public void init() { + edges = new ArrayList[edgeSize]; + in = new int[edgeSize]; + hasCheck = false; + hasLoop = true; + } + + + /** + * 列出整个任务链路图 + * @return + */ + public String getLoop() { + //TODO (最高根据topSort的结果 获得成环的那些节点(in[o] > 0的点) 直接返回即可) + topSort(); + StringBuilder sb = new StringBuilder(); + boolean[] vis = new boolean[edgeSize]; + for (int i = 0; i < edgeSize; i++) { + if (edges[i] != null && edges[i].size() > 0) { + buildLoop(sb, i, vis); + break; + } + } + return sb.substring(0, sb.length() - 1); + } + + + private void buildLoop(StringBuilder sb, Integer index, boolean vis[]) { + List edge = edges[index]; + if (!vis[index] && edge != null && edge.size() > 0) { + vis[index] = true; + edge.forEach(x -> { + sb.append(x).append("->").append(edges[x]).append(","); + buildLoop(sb, x, vis); + }); + } + } +} + + diff --git a/hera-common/src/main/java/com/dfire/common/util/EnvUtils.java b/hera-common/src/main/java/com/dfire/common/util/EnvUtils.java new file mode 100755 index 00000000..56adabd8 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/EnvUtils.java @@ -0,0 +1,45 @@ +package com.dfire.common.util; + +import com.dfire.common.constants.Constants; +import com.dfire.config.HeraGlobalEnv; + +/** + * desc: + * + * @author scx + * @create 2019/05/29 + */ +public class EnvUtils { + + + private static String env = HeraGlobalEnv.getEnv() == null ? "pre" : HeraGlobalEnv.getEnv(); + private static String area = HeraGlobalEnv.getArea(); + + public static boolean isDaily() { + return env.equals(Constants.DAILY_ENV); + } + + public static boolean isPre() { + return env.equals(Constants.PRE_ENV); + } + + + public static boolean isPro() { + return env.equals(Constants.PUB_ENV); + } + + + public static boolean isEurope() { + return area.equals(Constants.AREA_EUROPE); + } + + public static boolean isUs() { + return area.equals(Constants.AREA_US); + } + + public static boolean isIndia() { + return area.equals(Constants.AREA_INDIA); + } + + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/util/HeraDateTool.java b/hera-common/src/main/java/com/dfire/common/util/HeraDateTool.java new file mode 100755 index 00000000..d1565354 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/HeraDateTool.java @@ -0,0 +1,113 @@ +package com.dfire.common.util; + +import com.dfire.common.constants.TimeFormatConstant; +import com.dfire.logs.ErrorLog; +import org.joda.time.DateTime; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author: 凌霄 + * @time: Created in 17:49 2018/3/22 + * @desc Hera日期工具类, 用于界面配置项的动态替换 + */ +public class HeraDateTool { + + private Calendar calendar = Calendar.getInstance(); + + public HeraDateTool() { + this(new Date()); + } + + public HeraDateTool(Date date) { + this.calendar.setTime(date); + } + + public HeraDateTool addDay(int amount) { + calendar.add(Calendar.DAY_OF_YEAR, amount); + return this; + } + + public HeraDateTool add(int field, int amount) { + calendar.add(field, amount); + return this; + } + + public HeraDateTool set(int field, int amount) { + calendar.set(field, amount); + return this; + } + + public long getTime() { + return calendar.getTime().getTime() / 1000; + } + + public long getMillis() { + return calendar.getTime().getTime(); + } + + + public long getNowMillis() { + return System.currentTimeMillis(); + } + + + public int get(int x) { + return calendar.get(x); + } + + public String format(String pattern) { + SimpleDateFormat format = new SimpleDateFormat(pattern); + return format.format(calendar.getTime()); + } + + + /** + * @param dateStr 需要转换的字符串 + * @param formatStr 需要格式的目标字符串 举例 yyyy-MM-dd + * @return outFormatStr 需要格式的输出字符串 举例 yyyy-MM-dd + * @throws ParseException 转换异常 + * @desc 日期格式字符串互相转换 + */ + public static String StringToDateStr(String dateStr, String formatStr, String outFormatStr) { + DateFormat sdf = new SimpleDateFormat(formatStr); + SimpleDateFormat outDateFormat = new SimpleDateFormat(outFormatStr); + Date date; + String outDateStr = ""; + try { + date = sdf.parse(dateStr); + outDateStr = outDateFormat.format(date); + } catch (ParseException e) { + ErrorLog.error("解析日期异常", e); + } + return outDateStr; + } + + /** + * @param dateStr 需要转换的字符串 + * @param formatStr 需要格式的目标字符串 举例 yyyy-MM-dd + * @return Date 返回转换后的时间 + * @throws ParseException 转换异常 + * @desc 字符串转换到时间格式 + */ + public static Date StringToDate(String dateStr, String formatStr) { + DateFormat sdf = new SimpleDateFormat(formatStr); + Date date = null; + try { + date = sdf.parse(dateStr); + } catch (ParseException e) { + ErrorLog.error("转换日期格式异常", e); + } + return date; + } + + public static String getToday() { + return new DateTime().toString(TimeFormatConstant.YYYY_MM_DD); + } + + +} diff --git a/hera-common/src/main/java/com/dfire/common/util/HierarchyProperties.java b/hera-common/src/main/java/com/dfire/common/util/HierarchyProperties.java new file mode 100755 index 00000000..8a812f61 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/HierarchyProperties.java @@ -0,0 +1,128 @@ +package com.dfire.common.util; + + +import org.apache.commons.lang.StringUtils; + +import java.util.*; + +/** + * @author: 凌霄 + * @time: Created in 14:58 2018/3/22 + * @desc 带层次结构的属性, 任务配置继承 + */ +public class HierarchyProperties { + + protected HierarchyProperties parent; + protected Map properties; + + public HierarchyProperties(Map properties) { + if (properties != null) { + this.properties = properties; + } else { + this.properties = new HashMap<>(0); + } + } + + public HierarchyProperties(HierarchyProperties parent, Map properties) { + this.parent = parent; + if (properties == null) { + this.properties = new HashMap<>(0); + } else { + this.properties = new HashMap<>(properties); + } + } + + public HierarchyProperties getParent() { + return parent; + } + + public Map getLocalProperties() { + return properties; + } + + public void setProperty(String key, String value) { + properties.put(key, value); + } + + public Set getPropertyKeys() { + Set set = new HashSet<>(); + if (parent != null) { + set.addAll(parent.getPropertyKeys()); + } + set.addAll(properties.keySet()); + return set; + } + + /** + * @param key + * @return + * @desc 获取属性值, 如果自身属性中没有,则向父属性查询 + */ + public String getProperty(String key) { + if (properties != null && properties.containsKey(key)) { + return properties.get(key); + } + if (parent != null) { + return parent.getProperty(key); + } + return null; + } + + /** + * @param key + * @return + * @desc 获取属性值, 如果自身属性中没有,则向父属性查询 + */ + public String getProperty(String key, String defaultValue) { + return StringUtils.isBlank(getProperty(key)) ? defaultValue : getProperty(key); + } + + /** + * @param key + * @return + * @desc 获取属性值, 只在自身属性中查询 + */ + public String getLocalProperty(String key) { + return properties.get(key); + } + + /** + * @param key + * @param defaultValue + * @return 获取属性值, 只在自身属性中查询, 如果没有,则返回传入的默认值 + */ + public String getLocalProperty(String key, String defaultValue) { + return StringUtils.isBlank(getLocalProperty(key)) ? defaultValue : getLocalProperty(key); + } + + /** + * @param key + * @return + * @desc 向上获取所有的数据, 一般用于获取带继承性质的属性, 比如classpath,需要父级的classpath + */ + public List getHierarchyProperty(String key) { + List list = new ArrayList<>(); + if (properties.get(key) != null) { + list.add(properties.get(key)); + } + if (parent != null) { + list.addAll(parent.getHierarchyProperty(key)); + } + return list; + } + + /** + * 获得层级属性 + * + * @return + */ + public Map getAllProperties() { + if (parent != null) { + Map parentMap = new HashMap<>(parent.getAllProperties()); + parentMap.putAll(getLocalProperties()); + return parentMap; + } + return getLocalProperties(); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/util/HttpUtils.java b/hera-common/src/main/java/com/dfire/common/util/HttpUtils.java new file mode 100755 index 00000000..4d384836 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/HttpUtils.java @@ -0,0 +1,65 @@ +package com.dfire.common.util; + +import com.dfire.logs.ErrorLog; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicHeader; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.List; + +/** + * desc: + * + * @author scx + * @create 2019/04/26 + */ +public class HttpUtils { + + + public static String doGet(String urlStr, List headers) { + URI uri = null; + try { + URL url = new URL(urlStr); + uri = new URI(url.getProtocol(), url.getHost() + ":" + url.getPort(), url.getPath(), url.getQuery(), null); + } catch (URISyntaxException | MalformedURLException e) { + ErrorLog.error("url格式错误", e); + + } + + HttpGet httpGet = new HttpGet(uri); + if (headers != null && headers.size() > 0) { + for (BasicHeader header : headers) { + httpGet.setHeader(header); + } + } + return doExecute(urlStr, httpGet); + + } + + private static String doExecute(String url, HttpUriRequest request) { + try { + HttpClient httpClient = HttpClients.createMinimal(); + HttpResponse response = httpClient.execute(request); + int code = response.getStatusLine().getStatusCode(); + if (code == 200) { + return EntityUtils.toString(response.getEntity()); + } else { + ErrorLog.error(url + " http请求异常:" + response.getStatusLine().getStatusCode() + response.getEntity().toString()); + } + } catch (IOException e) { + ErrorLog.error("发送http请求失败", e); + } + return null; + } + + +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/util/LambdaUtils.java b/hera-common/src/main/java/com/dfire/common/util/LambdaUtils.java new file mode 100755 index 00000000..fbae5aa5 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/LambdaUtils.java @@ -0,0 +1,21 @@ +package com.dfire.common.util; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; + +/** + * desc: + * + * @author scx + * @create 2019/09/11 + */ +public class LambdaUtils { + + + public static Predicate distinctByKey(Function keyExtractor) { + Map seen = new ConcurrentHashMap<>(64); + return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE) == null; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/util/NamedThreadFactory.java b/hera-common/src/main/java/com/dfire/common/util/NamedThreadFactory.java new file mode 100755 index 00000000..b45c301a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/NamedThreadFactory.java @@ -0,0 +1,50 @@ +package com.dfire.common.util; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * + * @author xiaosuda + * @date 2018/7/2 + */ +public class NamedThreadFactory implements ThreadFactory { + + private final static AtomicInteger POOL_SEQ = new AtomicInteger(1); + + private final AtomicInteger mThreadNum = new AtomicInteger(1); + + + private final boolean isDaemon; + + private final String mPrefix; + + private ThreadGroup mGroup; + + public NamedThreadFactory(){ + this("pool-" + POOL_SEQ.incrementAndGet(), false); + } + + public NamedThreadFactory(String prefix) { + this(prefix, false); + } + + public NamedThreadFactory(String prefix, boolean isDaemon) { + this.mPrefix = prefix + "-thread-"; + this.isDaemon = isDaemon; + SecurityManager s = System.getSecurityManager(); + mGroup = (s == null) ? Thread.currentThread().getThreadGroup() : s.getThreadGroup(); + } + + @Override + public Thread newThread(Runnable runnable) { + String threadName = mPrefix + mThreadNum.incrementAndGet(); + Thread thread = new Thread(mGroup, runnable, threadName, 0); + thread.setDaemon(isDaemon); + return thread; + } + + public ThreadGroup getThreadGroup() { + return mGroup; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/util/Pair.java b/hera-common/src/main/java/com/dfire/common/util/Pair.java new file mode 100755 index 00000000..f1584aa1 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/Pair.java @@ -0,0 +1,32 @@ +package com.dfire.common.util; + +/** + * desc: + * + * @author scx + * @create 2019/07/22 + */ +public class Pair { + + private A fst; + + private B snd; + + + public Pair(A a, B b) { + this.fst = a; + this.snd = b; + } + + public A fst() { + return fst; + } + + public B snd() { + return snd; + } + + public static Pair of(A a, B b) { + return new Pair<>(a, b); + } +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/util/PasswordUtils.java b/hera-common/src/main/java/com/dfire/common/util/PasswordUtils.java new file mode 100755 index 00000000..50f25856 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/PasswordUtils.java @@ -0,0 +1,85 @@ +package com.dfire.common.util; + + +import com.dfire.logs.ErrorLog; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +/** + * desc: + * + * @author scx + * @create 2019/04/19 + */ +public class PasswordUtils { + + + private final static String SALT = "www.hera.cn/19960811"; + + public static String aesEncryption(String content) { + try { + SecretKey key = buildKey(); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.ENCRYPT_MODE, key); + return new BASE64Encoder().encode(cipher.doFinal(content.getBytes(StandardCharsets.UTF_8))); + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { + ErrorLog.error("加密失败", e); + } + return null; + } + + + private static SecretKey buildKey() { + //1.构造密钥生成器,指定为AES算法,不区分大小写 + KeyGenerator keygen; + try { + keygen = KeyGenerator.getInstance("AES"); + //2.根据ecnodeRules规则初始化密钥生成器 + //生成一个128位的随机源,根据传入的字节数组 + SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); + random.setSeed(SALT.getBytes()); + keygen.init(128, random); + //3.产生原始对称密钥 + SecretKey originalKey = keygen.generateKey(); + //4.获得原始对称密钥的字节数组 + byte[] raw = originalKey.getEncoded(); + //5.根据字节数组生成AES密钥 + return new SecretKeySpec(raw, "AES"); + } catch (NoSuchAlgorithmException e) { + ErrorLog.error("算法不存在", e); + } + return null; + } + + public static String aesDecrypt(String content) { + try { + SecretKey key = buildKey(); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.DECRYPT_MODE, key); + return new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(content)), StandardCharsets.UTF_8); + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException | IllegalBlockSizeException | BadPaddingException e) { + ErrorLog.error("解密失败", e); + } + return null; + } + + public static void main(String[] args) throws UnsupportedEncodingException { + String content = "964;hadoop"; + String secret = aesEncryption(content); + System.out.println(secret); + + + // U%2BrVkiAacaEQLm09g%2BmoyQ%3D%3D + // System.out.println(aesDecrypt("HTj//o8xi7V4rbatMpyjGw==")); + } +} \ No newline at end of file diff --git a/hera-common/src/main/java/com/dfire/common/util/RenderHierarchyProperties.java b/hera-common/src/main/java/com/dfire/common/util/RenderHierarchyProperties.java new file mode 100755 index 00000000..6d2848e6 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/RenderHierarchyProperties.java @@ -0,0 +1,130 @@ +package com.dfire.common.util; + +import com.dfire.common.exception.HeraException; +import com.dfire.logs.ErrorLog; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +import java.io.StringWriter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +/** + * @author: 凌霄 + * @time: Created in 15:40 2018/3/22 + * @desc 层次结构属性解析,hera时间配置解析 + */ +public class RenderHierarchyProperties extends HierarchyProperties { + + private HierarchyProperties properties; + + static { + try { + Velocity.init(); + } catch (Exception e) { + ErrorLog.error("velocity init fail", e); + } + } + + static Pattern pt = Pattern.compile("\\$\\{zdt.*?\\}"); + + public RenderHierarchyProperties(HierarchyProperties properties) { + super(new HashMap<>()); + this.properties = properties; + } + + + /** + * @param template + * @param dateStr + * @return hera配置日期变量替换,"${yesterday}"为系统变量 + */ + public static String render(String template, String dateStr) throws HeraException { + if (template == null) { + return null; + } + Matcher matcher = pt.matcher(template); + while (matcher.find()) { + String m = template.substring(matcher.start(), matcher.end()); + StringWriter sw = new StringWriter(); + try { + VelocityContext context = new VelocityContext(); + if (dateStr == null) { + context.put("zdt", new HeraDateTool()); + } else { + context.put("zdt", new HeraDateTool(HeraDateTool.StringToDate(dateStr, ActionUtil.ACTION_MIN))); + } + Velocity.evaluate(context, sw, "", m); + if (m.equals(sw.toString())) { + throw new HeraException("渲染日期失败:" + m); + } + } catch (Exception e) { + throw new HeraException(e); + } + template = template.replace(m, sw.toString()); + matcher = pt.matcher(template); + } + if (dateStr == null) { + template = template.replace("${yesterday}", new HeraDateTool().addDay(-1).format("yyyyMMdd")); + } else { + template = template.replace("${yesterday}", new HeraDateTool(HeraDateTool.StringToDate(dateStr, ActionUtil.ACTION_MIN)).addDay(-1).format("yyyyMMdd")); + } + return template; + } + + @Override + public HierarchyProperties getParent() { + return new RenderHierarchyProperties(properties.getParent()); + } + + @Override + public Map getLocalProperties() { + return properties.getLocalProperties(); + } + + @Override + public void setProperty(String key, String value) { + properties.setProperty(key, value); + } + + @Override + public Set getPropertyKeys() { + return properties.getPropertyKeys(); + } + + @Override + public String getProperty(String key) { + return properties.getProperty(key); + } + + @Override + public String getProperty(String key, String defaultValue) { + return properties.getProperty(key, defaultValue); + } + + @Override + public String getLocalProperty(String key) { + return properties.getLocalProperty(key); + } + + @Override + public String getLocalProperty(String key, String defaultValue) { + return properties.getLocalProperty(key); + } + + @Override + public List getHierarchyProperty(String key) { + return properties.getHierarchyProperty(key); + } + + @Override + public Map getAllProperties() { + return properties.getAllProperties(); + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/util/StringUtil.java b/hera-common/src/main/java/com/dfire/common/util/StringUtil.java new file mode 100755 index 00000000..cf7a2065 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/util/StringUtil.java @@ -0,0 +1,216 @@ +package com.dfire.common.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONPathException; +import com.dfire.common.constants.Constants; +import com.dfire.common.processor.DownProcessor; +import com.dfire.common.processor.Processor; +import com.dfire.logs.ErrorLog; +import org.apache.commons.lang.StringUtils; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.*; + +/** + * @author: 凌霄 + * @time: Created in 18:06 2018/1/7 + * @desc 字符串处理工具类 + */ + +public class StringUtil { + + /** + * @param sourceStr + * @return + * @desc 登陆密码md5加密 + */ + + public static String EncoderByMd5(String sourceStr) { + int i; + StringBuffer buf = new StringBuffer(""); + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + ErrorLog.error("MD5 错误", e); + } + md.update(sourceStr.getBytes()); + byte b[] = md.digest(); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) { + i += 256; + } + if (i < 16) { + buf.append("0"); + } + buf.append(Integer.toHexString(i)); + } + return buf.toString(); + } + + /** + * job中的config解析成map + * + * @param config + * @return + */ + public static Map convertStringToMap(String config) throws RuntimeException { + if (StringUtils.isBlank(config) || "{}".equals(config)) { + return new HashMap<>(0); + } + JSONObject jsonObject; + try { + jsonObject = JSONObject.parseObject(config); + } catch (JSONPathException e) { + throw new RuntimeException("json parse error:", e); + } + Map map = new TreeMap<>(); + for (Object key : jsonObject.keySet()) { + map.put(key.toString(), jsonObject.getString(key.toString())); + } + return map; + } + + + public static Map configsToMap(String configs) { + configs = configs.trim(); + Map configMap = new HashMap<>(); + String[] split = configs.split("\n"); + Arrays.stream(split).forEach(x -> { + int index = x.indexOf("="); + if (index != -1) { + configMap.put(x.substring(0, index).trim(), x.substring(index + 1).trim()); + } + }); + return configMap; + } + + + public static String mapToConfigs(Map configMap) { + StringBuilder configs = new StringBuilder(); + configMap.forEach((key, val) -> configs.append(key).append("=").append(val).append("\n")); + return configs.toString(); + } + + /** + * config转成json + * + * @param config + * @return + */ + public static String convertMapToString(Map config) { + if (config == null) { + return null; + } + JSONObject jsonObject = new JSONObject(); + for (Map.Entry entry : config.entrySet()) { + jsonObject.put(entry.getKey(), entry.getValue()); + } + return jsonObject.toString(); + } + + + public static List convertProcessorToList(String processor) { + List list = new ArrayList<>(); + Processor result = null; + if (processor == null || processor.equals("") || processor.equals("[]")) { + return list; + } + JSONObject jsonObject = JSONObject.parseObject(processor); + String id = jsonObject.getString("id"); + if (StringUtils.isNotBlank(id)) { + if (("download").equals(id)) { + result = new DownProcessor(); + list.add(result); + } + } + return list; + } + + public static String convertProcessorToList(List list) { + JSONArray preArray = new JSONArray(); + for (Processor p : list) { + JSONObject o = new JSONObject(); + o.put("id", p.getId()); + o.put("config", p.getConfig()); + preArray.add(o); + } + return preArray.toString(); + } + + + public static boolean actionIdToJobId(String actionId, String id) { + String str = actionId.substring(12); + Integer id1 = Integer.valueOf(str); + Integer id2 = Integer.valueOf(id); + return id1.equals(id2); + } + + public static boolean actionIdToJobId(Long actionId, String id) { + return actionIdToJobId(String.valueOf(actionId), id); + } + + /** + * job resource转换为List + * + * @param resource + * @return + */ + public static List> convertResources(String resource) { + List> tempRes = new ArrayList<>(); + JSONArray resArray = new JSONArray(); + + if (StringUtils.isNotBlank(resource)) { + + try { + resArray = JSONArray.parseArray(resource); + } catch (Exception e) { + ErrorLog.error("解析字符串异常", e); + } + for (int i = 0; i < resArray.size(); i++) { + JSONObject o = resArray.getJSONObject(i); + Map map = new HashMap<>(); + for (Object key : o.keySet()) { + map.put(key.toString(), o.getString(key.toString())); + } + tempRes.add(map); + } + } + return tempRes; + } + + public static String convertResourceToString(List> list) { + String resource = "[]"; + if (list != null && list.size() > 0) { + JSONArray resArray = new JSONArray(); + for (Map map : list) { + JSONObject o = new JSONObject(); + for (String key : map.keySet()) { + o.put(key, map.get(key)); + } + resArray.add(o); + } + resource = resArray.toString(); + } + return resource; + } + + public static Integer getGroupId(String group) { + String groupNum = group; + if (group.startsWith(Constants.GROUP_PREFIX)) { + groupNum = group.split("_")[1]; + } + Integer res; + try { + res = Integer.parseInt(groupNum); + } catch (Exception e) { + throw new IllegalArgumentException("无法识别的groupId:" + group); + } + + return res; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/GroupTaskVo.java b/hera-common/src/main/java/com/dfire/common/vo/GroupTaskVo.java new file mode 100755 index 00000000..0f850ddb --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/GroupTaskVo.java @@ -0,0 +1,24 @@ +package com.dfire.common.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author xiaosuda + * @date 2018/12/3 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class GroupTaskVo { + + private String actionId; + private String jobId; + private String name; + private String status; + private String readyStatus; + private String lastResult; +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/JobElement.java b/hera-common/src/main/java/com/dfire/common/vo/JobElement.java new file mode 100755 index 00000000..e63e52fb --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/JobElement.java @@ -0,0 +1,64 @@ +package com.dfire.common.vo; + +import com.dfire.common.enums.JobStatus; +import com.dfire.common.enums.TriggerTypeEnum; +import lombok.Builder; +import lombok.Data; + + +/** + * @author: 凌霄 + * @time: Created in 10:54 2018/1/4 + * @desc 任务队列中job的实体 + */ +@Data +@Builder +public class JobElement { + + /** + * 版本号id + */ + private Long jobId; + + private int hostGroupId; + + private boolean fixedEmr; + + private Integer priorityLevel; + + private Long historyId; + + private TriggerTypeEnum triggerType; + + private JobStatus status; + + private boolean isCancel; + + /** + * 任务的所属组 + */ + private String owner; + + private Integer costMinute; + + + public boolean equals(JobElement jobElement) { + if (jobElement == null || jobElement.getJobId() == null) { + return false; + } + return jobElement.getJobId().equals(jobId); + } + + @Override + public int hashCode() { + return jobId.hashCode(); + } + + @Override + public String toString() { + return "JobElement{" + + "jobId='" + jobId + '\'' + + ", hostGroupId=" + hostGroupId + + '}'; + } +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/JobStatus.java b/hera-common/src/main/java/com/dfire/common/vo/JobStatus.java new file mode 100755 index 00000000..ad0db3d0 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/JobStatus.java @@ -0,0 +1,40 @@ +package com.dfire.common.vo; + +import com.dfire.common.enums.StatusEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 23:43 2018/1/12 + * @desc Job的状态用于持久化Job状态,重启服务器时用作恢复 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class JobStatus { + + /** + * 版本号id + */ + private Long actionId; + + private StatusEnum status; + + private Long historyId; + + private Date startTime; + + private Date endTime; + + /** + * 依赖的Job的状态:key 依赖的版本号ID,value 依赖的Job的完成时间 + */ + private Map readyDependency; +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/LogContent.java b/hera-common/src/main/java/com/dfire/common/vo/LogContent.java new file mode 100755 index 00000000..dd12b587 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/LogContent.java @@ -0,0 +1,183 @@ +package com.dfire.common.vo; + +import com.dfire.common.constants.Constants; +import com.dfire.common.enums.StatusEnum; +import com.dfire.config.HeraGlobalEnv; + +import lombok.Builder; +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.LinkedList; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * @author: 凌霄 + * @time: Created in 23:24 2018/1/12 + * @desc 任务运行过程中的日志记录 + */ +@Data +public class LogContent { + + private int lines; + + private final String CONSOLE = "CONSOLE# "; + private final String HERA = "HERA# "; + private StringBuffer content; + + private static final int HEAD_PRINT_COUNT = HeraGlobalEnv.getWebLogHeadCount(); + + private static final int TAIL_PRINT_COUNT = HeraGlobalEnv.getWebLogTailCount(); + + private boolean limit = true; + + private final String limitLog = "控制台输出信息过多,停止记录,建议您优化自己的Job" + Constants.LOG_SPLIT; + + + private static final String ERROR = "error"; + + private LinkedList tailLog; + + private Lock lock; + + public LogContent() { + this.tailLog = new LinkedList<>(); + this.content = new StringBuffer(); + this.lock = new ReentrantLock(); + } + + public LogContent(StringBuffer content) { + this.content = content; + this.tailLog = new LinkedList<>(); + this.lock = new ReentrantLock(); + } + + + /** + * size大小的队列 + * + * @param log + */ + private void queuePushLog(String log) { + try { + lock.lock(); + tailLog.add(log); + if (tailLog.size() >= TAIL_PRINT_COUNT) { + tailLog.removeFirst(); + } + } finally { + lock.unlock(); + } + } + + private String tailLog() { + if (lines >= HEAD_PRINT_COUNT) { + StringBuilder sb = new StringBuilder(); + String[] tailLogs; + try { + lock.lock(); + tailLogs = tailLog.toArray(new String[0]); + } finally { + lock.unlock(); + } + for (String log : tailLogs) { + sb.append(log); + } + return sb.toString(); + } else { + return ""; + } + } + + + public void appendConsole(String log) { + //空日志不记录 + if (StringUtils.isBlank(log)) { + return; + } + if (lines < HEAD_PRINT_COUNT) { + content.append(CONSOLE).append(redColorMsg(log)).append(Constants.LOG_SPLIT); + appendLimitLog(); + } else { + queuePushLog(CONSOLE + redColorMsg(log) + Constants.LOG_SPLIT); + } + } + + + public void appendHera(String log) { + String[] l = log.split(Constants.NEW_LINE); + for (String s : l) { + if (lines < HEAD_PRINT_COUNT) { + content.append(HERA).append(s).append(Constants.LOG_SPLIT); + appendLimitLog(); + } else { + queuePushLog(HERA + s + Constants.LOG_SPLIT); + } + } + } + + public void append(String log) { + if (lines < HEAD_PRINT_COUNT) { + content.append(log).append(Constants.LOG_SPLIT); + appendLimitLog(); + } else { + queuePushLog(log + Constants.LOG_SPLIT); + } + } + + + private void appendLimitLog() { + if (++lines == HEAD_PRINT_COUNT) { + content.append(HERA).append(limitLog); + content.append(HERA).append(limitLog); + content.append(HERA).append(limitLog); + } + + } + + + public void appendHeraException(Exception e) { + if (e == null) { + return; + } + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + appendHera(sw.toString()); + } + + public void setContent(StringBuffer content) { + this.content = content; + } + + public String getContent() { + return content.toString() + tailLog(); + } + + + public String getMailContent() { + return getContent(); + } + + private String redColorMsg(String log) { + if (log.toLowerCase().contains(ERROR) + || log.toLowerCase().contains(StatusEnum.FAILED.toString()) + || log.contains("Exception") + || log.contains("NullPointException") + || log.contains("No such file or directory") + || log.contains("command not found") + || log.contains("Permission denied")) { + return "" + log + ""; + } else { + return log; + } + } + + + public int getLines() { + return lines; + } + +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/MachineInfoVo.java b/hera-common/src/main/java/com/dfire/common/vo/MachineInfoVo.java new file mode 100755 index 00000000..1ed62e73 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/MachineInfoVo.java @@ -0,0 +1,39 @@ +package com.dfire.common.vo; + +import lombok.Data; + +/** + * @author xiaosuda + * @date 2018/11/14 + */ +@Data +public class MachineInfoVo { + /** + * 文件系统分区 + */ + private String filesystem; + /** + * 文件类型 + */ + private String type; + /** + * 分区大小 + */ + private String size; + /** + * 分区已经使用大小 + */ + private String used; + /** + * 分区可用大小 + */ + private String avail; + /** + * 分区使用的比例 + */ + private String use; + /** + * 磁盘分区挂载的目录 即挂载点 + */ + private String mountedOn; +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/OSInfoVo.java b/hera-common/src/main/java/com/dfire/common/vo/OSInfoVo.java new file mode 100755 index 00000000..2af4c744 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/OSInfoVo.java @@ -0,0 +1,33 @@ +package com.dfire.common.vo; + +import lombok.Data; + +/** + * + * @author xiaosuda + * @date 2018/11/14 + */ +@Data +public class OSInfoVo { + + /** + * 用户占用 + */ + float user = 1; + /** + * 系统占用 + */ + float system = 2; + /** + * 内存使用率 + */ + float mem = 3; + /** + * cpu空闲 + */ + float cpu = 4; + /** + * swap空闲 + */ + float swap = 5; +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/ProcessMonitorVo.java b/hera-common/src/main/java/com/dfire/common/vo/ProcessMonitorVo.java new file mode 100755 index 00000000..92ad66ca --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/ProcessMonitorVo.java @@ -0,0 +1,45 @@ +package com.dfire.common.vo; + +import lombok.Data; + +/** + * + * @author xiaosuda + * @date 2018/11/14 + */ +@Data +public class ProcessMonitorVo { + + /** + * 进程id + */ + private String pid; + /** + * 进程所有者的用户名 + */ + private String user; + /** + * 进程使用的虚拟内存总量 + */ + private String viri; + /** + * 进程使用的、未被换出的大小 + */ + private String res; + /** + * 上次更新到现在cpu时间占用百分比 + */ + private String cpu; + /** + *物理内存百分比 + */ + private String mem; + /** + * 进程使用的cpu时间总计 + */ + private String time; + /** + * 命令名/命令行 + */ + private String command; +} diff --git a/hera-common/src/main/java/com/dfire/common/vo/WorkInfoVo.java b/hera-common/src/main/java/com/dfire/common/vo/WorkInfoVo.java new file mode 100755 index 00000000..79cbb789 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/common/vo/WorkInfoVo.java @@ -0,0 +1,28 @@ +package com.dfire.common.vo; + +import lombok.Data; + +import java.util.List; + +/** + * + * @author xiaosuda + * @date 2018/11/14 + */ +@Data +public class WorkInfoVo { + + /** + * 机器信息 + */ + private List machineInfo; + /** + * 系统信息 + */ + private OSInfoVo osInfo; + /** + * 进程监控 + */ + private List processMonitor; + +} diff --git a/hera-common/src/main/java/com/dfire/config/HeraGlobalEnv.java b/hera-common/src/main/java/com/dfire/config/HeraGlobalEnv.java new file mode 100755 index 00000000..9c9e838a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/config/HeraGlobalEnv.java @@ -0,0 +1,554 @@ +package com.dfire.config; + +import com.dfire.common.constants.Constants; +import com.dfire.common.enums.OperatorSystemEnum; +import com.dfire.logs.HeraLog; +import lombok.Getter; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author xiaosuda + * @date 2018/4/16 + */ +@Configuration +public class HeraGlobalEnv { + + @Getter + public static String excludeFile; + + public static int defaultWorkerGroup; + + public static Integer preemptionMasterGroup; + + @Getter + private static long requestTimeout = 60 * 1000L; + + @Getter + private static long channelTimeout = 1000L; + + @Getter + private static int jobCacheDay; + + @Getter + private static String loadBalance; + + @Getter + private static String env; + @Getter + private static boolean sudoUser; + + @Getter + private static int warmUpCheck; + + @Getter + private static Float maxMemRate; + @Getter + private static Float maxCpuLoadPerCore; + @Getter + private static Float perTaskUseMem; + @Getter + private static Float systemMemUsed; + @Getter + private static Integer scanRate; + @Getter + private static Integer connectPort; + @Getter + private static String workDir; + @Getter + private static Integer maxParallelNum; + @Getter + private static Integer maxRerunParallelNum; + @Getter + private static Integer rerunStartTime; + @Getter + private static Integer rerunEndTime; + @Getter + private static Integer heartBeat; + @Getter + private static String admin; + @Getter + private static String area; + @Getter + private static Integer taskTimeout; + @Getter + private static String sparkAddress; + @Getter + private static String sparkDriver; + @Getter + private static String sparkUser; + @Getter + private static String sparkPassword; + @Getter + private static String sparkMaster; + @Getter + private static String sparkDriverMemory; + @Getter + private static String sparkDriverCores; + @Getter + private static String sparkExecutorMemory; + @Getter + private static String sparkExecutorCores; + @Getter + private static String hdfsUploadPath; + @Getter + private static String jobShellBin; + @Getter + private static String jobHiveBin; + @Getter + private static String jobSparkSqlBin; + @Getter + private static boolean emrJob; + @Getter + private static boolean scriptEcho; + @Getter + private static String emrCluster; + @Getter + private static String keyPath; + + @Getter + private static String kerberosKeytabPath; + @Getter + private static String kerberosPrincipal; + + @Getter + private static Integer webSessionExpire; + + @Getter + private static Integer webLogHeadCount; + + @Getter + private static Integer webLogTailCount; + + @Getter + private static String aliYunAccessKey; + @Getter + private static String indiaAccessKey; + + @Getter + private static String aliYunAccessSecret; + @Getter + private static String indiaAccessSecret; + + @Getter + private static String mailPort; + @Getter + private static String mailProtocol; + @Getter + private static String mailHost; + @Getter + private static String mailUser; + @Getter + private static String mailPassword; + @Getter + private static Set alarmEnvSet; + @Getter + public static String emrFixedHost; + @Getter + private static Set emrGroups; + + @Getter + private static String awsEmrType; + @Getter + public static String monitorUsers; + @Getter + public static String monitorEmails; + + + + @Value("${hera.sudoUser}") + public void setSudoUser(boolean sudoUser) { + HeraGlobalEnv.sudoUser = sudoUser; + } + + + + @Value("${hera.emr_groups}") + public void setEmrGroups(String groups) { + if (StringUtils.isNotBlank(groups)) { + HeraGlobalEnv.emrGroups = Arrays.stream(groups.split(Constants.SEMICOLON)).collect(Collectors.toSet()); + } else { + HeraGlobalEnv.emrGroups = new HashSet<>(0); + } + if (HeraGlobalEnv.emrGroups.size() == 0) { + HeraLog.warn("the hera.emr.groups is null, all user will use same emr cluster"); + } + } + + + @Value("${hera.job.script-echo}") + public void setScriptEcho(boolean scriptEcho) { + HeraGlobalEnv.scriptEcho = scriptEcho; + } + + @Value("${hera.monitorUsers}") + public void setMonitorUsers(String monitorUsers) { + HeraGlobalEnv.monitorUsers = monitorUsers; + } + + @Value("${hera.monitorEmails}") + public void setMonitorEmails(String monitorEmails) { + HeraGlobalEnv.monitorEmails = monitorEmails; + } + + @Value("${india.accessKey}") + public void setIndiaAccessKey(String indiaAccessKey) { + HeraGlobalEnv.indiaAccessKey = indiaAccessKey; + } + + @Value("${india.accessSecret}") + public void setIndiaAccessSecret(String indiaAccessSecret) { + HeraGlobalEnv.indiaAccessSecret = indiaAccessSecret; + } + + @Value("${aliYun.accessKey}") + public void setAliYunAccessKey(String aliYunAccessKey) { + HeraGlobalEnv.aliYunAccessKey = aliYunAccessKey; + } + + @Value("${aliYun.accessSecret}") + public void setAliYunAccessSecret(String aliYunAccessSecret) { + HeraGlobalEnv.aliYunAccessSecret = aliYunAccessSecret; + } + + @Value("${hera.excludeFile}") + public void setExcludeFile(String excludeFile) { + HeraGlobalEnv.excludeFile = excludeFile; + } + + @Value("${hera.defaultWorkerGroup}") + public void setDefaultWorkerGroup(int defaultWorkerGroup) { + HeraGlobalEnv.defaultWorkerGroup = defaultWorkerGroup; + } + + @Value("${hera.preemptionMasterGroup}") + public void setPreemptionMasterGroup(Integer preemptionMasterGroup) { + HeraGlobalEnv.preemptionMasterGroup = preemptionMasterGroup; + } + + @Value("${hera.kerberos.keytabpath}") + public void setKerberosKeytabPath(String kerberosKeytabPath) { + HeraGlobalEnv.kerberosKeytabPath = kerberosKeytabPath.trim(); + } + @Value("${hera.kerberos.principal}") + public void setKerberosPrincipal(String kerberosPrincipal) { + HeraGlobalEnv.kerberosPrincipal = kerberosPrincipal.trim(); + } + + @Value("${hera.env}") + public void setEnv(String env) { + if (env.contains("_")) { + HeraGlobalEnv.env = env.split("_")[0]; + } else { + HeraGlobalEnv.env = env; + } + } + + @Value("${hera.maxMemRate}") + public void setMaxMemRate(Float maxMemRate) { + HeraGlobalEnv.maxMemRate = maxMemRate; + } + + @Value("${hera.maxCpuLoadPerCore}") + public void setCpuLoadPerCore(Float maxCpuLoadPerCore) { + HeraGlobalEnv.maxCpuLoadPerCore = maxCpuLoadPerCore; + } + + @Value("${hera.hdfsUploadPath}") + public void setHdfsUploadPath(String hdfsUploadPath) { + HeraGlobalEnv.hdfsUploadPath = hdfsUploadPath; + } + + @Value("${hera.scanRate}") + public void setScanRate(Integer scanRate) { + HeraGlobalEnv.scanRate = scanRate; + } + + @Value("${hera.connectPort}") + public void setConnectPort(Integer connectPort) { + HeraGlobalEnv.connectPort = connectPort; + } + + @Value("${hera.workDir}") + public void setWorkDir(String workDir) { + File file = new File(workDir); + if (!file.exists()) { + HeraGlobalEnv.workDir = System.getProperty("user.dir"); + HeraLog.warn("配置的工作路径" + workDir + "不存在,将使用默认路径:" + HeraGlobalEnv.workDir); + } else { + HeraGlobalEnv.workDir = workDir; + } + } + + @Value("${hera.maxParallelNum}") + public void setMaxParallelNum(Integer maxParallelNum) { + HeraGlobalEnv.maxParallelNum = maxParallelNum; + } + + @Value("${hera.rerun.maxParallelNum}") + public void setMaxRerunParallelNum(Integer maxRerunParallelNum) { + HeraGlobalEnv.maxRerunParallelNum = maxRerunParallelNum; + } + + @Value("${hera.rerun.timeRange}") + public void setRerunTimeRange(String rerunTimeRange) { + int splitIndex; + if (rerunTimeRange != null && (splitIndex = rerunTimeRange.indexOf("-")) != -1) { + HeraGlobalEnv.rerunStartTime = Integer.parseInt(rerunTimeRange.substring(0, splitIndex)); + HeraGlobalEnv.rerunEndTime = Integer.parseInt(rerunTimeRange.substring(splitIndex + 1)); + } + } + + @Value("${hera.jobCacheDay}") + public void setJobCacheDay(int jobCacheDay) { + HeraGlobalEnv.jobCacheDay = jobCacheDay; + } + + + @Value("${hera.admin}") + public void setAdmin(String admin) { + HeraGlobalEnv.admin = admin; + } + + @Value("${hera.taskTimeout}") + public void setTaskTimeout(Integer taskTimeout) { + HeraGlobalEnv.taskTimeout = taskTimeout; + } + + @Value("${hera.heartBeat}") + public void setHeartBeat(Integer heartBeat) { + HeraGlobalEnv.heartBeat = heartBeat; + } + + @Value("${hera.perTaskUseMem}") + public void setPerTaskUseMem(Float perTaskUseMem) { + HeraGlobalEnv.perTaskUseMem = perTaskUseMem; + } + + @Value("${hera.systemMemUsed}") + public void setSystemMemUsed(Float systemMemUsed) { + HeraGlobalEnv.systemMemUsed = systemMemUsed; + } + + @Value("${hera.maxCpuLoadPerCore}") + public void setMaxCpuLoadPerCore(Float maxCpuLoadPerCore) { + HeraGlobalEnv.maxCpuLoadPerCore = maxCpuLoadPerCore; + } + + @Value("${hera.loadBalance}") + public void setLoadBalance(String loadBalance) { + HeraGlobalEnv.loadBalance = loadBalance; + } + + @Value("${hera.warmUpCheck}") + public void setWarmUpCheck(int warmUpCheck) { + HeraGlobalEnv.warmUpCheck = warmUpCheck; + } + + @Value("${hera.requestTimeout}") + public void setTimeout(Long requestTimeout) { + HeraGlobalEnv.requestTimeout = requestTimeout; + } + + @Value("${hera.channelTimeout}") + public void setChannelTimeout(Long channelTimeout) { + HeraGlobalEnv.channelTimeout = channelTimeout; + } + + @Value("${spark.address}") + public void setSparkAddress(String sparkAddress) { + HeraGlobalEnv.sparkAddress = sparkAddress; + } + + @Value("${spark.driver}") + public void setSparkDriver(String sparkDriver) { + HeraGlobalEnv.sparkDriver = sparkDriver; + } + + @Value("${spark.username}") + public void setSparkUser(String sparkUser) { + HeraGlobalEnv.sparkUser = sparkUser; + } + + @Value("${spark.password}") + public void setSparkPassword(String sparkPassword) { + HeraGlobalEnv.sparkPassword = sparkPassword; + } + + @Value("${spark.master}") + public void setSparkMaster(String sparkMaster) { + HeraGlobalEnv.sparkMaster = sparkMaster; + } + + @Value("${spark.driver-memory}") + public void setSparkDriverMemory(String sparkDriverMemory) { + HeraGlobalEnv.sparkDriverMemory = sparkDriverMemory; + } + + @Value("${spark.driver-cores}") + public void setSparkDriverCores(String sparkDriverCores) { + HeraGlobalEnv.sparkDriverCores = sparkDriverCores; + } + + @Value("${spark.executor-memory}") + public void setSparkExecutorMemory(String sparkExecutorMemory) { + HeraGlobalEnv.sparkExecutorMemory = sparkExecutorMemory; + } + + @Value("${spark.executor-cores}") + public void setSparkExecutorCores(String sparkExecutorCores) { + HeraGlobalEnv.sparkExecutorCores = sparkExecutorCores; + } + + @Value("${hera.job.shell.bin}") + public void setJobShellBin(String jobShellBin) { + HeraGlobalEnv.jobShellBin = jobShellBin + Constants.BLANK_SPACE; + } + + @Value("${hera.job.hive.bin}") + public void setJobHiveBin(String jobHiveBin) { + HeraGlobalEnv.jobHiveBin = jobHiveBin + Constants.BLANK_SPACE; + } + + @Value("${hera.job.spark-sql.bin}") + public void setJobSparkSqlBin(String jobSparkSqlBin) { + HeraGlobalEnv.jobSparkSqlBin = jobSparkSqlBin + Constants.BLANK_SPACE; + } + + + @Value("${hera.area}") + public void setArea(String area) { + if (StringUtils.isBlank(area)) { + throw new RuntimeException("请设置hera要执行的任务区域:" + area); + } else { + HeraGlobalEnv.area = area.trim(); + } + } + + @Value("${mail.port}") + public void setMailPort(String mailPort) { + HeraGlobalEnv.mailPort = mailPort; + } + + @Value("${mail.protocol}") + public void setMailProtocol(String mailProtocol) { + HeraGlobalEnv.mailProtocol = mailProtocol; + } + + @Value("${mail.host}") + public void setMailHost(String mailHost) { + HeraGlobalEnv.mailHost = mailHost; + } + + @Value("${mail.user}") + public void setMailUser(String mailUser) { + HeraGlobalEnv.mailUser = mailUser; + } + + @Value("${mail.password}") + public void setMailPassword(String mailPassword) { + HeraGlobalEnv.mailPassword = mailPassword; + } + + + @Value("${hera.webLogHeadCount}") + public void setWebLogHeadCount(Integer webLogHeadCount) { + HeraGlobalEnv.webLogHeadCount = webLogHeadCount; + } + + @Value("${hera.webLogTailCount}") + public void setWebLogTailCount(Integer webLogTailCount) { + HeraGlobalEnv.webLogTailCount = webLogTailCount; + } + + + @Value("${hera.webSessionExpire}") + public void setWebSessionExpire(Integer webSessionExpire) { + HeraGlobalEnv.webSessionExpire = webSessionExpire; + } + + + @Value("${hera.alarmEnv}") + public void setAlarmEnvSet(String mailEnv) { + if (StringUtils.isBlank(mailEnv)) { + mailEnv = Constants.PUB_ENV; + } + HeraGlobalEnv.alarmEnvSet = new HashSet<>(); + alarmEnvSet.addAll(Arrays.asList(mailEnv.split(Constants.COMMA))); + } + + @Value("${hera.emr_fixed_host}") + public void setEmrFixedHost(String emrFixedHost) { + HeraGlobalEnv.emrFixedHost = emrFixedHost; + } + + @Value("${hera.aws_emr_type}") + public void setAwsEmrType(String awsEmrType) { + HeraGlobalEnv.awsEmrType = awsEmrType; + } + + @Value("${hera.emrJob}") + public void setEmrJob(String emrJob) { + if (Boolean.FALSE.toString().equals(emrJob)) { + HeraGlobalEnv.emrJob = false; + } else { + HeraGlobalEnv.emrJob = true; + + String[] emrCluster = emrJob.split(":"); + if (emrCluster.length == 0 || emrCluster.length == 1) { + throw new RuntimeException("emrJob参数设置错误:" + emrJob); + } + HeraGlobalEnv.emrCluster = emrCluster[1]; + } + } + + + + @Value("${hera.keyPath}") + public void setKeyPath(String keyPath) { + HeraGlobalEnv.keyPath = keyPath; + } + + + @Getter + private static OperatorSystemEnum systemEnum; + + /** + * 用户环境变量 + */ + public static Map userEnvMap = new HashMap<>(); + + static { + String os = System.getProperty("os.name"); + if (os != null) { + if (os.toLowerCase().startsWith("win")) { + systemEnum = OperatorSystemEnum.WIN; + } else if (os.toLowerCase().startsWith("mac")) { + systemEnum = OperatorSystemEnum.MAC; + } else { + systemEnum = OperatorSystemEnum.LINUX; + } + } + for (Map.Entry entry : System.getProperties().entrySet()) { + userEnvMap.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue())); + } + userEnvMap.putAll(System.getenv()); + // 全局配置,支持中文不乱 + userEnvMap.put("LANG", "zh_CN.UTF-8"); + } + + public static boolean isLinuxSystem() { + return OperatorSystemEnum.isLinux(systemEnum); + } + + public static boolean isMacOS() { + return OperatorSystemEnum.isMac(systemEnum); + } + + +} diff --git a/hera-common/src/main/java/com/dfire/event/AbstractEvent.java b/hera-common/src/main/java/com/dfire/event/AbstractEvent.java new file mode 100755 index 00000000..c279b1cd --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/AbstractEvent.java @@ -0,0 +1,36 @@ +package com.dfire.event; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: 凌霄 + * @time: Created in 下午4:56 2018/4/18 + * @desc + */ +@Data +@NoArgsConstructor +public class AbstractEvent { + + private boolean cancelled; + private Object source; + private EventType type; + + public AbstractEvent(EventType type) { + this.type = type; + } + + public AbstractEvent(Object source) { + this.source = source; + } + + public boolean isCancelled() { + return cancelled; + } + + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + +} diff --git a/hera-common/src/main/java/com/dfire/event/ApplicationEvent.java b/hera-common/src/main/java/com/dfire/event/ApplicationEvent.java new file mode 100755 index 00000000..422a47cb --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/ApplicationEvent.java @@ -0,0 +1,22 @@ +package com.dfire.event; + + +/** + * @author: 凌霄 + * @time: Created in 下午5:08 2018/4/18 + * @desc + */ +public class ApplicationEvent extends AbstractEvent { + + private Object data; + + public ApplicationEvent(EventType type) { + super(type); + } + + public ApplicationEvent(EventType type, Object data) { + super(type); + this.data = data; + } + +} diff --git a/hera-common/src/main/java/com/dfire/event/EventType.java b/hera-common/src/main/java/com/dfire/event/EventType.java new file mode 100755 index 00000000..d6c9455b --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/EventType.java @@ -0,0 +1,20 @@ +package com.dfire.event; + +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 下午4:57 2018/4/18 + * @desc + */ +@Data +public class EventType { + + private static int count = 0; + final String id; + + public EventType() { + id = String.valueOf(count++); + } + +} diff --git a/hera-common/src/main/java/com/dfire/event/Events.java b/hera-common/src/main/java/com/dfire/event/Events.java new file mode 100755 index 00000000..a89a2a0c --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/Events.java @@ -0,0 +1,33 @@ +package com.dfire.event; + +/** + * @author: 凌霄 + * @time: Created in 下午3:39 2018/4/19 + * @desc + */ +public class Events { + + public static final EventType Initialize = new EventType(); + + /** + * Job执行成功 + */ + public static final EventType JobSucceed = new EventType(); + /** + * Job执行失败 + */ + public static final EventType JobFailed = new EventType(); + /** + * 触发Job定时任务 + */ + public static final EventType ScheduleTrigger = new EventType(); + /** + * 更新一个Job + */ + public static final EventType UpdateJob = new EventType(); + /** + * 根据批量更新属于该JobId的Actions + */ + public static final EventType UpdateActions = new EventType(); + +} diff --git a/hera-common/src/main/java/com/dfire/event/HeraDebugFailEvent.java b/hera-common/src/main/java/com/dfire/event/HeraDebugFailEvent.java new file mode 100755 index 00000000..dfffbd42 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/HeraDebugFailEvent.java @@ -0,0 +1,26 @@ +package com.dfire.event; + +import com.dfire.common.entity.HeraDebugHistory; +import lombok.Builder; +import lombok.Getter; + +/** + * @author: 凌霄 + * @time: Created in 下午3:34 2018/4/19 + * @desc + */ +@Builder +public class HeraDebugFailEvent extends ApplicationEvent { + + @Getter + private final HeraDebugHistory debugHistory; + private final Integer fileId; + private final Throwable throwable; + + public HeraDebugFailEvent(HeraDebugHistory history, Integer fileId, Throwable t) { + super(Events.JobFailed); + this.fileId = fileId; + this.debugHistory = history; + this.throwable = t; + } +} diff --git a/hera-common/src/main/java/com/dfire/event/HeraDebugSuccessEvent.java b/hera-common/src/main/java/com/dfire/event/HeraDebugSuccessEvent.java new file mode 100755 index 00000000..6d8af5b8 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/HeraDebugSuccessEvent.java @@ -0,0 +1,25 @@ +package com.dfire.event; + +import com.dfire.common.entity.HeraDebugHistory; +import lombok.Builder; +import lombok.Getter; + +/** + * @author: 凌霄 + * @time: Created in 下午4:06 2018/4/19 + * @desc + */ +@Builder +public class HeraDebugSuccessEvent extends ApplicationEvent { + + @Getter + private HeraDebugHistory history; + private Integer fileId; + + public HeraDebugSuccessEvent(HeraDebugHistory history, Integer fileId) { + super(Events.JobSucceed); + this.fileId = fileId; + this.history = history; + } + +} diff --git a/hera-common/src/main/java/com/dfire/event/HeraJobFailedEvent.java b/hera-common/src/main/java/com/dfire/event/HeraJobFailedEvent.java new file mode 100755 index 00000000..756ec82b --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/HeraJobFailedEvent.java @@ -0,0 +1,40 @@ +package com.dfire.event; + +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.TriggerTypeEnum; +import lombok.Data; + +import java.util.Objects; + +/** + * @author: 凌霄 + * @time: Created in 下午4:11 2018/4/19 + * @desc + */ +@Data +public class HeraJobFailedEvent extends ApplicationEvent { + + private final HeraJobHistoryVo heraJobHistory; + private final Long actionId; + private final TriggerTypeEnum triggerType; + private HeraJob heraJob; + private int runCount = 0; + private int rollBackTime = 0; + private int retryCount = 0; + + public HeraJobFailedEvent(Long jobId, TriggerTypeEnum triggerType, HeraJobHistoryVo heraJobHistory) { + super(Events.JobFailed); + this.actionId = jobId; + this.triggerType = triggerType; + this.heraJobHistory = heraJobHistory; + } + + public void setRollBackTime(int value) { + if (Objects.equals(triggerType, TriggerTypeEnum.SCHEDULE) || Objects.equals(triggerType, TriggerTypeEnum.MANUAL_RECOVER)) { + this.rollBackTime = value; + } + } + + +} diff --git a/hera-common/src/main/java/com/dfire/event/HeraJobLostEvent.java b/hera-common/src/main/java/com/dfire/event/HeraJobLostEvent.java new file mode 100755 index 00000000..a95f678b --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/HeraJobLostEvent.java @@ -0,0 +1,18 @@ +package com.dfire.event; + +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 下午4:20 2018/4/19 + * @desc + */ +@Data +public class HeraJobLostEvent extends ApplicationEvent { + + private final Long jobId; + public HeraJobLostEvent(EventType type, Long jobId){ + super(type); + this.jobId=jobId; + } +} diff --git a/hera-common/src/main/java/com/dfire/event/HeraJobMaintenanceEvent.java b/hera-common/src/main/java/com/dfire/event/HeraJobMaintenanceEvent.java new file mode 100755 index 00000000..5ab58357 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/HeraJobMaintenanceEvent.java @@ -0,0 +1,19 @@ +package com.dfire.event; + +import lombok.Getter; + +/** + * @author: 凌霄 + * @time: Created in 下午4:23 2018/4/19 + * @desc + */ +public class HeraJobMaintenanceEvent extends ApplicationEvent { + + @Getter + private final Long id; + + public HeraJobMaintenanceEvent(EventType type, Long id) { + super(type); + this.id = id; + } +} diff --git a/hera-common/src/main/java/com/dfire/event/HeraJobSuccessEvent.java b/hera-common/src/main/java/com/dfire/event/HeraJobSuccessEvent.java new file mode 100755 index 00000000..f2517dcf --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/HeraJobSuccessEvent.java @@ -0,0 +1,29 @@ +package com.dfire.event; + +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.TriggerTypeEnum; +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 下午4:27 2018/4/19 + * @desc + */ +@Data +public class HeraJobSuccessEvent extends ApplicationEvent { + + + private final HeraJobHistoryVo heraJobHistory; + + private String statisticEndTime; + private Long jobId; + private TriggerTypeEnum triggerType; + + public HeraJobSuccessEvent(Long jobId, TriggerTypeEnum triggerType, HeraJobHistoryVo heraJobHistory) { + super(Events.JobSucceed); + this.jobId = jobId; + this.triggerType = triggerType; + this.heraJobHistory = heraJobHistory; + } + +} diff --git a/hera-common/src/main/java/com/dfire/event/HeraScheduleTriggerEvent.java b/hera-common/src/main/java/com/dfire/event/HeraScheduleTriggerEvent.java new file mode 100755 index 00000000..75a64cb5 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/event/HeraScheduleTriggerEvent.java @@ -0,0 +1,21 @@ +package com.dfire.event; + +import lombok.Builder; +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 下午4:32 2018/4/19 + * @desc + */ +@Builder +@Data +public class HeraScheduleTriggerEvent extends ApplicationEvent { + + private final Long actionId; + + public HeraScheduleTriggerEvent(Long actionId) { + super(Events.ScheduleTrigger); + this.actionId = actionId; + } +} diff --git a/hera-common/src/main/java/com/dfire/graph/DirectionGraph.java b/hera-common/src/main/java/com/dfire/graph/DirectionGraph.java new file mode 100755 index 00000000..ae932e19 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/graph/DirectionGraph.java @@ -0,0 +1,84 @@ +package com.dfire.graph; + +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 下午6:44 2018/8/15 + * @desc + */ +@Data +public class DirectionGraph implements Serializable { + + /** + * 默认图的点的个数 + */ + private Integer maxNodeNum = 60000; + + /** + * srcEdge 表示图的边 + */ + private ArrayList[] srcEdge; + /** + * tarEdge 表示图的边 + */ + private ArrayList[] tarEdge; + /** + * 根据node节点的nodeName找下标 + */ + private Map nodeMap; + /** + * 根据下标查找node节点 + */ + private Map> indexMap; + + + private int index; + + public DirectionGraph() { + index = 0; + srcEdge = new ArrayList[maxNodeNum]; + tarEdge = new ArrayList[maxNodeNum]; + nodeMap = new HashMap<>(); + indexMap = new HashMap<>(); + } + + public boolean addNode(GraphNode graphNode) { + if (nodeMap.get(graphNode.getNodeName()) != null) { + return false; + } + nodeMap.put( graphNode.getNodeName(), index); + indexMap.put(index++, graphNode); + return true; + } + + public boolean addEdge(GraphNode graphNodeOne, GraphNode graphNodeTwo) { + Integer srcIndex = getNodeIndex(graphNodeOne); + Integer tarIndex = getNodeIndex(graphNodeTwo); + if (srcIndex == null) { + return false; + } + if (srcEdge[srcIndex] == null) { + srcEdge[srcIndex] = new ArrayList<>(); + } + if (!srcEdge[srcIndex].contains(tarIndex)) { + srcEdge[srcIndex].add(tarIndex); + } + if (tarEdge[tarIndex] == null) { + tarEdge[tarIndex] = new ArrayList<>(); + } + if (!tarEdge[tarIndex].contains(srcIndex)) { + tarEdge[tarIndex].add(srcIndex); + } + return true; + } + + public Integer getNodeIndex(GraphNode node) { + return nodeMap.get(node.getNodeName()); + } +} diff --git a/hera-common/src/main/java/com/dfire/graph/Edge.java b/hera-common/src/main/java/com/dfire/graph/Edge.java new file mode 100755 index 00000000..c096f287 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/graph/Edge.java @@ -0,0 +1,20 @@ +package com.dfire.graph; + +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 下午6:43 2018/8/15 + * @desc + */ +@Data +public class Edge { + + private GraphNode nodeA; + private GraphNode nodeB; + + public Edge(GraphNode nodeA, GraphNode nodeB) { + this.nodeA = nodeA; + this.nodeB = nodeB; + } +} diff --git a/hera-common/src/main/java/com/dfire/graph/GraphNode.java b/hera-common/src/main/java/com/dfire/graph/GraphNode.java new file mode 100755 index 00000000..7b70ad38 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/graph/GraphNode.java @@ -0,0 +1,77 @@ +package com.dfire.graph; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author: 凌霄 + * @time: Created in 下午6:43 2018/8/15 + * @desc + */ +@Data +public class GraphNode implements Serializable { + + /** + * 顶点名称 + */ + private T nodeName; + /** + * 顶点说明 + */ + private Object remark; + + /** + * 任务状态 + * 1:开启 + * 0:关闭 + */ + private Integer auto; + + private String descName; // 展示名称 + + public GraphNode() { + } + +// public GraphNode(T nodeName, Object remark) { +// this.nodeName = nodeName; +// this.remark = remark; +// } + +// public GraphNode(Integer auto,T nodeName, Object remark) { +// this.nodeName = nodeName; +// this.remark = remark; +// this.auto = auto; +// } + + public GraphNode(T nodeName, Object remark, String descName) { + this.nodeName = nodeName; + this.remark = remark; + this.descName = descName; + } + + public GraphNode(Integer auto,T nodeName, Object remark, String descName) { + this.nodeName = nodeName; + this.remark = remark; + this.auto = auto; + this.descName = descName; + } + + @Override + public boolean equals(Object graphNode) { + if (!(graphNode instanceof GraphNode)) { + return false; + } + GraphNode other = (GraphNode) graphNode; + + if (!other.getNodeName().toString().trim().equals(this.getNodeName().toString().trim())) { + return false; + } + return true; + } + + @Override + public int hashCode() { + return this.getNodeName().hashCode(); + } +} diff --git a/hera-common/src/main/java/com/dfire/graph/JobRelation.java b/hera-common/src/main/java/com/dfire/graph/JobRelation.java new file mode 100755 index 00000000..89df824d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/graph/JobRelation.java @@ -0,0 +1,23 @@ +package com.dfire.graph; + +import lombok.Data; + +@Data +public class JobRelation { + + private Integer id; + + private String name; + + private String dependencies; + + private Integer pid; + + private String pname; + + private Integer auto; + + private Integer pAuto; + + +} diff --git a/hera-common/src/main/java/com/dfire/logs/DebugLog.java b/hera-common/src/main/java/com/dfire/logs/DebugLog.java new file mode 100755 index 00000000..4fa0889c --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/DebugLog.java @@ -0,0 +1,42 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaosuda + * @date 2018/11/5 + */ +@Slf4j +public class DebugLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + +} diff --git a/hera-common/src/main/java/com/dfire/logs/ErrorLog.java b/hera-common/src/main/java/com/dfire/logs/ErrorLog.java new file mode 100755 index 00000000..b9d1d935 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/ErrorLog.java @@ -0,0 +1,34 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaosuda + * @date 2018/11/26 + */ +@Slf4j +public class ErrorLog { + + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + + public static void error(Throwable e) { + log.error(e.getMessage(), e); + } + + +} diff --git a/hera-common/src/main/java/com/dfire/logs/HeartLog.java b/hera-common/src/main/java/com/dfire/logs/HeartLog.java new file mode 100755 index 00000000..d8cb268d --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/HeartLog.java @@ -0,0 +1,50 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaosuda + * @date 2018/11/5 + */ +@Slf4j +public class HeartLog { + public static void info(String msg) { + log.info(msg); + } + + public static void debug(String msg) { + log.debug(msg); + } + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + + } + + public static void debug(String format, Object... arguments) { + log.debug(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + +} diff --git a/hera-common/src/main/java/com/dfire/logs/HeraLog.java b/hera-common/src/main/java/com/dfire/logs/HeraLog.java new file mode 100755 index 00000000..382dc408 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/HeraLog.java @@ -0,0 +1,46 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaosuda + * @date 2018/11/5 + */ +@Slf4j +public class HeraLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + + public static void error(String format,Throwable throwable){ + log.error(format,throwable); + } + +} diff --git a/hera-common/src/main/java/com/dfire/logs/MasterLog.java b/hera-common/src/main/java/com/dfire/logs/MasterLog.java new file mode 100755 index 00000000..91040ab2 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/MasterLog.java @@ -0,0 +1,46 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author huoguo + * @date 2018/11/5 + */ +@Slf4j +public class MasterLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + public static void error(String format,Throwable throwable){ + log.error(format,throwable); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + +} diff --git a/hera-common/src/main/java/com/dfire/logs/MonitorLog.java b/hera-common/src/main/java/com/dfire/logs/MonitorLog.java new file mode 100755 index 00000000..42cc1715 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/MonitorLog.java @@ -0,0 +1,53 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * + * @author xiaosuda + * @date 2018/12/20 + */ +@Slf4j +public class MonitorLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void debug(String msg) { + log.debug(msg); + } + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void info(Class c, String format, Object... arguments) { + log.info(c.getSimpleName() + ": " + format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + + public static void error(String format, Throwable throwable) { + log.error(format, throwable); + } +} diff --git a/hera-common/src/main/java/com/dfire/logs/ScanLog.java b/hera-common/src/main/java/com/dfire/logs/ScanLog.java new file mode 100755 index 00000000..c2a30d7b --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/ScanLog.java @@ -0,0 +1,42 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaosuda + * @date 2018/11/5 + */ +@Slf4j +public class ScanLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + +} diff --git a/hera-common/src/main/java/com/dfire/logs/ScheduleLog.java b/hera-common/src/main/java/com/dfire/logs/ScheduleLog.java new file mode 100755 index 00000000..4b3c7df5 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/ScheduleLog.java @@ -0,0 +1,46 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaosuda + * @date 2018/11/5 + */ +@Slf4j +public class ScheduleLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + + public static void error(String format,Throwable throwable){ + log.error(format,throwable); + } + +} diff --git a/hera-common/src/main/java/com/dfire/logs/SocketLog.java b/hera-common/src/main/java/com/dfire/logs/SocketLog.java new file mode 100755 index 00000000..d7def474 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/SocketLog.java @@ -0,0 +1,45 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaosuda + * @date 2018/11/5 + */ +@Slf4j +public class SocketLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + + public static void error(String format,Throwable throwable){ + log.error(format,throwable); + } +} diff --git a/hera-common/src/main/java/com/dfire/logs/TaskLog.java b/hera-common/src/main/java/com/dfire/logs/TaskLog.java new file mode 100755 index 00000000..8845753a --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/TaskLog.java @@ -0,0 +1,50 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * 任务执行的详细过程 + * @author xiaosuda + * @date 2018/11/5 + */ +@Slf4j +public class TaskLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void info(Class c,String format, Object... arguments) { + log.info(c.getSimpleName()+": "+format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + + public static void error(String format,Throwable throwable){ + log.error(format,throwable); + } +} diff --git a/hera-common/src/main/java/com/dfire/logs/WorkerLog.java b/hera-common/src/main/java/com/dfire/logs/WorkerLog.java new file mode 100755 index 00000000..0c989f06 --- /dev/null +++ b/hera-common/src/main/java/com/dfire/logs/WorkerLog.java @@ -0,0 +1,46 @@ +package com.dfire.logs; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author huoguo + * @date 2018/11/5 + */ +@Slf4j +public class WorkerLog { + public static void info(String msg) { + log.info(msg); + } + + + public static void info(String format, Object... arguments) { + log.info(format, arguments); + } + + public static void error(String msg) { + log.error(msg); + } + + public static void error(String format, Object... arguments) { + log.error(format, arguments); + } + + public static void error(String format,Throwable throwable){ + log.error(format,throwable); + } + + + public static void error(String msg, Exception e) { + log.error(msg, e); + } + + + public static void warn(String msg) { + log.warn(msg); + } + + public static void warn(String format, Object... arguments) { + log.warn(format, arguments); + } + +} diff --git a/hera-core/pom.xml b/hera-core/pom.xml new file mode 100755 index 00000000..14628567 --- /dev/null +++ b/hera-core/pom.xml @@ -0,0 +1,127 @@ + + + 4.0.0 + + + com.dfire.hera + hera + 2.4.2 + + + hera-core + jar + ${hera.core.version} + hera-core + hera project for Spring Boot + + + 2.2.1 + 3.3.0 + 3.4 + + + + + + com.amazonaws + aws-java-sdk-emr + 1.11.513 + + + com.amazonaws + aws-java-sdk-core + 1.11.513 + + + + org.quartz-scheduler + quartz + + + com.aliyun + aliyun-java-sdk-core + 4.3.9 + + + com.aliyun + aliyun-java-sdk-emr + 3.1.0 + + + + io.netty + netty-all + + + com.auth0 + java-jwt + ${jwt.version} + + + + + com.google.guava + guava + + + org.projectlombok + lombok + + + com.alibaba + fastjson + + + com.google.protobuf + protobuf-java + 3.5.1 + + + org.slf4j + slf4j-api + + + + org.apache.commons + commons-lang3 + ${lang3.version} + + + + + com.alibaba + druid + + + commons-lang + commons-lang + + + + com.dfire.hera + hera-monitor + + + + com.dfire.hera + hera-protocol + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + junit + junit + + + + + + diff --git a/hera-core/src/main/java/com/dfire/core/emr/AbstractEmr.java b/hera-core/src/main/java/com/dfire/core/emr/AbstractEmr.java new file mode 100755 index 00000000..18ef5876 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/emr/AbstractEmr.java @@ -0,0 +1,411 @@ +package com.dfire.core.emr; + +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.lock.DistributeLock; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.MonitorLog; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.LockSupport; + +/** + * desc: emr集群 抽象类 + * + * @author scx + * @create 2019/04/01 + */ +public abstract class AbstractEmr implements EmrJob, Emr { + + /** + * emr集群的前缀 + */ + protected final String clusterPrefix = "hera-schedule-" + HeraGlobalEnv.getEnv() + "-"; + /** + * 缓存的集群IP + */ + // protected volatile List cacheIp = null; + + + protected String prefixKey = "ssh -o StrictHostKeyChecking=no -i "; + /** + * 任务数 + */ + // private volatile AtomicInteger taskRunning; + /** + * 任务计数器 + */ + // private AtomicLong taskNum; + /** + * 缓存的集群Id + */ + // private volatile String cacheClusterId; + /** + * 关闭集群的调度池 + */ + private ScheduledExecutorService pool; + /** + * 上次的任务数 + */ + private long cacheTaskNum; + /** + * 集群是否已经关闭字段 + */ + // private volatile boolean clusterTerminate = true; + /** + * check 集群是否需要关闭返回的future + */ + private ScheduledFuture clusterWatchFuture; + /** + * 自动扩展冷却时间 单位:秒 + */ + private int coolDown = 300; + /** + * 扩展百分比 + */ + private int scalePercent = 10; + /** + * 最少实例数 + */ + private int minCapacity = 1; + /** + * 最大实例数 + */ + private int maxCapacity = 15; + + private ConcurrentHashMap ownerCluster = new ConcurrentHashMap<>(); + + private ConcurrentHashMap ownerTaskRunning = new ConcurrentHashMap<>(); + + private ConcurrentHashMap ownerTaskTotal = new ConcurrentHashMap<>(); + + private ConcurrentHashMap> ownerIps = new ConcurrentHashMap<>(); + + private ConcurrentHashMap ownerLock = new ConcurrentHashMap<>(); + + + public int getCoolDown() { + return coolDown; + } + + public int getScalePercent() { + return scalePercent; + } + + public int getMinCapacity() { + return minCapacity; + } + + public int getMaxCapacity() { + return maxCapacity; + } + + protected String getClusterName(String owner) { + return buildClusterName(owner) + ActionUtil.getCurrDate(); + } + + protected String buildClusterName(String owner) { + return clusterPrefix + owner + "-"; + } + + /** + * 创建集群的方法 + */ + protected void createCluster(String owner) { + init(); + if (StringUtils.isBlank(ownerCluster.get(owner))) { + synchronized (ownerLock.get(owner)) { + if (notAlive(owner)) { + String cacheClusterId = null; + //创建集群有可能发生异常 + while (StringUtils.isBlank(cacheClusterId)) { + cacheClusterId = sendCreateRequest(owner); + sleep(); + } + boolean exception = false; + try { + waitClusterCompletion(cacheClusterId); + ownerCluster.put(owner, cacheClusterId); + } catch (HeraException e) { + ErrorLog.error("等待集群创建完成失败:", e); + sleep(); + createCluster(owner); + exception = true; + } + //初始化一次就够了 + if (!exception) { + before(owner); + MonitorLog.info("[" + owner + "]集群创建完成,可以执行任务了.集群ID为:" + ownerCluster.get(owner)); + } + } + } + } else { + if (notAlive(owner)) { + synchronized (ownerLock.get(owner)) { + if (notAlive(owner)) { + destroyCluster(owner); + createCluster(owner); + } + } + } + } + } + + private void before(String owner) { + ownerIps.remove(owner); + if (DistributeLock.isMaster()) { + //重置当前集群的所有任务,running不可重置,因为可能集群被手动关闭,任务还在重试中 + ownerTaskTotal.putIfAbsent(owner, new AtomicLong(0)); + submitClusterWatch(); + } + } + + + @Override + public void addJob(String owner) { + try { + ownerLock.putIfAbsent(owner, new Object()); + createCluster(owner); + } catch (Exception e) { + ErrorLog.error("创建集群失败", e); + } finally { + if (ownerTaskRunning.get(owner) != null) { + ownerTaskRunning.get(owner).incrementAndGet(); + } else { + ownerTaskRunning.putIfAbsent(owner, new AtomicLong(1)); + } + if (ownerTaskTotal.get(owner) != null) { + ownerTaskTotal.get(owner).incrementAndGet(); + } else { + ownerTaskTotal.putIfAbsent(owner, new AtomicLong(1)); + } + } + } + + @Override + public void removeJob(String owner) { + if (ownerTaskRunning.get(owner) != null) { + ownerTaskRunning.get(owner).decrementAndGet(); + } + } + + + /** + * 判断是否有创建好的集群 + * + * @return 结果 + */ + private boolean notAlive(String owner) { + //如果当前缓存的集群已经关闭,查询是否有已经启动的 + String cacheClusterId; + if (!checkAlive(cacheClusterId = ownerCluster.get(owner))) { + String newClusterId = getAliveId(owner); + //发生了集群id切换,重新检测。一个线程检测就够了 + if (StringUtils.isNotBlank(newClusterId)) { + synchronized (ownerLock.get(owner)) { + try { + waitClusterCompletion(newClusterId); + ownerCluster.put(owner, newClusterId); + before(owner); + } catch (HeraException e) { + ErrorLog.error("集群创建失败:", e); + return true; + } + } + return false; + } + MonitorLog.info("集群已经关闭:" + cacheClusterId); + return true; + } + return false; + } + + + /** + * 判断集群是否活着 + * + * @param cacheClusterId cacheClusterId + * @return boolean + */ + protected abstract boolean checkAlive(String cacheClusterId); + + /** + * 获得emr集群的登录ip/域名 + * + * @return ip/域名 + */ + @Override + public String getIp(String owner) { + ownerLock.putIfAbsent(owner, new Object()); + this.init(); + if (notAlive(owner)) { + throw new IllegalStateException("[" + owner + "]:无存活的集群"); + } + List ipList = ownerIps.get(owner); + if (ipList == null || ipList.size() == 0) { + synchronized (ownerLock.get(owner)) { + if (ipList == null || ipList.size() == 0) { + ipList = getMasterIp(ownerCluster.get(owner)); + if (ipList == null || ipList.size() == 0) { + throw new NullPointerException("cacheIp can not be null"); + } + ownerIps.put(owner, ipList); + } + } + } + return ipList.get(ThreadLocalRandom.current().nextInt(ipList.size())); + } + + + /** + * 循环检测 ,等待集群创建完成 + */ + private void waitClusterCompletion(String cacheClusterId) throws HeraException { + long start = System.currentTimeMillis(); + //最创建集群能容忍的最大等待时间 30 分钟 + long maxWaitTime = 30 * 60 * 1000L; + // 必须同步 不能异步 + + while (!isCompletion(cacheClusterId)) { + sleep(); + if (System.currentTimeMillis() - start > maxWaitTime) { + terminateCluster(cacheClusterId); + throw new HeraException("创建集群时间超出" + maxWaitTime + "ms,强制关闭集群"); + } + } + MonitorLog.info("创建集群:" + cacheClusterId + "耗时:" + (System.currentTimeMillis() - start) + "ms"); + } + + private void sleep() { + long sleepTime = 30 * 1000 * 1000000L; + LockSupport.parkNanos(sleepTime); + } + + + /** + * createCluster 方法已经同步过 + */ + private void submitClusterWatch() { + if (clusterWatchFuture == null || clusterWatchFuture.isDone() || clusterWatchFuture.isCancelled()) { + if (pool == null) { + pool = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("cluster-destroy-watch", true)); + } + HashMap cacheTotalNum = new HashMap<>(ownerCluster.size()); + clusterWatchFuture = pool.scheduleWithFixedDelay(() -> { + ArrayList owners = new ArrayList<>(ownerCluster.keySet()); + if (owners.size() == 0) { + MonitorLog.info("there has no emr cluster owner,shutdown cluster-destroy-watch pool"); + clusterWatchFuture.cancel(true); + clusterWatchFuture = null; + cacheTotalNum.clear(); + } else { + for (String owner : owners) { + long taskRunning = ownerTaskRunning.getOrDefault(owner, new AtomicLong(0)).get(); + //如果正在运行的任务数为0 ,判断所有运行任务是否有变化 + if (taskRunning == 0) { + long lastTotal = cacheTotalNum.getOrDefault(owner, 0L); + long taskTotal = ownerTaskTotal.getOrDefault(owner, new AtomicLong(0)).get(); + MonitorLog.info("isMaster:{},正在emr集群[{}]运行的任务个数:{},十分钟前运行的总任务个数:{},运行的总任务个数:{}", DistributeLock.isMaster(), owner, taskRunning, lastTotal, taskTotal); + //如果任务执行没有变化,说明可以关闭了 + if (lastTotal == taskTotal) { + MonitorLog.info("[" + owner + "]集群:" + ownerCluster.get(owner) + "关闭成功,执行任务数为:" + taskTotal); + destroyCluster(owner); + cacheTotalNum.remove(owner); + } else { + cacheTotalNum.put(owner, taskTotal); + } + } + } + } + + }, 11, 11, TimeUnit.MINUTES); + } + + } + + /** + * 初始化client操作 + */ + protected abstract void init(); + + /** + * 关闭集群操作 + * + * @param clusterId clusterId + */ + protected abstract void terminateCluster(String clusterId); + + /** + * 关闭client + */ + protected abstract void shutdown(); + + + /** + * 发送创建集群的请求 + * + * @return 返回clusterId + */ + protected abstract String sendCreateRequest(String owner); + + /** + * 判断以clusterPrefix开头的机器是否有存活 + * + * @return StringUtils.isBlank() 表示无存活 + */ + + + protected abstract String getAliveId(String owner); + + /** + * 检测集群是否创建完成 + * + * @param clusterId clusterId + * @return + */ + protected abstract boolean isCompletion(String clusterId) throws HeraException; + + /** + * 获得master的ip + * + * @param clusterId clusterId + * @return + */ + protected abstract List getMasterIp(String clusterId); + + /** + * 销毁集群 + */ + protected void destroyCluster(String owner) { + clusterWatchFuture = null; + ownerTaskRunning.remove(owner); + ownerTaskTotal.remove(owner); + if (ownerCluster.size() == 0) { + shutdown(); + } + terminateCluster(ownerCluster.remove(owner)); + } + + + @Override + public String getLogin(String user, String owner) { + return prefixKey + HeraGlobalEnv.getKeyPath() + " " + user + "@" + this.getIp(owner); + } + + @Override + public String getFixLogin(String host) { + if ("UE".equals(HeraGlobalEnv.getArea()) || "WE".equals(HeraGlobalEnv.getArea())) { + return prefixKey + " /home/docker/conf/fixed.pem -p 33033 hdfs@" + host; + } + return prefixKey + " /home/docker/conf/fixed.pem hadoop@" + host; + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/emr/AliYunEmr.java b/hera-core/src/main/java/com/dfire/core/emr/AliYunEmr.java new file mode 100755 index 00000000..d2468f9f --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/emr/AliYunEmr.java @@ -0,0 +1,421 @@ +package com.dfire.core.emr; + +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.emr.model.v20160408.*; +import com.aliyuncs.emr.model.v20160408.CreateClusterV2Request.Config; +import com.aliyuncs.emr.model.v20160408.CreateClusterV2Request.HostGroup; +import com.aliyuncs.emr.model.v20160408.DescribeClusterV2Response.ClusterInfo; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.EnvUtils; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.MonitorLog; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * desc: + * + * @author scx + * @create 2019/04/01 + */ +public class AliYunEmr extends AbstractEmr { + + + public static final String NAME = "aliYun"; + + private boolean isShutdown = true; + + private DefaultAcsClient client; + + + private List aliveStatus = new ArrayList<>(); + + { + aliveStatus.add("CREATING"); + aliveStatus.add("IDLE"); + aliveStatus.add("RUNNING"); + } + + public static void main(String[] args) { + AliYunEmr emr = new AliYunEmr(); + emr.init(); + } + + + @Override + protected void init() { + if (client == null || isShutdown) { + synchronized (this) { + if (client == null || isShutdown) { + String region = "cn-hangzhou"; + if (EnvUtils.isDaily()) { + region = "cn-shanghai"; + } + IClientProfile profile = DefaultProfile.getProfile(region, HeraGlobalEnv.getAliYunAccessKey(), HeraGlobalEnv.getAliYunAccessSecret()); + client = new DefaultAcsClient(profile); + isShutdown = false; + } + } + } + } + + @Override + protected void terminateCluster(String clusterId) { + ReleaseClusterRequest request = new ReleaseClusterRequest(); + request.setId(clusterId); + try { + client.getAcsResponse(request); + MonitorLog.info("关闭集群" + clusterId + "成功"); + } catch (ClientException e) { + MonitorLog.error("关闭集群" + clusterId + "失败", e); + } + } + + + @Override + protected void shutdown() { + if (!isShutdown) { + isShutdown = true; + client.shutdown(); + client = null; + } + } + + @Override + protected String sendCreateRequest(String owner) { + try { + CreateClusterV2Request request = new CreateClusterV2Request(); + request.setName(getClusterName(owner)); + request.setEmrVer("EMR-3.12.0"); + request.setAutoRenew(false); + request.setChargeType("PostPaid"); + request.setClusterType("HADOOP"); + //使用统一meta数据库 一定要开启 + request.setIsOpenPublicIp(true); + request.setLogPath("oss://log-xxxx"); + request.setNetType("vpc"); + if (EnvUtils.isDaily()) { + request.setVpcId("vpc-u"); + request.setVSwitchId("v"); + request.setZoneId("cn-shanghai-f"); + request.setSecurityGroupId("xxxx"); + } else { + request.setVpcId("vpc-b"); + request.setVSwitchId("vsw-b"); + request.setZoneId("cn-hangzhou-g"); + request.setSecurityGroupId("xxxx"); + + } + //登录emr集群的账号密码 + request.setMasterPwd("xxxxxx"); + request.setIoOptimized(true); + List configs = new ArrayList<>(); + if (EnvUtils.isPre()) { + setCustomHiveMetaDB(configs); + request.setUseLocalMetaDb(true); + } else { + request.setUseLocalMetaDb(false); + } + setSparkConf(configs); + request.setConfigs(configs); + request.setInstanceGeneration("ecs-2"); + setHostGroups(request); + setBootStrapAction(request); + CreateClusterV2Response response = client.getAcsResponse(request); + String clusterId = response.getClusterId(); + setAutoScaling(clusterId); + return clusterId; + } catch (Exception e) { + ErrorLog.error("aliyun创建集群异常:" + e.getMessage(), e); + + } + return null; + } + + /** + * 引导操作 + * + * @param request request + */ + private void setBootStrapAction(CreateClusterV2Request request) { + List actions = new ArrayList<>(); + CreateClusterV2Request.BootstrapAction userAction = new CreateClusterV2Request.BootstrapAction(); + userAction.setName("userInit"); + if (EnvUtils.isDaily()) { + //emr集群引导操作的oss路径 + userAction.setPath("oss://hera/bootstrap.sh"); + //引导操作脚本的执行命令 + userAction.setArg("-c \"osscmd --id=" + HeraGlobalEnv.getAliYunAccessKey() + " --key=" + HeraGlobalEnv.getAliYunAccessSecret()); + } else if (EnvUtils.isPre()) { + //emr集群引导操作的oss路径 + userAction.setPath("oss://hera/bootstrap.sh"); + //引导操作脚本的执行命令 + userAction.setArg("-c \"osscmd --id=" + HeraGlobalEnv.getAliYunAccessKey() + " --key=" + HeraGlobalEnv.getAliYunAccessSecret()); + } else if (EnvUtils.isPro()) { + //emr集群引导操作的oss路径 + userAction.setPath("oss://hera/bootstrap.sh"); + //引导操作脚本的执行命令 + userAction.setArg("-c \"osscmd --id=" + HeraGlobalEnv.getAliYunAccessKey() + " --key=" + HeraGlobalEnv.getAliYunAccessSecret()); + } else { + throw new IllegalStateException("未识别的环境:" + HeraGlobalEnv.getEnv()); + } + actions.add(userAction); + request.setBootstrapActions(actions); + } + + @Override + protected String getAliveId(String owner) { + ListClustersRequest request = new ListClustersRequest(); + request.setStatusLists(aliveStatus); + request.setPageNumber(1); + request.setPageSize(200); + try { + ListClustersResponse response = client.getAcsResponse(request); + List clusters = response.getClusters(); + for (ListClustersResponse.ClusterInfo cluster : clusters) { + if (cluster.getName().startsWith(buildClusterName(owner))) { + return cluster.getId(); + } + } + } catch (ClientException e) { + ErrorLog.error("读取emr存活集群失败", e); + } + return null; + } + + @Override + protected boolean isCompletion(String clusterId) throws HeraException { + ClusterInfo clusterInfo = getClusterInfo(clusterId); + if (clusterInfo == null) { + return false; + } + MonitorLog.info("当前集群状态为:{},{},{}", clusterId, clusterInfo.getName(), clusterInfo.getStatus()); + return isReady(clusterInfo.getStatus()); + } + + private boolean isReady(String status) throws HeraException { + if ("CREATING".equals(status) || "BOOTSTRAPPING".equals(status)) { + return false; + } + if ("RELEASED".equals(status)) { + throw new HeraException("集群已关闭"); + } + return aliveStatus.contains(status); + } + + @Override + protected List getMasterIp(String clusterId) { + ClusterInfo clusterInfo = getClusterInfo(clusterId); + if (clusterInfo == null) { + return null; + } + List ipList = new ArrayList<>(); + List groupList = clusterInfo.getHostGroupList(); + for (ClusterInfo.HostGroup hostGroup : groupList) { + if ("CORE".equals(hostGroup.getHostGroupType())) { + for (ClusterInfo.HostGroup.Node node : hostGroup.getNodes()) { + if ("NORMAL".equals(node.getStatus())) { + ipList.add(node.getInnerIp()); + } + } + } + } + return ipList; + } + + @Override + protected boolean checkAlive(String cacheClusterId) { + if (StringUtils.isBlank(cacheClusterId)) { + return false; + } + ClusterInfo clusterInfo = getClusterInfo(cacheClusterId); + if (clusterInfo == null) { + return false; + } + MonitorLog.info("{}集群状态为:{}", cacheClusterId, clusterInfo.getStatus()); + return aliveStatus.contains(clusterInfo.getStatus()); + } + + private ClusterInfo getClusterInfo(String clusterId) { + DescribeClusterV2Request request = new DescribeClusterV2Request(); + request.setId(clusterId); + ClusterInfo clusterInfo = null; + try { + DescribeClusterV2Response acsResponse = client.getAcsResponse(request); + clusterInfo = acsResponse.getClusterInfo(); + } catch (ClientException e) { + ErrorLog.error("获取集群信息失败", e); + } + return clusterInfo; + } + + + private void setHostGroups(CreateClusterV2Request request) { + List hostGroups = new ArrayList<>(); + + HostGroup masterGroup = new HostGroup(); + masterGroup.setNodeCount(1); + masterGroup.setHostGroupName("MASTER"); + masterGroup.setHostGroupType("MASTER"); + masterGroup.setInstanceType("ecs.r5.xlarge"); + masterGroup.setDiskType("cloud_efficiency"); + masterGroup.setDiskCapacity(80); + masterGroup.setDiskCount(1); + hostGroups.add(masterGroup); + + HostGroup coreGroup = new HostGroup(); + + if (EnvUtils.isDaily()) { + coreGroup.setNodeCount(2); + coreGroup.setInstanceType("ecs.r5.xlarge"); + } else { + if (EnvUtils.isPre()) { + coreGroup.setInstanceType("ecs.r5.2xlarge"); + coreGroup.setNodeCount(2); + } else { + coreGroup.setInstanceType("ecs.r5.2xlarge"); + coreGroup.setNodeCount(4); + } + } + coreGroup.setHostGroupName("CORE"); + coreGroup.setHostGroupType("CORE"); + coreGroup.setDiskType("cloud_efficiency"); + coreGroup.setDiskCapacity(80); + coreGroup.setDiskCount(4); + hostGroups.add(coreGroup); + + request.setHostGroups(hostGroups); + } + + /** + * 设置自定义的hive 元数据地址 + * + * @param configs + */ + private void setCustomHiveMetaDB(List configs) { + Config metaConf = new Config(); + setHiveConf(metaConf, "init.meta.db", "false"); + configs.add(metaConf); + + Config usernameConf = new Config(); + setHiveConf(usernameConf, "javax.jdo.option.ConnectionUserName", "xxxx"); + configs.add(usernameConf); + + Config passwordConf = new Config(); + setHiveConf(passwordConf, "javax.jdo.option.ConnectionPassword", "xxxx"); + configs.add(passwordConf); + + Config driverConf = new Config(); + setHiveConf(driverConf, "javax.jdo.option.ConnectionDriverName", "com.mysql.jdbc.Driver"); + configs.add(driverConf); + + Config urlConf = new Config(); + setHiveConf(urlConf, "javax.jdo.option.ConnectionURL", "jdbc:mysql://rds:3306/hivemeta_pre?createDatabaseIfNotExist=true"); + configs.add(urlConf); + + } + + private void setSparkConf(List configs) { + Config retryConf = new Config(); + setSparkConf(retryConf, "spark.port.maxRetries", "256"); + configs.add(retryConf); + } + + + private void setHiveConf(Config config, String key, String val) { + config.setServiceName("HIVE"); + config.setFileName("hive-site"); + config.setConfigKey(key); + config.setConfigValue(val); + + } + + + private void setSparkConf(Config config, String key, String val) { + config.setServiceName("SPARK"); + config.setFileName("spark-defaults"); + config.setConfigKey(key); + config.setConfigValue(val); + } + + + /** + * 设置弹性伸缩 阿里云暂时不支持api模式 + * + * @param clusterId clusterId + */ + private void setAutoScaling(String clusterId) { + + CreateScalingTaskGroupRequest scaleRequest = new CreateScalingTaskGroupRequest(); + + scaleRequest.setClusterId(clusterId); + //10 + scaleRequest.setMaxSize(getMaxCapacity()); + //2 + scaleRequest.setMinSize(getMinCapacity()); + //300 + scaleRequest.setDefaultCooldown(getCoolDown()); + List rules = new ArrayList<>(2); + + CreateScalingTaskGroupRequest.ScalingRule scaleOut = new CreateScalingTaskGroupRequest.ScalingRule(); + scaleOut.setAdjustmentType("PercentChangeInCapacity"); + //10 + scaleOut.setAdjustmentValue(getScalePercent()); + scaleOut.setRuleName("hera-scale-out"); + //300 + scaleOut.setCooldown(getCoolDown()); + + + CreateScalingTaskGroupRequest.ScalingRule.CloudWatchTrigger scaleOutTrigger = new CreateScalingTaskGroupRequest.ScalingRule.CloudWatchTrigger(); + scaleOutTrigger.setComparisonOperator("LessThanOrEqualToThreshold"); + scaleOutTrigger.setPeriod(getCoolDown()); + scaleOutTrigger.setStatistics("Average"); + scaleOutTrigger.setThreshold(String.valueOf(1024 * 4)); + scaleOutTrigger.setMetricName("YARN.AvailableMemory"); + + scaleOut.setCloudWatchTriggers(Collections.singletonList(scaleOutTrigger)); + + rules.add(scaleOut); + + scaleRequest.setScalingRules(rules); + scaleRequest.setInstanceTypeLists(Collections.singletonList("ecs.r5.xlarge")); + scaleRequest.setPayType("Postpaid"); + scaleRequest.setDataDiskCategory("CLOUD_SSD"); + scaleRequest.setDataDiskSize(80); + scaleRequest.setDataDiskCount(4); + + try { + CreateScalingTaskGroupResponse response = client.getAcsResponse(scaleRequest); + MonitorLog.info("ScalingTaskGroup's hostGroupId is :" + response.getHostGroupId()); + } catch (ClientException e) { + MonitorLog.error("create scaling exception", e); + } + + /* + + CreateScalingTaskGroupRequest.ScalingRule scaleIn = new CreateScalingTaskGroupRequest.ScalingRule(); + scaleIn.setAdjustmentType("PercentChangeInCapacity"); + scaleIn.setAdjustmentValue(-getScalePercent()); + scaleIn.setRuleName("hera-scale-in"); + scaleIn.setCooldown(getCoolDown()); + + CreateScalingTaskGroupRequest.ScalingRule.CloudWatchTrigger scaleInTrigger = new CreateScalingTaskGroupRequest.ScalingRule.CloudWatchTrigger(); + scaleInTrigger.setComparisonOperator("GreaterThanOrEqualToThreshold"); + scaleInTrigger.setPeriod(getCoolDown()); + scaleInTrigger.setStatistics("Average"); + scaleInTrigger.setThreshold(String.valueOf(1024 * 6)); + scaleInTrigger.setMetricName("YARN.AvailableMemory"); + + scaleIn.setCloudWatchTriggers(Collections.singletonList(scaleInTrigger)); + rules.add(scaleIn);*/ + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/emr/AmazonEmr.java b/hera-core/src/main/java/com/dfire/core/emr/AmazonEmr.java new file mode 100755 index 00000000..18d1eb4e --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/emr/AmazonEmr.java @@ -0,0 +1,564 @@ +package com.dfire.core.emr; + +import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClient; +import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClientBuilder; +import com.amazonaws.services.elasticmapreduce.model.*; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.EmrConf; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.EnvUtils; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.MonitorLog; +import org.apache.commons.lang.StringUtils; + +import java.util.*; + +/** + * desc: + * 亚马逊emr集群 + * + * @author scx + * @create 2019/04/01 + */ +public class AmazonEmr extends AbstractEmr { + + public static final String NAME = "amazon"; + + + private final String[] APP_NAMES = {"hadoop", "spark", "hive", "livy", "zeppelin", "sqoop"}; + + private volatile long lastCheckTime = 0L; + + private volatile boolean lastCheckStatus = false; + + /** + * httpCode 正常退出码 + */ + protected final int SUCCESS_HTTP_CODE = 200; + /** + * emr 客户端 + */ + private volatile AmazonElasticMapReduceClient emr; + + /** + * emr 客户端是否管不 + */ + private volatile boolean isShutdown = true; + + + private ClusterState[] aliveStatus = {ClusterState.STARTING, ClusterState.BOOTSTRAPPING, ClusterState.RUNNING, ClusterState.WAITING}; + + + @Override + protected String getAliveId(String owner) { + String clusterId = null; + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -2); + ListClustersResult clusters = emr.listClusters(new ListClustersRequest().withCreatedAfter(calendar.getTime()) + .withClusterStates(aliveStatus)); + List summaries = clusters.getClusters(); + if (summaries != null && summaries.size() > 0) { + for (ClusterSummary summary : summaries) { + if (summary.getName().startsWith(buildClusterName(owner))) { + clusterId = summary.getId(); + MonitorLog.info("emr集群已经启动过,无需再次启动 :" + clusterId); + } + } + } + return clusterId; + } + + + @Override + protected boolean checkAlive(String cacheClusterId) { + if (StringUtils.isBlank(cacheClusterId)) { + return false; + } + //60秒检测一次 + long time = 30000L; + long now = System.currentTimeMillis(); + if (now - lastCheckTime >= time) { + synchronized (this) { + if (now - lastCheckTime >= time) { + Cluster clusterInfo = getClusterInfo(cacheClusterId); + ClusterStatus status = clusterInfo.getStatus(); + lastCheckStatus = false; + for (ClusterState clusterState : aliveStatus) { + if (clusterState.toString().equals(status.getState())) { + lastCheckStatus = true; + break; + } + } + lastCheckTime = System.currentTimeMillis(); + } + } + } + return lastCheckStatus; + } + + /** + * emr client 初始化 + */ + @Override + protected void init() { + if (emr == null || isShutdown) { + synchronized (this) { + if (emr == null || isShutdown) { + String regionName = "ap-south-1"; + if (EnvUtils.isEurope()) { + regionName = "eu-central-1"; + } else if (EnvUtils.isUs()) { + regionName = "us-west-2"; + } + emr = (AmazonElasticMapReduceClient) AmazonElasticMapReduceClientBuilder.standard().withRegion(regionName).build(); + isShutdown = false; + } + } + } + } + + + @Override + protected String sendCreateRequest(String owner) { + try { + EmrConf emrConf = new EmrConf(); + emrConf.setClusterName(getClusterName(owner)); + emrConf.setMasterInstanceType("m5.4xlarge"); + emrConf.setCoreInstanceType("m5.xlarge"); + emrConf.setTaskInstanceType("m5.4xlarge"); + emrConf.setNumCoreNodes(3); + emrConf.setNumTaskNodes(1); + if (EnvUtils.isEurope()) { + //欧洲区域 + emrConf.setLoginURl("s3n://xxx"); + emrConf.setEmrManagedSlaveSecurityGroup("xxx"); + emrConf.setEmrManagedMasterSecurityGroup("xxx"); + emrConf.setServiceAccessSecurityGroup("xxx"); + emrConf.setEc2SubnetId("xxx"); + //初始化的公钥key + emrConf.setKeyPairName("key_eu"); + } else if (EnvUtils.isUs()) { + //美国区域 + emrConf.setLoginURl("s3n://xxx"); + emrConf.setEmrManagedSlaveSecurityGroup("yyyy"); + emrConf.setEmrManagedMasterSecurityGroup("yyyy"); + emrConf.setServiceAccessSecurityGroup("yyyy"); + emrConf.setEc2SubnetId("yyyy"); + //初始化的公钥key + emrConf.setKeyPairName("key_us"); + } else if (EnvUtils.isIndia()) { + //印度区域 + emrConf.setLoginURl("s3n://xxx"); + emrConf.setEmrManagedSlaveSecurityGroup("zzz"); + emrConf.setEmrManagedMasterSecurityGroup("zzz"); + emrConf.setServiceAccessSecurityGroup("zzz"); + emrConf.setEc2SubnetId("zzz"); + //初始化的公钥key + emrConf.setKeyPairName("key_ind"); + } + RunJobFlowResult result = createClient(emrConf, owner); + int statusCode = result.getSdkHttpMetadata().getHttpStatusCode(); + if (statusCode == SUCCESS_HTTP_CODE) { + return result.getJobFlowId(); + } else { + ErrorLog.error("创建集群异常:" + statusCode); + } + } catch (Exception e) { + ErrorLog.error("amazon创建集群异常:" + e.getMessage(), e); + } + return null; + } + + + /** + * 检测集群是否创建完成逻辑 + * + * @param clusterId 集群ID + * @return 创建结果 + */ + @Override + protected boolean isCompletion(String clusterId) throws HeraException { + try { + if (clusterId == null) { + throw new HeraException("clusterId不能为null"); + } + MonitorLog.info("检测集群是否创建完成:" + clusterId); + Cluster clusterInfo = getClusterInfo(clusterId); + ClusterStatus status = clusterInfo.getStatus(); + if (ClusterState.TERMINATED.toString().equals(status.getState()) || ClusterState.TERMINATED_WITH_ERRORS.toString().equals(status.getState()) || ClusterState.TERMINATING.toString().equals(status.getState())) { + throw new HeraException("集群异常关闭"); + } + MonitorLog.info(clusterId + "当前集群状态:" + status.getState()); + if (status.getState().equals(ClusterState.WAITING.toString()) || status.getState().equals(ClusterState.RUNNING.toString())) { + return true; + } + } catch (Exception e) { + throw new HeraException("检测amazon集群创建是否完成失败:" + e.getMessage(), e); + } + return false; + + } + + private Cluster getClusterInfo(String clusterId) { + DescribeClusterResult result = emr.describeCluster(new DescribeClusterRequest().withClusterId(clusterId)); + if (result.getSdkHttpMetadata().getHttpStatusCode() != SUCCESS_HTTP_CODE) { + MonitorLog.info("检测集群创建完成的请求失败,http退出码为:" + result.getSdkHttpMetadata().getHttpStatusCode()); + } + return result.getCluster(); + } + + /** + * 关闭集群 + */ + @Override + protected void terminateCluster(String clusterId) { + emr.setTerminationProtection(new SetTerminationProtectionRequest().withJobFlowIds(clusterId).withTerminationProtected(false)); + TerminateJobFlowsResult terminateResult = emr.terminateJobFlows(new TerminateJobFlowsRequest().withJobFlowIds(clusterId)); + if (terminateResult.getSdkHttpMetadata().getHttpStatusCode() != SUCCESS_HTTP_CODE) { + MonitorLog.error("集群关闭失败" + clusterId); + } + } + + + /** + * 输出最近创建的集群 + */ + private void showCluster() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.HOUR, -1); + ListClustersResult running = emr.listClusters(new ListClustersRequest().withCreatedAfter(calendar.getTime())); + MonitorLog.info("集群个数" + running.getClusters().size()); + for (ClusterSummary cluster : running.getClusters()) { + MonitorLog.info(cluster.toString()); + } + } + + @Override + protected List getMasterIp(String clusterId) { + DescribeClusterResult result = emr.describeCluster(new DescribeClusterRequest().withClusterId(clusterId)); + if (result.getSdkHttpMetadata().getHttpStatusCode() != SUCCESS_HTTP_CODE) { + return null; + } else { + List ipList = new ArrayList<>(1); + ipList.add(result.getCluster().getMasterPublicDnsName()); + return ipList; + } + } + + + @Override + protected synchronized void shutdown() { + if (!isShutdown) { + emr.shutdown(); + isShutdown = true; + emr = null; + } + } + + private RunJobFlowResult createClient(EmrConf emrConf, String owner) { + RunJobFlowRequest request = new RunJobFlowRequest() + .withApplications(getApps()) + .withReleaseLabel("emr-5.21.0") + .withLogUri(emrConf.getLoginURl()) + .withName(emrConf.getClusterName()) + .withInstances(buildInstances(emrConf)) + .withConfigurations(buildConfigurations()) + .withAutoScalingRole("EMR_AutoScaling_DefaultRole") + .withVisibleToAllUsers(true) + .withJobFlowRole("EMR_EC2_DefaultRole") + .withServiceRole("EMR_DefaultRole") + .withBootstrapActions(buildBootstrapActions()) + .withTags(new Tag("EMR", HeraGlobalEnv.getArea() + "-" + HeraGlobalEnv.getEnv() + "-" + owner + "-hera-schedule")) + .withScaleDownBehavior("TERMINATE_AT_TASK_COMPLETION"); + MonitorLog.info("准备创建集群..."); + return emr.runJobFlow(request); + } + + private Collection buildBootstrapActions() { + Collection actionConfigs = new ArrayList<>(); + //设置创建集群的引导操作 + if (EnvUtils.isIndia()) { + actionConfigs.add(new BootstrapActionConfig() + .withName("userinit") + .withScriptBootstrapAction(new ScriptBootstrapActionConfig() + .withPath("s3://xx/bootstrap.sh") + .withArgs(Arrays.asList("-caws s3 cp", "")))); + } else if (EnvUtils.isUs() || EnvUtils.isEurope()) { + actionConfigs.add(new BootstrapActionConfig() + .withName("userinit") + .withScriptBootstrapAction(new ScriptBootstrapActionConfig() + .withPath("s3://xx/bootstrap.sh") + .withArgs(Arrays.asList("-caws s3 cp", "")))); + } + + return actionConfigs; + } + + + /** + * 新建实例 + * + * @param emrConf EmrConf + * @return JobFlowInstancesConfig + */ + private JobFlowInstancesConfig buildInstances(EmrConf emrConf) { + + InstanceGroupConfig masterInstance = new InstanceGroupConfig() + .withInstanceCount(1) + .withEbsConfiguration(new EbsConfiguration() + .withEbsBlockDeviceConfigs(new EbsBlockDeviceConfig() + .withVolumeSpecification(new VolumeSpecification() + .withSizeInGB(100) + .withVolumeType("standard")) + .withVolumesPerInstance(1))) + .withInstanceRole("MASTER") + .withInstanceType(emrConf.getMasterInstanceType()) + .withName("主实例 - 1"); + + + /** + * core节点一般为3个节点 + */ + InstanceGroupConfig coreInstance = new InstanceGroupConfig() + .withInstanceCount(emrConf.getNumCoreNodes()) + .withMarket(MarketType.ON_DEMAND) + .withEbsConfiguration(new EbsConfiguration() + .withEbsBlockDeviceConfigs(new EbsBlockDeviceConfig() + .withVolumeSpecification(new VolumeSpecification() + .withSizeInGB(100) + .withVolumeType("standard")) + .withVolumesPerInstance(2))) + .withInstanceRole("CORE") + .withInstanceType(emrConf.getCoreInstanceType()) + .withName("核心实例组 - 1"); + + + /** + * task节点弹性伸缩 + */ + InstanceGroupConfig taskInstance = new InstanceGroupConfig() + .withInstanceCount(emrConf.getNumTaskNodes()) + .withMarket(MarketType.fromValue(HeraGlobalEnv.getAwsEmrType())) + .withEbsConfiguration(new EbsConfiguration() + .withEbsBlockDeviceConfigs(new EbsBlockDeviceConfig() + .withVolumeSpecification(new VolumeSpecification() + .withSizeInGB(100) + .withVolumeType("standard")) + .withVolumesPerInstance(2))) + .withInstanceRole("TASK") + .withInstanceType(emrConf.getTaskInstanceType()) + .withAutoScalingPolicy(buildAutoScalingPolicy()) + .withName("核心实例组 - 2"); + + JobFlowInstancesConfig instancesConfig = new JobFlowInstancesConfig() + .withInstanceGroups(masterInstance, coreInstance, taskInstance) + .withEc2KeyName(emrConf.getKeyPairName()) + .withKeepJobFlowAliveWhenNoSteps(true) + .withEmrManagedMasterSecurityGroup(emrConf.getEmrManagedMasterSecurityGroup()) + .withEmrManagedSlaveSecurityGroup(emrConf.getEmrManagedSlaveSecurityGroup()) + .withServiceAccessSecurityGroup(emrConf.getServiceAccessSecurityGroup()) + .withTerminationProtected(true) + .withEc2SubnetId(emrConf.getEc2SubnetId()); + + + if (StringUtils.isNotBlank(emrConf.getAdditionalMasterSecurityGroups())) { + instancesConfig.setAdditionalMasterSecurityGroups(Arrays.asList(emrConf.getAdditionalMasterSecurityGroups().split(Constants.COMMA))); + } + + if (StringUtils.isNotBlank(emrConf.getAdditionalSlaveSecurityGroups())) { + instancesConfig.setAdditionalSlaveSecurityGroups(Arrays.asList(emrConf.getAdditionalSlaveSecurityGroups().split(Constants.COMMA))); + } + return instancesConfig; + } + + /** + * emr集群自动扩展策略,可以自己定义 + * + * @return AutoScalingPolicy + */ + private AutoScalingPolicy buildAutoScalingPolicy() { + + + // yarn 资源可用百分比低于10% 扩容 + double increaseThreshold = 20d; + // yarn 资源可用百分比高于30% 缩容 + double decreaseThreshold = 30d; + + ScalingRule scaleOutByMemPer = new ScalingRule() + .withName("scale-out by yarn resource Per") + .withDescription("scale-out by yarn resources Per") + .withAction(new ScalingAction() + .withSimpleScalingPolicyConfiguration(new SimpleScalingPolicyConfiguration() + .withScalingAdjustment(getScalePercent()) + .withAdjustmentType("PERCENT_CHANGE_IN_CAPACITY") + .withCoolDown(getCoolDown()))) + .withTrigger(new ScalingTrigger() + .withCloudWatchAlarmDefinition(new CloudWatchAlarmDefinition() + .withComparisonOperator("LESS_THAN_OR_EQUAL") + .withEvaluationPeriods(1) + .withPeriod(getCoolDown()) + .withMetricName("YARNMemoryAvailablePercentage") + .withNamespace("AWS/ElasticMapReduce") + .withThreshold(increaseThreshold) + .withStatistic("AVERAGE") + .withUnit("PERCENT") + .withDimensions(new MetricDimension() + .withKey("JobFlowId") + .withValue("${emr.clusterId}")))); + + + ScalingRule scaleOutByMem = new ScalingRule() + .withName("scale-out by yarn resource") + .withDescription("scale-out by yarn resources") + .withAction(new ScalingAction() + .withSimpleScalingPolicyConfiguration(new SimpleScalingPolicyConfiguration() + .withScalingAdjustment(getScalePercent()) + .withAdjustmentType("PERCENT_CHANGE_IN_CAPACITY") + .withCoolDown(getCoolDown()))) + .withTrigger(new ScalingTrigger() + .withCloudWatchAlarmDefinition(new CloudWatchAlarmDefinition() + .withComparisonOperator("LESS_THAN_OR_EQUAL") + .withEvaluationPeriods(1) + .withPeriod(getCoolDown()) + .withMetricName("MemoryAvailableMB") + .withNamespace("AWS/ElasticMapReduce") + .withThreshold(increaseThreshold * 2048) + .withStatistic("AVERAGE") + .withUnit("COUNT") + .withDimensions(new MetricDimension() + .withKey("JobFlowId") + .withValue("${emr.clusterId}")))); + + ScalingRule scaleInByMemPer = new ScalingRule() + .withName("scale-in by yarn resource per") + .withDescription("scale-in by yarn resources per") + .withAction(new ScalingAction() + .withSimpleScalingPolicyConfiguration(new SimpleScalingPolicyConfiguration() + .withScalingAdjustment(-getScalePercent()) + .withAdjustmentType("PERCENT_CHANGE_IN_CAPACITY") + .withCoolDown(getCoolDown()))) + .withTrigger(new ScalingTrigger() + .withCloudWatchAlarmDefinition(new CloudWatchAlarmDefinition() + .withComparisonOperator("GREATER_THAN_OR_EQUAL") + .withEvaluationPeriods(1) + .withPeriod(getCoolDown()) + .withMetricName("YARNMemoryAvailablePercentage") + .withNamespace("AWS/ElasticMapReduce") + .withThreshold(decreaseThreshold) + .withStatistic("AVERAGE") + .withUnit("PERCENT") + .withDimensions(new MetricDimension() + .withKey("JobFlowId") + .withValue("${emr.clusterId}")))); + + + ScalingRule scaleInByMem = new ScalingRule() + .withName("scale-in by yarn resource") + .withDescription("scale-in by yarn resources") + .withAction(new ScalingAction() + .withSimpleScalingPolicyConfiguration(new SimpleScalingPolicyConfiguration() + .withScalingAdjustment(-getScalePercent()) + .withAdjustmentType("PERCENT_CHANGE_IN_CAPACITY") + .withCoolDown(getCoolDown()))) + .withTrigger(new ScalingTrigger() + .withCloudWatchAlarmDefinition(new CloudWatchAlarmDefinition() + .withComparisonOperator("GREATER_THAN_OR_EQUAL") + .withEvaluationPeriods(1) + .withPeriod(getCoolDown()) + .withMetricName("MemoryAvailableMB") + .withNamespace("AWS/ElasticMapReduce") + .withThreshold(decreaseThreshold * 2048) + .withStatistic("AVERAGE") + .withUnit("COUNT") + .withDimensions(new MetricDimension() + .withKey("JobFlowId") + .withValue("${emr.clusterId}")))); + return new AutoScalingPolicy() + .withConstraints(new ScalingConstraints() + .withMinCapacity(getMinCapacity()) + .withMaxCapacity(getMaxCapacity())) + .withRules(scaleInByMem, scaleInByMemPer, scaleOutByMem, scaleOutByMemPer); + } + + /** + * 初始化配置信息 + * + * @return configurations + */ + private List buildConfigurations() { + + List configs = new ArrayList<>(); + + if (EnvUtils.isPre() && !EnvUtils.isIndia()) { + Map hivePro = new HashMap<>(1); + hivePro.put("javax.jdo.option.ConnectionUserName", "username"); + hivePro.put("javax.jdo.option.ConnectionDriverName", "org.mariadb.jdbc.Driver"); + hivePro.put("javax.jdo.option.ConnectionPassword", "password"); + String url = "jdbc:mysql://localhost:3306/hivemeta_pre?createDatabaseIfNotExist=true"; + if (EnvUtils.isEurope()) { + url = "jdbc:mysql://localhost:3306/hivemeta_pre?createDatabaseIfNotExist=true"; + } + hivePro.put("javax.jdo.option.ConnectionURL", url); + configs.add(new Configuration() + .withClassification("hive-site") + .withProperties(hivePro) + .withConfigurations()); + } else { + //hive 配置 + Map hivePro = new HashMap<>(1); + hivePro.put("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"); + configs.add(new Configuration() + .withClassification("hive-site") + .withProperties(hivePro) + .withConfigurations()); + + + //presto-hive 配置 + Map prestoPro = new HashMap<>(1); + prestoPro.put("hive.metastore.glue.datacatalog.enabled", "true"); + configs.add(new Configuration() + .withClassification("presto-connector-hive") + .withProperties(prestoPro) + .withConfigurations()); + + //spark-hive 配置 + Map sparkPro = new HashMap<>(1); + sparkPro.put("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"); + configs.add(new Configuration() + .withClassification("spark-hive-site") + .withProperties(sparkPro) + .withConfigurations()); + } + configs.add(new Configuration() + .withClassification("spark-defaults") + .withProperties(Collections.singletonMap("spark.port.maxRetries", "256")) + .withConfigurations()); + return configs; + } + + + /** + * 初始化所有要创建的集群 + * + * @return applications + */ + private List getApps() { + List apps = new ArrayList<>(APP_NAMES.length); + for (String appName : APP_NAMES) { + apps.add(buildApp(appName)); + } + return apps; + } + + /** + * 新建集群 + * + * @param name 集群名称 + * @return application + */ + private Application buildApp(String name) { + return new Application().withName(name); + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/emr/Emr.java b/hera-core/src/main/java/com/dfire/core/emr/Emr.java new file mode 100755 index 00000000..4ab3204d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/emr/Emr.java @@ -0,0 +1,32 @@ +package com.dfire.core.emr; + +/** + * desc: + * + * @author scx + * @create 2019/04/01 + */ +public interface Emr { + + /** + * 获得登录命令 + * + * @return 登录命令 + */ + String getLogin(String user,String owner); + + /** + * 获得固定集群的登录方式 + * + * @return + */ + String getFixLogin(String host); + + /** + * 随机获得一台IP + * + * @return true/false + */ + String getIp(String owner); + +} diff --git a/hera-core/src/main/java/com/dfire/core/emr/EmrJob.java b/hera-core/src/main/java/com/dfire/core/emr/EmrJob.java new file mode 100755 index 00000000..2656c266 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/emr/EmrJob.java @@ -0,0 +1,18 @@ +package com.dfire.core.emr; + +/** + * @author scx + */ +public interface EmrJob { + + /** + * 添加任务接口 + */ + void addJob(String owner); + + /** + * 移除任务 + */ + void removeJob(String owner); + +} diff --git a/hera-core/src/main/java/com/dfire/core/emr/FixedEmr.java b/hera-core/src/main/java/com/dfire/core/emr/FixedEmr.java new file mode 100755 index 00000000..c2c476ea --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/emr/FixedEmr.java @@ -0,0 +1,56 @@ +package com.dfire.core.emr; + +import com.dfire.common.exception.HeraException; + +import java.util.List; + +/** + * desc: + * + * @author scx + * @create 2020/02/18 + */ +public class FixedEmr extends AbstractEmr { + + public final static String NAME = "fixed"; + + @Override + protected boolean checkAlive(String cacheClusterId) { + return true; + } + + @Override + protected void init() { + + } + + @Override + protected void terminateCluster(String clusterId) { + + } + + @Override + protected void shutdown() { + + } + + @Override + protected String sendCreateRequest(String owner) { + return "fixed-" + System.currentTimeMillis(); + } + + @Override + protected String getAliveId(String owner) { + return "fixed-" + System.currentTimeMillis(); + } + + @Override + protected boolean isCompletion(String clusterId) throws HeraException { + return true; + } + + @Override + protected List getMasterIp(String clusterId) { + return null; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/emr/WrapEmr.java b/hera-core/src/main/java/com/dfire/core/emr/WrapEmr.java new file mode 100755 index 00000000..0c9bda7b --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/emr/WrapEmr.java @@ -0,0 +1,74 @@ +package com.dfire.core.emr; + +import com.dfire.config.HeraGlobalEnv; + +/** + * desc: + * + * @author scx + * @create 2019/04/01 + */ +public class WrapEmr implements Emr, EmrJob { + + private volatile static AbstractEmr emr; + + @Override + public void addJob(String owner) { + checkEmr(); + emr.addJob(checkOwner(owner)); + } + + @Override + public void removeJob(String owner) { + checkEmr(); + emr.removeJob(checkOwner(owner)); + } + + + @Override + public String getLogin(String user, String owner) { + checkEmr(); + return emr.getLogin(user, checkOwner(owner)); + } + + @Override + public String getFixLogin(String host) { + checkEmr(); + return emr.getFixLogin(host); + } + + @Override + public String getIp(String owner) { + checkEmr(); + return emr.getIp(checkOwner(owner)); + } + + private String checkOwner(String owner) { + if (!HeraGlobalEnv.getEmrGroups().contains(owner)) { + return "other"; + } + return owner; + } + + private void checkEmr() { + if (emr == null) { + synchronized (WrapEmr.class) { + if (emr == null) { + switch (HeraGlobalEnv.getEmrCluster()) { + case AmazonEmr.NAME: + emr = new AmazonEmr(); + break; + case AliYunEmr.NAME: + emr = new AliYunEmr(); + break; + case FixedEmr.NAME: + emr = new FixedEmr(); + break; + default: + throw new RuntimeException("未识别的emr集群类型:" + HeraGlobalEnv.getEmrCluster()); + } + } + } + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/Dispatcher.java b/hera-core/src/main/java/com/dfire/core/event/Dispatcher.java new file mode 100755 index 00000000..f1cbc90d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/Dispatcher.java @@ -0,0 +1,100 @@ +package com.dfire.core.event; + +import com.dfire.core.event.base.AbstractObservable; +import com.dfire.core.event.base.MvcEvent; +import com.dfire.core.event.handler.AbstractHandler; +import com.dfire.core.event.handler.JobHandler; +import com.dfire.core.event.listenter.AbstractListener; +import com.dfire.event.ApplicationEvent; +import com.dfire.event.EventType; +import com.dfire.logs.ErrorLog; +import com.google.common.collect.Lists; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @author: 凌霄 + * @time: Created in 11:00 2018/1/4 + * @desc hera中的任务事件observer, 接受事件,全局广播dispatch + */ +public class Dispatcher extends AbstractObservable { + + public static final EventType beforeDispatch = new EventType(); + + public static final EventType afterDispatch = new EventType(); + + @Getter + List jobHandlers; + + public Dispatcher() { + jobHandlers = new ArrayList<>(); + } + + public void addJobHandler(JobHandler jobHandler) { + if (!jobHandlers.contains(jobHandler)) { + jobHandlers.add(jobHandler); + } + } + + public void removeJobHandler(JobHandler jobHandler) { + jobHandlers.remove(jobHandler); + } + + public void addDispatcherListener(AbstractListener listener) { + addListener(beforeDispatch, listener); + addListener(afterDispatch, listener); + } + + + public void forwardEvent(ApplicationEvent event) { + dispatch(event); + } + + public void forwardEvent(EventType eventType) { + dispatch(eventType); + } + + + public void dispatch(EventType type) { + dispatch(new ApplicationEvent(type)); + } + + public void dispatch(EventType type, Object data) { + dispatch(new ApplicationEvent(type, data)); + } + + /** + * 事件广播,每次任务状态变化,触发响应事件,全局广播,自动调度successEvent,触发依赖调度一些依赖更新 + * + * @param applicationEvent + */ + public void dispatch(ApplicationEvent applicationEvent) { + try { + MvcEvent mvcEvent = new MvcEvent(this, applicationEvent); + mvcEvent.setApplicationEvent(applicationEvent); + if (fireEvent(beforeDispatch, mvcEvent)) { + List jobHandlersCopy = Lists.newArrayList(jobHandlers); + for (AbstractHandler jobHandler : jobHandlersCopy) { + try { + if (jobHandler.canHandle(applicationEvent)) { + if (!jobHandler.isInitialized()) { + jobHandler.setInitialized(true); + } + jobHandler.handleEvent(applicationEvent); + } + } catch (Exception e) { + ErrorLog.error(((JobHandler) jobHandler).getActionId() + "广播异常", e); + } + } + fireEvent(afterDispatch, mvcEvent); + } + } catch (Exception e) { + ErrorLog.error("global dispatch job event error", e); + } + + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/event/base/AbstractObservable.java b/hera-core/src/main/java/com/dfire/core/event/base/AbstractObservable.java new file mode 100755 index 00000000..a832c76d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/base/AbstractObservable.java @@ -0,0 +1,122 @@ +package com.dfire.core.event.base; + +import com.dfire.core.event.listenter.Listener; +import com.dfire.event.AbstractEvent; +import com.dfire.event.EventType; +import com.google.common.collect.Lists; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 下午2:44 2018/4/23 + * @desc + */ +public class AbstractObservable implements Observable { + + private boolean fireEvents = true; + + private Map>> listMap; + + private boolean activeEvent; + + + @Override + public void addListener(EventType eventType, Listener listener) { + if (listener == null) { + return; + } + if (listMap == null) { + listMap = new HashMap<>(8); + } + List> listeners = listMap.get(eventType.getId()); + if (listeners == null) { + listeners = new ArrayList<>(); + listeners.add((Listener) listener); + listMap.put(eventType.getId(), listeners); + } else { + if (!listeners.contains(listener)) { + listeners.add((Listener) listener); + } + } + + } + + @Override + public List> getListeners(EventType eventType) { + if (listMap == null) { + return new ArrayList<>(); + } + List> list = listMap.get(eventType.getId()); + if (list == null) { + return new ArrayList<>(); + } + return (List) list; + } + + @Override + public boolean hasListeners() { + return listMap != null && listMap.size() > 0; + } + + @Override + public boolean hasListeners(EventType eventType) { + if (listMap != null) { + List> listeners = listMap.get(eventType.getId()); + if (listeners != null && !listeners.isEmpty()) { + return true; + } + } + return false; + } + + @Override + public void removeAllListeners() { + if (listMap != null) { + listMap.clear(); + } + + } + + @Override + public void removeAllListeners(EventType eventType, Listener listener) { + if (listMap == null) { + return; + } + String id = eventType.getId(); + List> listeners = listMap.get(id); + if (listeners != null) { + listeners.remove(listener); + if (listeners.isEmpty()) { + listMap.remove(id); + } + } + } + + @Override + public boolean fireEvent(EventType eventType, AbstractEvent abstractEvent) { + if (fireEvents && listMap != null) { + activeEvent = true; + abstractEvent.setType(eventType); + List> listeners = listMap.get(eventType.getId()); + if (listeners != null) { + List> listenersCopy = Lists.newArrayList(listeners); + for (Listener listener : listenersCopy) { + callListener(listener, abstractEvent); + } + } + activeEvent = false; + return !abstractEvent.isCancelled(); + } + return true; + } + + public void callListener(Listener listener, AbstractEvent event) { + listener.handleEvent(event); + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/event/base/MvcEvent.java b/hera-core/src/main/java/com/dfire/core/event/base/MvcEvent.java new file mode 100755 index 00000000..cb31bbec --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/base/MvcEvent.java @@ -0,0 +1,29 @@ +package com.dfire.core.event.base; + +import com.dfire.core.event.Dispatcher; +import com.dfire.event.AbstractEvent; +import com.dfire.event.ApplicationEvent; +import com.dfire.event.EventType; +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 下午5:19 2018/4/18 + * @desc + */ +@Data +public class MvcEvent extends AbstractEvent { + + private ApplicationEvent applicationEvent; + private String name; + + + public MvcEvent(EventType type) { + super(type); + } + + public MvcEvent(Dispatcher dispatcher, ApplicationEvent applicationEvent) { + super(dispatcher); + this.applicationEvent = applicationEvent; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/base/Observable.java b/hera-core/src/main/java/com/dfire/core/event/base/Observable.java new file mode 100755 index 00000000..ca5f3fb4 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/base/Observable.java @@ -0,0 +1,31 @@ +package com.dfire.core.event.base; + +import com.dfire.core.event.listenter.Listener; +import com.dfire.event.AbstractEvent; +import com.dfire.event.EventType; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午2:32 2018/4/23 + * @desc + */ +public interface Observable { + + void addListener(EventType eventType, Listener listener); + + List> getListeners(EventType eventType); + + boolean hasListeners(); + + boolean hasListeners(EventType eventType); + + void removeAllListeners(); + + void removeAllListeners(EventType eventType, Listener listener); + + boolean fireEvent(EventType eventType, AbstractEvent abstractEvent); + + +} diff --git a/hera-core/src/main/java/com/dfire/core/event/handler/AbstractHandler.java b/hera-core/src/main/java/com/dfire/core/event/handler/AbstractHandler.java new file mode 100755 index 00000000..a7fe4150 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/handler/AbstractHandler.java @@ -0,0 +1,68 @@ +package com.dfire.core.event.handler; + +import com.dfire.event.ApplicationEvent; +import com.dfire.event.EventType; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午5:24 2018/4/19 + * @desc 抽象任务实践处理器 + */ +@Data +public abstract class AbstractHandler { + + protected List children; + protected boolean initialized; + protected AbstractHandler parent; + + private List supportedEvents; + + + public boolean canHandle(ApplicationEvent event) { + return canHandle(event, true); + } + + public boolean canHandle(ApplicationEvent event, boolean bubbleDown) { + if (supportedEvents != null && supportedEvents.contains(event.getType())) { + return true; + } + if (children != null && bubbleDown) { + for (AbstractHandler c : children) { + if (c.canHandle(event, bubbleDown)) { + return true; + } + } + } + return false; + } + + /** + * hera事件处理方法 + * + * @param event + */ + public abstract void handleEvent(ApplicationEvent event); + + public void initialize() { + + } + + public void destroy() { + } + + + protected void registerEventType(EventType type) { + if (supportedEvents == null) { + supportedEvents = new ArrayList<>(); + } + if (type != null) { + if (!supportedEvents.contains(type)) { + supportedEvents.add(type); + } + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/handler/JobHandler.java b/hera-core/src/main/java/com/dfire/core/event/handler/JobHandler.java new file mode 100755 index 00000000..b0b64458 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/handler/JobHandler.java @@ -0,0 +1,378 @@ +package com.dfire.core.event.handler; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.constants.Constants; +import com.dfire.common.constants.LogConstant; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.model.JobGroupCache; +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.JobScheduleTypeEnum; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.service.HeraGroupService; +import com.dfire.common.service.HeraJobActionService; +import com.dfire.common.service.HeraJobHistoryService; +import com.dfire.common.service.HeraUserService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.vo.JobStatus; +import com.dfire.core.event.Dispatcher; +import com.dfire.core.job.CancelHadoopJob; +import com.dfire.core.job.JobContext; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.quartz.HeraQuartzJob; +import com.dfire.event.*; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.ScheduleLog; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import org.apache.commons.lang.StringUtils; +import org.quartz.*; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author: 凌霄 + * @time: Created in 下午5:24 2018/4/19 + * @desc 每种任务执行状态都对应相应事件,job执行生命周期事件执行逻辑 + */ + +@Builder +@AllArgsConstructor +public class JobHandler extends AbstractHandler { + + @Getter + private final Long actionId; + private JobGroupCache cache; + private HeraJobHistoryService jobHistoryService; + private HeraGroupService heraGroupService; + private HeraJobActionService heraJobActionService; + private Master master; + private MasterContext masterContext; + private HeraUserService heraUserService; + + public JobHandler(Long actionId, Master master, MasterContext masterContext) { + this.actionId = actionId; + this.jobHistoryService = masterContext.getHeraJobHistoryService(); + this.heraGroupService = masterContext.getHeraGroupService(); + this.heraJobActionService = masterContext.getHeraJobActionService(); + this.heraUserService = masterContext.getHeraUserService(); + this.cache = JobGroupCache.builder().actionId(actionId).heraJobActionService(heraJobActionService).build(); + this.master = master; + this.masterContext = masterContext; + registerEventType(Events.Initialize); + } + + @Override + public boolean canHandle(ApplicationEvent event) { + if (super.canHandle(event)) { + return true; + } + return event instanceof HeraJobFailedEvent || event instanceof HeraJobSuccessEvent || + event instanceof HeraJobLostEvent || event instanceof HeraScheduleTriggerEvent || + event instanceof HeraJobMaintenanceEvent; + } + + /** + * 接受到任务事件广播处理逻辑 + * + * @param event + */ + @Override + public void handleEvent(ApplicationEvent event) { + if (event instanceof HeraJobSuccessEvent) { + handleSuccessEvent((HeraJobSuccessEvent) event); + } else if (event instanceof HeraJobFailedEvent) { + handleFailedEvent((HeraJobFailedEvent) event); + } else if (event instanceof HeraScheduleTriggerEvent) { + handleTriggerEvent((HeraScheduleTriggerEvent) event); + } else if (event instanceof HeraJobMaintenanceEvent) { + handleMaintenanceEvent((HeraJobMaintenanceEvent) event); + } else if (event instanceof HeraJobLostEvent) { + handleLostEvent((HeraJobLostEvent) event); + } else if (event.getType() == Events.Initialize) { + handleInitialEvent(); + } + } + + /** + * 1.running 任务重试 + * 2.调度任务加入调度池 + */ + public void handleInitialEvent() { + + HeraAction heraAction = heraJobActionService.findById(actionId); + if (heraAction != null) { + //对版本表中处于running状态的任务进行重试 + if (StatusEnum.RUNNING.toString().equals(heraAction.getStatus())) { + ScheduleLog.warn("actionId = " + actionId + " 处于RUNNING状态,说明该job状态丢失,立即进行重试操作。。。"); + //有历史版本 + if (heraAction.getHistoryId() != null) { + HeraJobHistory jobHistory = jobHistoryService.findById(heraAction.getHistoryId()); + if (jobHistory == null) { + return; + } + // 搜索上一次运行的日志,从日志中提取jobId 进行kill + if (jobHistory.getStatus() == null || !jobHistory.getStatus().equals(StatusEnum.SUCCESS.toString())) { + try { + JobContext tmp = JobContext.getTempJobContext(JobContext.MANUAL_RUN); + tmp.setHeraJobHistory(BeanConvertUtils.convert(jobHistory)); + new CancelHadoopJob(tmp).run(); + startNewJob(BeanConvertUtils.transform(heraAction), LogConstant.SERVER_START_JOB_LOG, TriggerTypeEnum.SCHEDULE); + } catch (Exception e) { + ErrorLog.error("取消任务异常", e); + } + } + jobHistory.setStatus(StatusEnum.FAILED.toString()); + jobHistory.setIllustrate("任务历史丢失"); + jobHistory.setEndTime(new Date()); + jobHistoryService.update(jobHistory); + } else { + startNewJob(BeanConvertUtils.transform(heraAction), LogConstant.SERVER_START_JOB_LOG, TriggerTypeEnum.SCHEDULE); + } + } + } + + /** + * 如果是定时任务,启动定时程序,独立调度任务,创建quartz调度 + * + */ + HeraActionVo heraActionVo = cache.getHeraActionVo(); + boolean isSchedule = heraActionVo.getAuto() && Objects.equals(heraActionVo.getScheduleType(), JobScheduleTypeEnum.Independent); + if (isSchedule) { + try { + createScheduleJob(masterContext.getDispatcher(), heraActionVo); + } catch (Exception e) { + if (e instanceof SchedulerException) { + heraActionVo.setAuto(false); + ErrorLog.error("create job quartz schedule error", e); + } + throw new RuntimeException(e); + } + } + } + + + /** + * 收到广播的任务成功事件的处理流程,每次自动调度任务成功执行,会进行一次全局的SuccessEvent广播,使得依赖任务可以更新readyDependent + * + * @param event + */ + private void handleSuccessEvent(HeraJobSuccessEvent event) { + if (event.getTriggerType() == TriggerTypeEnum.MANUAL || event.getTriggerType() == TriggerTypeEnum.AUTO_RERUN) { + return; + } + Long jobId = event.getJobId(); + HeraActionVo heraActionVo = cache.getHeraActionVo(); + if (heraActionVo == null) { + autoRecovery(); + return; + } + + if (!heraActionVo.getAuto() || jobId.equals(heraActionVo.getId())) { + return; + } + if (heraActionVo.getScheduleType() == JobScheduleTypeEnum.Independent) { + return; + } + //依赖的任务包含该广播的任务ID + if (heraActionVo.getDependencies() == null || !heraActionVo.getDependencies().contains(jobId)) { + return; + } + JobStatus jobStatus; + + //如果是超级恢复 + if (event.getTriggerType() == TriggerTypeEnum.SUPER_RECOVER) { + List dependencies = heraActionVo.getDependencies(); + for (Long depId : dependencies) { + HeraAction action = master.getHeraActionMap().get(depId); + if (action != null && StatusEnum.RUNNING.toString().equals(action.getStatus())) { + ScheduleLog.info(String.format("{} is running,cancel job {} super recovery", depId, heraActionVo.getId())); + return; + } + } + startNewJob(heraActionVo, LogConstant.SUPER_RECOVER_LOG, TriggerTypeEnum.SUPER_RECOVER); + + } else if (event.getTriggerType() == TriggerTypeEnum.SCHEDULE || event.getTriggerType() == TriggerTypeEnum.MANUAL_RECOVER) { + //必须同步 + synchronized (this) { + jobStatus = heraJobActionService.findJobStatus(actionId); + ScheduleLog.info(actionId + "received a success dependency job with actionId = " + jobId); + jobStatus.getReadyDependency().put(String.valueOf(jobId), String.valueOf(System.currentTimeMillis())); + heraJobActionService.updateStatus(jobStatus); + } + boolean allComplete = true; + for (Long key : heraActionVo.getDependencies()) { + if (jobStatus.getReadyDependency().get(String.valueOf(key)) == null) { + allComplete = false; + break; + } + } + if (allComplete) { + ScheduleLog.info("JobId:" + actionId + " all dependency jobs is ready,run!"); + startNewJob(heraActionVo, LogConstant.DEPENDENT_READY_LOG, TriggerTypeEnum.SCHEDULE); + } else { + ScheduleLog.info(actionId + "some of dependency is not ready, waiting" + JSONObject.toJSONString(jobStatus.getReadyDependency().keySet())); + } + } + } + + + private void handleFailedEvent(HeraJobFailedEvent event) { + //处理任务失败的事件 + + } + + /** + * 自动调度执行逻辑,如果没有版本,说明job被删除了,异常情况 + * + * @param event + */ + public void handleTriggerEvent(HeraScheduleTriggerEvent event) { + Long actionId = event.getActionId(); + HeraActionVo heraActionVo = cache.getHeraActionVo(); + if (heraActionVo == null) { + autoRecovery(); + return; + } + if (!actionId.equals(heraActionVo.getId())) { + return; + } + startNewJob(heraActionVo, "自动调度", TriggerTypeEnum.SCHEDULE); + } + + + private void startNewJob(HeraActionVo heraActionVo, String illustrate, TriggerTypeEnum triggerTypeEnum) { + HeraJob heraJob = masterContext.getHeraJobService().findById(heraActionVo.getJobId()); + if (!master.checkJobRun(heraJob)) { + return; + } + HeraJobHistory history = HeraJobHistory.builder(). + actionId(heraActionVo.getId()). + illustrate(illustrate). + jobId(heraActionVo.getJobId()). + triggerType(triggerTypeEnum.getId()). + operator(heraActionVo.getOwner()). + hostGroupId(heraActionVo.getHostGroupId()). + batchId(heraActionVo.getBatchId()). + bizLabel(heraJob.getBizLabel()). + build(); + masterContext.getHeraJobHistoryService().insert(history); + HeraJobHistoryVo historyVo = BeanConvertUtils.convert(history); + master.run(historyVo, heraJob); + } + + private void autoRecovery() { + cache.refresh(); + HeraActionVo heraActionVo = cache.getHeraActionVo(); + //任务被删除 + if (heraActionVo == null) { + masterContext.getDispatcher().removeJobHandler(this); + destroy(); + ScheduleLog.info("heraAction 为空, 删除{}", actionId); + return; + } + //自动调度关闭 + if (!heraActionVo.getAuto()) { + destroy(); + return; + } + + /** + * 如果是依赖任务 原来可能是独立任务,需要尝试删除原来的定时调度 + * 如果是独立任务,则重新创建quartz调度 + * + */ + if (heraActionVo.getScheduleType() == JobScheduleTypeEnum.Dependent) { + destroy(); + } else if (heraActionVo.getScheduleType() == JobScheduleTypeEnum.Independent) { + try { + createScheduleJob(masterContext.getDispatcher(), heraActionVo); + } catch (SchedulerException e) { + ErrorLog.error("创建调度任务异常", e); + } + } + } + + private void handleMaintenanceEvent(HeraJobMaintenanceEvent event) { + if (event.getType() == Events.UpdateJob && Objects.equals(Integer.parseInt(String.valueOf(event.getId())), ActionUtil.getJobId(actionId))) { + autoRecovery(); + } + if (event.getType() == Events.UpdateActions && Objects.equals(actionId, event.getId())) { + autoRecovery(); + } + + } + + /** + * 漏跑重新触发调度事件 + * + * @param event + */ + private void handleLostEvent(HeraJobLostEvent event) { + if (event.getType() == Events.UpdateJob && actionId.equals(event.getJobId())) { + HeraActionVo heraActionVo = cache.getHeraActionVo(); + if (heraActionVo != null) { + HeraAction heraAction = heraJobActionService.findById(actionId); + if (heraAction != null && StringUtils.isBlank(heraAction.getStatus()) && heraAction.getAuto() == 1) { + if (actionId < Long.parseLong(ActionUtil.getCurrActionVersion())) { + startNewJob(BeanConvertUtils.transform(heraAction), LogConstant.LOST_JOB_LOG, TriggerTypeEnum.SCHEDULE); + ScheduleLog.info("lost job, start schedule :{}", actionId); + } + } + } + } + } + + /** + * 创建定时任务 + * + * @param dispatcher the scheduler + * @param heraActionVo the job name + */ + + private void createScheduleJob(Dispatcher dispatcher, HeraActionVo heraActionVo) throws SchedulerException { + if (!ActionUtil.isCurrActionVersion(actionId)) { + return; + } + JobKey jobKey = new JobKey(String.valueOf(actionId), Constants.HERA_GROUP); + if (masterContext.getQuartzSchedulerService().getScheduler().getJobDetail(jobKey) == null) { + JobDetail jobDetail = JobBuilder.newJob(HeraQuartzJob.class).withIdentity(jobKey).build(); + jobDetail.getJobDataMap().put(Constants.QUARTZ_ID, heraActionVo.getId()); + jobDetail.getJobDataMap().put(Constants.QUARTZ_DISPATCHER, dispatcher); + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(heraActionVo.getCronExpression().trim()); + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(String.valueOf(actionId), Constants.HERA_GROUP).withSchedule(scheduleBuilder).build(); + masterContext.getQuartzSchedulerService().getScheduler().scheduleJob(jobDetail, trigger); + ScheduleLog.info("--------------------------- 添加自动调度成功:{}--------------------------", heraActionVo.getId()); + } + } + + + @Override + public void destroy() { + masterContext.getQuartzSchedulerService().deleteJob(actionId); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof JobHandler)) { + return false; + } + JobHandler jobHandler = (JobHandler) obj; + return actionId.equals(jobHandler.getActionId()); + } + + @Override + public int hashCode() { + return actionId.hashCode(); + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/AbstractListener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/AbstractListener.java new file mode 100755 index 00000000..f23e5c02 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/AbstractListener.java @@ -0,0 +1,53 @@ +package com.dfire.core.event.listenter; + +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.core.event.Dispatcher; +import com.dfire.core.event.base.MvcEvent; +import com.dfire.event.EventType; + +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author: 凌霄 + * @time: Created in 下午5:57 2018/4/18 + * @desc + */ +public abstract class AbstractListener implements Listener { + + private Executor executor; + + + @Override + public void handleEvent(MvcEvent event) { + EventType eventType = event.getType(); + if (eventType == Dispatcher.beforeDispatch) { + beforeDispatch(event); + } else if (eventType == Dispatcher.afterDispatch) { + afterDispatch(event); + } + + } + + public void beforeDispatch(MvcEvent mvcEvent) { + + } + + public void afterDispatch(MvcEvent mvcEvent) { + + } + + public Executor getSinglePool() { + if (executor == null) { + synchronized (this) { + if (executor == null) { + executor = new ThreadPoolExecutor( + 1, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(Integer.MAX_VALUE), new NamedThreadFactory("listener-thread-pool", true), new ThreadPoolExecutor.AbortPolicy()); + } + } + } + return executor; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/HeraAddJobListener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraAddJobListener.java new file mode 100755 index 00000000..1d934f31 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraAddJobListener.java @@ -0,0 +1,57 @@ +package com.dfire.core.event.listenter; + + +import com.dfire.event.HeraJobMaintenanceEvent; +import com.dfire.event.ApplicationEvent; +import com.dfire.event.Events; +import com.dfire.core.event.base.MvcEvent; +import com.dfire.core.event.handler.AbstractHandler; +import com.dfire.core.event.handler.JobHandler; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.logs.ScheduleLog; + +/** + * @author: 凌霄 + * @time: Created in 下午5:19 2018/4/19 + * @desc 增操作,添加controller + */ +public class HeraAddJobListener extends AbstractListener { + + private Master master; + private MasterContext masterContext; + + public HeraAddJobListener(Master master, MasterContext masterContext) { + this.master = master; + this.masterContext = masterContext; + } + + @Override + public void beforeDispatch(MvcEvent mvcEvent) { + if (mvcEvent.getApplicationEvent() instanceof HeraJobMaintenanceEvent) { + HeraJobMaintenanceEvent maintenanceEvent = (HeraJobMaintenanceEvent) mvcEvent.getApplicationEvent(); + if (mvcEvent.getType() == Events.UpdateActions) { + Long actionId = maintenanceEvent.getId(); + boolean exist = false; + for (AbstractHandler handler : masterContext.getDispatcher().getJobHandlers()) { + if (handler instanceof JobHandler) { + JobHandler jobHandler = (JobHandler) handler; + if (jobHandler.getActionId().equals(actionId)) { + exist = true; + break; + } + } + } + if (!exist) { + JobHandler handler = new JobHandler(actionId, master, masterContext); + masterContext.getDispatcher().addJobHandler(handler); + handler.handleEvent(new ApplicationEvent(Events.Initialize)); + mvcEvent.setCancelled(true); + ScheduleLog.info("schedule add job with actionId:" + actionId); + } + } + + } + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/HeraDebugListener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraDebugListener.java new file mode 100755 index 00000000..625c1489 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraDebugListener.java @@ -0,0 +1,32 @@ +package com.dfire.core.event.listenter; + + +import com.dfire.common.service.HeraFileService; +import com.dfire.event.HeraDebugFailEvent; +import com.dfire.event.HeraDebugSuccessEvent; +import com.dfire.core.event.base.MvcEvent; +import com.dfire.core.netty.master.MasterContext; + +/** + * @author: 凌霄 + * @time: Created in 下午5:37 2018/4/19 + * @desc + */ +public class HeraDebugListener extends AbstractListener { + + private HeraFileService heraFileService; + + public HeraDebugListener(MasterContext masterContext) { + heraFileService = masterContext.getHeraFileService(); + } + + @Override + public void beforeDispatch(MvcEvent mvcEvent) { + if (mvcEvent.getApplicationEvent() instanceof HeraDebugFailEvent) { + + + } else if (mvcEvent.getApplicationEvent() instanceof HeraDebugSuccessEvent) { + + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobFailListener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobFailListener.java new file mode 100755 index 00000000..0570cd54 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobFailListener.java @@ -0,0 +1,90 @@ +package com.dfire.core.event.listenter; + +import com.dfire.common.config.ServiceLoader; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraJobMonitor; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.service.HeraJobMonitorService; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.service.HeraSsoService; +import com.dfire.common.service.JobFailAlarm; +import com.dfire.common.util.ActionUtil; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.event.base.MvcEvent; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.event.HeraJobFailedEvent; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.MonitorLog; +import org.apache.commons.lang.StringUtils; + +import java.util.*; + +/** + * 任务失败的预处理 + * + * @author xiaosuda + */ +public class HeraJobFailListener extends AbstractListener { + + + private List alarms; + + private HeraJobMonitorService jobMonitorService; + + private HeraSsoService heraSsoService; + + private HeraJobService heraJobService; + + public HeraJobFailListener(MasterContext masterContext) { + alarms = ServiceLoader.getAlarms(); + jobMonitorService = masterContext.getHeraJobMonitorService(); + heraSsoService = masterContext.getHeraSsoService(); + heraJobService = masterContext.getHeraJobService(); + } + + @Override + public void beforeDispatch(MvcEvent mvcEvent) { + if (mvcEvent.getApplicationEvent() instanceof HeraJobFailedEvent) { + if (HeraGlobalEnv.getAlarmEnvSet().contains(HeraGlobalEnv.getEnv())) { + HeraJobFailedEvent failedEvent = (HeraJobFailedEvent) mvcEvent.getApplicationEvent(); + if (failedEvent.getTriggerType() == TriggerTypeEnum.MANUAL || failedEvent.getTriggerType() == TriggerTypeEnum.DEBUG) { + return; + } + //重跑次数未达到重试次数 + if (failedEvent.getRunCount() <= failedEvent.getRetryCount()) { + return; + } + super.getSinglePool().execute(() -> { + Integer jobId = ActionUtil.getJobId(failedEvent.getActionId()); + if (jobId == null) { + return; + } + HeraJob heraJob = heraJobService.findById(jobId); + if (heraJob == null) { + MonitorLog.warn("版本为{}的任务{}被删除", failedEvent.getActionId(), jobId); + return; + } + failedEvent.setHeraJob(heraJob); + Set monitorUser = new HashSet<>(); + Optional.ofNullable(jobMonitorService.findByJobId(jobId)) + .map(HeraJobMonitor::getUserIds) + .ifPresent(ids -> Arrays.stream(ids + .split(Constants.COMMA)) + .filter(StringUtils::isNotBlank) + .forEach(id -> { + Optional.ofNullable(heraSsoService.findSsoById(Integer.parseInt(id))).ifPresent(monitorUser::add); + })); + for (JobFailAlarm failAlarm : alarms) { + try { + failAlarm.alarm(failedEvent, monitorUser); + } catch (Exception e) { + ErrorLog.error("任务失败的通知事件异常:" + e.getMessage(), e); + } + } + }); + } + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobFinishListener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobFinishListener.java new file mode 100755 index 00000000..7864c29d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobFinishListener.java @@ -0,0 +1,127 @@ +package com.dfire.core.event.listenter; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.vo.HeraRerunVo; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.service.EmailService; +import com.dfire.common.service.HeraRerunService; +import com.dfire.common.service.HeraSsoService; +import com.dfire.common.util.ActionUtil; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.event.base.MvcEvent; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.event.HeraJobFailedEvent; +import com.dfire.event.HeraJobSuccessEvent; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import com.dfire.monitor.domain.AlarmInfo; +import com.dfire.monitor.service.AlarmCenter; + +/** + * desc: + * + * @author scx + * @create 2019/11/28 + */ +public class HeraJobFinishListener extends AbstractListener { + + private HeraRerunService heraRerunService; + + private AlarmCenter alarmCenter; + + private HeraSsoService heraSsoService; + + private EmailService emailService; + + + public HeraJobFinishListener(MasterContext context) { + heraRerunService = context.getHeraRerunService(); + alarmCenter = context.getAlarmCenter(); + heraSsoService = context.getHeraSsoService(); + emailService = context.getEmailService(); + } + + + @Override + public void beforeDispatch(MvcEvent mvcEvent) { + doRerunCheck(mvcEvent); + } + + private void doRerunCheck(MvcEvent mvcEvent) { + Long actionId = null; + Integer rerunId = null; + boolean rerunCheck = false; + boolean executeSuccess = false; + if (mvcEvent.getApplicationEvent() instanceof HeraJobSuccessEvent) { + HeraJobSuccessEvent successEvent = (HeraJobSuccessEvent) mvcEvent.getApplicationEvent(); + if (rerunCheck = successEvent.getTriggerType() == TriggerTypeEnum.AUTO_RERUN) { + actionId = successEvent.getJobId(); + rerunId = Integer.parseInt(successEvent.getHeraJobHistory().getProperties().get(Constants.RERUN_ID)); + executeSuccess = true; + } + } + if (mvcEvent.getApplicationEvent() instanceof HeraJobFailedEvent) { + HeraJobFailedEvent failedEvent = (HeraJobFailedEvent) mvcEvent.getApplicationEvent(); + if (rerunCheck = failedEvent.getTriggerType() == TriggerTypeEnum.AUTO_RERUN) { + actionId = failedEvent.getActionId(); + rerunId = Integer.parseInt(failedEvent.getHeraJobHistory().getProperties().get(Constants.RERUN_ID)); + } + } + if (rerunCheck) { + doRerunCheck(rerunId, actionId, executeSuccess); + } + } + + @Override + public void afterDispatch(MvcEvent mvcEvent) { + + } + + + private void doRerunCheck(Integer rerunId, Long actionId, boolean executeSuccess) { + + if (actionId != null) { + super.getSinglePool().execute(() -> { + //单线程池 无需担心并发问题 + HeraRerunVo rerunVo = null; + try { + Integer jobId = ActionUtil.getJobId(actionId); + //同步问题 + rerunVo = heraRerunService.findVoById(rerunId); + int processNum = Integer.parseInt(rerunVo.getExtra().getOrDefault(Constants.ACTION_PROCESS_NUM, "0")); + int failedNum = Integer.parseInt(rerunVo.getExtra().getOrDefault(Constants.ACTION_FAILED_NUM, "0")); + + rerunVo.getExtra().put(Constants.ACTION_PROCESS_NUM, String.valueOf(++processNum)); + if (!executeSuccess) { + rerunVo.getExtra().put(Constants.ACTION_FAILED_NUM, String.valueOf(++failedNum)); + } + if (rerunVo.getExtra().get(Constants.ACTION_ALL_NUM).equals(rerunVo.getExtra().get(Constants.ACTION_PROCESS_NUM))) { + rerunVo.setIsEnd(1); + HeraSso sso = heraSsoService.findSsoByName(rerunVo.getSsoName()); + String noticeMsg = "【重跑任务执行完成】\n" + + "重跑区域:" + HeraGlobalEnv.getArea() + "\n" + + "任务ID:" + jobId + "\n" + + "重跑名称:" + rerunVo.getName() + "\n" + + "总执行次数:" + processNum + "\n" + + "失败次数:" + failedNum; + if (sso != null) { + + alarmCenter.sendToWeChat(AlarmInfo.builder().userId(sso.getJobNumber()).message(noticeMsg).build()); + emailService.sendEmail("hera重跑任务执行完成", noticeMsg, sso.getEmail()); + } else { + HeraLog.info(noticeMsg); + } + } + } catch (Exception e) { + ErrorLog.error("更新重跑个数异常:" + actionId, e); + } finally { + if (rerunVo != null) { + heraRerunService.updateById(HeraRerunVo.builder().id(rerunVo.getId()).extra(rerunVo.getExtra()).isEnd(rerunVo.getIsEnd()).build()); + } + } + }); + } + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobSuccessListener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobSuccessListener.java new file mode 100755 index 00000000..ef7384f8 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraJobSuccessListener.java @@ -0,0 +1,32 @@ +package com.dfire.core.event.listenter; + +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.core.event.base.MvcEvent; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.event.HeraJobSuccessEvent; + +/** + * @author: 凌霄 + * @time: Created in 下午5:38 2018/4/19 + * @desc + */ +public class HeraJobSuccessListener extends AbstractListener { + + + public HeraJobSuccessListener(MasterContext context) { + } + + /** + * 任务成功的前置操作,可以在这里处理任务成功单未通知下游任务的的前置操作,比如:通知数据质量平台某某任务成功,可以进行检测 + * @param mvcEvent + */ + @Override + public void beforeDispatch(MvcEvent mvcEvent) { + if(mvcEvent.getApplicationEvent() instanceof HeraJobSuccessEvent) { + HeraJobSuccessEvent jobSuccessEvent = (HeraJobSuccessEvent) mvcEvent.getApplicationEvent(); + if(jobSuccessEvent.getTriggerType() == TriggerTypeEnum.SCHEDULE) { + return; + } + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/HeraStopScheduleJobListener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraStopScheduleJobListener.java new file mode 100755 index 00000000..7b47e803 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/HeraStopScheduleJobListener.java @@ -0,0 +1,19 @@ +package com.dfire.core.event.listenter; + +import com.dfire.event.Events; +import com.dfire.core.event.base.MvcEvent; + +/** + * @author: 凌霄 + * @time: Created in 下午5:39 2018/4/19 + * @desc 取消初始化事件,放置Job进行出错任务重试,以及开启定时器 + */ +public class HeraStopScheduleJobListener extends AbstractListener { + + @Override + public void beforeDispatch(MvcEvent mvcEvent) { + if (mvcEvent.getApplicationEvent().getType() == Events.Initialize) { + mvcEvent.setCancelled(true); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/event/listenter/Listener.java b/hera-core/src/main/java/com/dfire/core/event/listenter/Listener.java new file mode 100755 index 00000000..9e430edc --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/event/listenter/Listener.java @@ -0,0 +1,13 @@ +package com.dfire.core.event.listenter; + +import com.dfire.event.AbstractEvent; + +/** + * @author: 凌霄 + * @time: Created in 下午5:52 2018/4/18 + * @desc + */ +public interface Listener { + + void handleEvent(E event); +} diff --git a/hera-core/src/main/java/com/dfire/core/exception/RemotingException.java b/hera-core/src/main/java/com/dfire/core/exception/RemotingException.java new file mode 100755 index 00000000..464347c9 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/exception/RemotingException.java @@ -0,0 +1,49 @@ +package com.dfire.core.exception; + +import com.dfire.core.netty.HeraChannel; + +import java.net.SocketAddress; + +/** + * @author xiaosuda + * @date 2018/11/16 + */ +public class RemotingException extends Exception { + + private SocketAddress localAddress; + + private SocketAddress remoteAddress; + + public RemotingException(HeraChannel channel, String message, Throwable cause) { + this(channel == null ? null : channel.getLocalAddress(), channel == null ? null : channel.getRemoteAddress(), + message, cause); + } + + public RemotingException(HeraChannel channel, String msg) { + this(channel == null ? null : channel.getLocalAddress(), channel == null ? null : channel.getRemoteAddress(), + msg); + } + + public RemotingException(SocketAddress localAddress, SocketAddress remoteAddress, String message) { + super(message); + + this.localAddress = localAddress; + this.remoteAddress = remoteAddress; + } + + public RemotingException(SocketAddress localAddress, SocketAddress remoteAddress, String message, + Throwable cause) { + super(message, cause); + + this.localAddress = localAddress; + this.remoteAddress = remoteAddress; + } + + public SocketAddress getLocalAddress() { + return localAddress; + } + + public SocketAddress getRemoteAddress() { + return remoteAddress; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/filter/TimeoutFilter.java b/hera-core/src/main/java/com/dfire/core/filter/TimeoutFilter.java new file mode 100755 index 00000000..3863e627 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/filter/TimeoutFilter.java @@ -0,0 +1,98 @@ +package com.dfire.core.filter; + +import com.dfire.common.config.ExecuteFilter; +import com.dfire.common.config.Filter; +import com.dfire.common.config.ServiceLoader; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraJobMonitor; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.service.HeraJobMonitorService; +import com.dfire.common.service.HeraSsoService; +import com.dfire.common.service.JobFailAlarm; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import io.netty.util.HashedWheelTimer; +import io.netty.util.Timeout; +import io.netty.util.Timer; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * desc: + * + * @author scx + * @create 2019/05/08 + */ +@Filter("timeoutFilter") +public class TimeoutFilter implements ExecuteFilter { + + @Autowired + private HeraJobMonitorService jobMonitorService; + + @Autowired + private HeraSsoService heraSsoService; + + + private volatile Timer timeoutCheck; + + private ConcurrentHashMap cache; + + @Override + public void onExecute(JobElement jobElement) { + if (jobElement.getCostMinute() == null || jobElement.getCostMinute() <= 0) { + return; + } + if (timeoutCheck == null) { + synchronized (this) { + if (timeoutCheck == null) { + timeoutCheck = new HashedWheelTimer( + new NamedThreadFactory("timeout-check-timer", true), + 1, + TimeUnit.SECONDS); + cache = new ConcurrentHashMap<>(HeraGlobalEnv.getMaxParallelNum()); + } + } + } + cache.putIfAbsent(jobElement, timeoutCheck.newTimeout(timeout -> { + List alarms = ServiceLoader.getAlarms(); + Set monitorUser = getMonitorUser(ActionUtil.getJobId(jobElement.getJobId())); + for (JobFailAlarm alarm : alarms) { + try { + alarm.alarm(jobElement, monitorUser); + } catch (Exception e) { + ErrorLog.error("告警失败:", e); + } + } + }, jobElement.getCostMinute(), TimeUnit.MINUTES)); + } + + @Override + public void onResponse(JobElement element) { + if (cache != null) { + Timeout remove = cache.remove(element); + if (remove != null) { + remove.cancel(); + } + } + } + + private Set getMonitorUser(Integer jobId) { + Set monitorUser = new HashSet<>(); + Optional.ofNullable(jobMonitorService.findByJobId(jobId)) + .map(HeraJobMonitor::getUserIds) + .ifPresent(ids -> Arrays.stream(ids + .split(Constants.COMMA)) + .filter(StringUtils::isNotBlank) + .forEach(id -> { + Optional.ofNullable(heraSsoService.findSsoById(Integer.parseInt(id))).ifPresent(monitorUser::add); + })); + return monitorUser; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/filter/YarnMonitorFilter.java b/hera-core/src/main/java/com/dfire/core/filter/YarnMonitorFilter.java new file mode 100755 index 00000000..81bc7cdc --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/filter/YarnMonitorFilter.java @@ -0,0 +1,125 @@ +package com.dfire.core.filter; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.config.ExecuteFilter; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.service.HeraJobHistoryService; +import com.dfire.common.util.HttpUtils; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.common.util.StringUtil; +import com.dfire.common.vo.JobElement; +import com.dfire.logs.ErrorLog; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * desc: + * + * @author scx + * @create 2019/12/03 + */ + +//@Filter("yarnMonitorFilter") +public class YarnMonitorFilter implements ExecuteFilter { + + + private final String APP_ID = "id"; + private final String NAME = "name"; + private final String ALLOCATED_MB = "allocatedMB"; + private final String ALLOCATED_V_CORES = "allocatedVCores"; + private final String CLUSTER_USAGE_PERCENTAGE = "clusterUsagePercentage"; + private final String QUEUE_USAGE_PERCENTAGE = "queueUsagePercentage"; + private final String MEMORY_SECONDS = "memorySeconds"; + private final String V_CORE_SECONDS = "vcoreSeconds"; + + + @Autowired + private HeraJobHistoryService historyService; + + private ScheduledThreadPoolExecutor checkSchedule; + + private LinkedBlockingQueue jobQueue; + + private LinkedList appQueue; + + + @PostConstruct + public void init() { + jobQueue = new LinkedBlockingQueue<>(); + appQueue = new LinkedList<>(); + checkSchedule = + new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("yarn-monitor", true)); + checkSchedule.scheduleWithFixedDelay(() -> { + for (Long id : new ArrayList<>(jobQueue)) { + HeraJobHistory history = historyService.findPropertiesById(id); + Map properties = StringUtil.convertStringToMap(history.getProperties()); + String appId; + if ((appId = properties.get(Constants.APP_ID)) != null) { + jobQueue.remove(id); + appQueue.add(appId); + } + } + for (String appId : appQueue) { + Map resMap = parseAppLog(HttpUtils.doGet("http://172.30.68.120:5004/ws/v1/cluster/apps/" + appId, null)); + + } + + }, 30, 30, TimeUnit.SECONDS); + + + } + + @Override + public void onExecute(JobElement element) { + try { + jobQueue.put(element.getHistoryId()); + } catch (InterruptedException e) { + ErrorLog.error("添加历史ID异常", e); + } + } + + @Override + public void onResponse(JobElement element) { + if (jobQueue.contains(element.getHistoryId())) { + jobQueue.remove(element.getHistoryId()); + HeraJobHistory history = historyService.findPropertiesById(element.getHistoryId()); + Map properties = StringUtil.convertStringToMap(history.getProperties()); + String appId; + if ((appId = properties.get(Constants.APP_ID)) != null) { + Map resMap = parseAppLog(HttpUtils.doGet("http://172.30.68.120:5004/ws/v1/cluster/apps/" + appId, null)); + + + } + + } + } + + + public Map parseAppLog(String log) { + if (StringUtils.isBlank(log)) { + return null; + } + Map res = new HashMap<>(7); + JSONObject appEntity = JSONObject.parseObject(log).getJSONObject("app"); + res.put(APP_ID, appEntity.getString(APP_ID)); + res.put(ALLOCATED_MB, appEntity.getString(ALLOCATED_MB)); + res.put(ALLOCATED_V_CORES, appEntity.getString(ALLOCATED_V_CORES)); + res.put(CLUSTER_USAGE_PERCENTAGE, appEntity.getString(CLUSTER_USAGE_PERCENTAGE)); + res.put(QUEUE_USAGE_PERCENTAGE, appEntity.getString(QUEUE_USAGE_PERCENTAGE)); + res.put(MEMORY_SECONDS, appEntity.getString(MEMORY_SECONDS)); + res.put(V_CORE_SECONDS, appEntity.getString(V_CORE_SECONDS)); + res.put(NAME, appEntity.getString(NAME)); + return res; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/job/AbstractJob.java b/hera-core/src/main/java/com/dfire/core/job/AbstractJob.java new file mode 100755 index 00000000..89f3c410 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/AbstractJob.java @@ -0,0 +1,297 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.Constants; +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.enums.OperatorSystemEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.HierarchyProperties; +import com.dfire.common.util.Pair; +import com.dfire.common.util.StringUtil; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.emr.Emr; +import com.dfire.core.emr.WrapEmr; +import com.dfire.core.util.CommandUtils; +import com.dfire.logs.HeraLog; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 16:49 2018/1/10 + * @desc + */ +public abstract class AbstractJob implements Job { + + protected JobContext jobContext; + + protected boolean canceled = false; + + protected Emr emr; + + public AbstractJob(JobContext jobContext) { + this.jobContext = jobContext; + emr = new WrapEmr(); + } + + + @Override + public boolean isCanceled() { + return canceled; + } + + @Override + public JobContext getJobContext() { + return jobContext; + } + + public HierarchyProperties getProperties() { + return jobContext.getProperties(); + } + + protected String getProperty(String key, String defaultValue) { + String val; + return StringUtils.isBlank(val = jobContext.getProperties().getProperty(key)) ? defaultValue : val; + } + + protected String getProperty(String key) throws NullPointerException { + String val; + if ((val = jobContext.getProperties().getProperty(key)) == null) { + throw new NullPointerException("找不到" + key + "的值"); + } + return val; + } + + protected String getJobPrefix() { + if (HeraGlobalEnv.isEmrJob() || HeraGlobalEnv.getSystemEnum() == OperatorSystemEnum.MAC || !HeraGlobalEnv.isSudoUser()) { + return " "; + } + String user = getUser(); + if (StringUtils.isBlank(user)) { + return null; + } + if (HeraGlobalEnv.isMacOS()) { + return "sudo -u " + user; + } + return "sudo -s -E -u " + user; + } + + protected String generateRunCommand(JobRunTypeEnum runTypeEnum, String prefix, String jobPath) throws Exception { + StringBuilder command = new StringBuilder(); + // emr集群 + if (HeraGlobalEnv.isEmrJob()) { + File file = new File(jobPath); + if (!file.exists()) { + throw new HeraException("找不到脚本:" + jobPath); + } + String loginCmd = getProperty(Constants.EMR_SELECT_WORK); + String targetPath = Constants.TMP_PATH; + uploadFile(loginCmd, targetPath, file.getParent()); + String runPath = targetPath + File.separator + file.getParentFile().getName() + File.separator + file.getAbsoluteFile().getName(); + //这里的参数使用者可以自行修改,从hera机器上向emr集群分发任务 + command.append(loginCmd).append(Constants.BLANK_SPACE).append("\\").append(Constants.NEW_LINE); + command.append(Constants.SSH_PREFIX).append(Constants.NEW_LINE); + + command.append(generateRunCommandBizCore(runTypeEnum,prefix,runPath)); + + + command.append(Constants.NEW_LINE); + command.append(Constants.SSH_SUFFIX); + } else { + + command.append(generateRunCommandBizCore(runTypeEnum,prefix,jobPath)); + + } + return command.toString(); + } + + /** + * 业务核心代码的脚本内容 + * @param runTypeEnum + * @param prefix + * @param runPath + * @return + */ + public static String generateRunCommandBizCore(JobRunTypeEnum runTypeEnum, String prefix, String runPath){ + + String uuid = UUID.randomUUID().toString(); + String bizBefore= "bash /etc/profile" + Constants.NEW_LINE + + "curDir=$(cd `dirname $0`; pwd)" + Constants.NEW_LINE + + "scriptName=`basename $0`" + Constants.NEW_LINE + + "cd ${curDir}"+ Constants.NEW_LINE + + "log_file="+uuid+".log" + Constants.NEW_LINE + + "echo \"调度作业的日志文件:[${curDir}/${log_file}]\"" + Constants.NEW_LINE + + "runtime=`date '+%Y-%m-%d %H:%M:%S'`" + Constants.NEW_LINE + + "echo \"作业执行开始,时间[$runtime]\"" + Constants.NEW_LINE + ; + + String bizAfter = "if [ ${PIPESTATUS[0]} != 0 ]" + Constants.NEW_LINE + + "then" + Constants.NEW_LINE + + " runtime=`date '+%Y-%m-%d %H:%M:%S'`" + Constants.NEW_LINE + + " echo \"作业执行失败,时间[$runtime]\"" + Constants.NEW_LINE + + " exit -1" + Constants.NEW_LINE + + "else" + Constants.NEW_LINE + + " runtime=`date '+%Y-%m-%d %H:%M:%S'`" + Constants.NEW_LINE + + " #'此处可设置web或FTP服务,如上传日志文件,以达到网页端可查看完成日志功能' "+ Constants.NEW_LINE + + " echo \"作业执行成功,时间[$runtime]\"" + Constants.NEW_LINE + + "fi" + Constants.NEW_LINE + ; + + StringBuilder cmd = new StringBuilder(); + cmd.append(bizBefore).append(Constants.NEW_LINE); + + + //以下是业务脚本 + switch (runTypeEnum) { + case Spark: + cmd.append(HeraGlobalEnv.getJobSparkSqlBin()).append(prefix).append(" -f ").append(runPath); + cmd.append(" 2>&1|tee -a ${log_file} "); + break; + case Hive: + cmd.append(HeraGlobalEnv.getJobHiveBin()).append(" -f ").append(runPath); + cmd.append(" 2>&1|tee -a ${log_file} "); + break; + case Shell: + cmd.append("bash ").append(runPath); + cmd.append(" 2>&1|tee -a ${log_file} "); + break; + default: + cmd.append(""); + break; + } + + cmd.append(Constants.NEW_LINE).append(bizAfter); + + return cmd.toString(); + + } + + + protected String getLoginCmd() { + if (!HeraGlobalEnv.isEmrJob()) { + return "localhost"; + } + String host; + return isFixedEmrJob() && StringUtils.isNotBlank(host = getFixedHost()) ? emr.getFixLogin(host) : emr.getLogin(getUser(), getOwner()); + } + + protected String getOwner() { + return jobContext.getHeraJobHistory().getOperator(); + } + + protected String getIp(String owner) { + if (!HeraGlobalEnv.isEmrJob()) { + return "localhost"; + } + return isFixedEmrJob() ? getFixedHost() : emr.getIp(owner); + } + + private void uploadFile(String loginCmd, String targetPath, String parentPath) throws Exception { + Pair pair = CommandUtils.parseCmd(loginCmd); + UploadEmrFileJob uploadJob = new UploadEmrFileJob(pair.fst(), + parentPath, targetPath, pair.snd(), jobContext); + uploadJob.run(); + } + + + /** + * 判断是否为固定集群任务 + * + * @return boolean + */ + protected boolean isFixedEmrJob() { + //如果是emr集群的debug任务直接在固定集群执行 + if (jobContext.getRunType() == JobContext.DEBUG_RUN && HeraGlobalEnv.isEmrJob()) { + return true; + } + return Boolean.valueOf(getProperty(HeraGlobalEnv.getArea() + Constants.POINT + Constants.HERA_EMR_FIXED, getProperty(Constants.HERA_EMR_FIXED, "false")).trim().toLowerCase()); + } + + /** + * 获得固定集群的ip + * + * @return boolean + */ + protected String getFixedHost() { + return getProperty(HeraGlobalEnv.getArea() + "." + Constants.HERA_EMR_FIXED_HOST, HeraGlobalEnv.emrFixedHost).trim(); + } + + /** + * 判断是否为动态emr集群任务 + * + * @return boolean + */ + protected boolean isDynamicEmrJob() { + return HeraGlobalEnv.isEmrJob() && !isFixedEmrJob(); + } + + protected String getUser() { + if (jobContext.getRunType() == JobContext.SCHEDULE_RUN || jobContext.getRunType() == JobContext.MANUAL_RUN) { + return jobContext.getHeraJobHistory().getOperator(); + } else if (jobContext.getRunType() == JobContext.DEBUG_RUN) { + return jobContext.getDebugHistory().getOwner(); + } else if (jobContext.getRunType() == JobContext.SYSTEM_RUN) { + return ""; + } else { + log("没有RunType=" + jobContext.getRunType() + " 的执行类别"); + } + return null; + } + + + protected String dosToUnix(String script) { + return script.replace("\r\n", "\n"); + } + + protected boolean checkDosToUnix(String filePath) { + if (HeraGlobalEnv.isEmrJob()) { + return false; + } + String[] excludeFile = HeraGlobalEnv.excludeFile.split(Constants.SEMICOLON); + if (!ArrayUtils.isEmpty(excludeFile)) { + String lowCaseShellPath = filePath.toLowerCase(); + for (String exclude : excludeFile) { + if (lowCaseShellPath.endsWith(Constants.POINT + exclude)) { + return false; + } + } + } + return true; + } + + protected void logConsole(String log) { + if (jobContext.getHeraJobHistory() != null) { + jobContext.getHeraJobHistory().getLog().appendConsole(log); + } else if (jobContext.getDebugHistory() != null) { + jobContext.getDebugHistory().getLog().appendConsole(log); + } else { + HeraLog.info(log); + } + } + + protected void log(String log) { + if (jobContext.getHeraJobHistory() != null) { + jobContext.getHeraJobHistory().getLog().appendHera(log); + } else if (jobContext.getDebugHistory() != null) { + jobContext.getDebugHistory().getLog().appendHera(log); + } else { + HeraLog.warn(log); + } + } + + protected void log(Exception e) { + if (jobContext.getHeraJobHistory() != null) { + jobContext.getHeraJobHistory().getLog().appendHeraException(e); + } else if (jobContext.getDebugHistory() != null) { + jobContext.getDebugHistory().getLog().appendHeraException(e); + } else { + HeraLog.error(e.getMessage(), e); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/CancelHadoopJob.java b/hera-core/src/main/java/com/dfire/core/job/CancelHadoopJob.java new file mode 100755 index 00000000..ae17fcb6 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/CancelHadoopJob.java @@ -0,0 +1,80 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.Constants; +import com.dfire.config.HeraGlobalEnv; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 17:55 2018/3/26 + * @desc 扫描日志,揪出hadoop任务id,进行kill + */ +public class CancelHadoopJob extends ProcessJob { + + public CancelHadoopJob(JobContext jobContext) { + super(jobContext); + } + + @Override + public void cancel() { + canceled = true; + } + + /** + * 解析日志 查找map-reduce 的jobId 根据id进行kill + * + * @return + */ + @Override + public List getCommandList() { + List commands = new ArrayList<>(); + String logContent = null; + if (jobContext.getHeraJobHistory() != null) { + logContent = jobContext.getHeraJobHistory().getLog().toString(); + } else if (jobContext.getDebugHistory() != null) { + logContent = jobContext.getDebugHistory().getLog().toString(); + } + if (logContent != null) { + String hadoopCmd = getHadoopCmd(envMap); + String[] logLine = logContent.split(Constants.LOG_SPLIT); + for (String line : logLine) { + if (line.contains("Starting Job =")) { + String jobId = line.substring(line.indexOf("job_"), line.indexOf(Constants.COMMA)); + String killCommand = hadoopCmd + " job -kill " + jobId; + if (HeraGlobalEnv.isEmrJob()) { + killCommand = getLoginCmd() + " " + killCommand; + } + commands.add(killCommand); + log(killCommand); + } else if (line.contains("Submitted application")) { + String appId = line.substring(line.indexOf("Submitted application") + "Submitted application".length() + 1).replace(Constants.LOG_SPLIT, ""); + String killCommand = "yarn application -kill " + appId; + if (HeraGlobalEnv.isEmrJob()) { + killCommand = getLoginCmd() + " " + killCommand; + } + commands.add(killCommand); + log(killCommand); + } + } + } + return commands; + } + + /** + * @param evenMap + * @return + * @desc 获取系统环境的hadoop命令 + */ + public static String getHadoopCmd(Map evenMap) { + StringBuilder cmd = new StringBuilder(64); + String hadoopHome = evenMap.get("HADOOP_HOME"); + if (hadoopHome != null) { + cmd.append(hadoopHome).append("/bin/"); + } + cmd.append("hadoop "); + return cmd.toString(); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/DownLoadJob.java b/hera-core/src/main/java/com/dfire/core/job/DownLoadJob.java new file mode 100755 index 00000000..235edf65 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/DownLoadJob.java @@ -0,0 +1,43 @@ +package com.dfire.core.job; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 上午12:25 2018/4/26 + * @desc + */ +public class DownLoadJob extends AbstractJob { + + public DownLoadJob(JobContext jobContext) { + super(jobContext); + } + + @Override + public int run() throws Exception { + List jobList = new ArrayList<>(); + for (Map map : jobContext.getResources()) { + if (map.get("uri") != null) { + String uri = map.get("uri"); + String name = map.get("name"); + String localPath = name == null ? uri.substring(uri.lastIndexOf("/") + 1) : name; + jobList.add(new DownloadHadoopFileJob(jobContext, uri, localPath)); + } + } + int exitCode = 0; + for (Job job : jobList) { + if (!canceled) { + exitCode = job.run(); + } + } + return exitCode; + } + + @Override + public void cancel() { + canceled = true; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/job/DownloadHadoopFileJob.java b/hera-core/src/main/java/com/dfire/core/job/DownloadHadoopFileJob.java new file mode 100755 index 00000000..45630203 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/DownloadHadoopFileJob.java @@ -0,0 +1,50 @@ +package com.dfire.core.job; + + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.constants.Constants; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.MonitorLog; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午5:18 2018/5/1 + * @desc + */ +public class DownloadHadoopFileJob extends ProcessJob { + + private String hadoopPath; + private String localPath; + + public DownloadHadoopFileJob(JobContext jobContext, String hadoopPath, String localPath) { + super(jobContext); + this.hadoopPath = hadoopPath; + this.localPath = localPath; + } + + @Override + public List getCommandList() { + List commands = new ArrayList<>(); + if (HeraGlobalEnv.isEmrJob()) { + File file = new File(localPath); + //创建文件 + copyToLocal 放在一行 + String workDir = Constants.TMP_PATH + File.separator + "hera"; + String dirAndCopyToLocal = getProperty(Constants.EMR_SELECT_WORK) + " \"" + + "mkdir -p " + workDir + + " & " + "hadoop fs -copyToLocal " + hadoopPath + " " + workDir + File.separator + file.getName() + "\""; + commands.add(dirAndCopyToLocal); + } else { + if (StringUtils.isNotBlank(HeraGlobalEnv.getKerberosKeytabPath()) && StringUtils.isNotBlank(HeraGlobalEnv.getKerberosPrincipal())) { + commands.add("kinit -kt " + HeraGlobalEnv.getKerberosKeytabPath() + " " + HeraGlobalEnv.getKerberosPrincipal()); + } + commands.add("hadoop fs -copyToLocal " + hadoopPath + " " + localPath); + } + MonitorLog.debug("组装后的命令为:" + JSONObject.toJSONString(commands)); + return commands; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/EmptyJob.java b/hera-core/src/main/java/com/dfire/core/job/EmptyJob.java new file mode 100755 index 00000000..dd56d741 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/EmptyJob.java @@ -0,0 +1,27 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.Constants; +import com.dfire.config.HeraGlobalEnv; + +/** + * Created by shuangbofu on 2019-12-18 16:49 + * 前置空job,设置emr地址 + */ +public class EmptyJob extends AbstractJob { + + public EmptyJob(JobContext jobContext) { + super(jobContext); + } + + @Override + public int run() { + // 设置emr地址 + // jobContext.getHeraJobHistory().getProperties().put(Constants.EMR_ADDRESS, getIp(jobContext.getHeraJobHistory().getOperator()) + ":" + HeraGlobalEnv.getYarnPort()); + return 0; + } + + @Override + public void cancel() { + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/HadoopShellJob.java b/hera-core/src/main/java/com/dfire/core/job/HadoopShellJob.java new file mode 100755 index 00000000..83c7ab6e --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/HadoopShellJob.java @@ -0,0 +1,21 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.RunningJobKeyConstant; + +/** + * @author: 凌霄 + * @time: Created in 上午11:09 2018/5/1 + * @desc + */ +public class HadoopShellJob extends ShellJob { + + public HadoopShellJob(JobContext jobContext) { + super(jobContext); + jobContext.getProperties().setProperty(RunningJobKeyConstant.JOB_RUN_TYPE, "HadoopShellJob"); + } + + @Override + public int run() throws Exception { + return super.run(); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/HiveJob.java b/hera-core/src/main/java/com/dfire/core/job/HiveJob.java new file mode 100755 index 00000000..1ed47210 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/HiveJob.java @@ -0,0 +1,96 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.RunningJobKeyConstant; +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 上午7:59 2018/5/12 + * @desc + */ +public class HiveJob extends ProcessJob { + + + public HiveJob(JobContext jobContext) { + super(jobContext); + jobContext.getProperties().setProperty(RunningJobKeyConstant.JOB_RUN_TYPE, "HiveJob"); + } + + @Override + public int run() throws Exception { + return runInner(); + } + + private Integer runInner() throws Exception { + String script = getProperties().getLocalProperty(RunningJobKeyConstant.JOB_SCRIPT); + File file = new File(jobContext.getWorkDir() + File.separator + System.currentTimeMillis() + ".hive"); + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + throw new HeraException("创建.hive失败"); + } + } + + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), + Charset.forName(jobContext.getProperties().getProperty("hera.fs.encode", "utf-8")))) { + writer.write(dosToUnix(script.replaceAll("^--.*", "--"))); + } catch (Exception e) { + throw new HeraException("脚本写入文件失败:" + script); + } + + getProperties().setProperty(RunningJobKeyConstant.RUN_HIVE_PATH, file.getAbsolutePath()); + return super.run(); + } + + @Override + public List getCommandList() throws HeraException { + String hiveFilePath = getProperty(RunningJobKeyConstant.RUN_HIVE_PATH, ""); + List list = new ArrayList<>(); + String shellPrefix = getJobPrefix(); + boolean isDocToUnix = checkDosToUnix(hiveFilePath); + if (isDocToUnix) { + list.add("dos2unix " + hiveFilePath); + log("dos2unix file" + hiveFilePath); + } + String hiveCommand = " -f " + hiveFilePath; + String tmpFilePath = jobContext.getWorkDir() + File.separator + "tmp.sh"; + File tmpFile = new File(tmpFilePath); + OutputStreamWriter tmpWriter = null; + if (!tmpFile.exists()) { + try { + tmpFile.createNewFile(); + tmpWriter = new OutputStreamWriter(new FileOutputStream(tmpFile), + Charset.forName(jobContext.getProperties().getProperty("hera.fs.encode", "utf-8"))); + tmpWriter.write(generateRunCommand(JobRunTypeEnum.Hive, "", hiveFilePath)); + } catch (Exception e) { + throw new HeraException("组装命令异常", e); + } finally { + if (tmpWriter != null) { + try { + tmpWriter.close(); + } catch (IOException e) { + ErrorLog.error("关闭输出流失败", e); + } + } + } + list.add("chmod -R 777 " + jobContext.getWorkDir()); + list.add(shellPrefix + " sh " + tmpFilePath); + } else { + list.add("chmod -R 777 " + jobContext.getWorkDir()); + list.add(shellPrefix + HeraGlobalEnv.getJobHiveBin() + hiveCommand); + } + return list; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/Job.java b/hera-core/src/main/java/com/dfire/core/job/Job.java new file mode 100755 index 00000000..10a89598 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/Job.java @@ -0,0 +1,20 @@ +package com.dfire.core.job; + + +/** + * @author: 凌霄 + * @time: Created in 11:35 2018/1/10 + * @desc 统一job类型接口 + */ +public interface Job { + + int run() throws Exception; + + void cancel(); + + boolean isCanceled(); + + JobContext getJobContext(); + + +} diff --git a/hera-core/src/main/java/com/dfire/core/job/JobContext.java b/hera-core/src/main/java/com/dfire/core/job/JobContext.java new file mode 100755 index 00000000..1c2469c2 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/JobContext.java @@ -0,0 +1,101 @@ +package com.dfire.core.job; + +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.util.HeraDateTool; +import com.dfire.common.util.HierarchyProperties; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 11:36 2018/1/10 + * @desc Job上下文, 当存在多个Job顺序处理时,通过上下文莱传递Job状态与信息 + */ +@Builder +@Data +@AllArgsConstructor +public class JobContext { + + private static final String runPath = "/tmp/hera"; + + /** + * 调度执行 + */ + public static final int SCHEDULE_RUN = 1; + + /** + * 手动执行 + */ + public static final int MANUAL_RUN = 2; + + /** + * DEBUG执行 + */ + public static final int DEBUG_RUN = 3; + + /** + * 系统命令执行 + */ + public static final int SYSTEM_RUN = 4; + + private final int runType; + + private Map data = new HashMap<>(); + + private Integer preExitCode; + + private Integer coreExitCode; + + private String workDir; + + private HierarchyProperties properties = new HierarchyProperties(new HashMap<>()); + + private List> resources; + + private HeraJobHistoryVo heraJobHistory; + + private HeraDebugHistoryVo debugHistory; + + public JobContext() { + this(MANUAL_RUN); + } + + public JobContext(int runType) { + this.runType = runType; + } + + public static JobContext getTempJobContext(int runType) { + JobContext jobContext = new JobContext(runType); + HeraJobHistoryVo jobHistory = HeraJobHistoryVo.builder().build(); + jobContext.setHeraJobHistory(jobHistory); + File baseFile = new File(runPath); + if (!baseFile.exists()) { + baseFile.mkdirs(); + } + File file = new File(runType + HeraDateTool.getToday()); + if (!file.exists()) { + if (!file.mkdirs()) { + throw new SecurityException("create file failed,please check : " + file.getAbsolutePath()); + } + } + jobContext.setWorkDir(file.getAbsolutePath()); + jobContext.setProperties(new HierarchyProperties((new HashMap<>(16)))); + return jobContext; + + } + + public void putData(String key, Object val) { + data.put(key, val); + } + + public Object getData(String key) { + return data.get(key); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/ProcessJob.java b/hera-core/src/main/java/com/dfire/core/job/ProcessJob.java new file mode 100755 index 00000000..3227edb3 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/ProcessJob.java @@ -0,0 +1,229 @@ +package com.dfire.core.job; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.constants.Constants; +import com.dfire.common.exception.HeraCaughtExceptionHandler; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.HierarchyProperties; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import com.dfire.logs.TaskLog; + +import java.io.*; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CountDownLatch; + +/** + * @author: 凌霄 + * @time: Created in 11:01 2018/3/23 + * @desc 通过操作系统创建进程Process的Job任务 + */ +public abstract class ProcessJob extends AbstractJob { + + protected volatile Process process; + protected final Map envMap; + private int exitCode; + + + public ProcessJob(JobContext jobContext) { + super(jobContext); + envMap = HeraGlobalEnv.userEnvMap; + } + + /** + * 组装命令 + * + * @return cmdList + * @throws HeraException 组装异常 + */ + public abstract List getCommandList() throws HeraException; + + + @Override + public int run() throws Exception { + exitCode = Constants.DEFAULT_EXIT_CODE; + jobContext.getProperties().getAllProperties().keySet().stream() + .filter(key -> jobContext.getProperties().getProperty(key) != null && (key.startsWith("secret."))) + .forEach(k -> envMap.put(k, jobContext.getProperties().getProperty(k))); + List commands = getCommandList(); + + for (String command : commands) { + + String[] splitCommand = partitionCommandLine(command); + ProcessBuilder builder = new ProcessBuilder(splitCommand); + builder.directory(new File(jobContext.getWorkDir())); + builder.environment().putAll(envMap); + try { + process = builder.start(); + } catch (IOException e) { + throw new HeraException("执行脚本" + command + "失败", e); + } + String threadName; + if (jobContext.getHeraJobHistory() != null && jobContext.getHeraJobHistory().getJobId() != null) { + threadName = "actionId=" + jobContext.getHeraJobHistory().getJobId(); + } else if (jobContext.getDebugHistory() != null && jobContext.getDebugHistory().getId() != null) { + threadName = "debugId=" + jobContext.getDebugHistory().getId(); + } else { + threadName = "not-normal-job"; + } + CountDownLatch latch = new CountDownLatch(2); + Thread inputThread = new StreamThread(process.getInputStream(), threadName, latch); + Thread outputThread = new StreamThread(process.getErrorStream(), threadName, latch); + inputThread.setUncaughtExceptionHandler(new HeraCaughtExceptionHandler()); + outputThread.setUncaughtExceptionHandler(new HeraCaughtExceptionHandler()); + inputThread.start(); + outputThread.start(); + try { + exitCode = process.waitFor(); + latch.await(); + } catch (InterruptedException e) { + exitCode = Constants.INTERRUPTED_EXIT_CODE; + log(e); + } finally { + process = null; + } + } + return exitCode; + } + + + /** + * @param command + * @return + * @desc 对hera中的操作系统命令进行拆分成字符串数组,方便给ProcessBuilder传命令参数, + * 如:"free -m | grep buffers/cache",成为:{“free”,“-m”,“|”,“grep”,“buffers/cache”} + */ + public static String[] partitionCommandLine(String command) { + List commands = new ArrayList<>(); + StringBuilder builder = new StringBuilder(command.length()); + int index = 0; + boolean isApostrophe = false; + boolean isQuote = false; + while (index < command.length()) { + char c = command.charAt(index); + switch (c) { + case ' ': + if (!isQuote && !isApostrophe) { + String arg = builder.toString(); + builder = new StringBuilder(command.length() - index); + if (arg.length() > 0) { + commands.add(arg); + } + } else { + builder.append(c); + } + break; + case '\'': + if (!isQuote) { + isApostrophe = !isApostrophe; + } else { + builder.append(c); + } + break; + case '"': + if (!isApostrophe) { + isQuote = !isQuote; + } else { + builder.append(c); + } + break; + default: + builder.append(c); + } + index++; + } + if (builder.length() > 0) { + String arg = builder.toString(); + commands.add(arg); + } + TaskLog.info("5.2 ProcessJob :组装后的命令为:{}", JSONObject.toJSONString(commands)); + return commands.toArray(new String[0]); + } + + @Override + public void cancel() { + try { + new CancelHadoopJob(jobContext).run(); + } catch (Exception e) { + log(e); + } + //强制kill 进程 + if (process != null) { + log("WARN Attempting to kill the process "); + try { + process.destroy(); + int pid = getProcessId(); + String st; + if (HeraGlobalEnv.isEmrJob()) { + st = "kill -9 " + pid; + } else { + st = "sudo sh -c \"cd; pstree " + pid + " -p | grep -o '([0-9]*)' | awk -F'[()]' '{print \\$2}' | xargs kill -9\""; + } + String[] commands = {"sh", "-c", st}; + ProcessBuilder processBuilder = new ProcessBuilder(commands); + try { + process = processBuilder.start(); + log("kill process tree success"); + } catch (Exception e) { + log(e); + } + } catch (Exception e) { + log(e); + } finally { + process = null; + } + } + } + + private int getProcessId() { + int processId = 0; + try { + Field f = process.getClass().getDeclaredField("pid"); + f.setAccessible(true); + processId = f.getInt(process); + } catch (Throwable e) { + log(e.getMessage()); + } + return processId; + } + + + + /** + * @author: 凌霄 + * @time: Created in 11:01 2018/3/26 + * @desc job输出流日志接收线程 + */ + public class StreamThread extends Thread { + private InputStream inputStream; + private String threadName; + private CountDownLatch latch; + + private StreamThread(InputStream inputStream, String threadName, CountDownLatch latch) { + this.inputStream = inputStream; + this.threadName = threadName; + this.latch = latch; + } + + @Override + public void run() { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"))) { + String line; + while ((line = reader.readLine()) != null) { + logConsole(line); + } + } catch (Exception e) { + exitCode = Constants.LOG_EXIT_CODE; + HeraLog.error("接受日志异常:{}", e); + log(threadName + ": 接收日志出错,退出日志接收"); + } finally { + latch.countDown(); + } + } + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/job/ProcessJobContainer.java b/hera-core/src/main/java/com/dfire/core/job/ProcessJobContainer.java new file mode 100755 index 00000000..51e2028f --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/ProcessJobContainer.java @@ -0,0 +1,100 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.Constants; +import com.dfire.common.constants.RunningJobKeyConstant; +import com.dfire.common.exception.HeraException; +import com.dfire.config.HeraGlobalEnv; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 上午12:30 2018/4/26 + * @desc job执行单元的集合体,按照处理顺序,先执行前置处理(job执行所需进行的upload,download), + * 在执行核心处理(shell, hive)(脚本执行逻辑),最后执行后置处理 + */ + +public class ProcessJobContainer extends AbstractJob { + + + private List pres; + private List posts; + private Job job; + + private Job running; + + + public ProcessJobContainer(JobContext jobContext, List pres, List posts, Job core) { + super(jobContext); + this.pres = pres; + this.job = core; + this.posts = posts; + } + + + /** + * 单个任务完整执行逻辑,按照前置,core,后置顺序执行 + * + * @return + */ + @Override + public int run() throws Exception { + int exitCode = -1; + try { + if (HeraGlobalEnv.isScriptEcho() || Boolean.parseBoolean(getProperty(Constants.HERA_SCRIPT_ECHO, "false"))) { + String echoLog = "==================开始输出脚本内容==================\n" + + Constants.NEW_LINE + getProperty(RunningJobKeyConstant.JOB_SCRIPT); + log(echoLog); + log("==================结束输出脚本内容=================="); + } + getProperties().setProperty(Constants.EMR_SELECT_WORK, getLoginCmd()); + for (Job job : pres) { + if (isCanceled()) { + break; + } + running = job; + log("开始执行前置处理单元" + job.getClass().getSimpleName()); + jobContext.setPreExitCode(running.run()); + log("前置处理单元" + job.getClass().getSimpleName() + "处理完毕"); + running = null; + } + jobContext.setCoreExitCode(exitCode); + if (!isCanceled()) { + log("开始执行核心job"); + running = job; + exitCode = job.run(); + jobContext.setCoreExitCode(exitCode); + } + log("核心job处理完毕"); + running = null; + + for (Job job : posts) { + if (isCanceled()) { + break; + } + log("开始执行后置处理单元" + job.getClass().getSimpleName()); + running = job; + jobContext.setPreExitCode(running.run()); + log("后置置处理单元" + job.getClass().getSimpleName() + "处理完毕"); + running = null; + } + } catch (Exception e) { + log(e); + throw new HeraException("执行任务异常:", e); + } finally { + log("exitCode = " + exitCode); + } + + return exitCode; + } + + @Override + public void cancel() { + log("cancel job start"); + canceled = true; + if (running != null) { + running.cancel(); + } + log("cancel job end"); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/ShellJob.java b/hera-core/src/main/java/com/dfire/core/job/ShellJob.java new file mode 100755 index 00000000..95817f73 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/ShellJob.java @@ -0,0 +1,120 @@ +package com.dfire.core.job; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.constants.RunningJobKeyConstant; +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.core.util.CommandUtils; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import com.dfire.logs.TaskLog; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 上午12:30 2018/4/26 + * @desc shell脚本执行类,拼接shell文件,执行文件执行命令 + */ + +public class ShellJob extends ProcessJob { + + private String shell = null; + + public ShellJob(JobContext jobContext) { + super(jobContext); + } + + /** + * 脚本执行命令集合 + * 主要包括:切换用户,修改文件权限,执行制定脚本 + * + * @return 命令集合 + */ + @Override + public List getCommandList() throws HeraException { + String script; + if (shell != null) { + script = shell; + } else { + script = getProperties().getLocalProperty(RunningJobKeyConstant.JOB_SCRIPT); + } + OutputStreamWriter outputStreamWriter = null; + try { + File f = new File(jobContext.getWorkDir() + File.separator + (System.currentTimeMillis()) + ".sh"); + if (!f.exists()) { + if (!f.createNewFile()) { + log("ERROR:创建文件失败 " + f.getAbsolutePath()); + HeraLog.error("创建文件失败:" + f.getAbsolutePath()); + } + } + outputStreamWriter = new OutputStreamWriter(new FileOutputStream(f), Charset.forName("utf-8")); + outputStreamWriter.write(dosToUnix(script)); + getProperties().setProperty(RunningJobKeyConstant.RUN_SHELL_PATH, f.getAbsolutePath()); + } catch (IOException e) { + throw new HeraException("创建文件失败,请检查是否有权限", e); + } finally { + if (outputStreamWriter != null) { + try { + outputStreamWriter.close(); + } catch (IOException e) { + ErrorLog.error("关闭输出流异常", e); + } + } + } + String shellFilePath = getProperty(RunningJobKeyConstant.RUN_SHELL_PATH, ""); + List list = new ArrayList<>(); + //修改权限 + String shellPrefix = getJobPrefix(); + //过滤不需要转化的后缀名 + boolean isDocToUnix = checkDosToUnix(shellFilePath); + if (isDocToUnix) { + list.add("dos2unix " + shellFilePath); + log("dos2unix file:" + shellFilePath); + } else { + log("file path :" + shellFilePath); + } + String tmpFilePath = jobContext.getWorkDir() + File.separator + "tmp.sh"; + File tmpFile = new File(tmpFilePath); + OutputStreamWriter tmpWriter = null; + + if (!tmpFile.exists()) { + try { + if (!tmpFile.createNewFile()) { + log("ERROR:创建文件失败," + tmpFilePath); + HeraLog.error("创建文件失败", tmpFile); + } + tmpWriter = new OutputStreamWriter(new FileOutputStream(tmpFile), + Charset.forName(jobContext.getProperties().getProperty("hera.fs.encode", "utf-8"))); + tmpWriter.write(generateRunCommand(JobRunTypeEnum.Shell, "", shellFilePath)); + } catch (Exception e) { + throw new HeraException("组装命令异常", e); + } finally { + if (tmpWriter != null) { + try { + tmpWriter.close(); + } catch (IOException e) { + ErrorLog.error("关闭输出流异常", e); + } + } + } + } + list.add(CommandUtils.changeFileAuthority(jobContext.getWorkDir())); + list.add(CommandUtils.getRunShCommand(shellPrefix, tmpFilePath)); + + TaskLog.info("5.1 命令:{}", JSONObject.toJSONString(list)); + return list; + } + + @Override + public int run() throws Exception { + return super.run(); + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/job/Spark2Job.java b/hera-core/src/main/java/com/dfire/core/job/Spark2Job.java new file mode 100755 index 00000000..8f11aa2d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/Spark2Job.java @@ -0,0 +1,102 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.RunningJobKeyConstant; +import com.dfire.core.tool.pool.JdbcDataSourcePool; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.List; + +/** + * @Description : Thrift spark job + * @Author : HeGuoZi + * @Date : 14:02 2018/8/22 + * @Modified : + */ +public class Spark2Job extends ProcessJob { + + + private static JdbcDataSourcePool jdbcDataSourcePool; + + private final int maxOutputNum = 2000; + + public Spark2Job(JobContext jobContext) { + super(jobContext); + jobContext.getProperties().setProperty(RunningJobKeyConstant.JOB_RUN_TYPE, "Spark2Job"); + } + + @Override + public int run() throws Exception { + return runInner(); + } + + private Integer runInner() { + String script = getProperties().getLocalProperty(RunningJobKeyConstant.JOB_SCRIPT); + int last = 0; + for (int now = 0; now < script.length() && last < script.length(); now++) { + if (last <= now - 1) { + if (";".equals(script.substring(now, now + 1))) { + if (!executeAndPrint(script, last, now)) { + return -999; + } + last = now + 1; + } else if (now == script.length() - 1) { + if (!executeAndPrint(script, last, now + 1)) { + return -999; + } + } + } + } + return 0; + } + + private boolean executeAndPrint(String script, int startPoint, int endPoint) { + if (jdbcDataSourcePool == null) { + synchronized (Spark2Job.class) { + if (jdbcDataSourcePool == null) { + jdbcDataSourcePool = new JdbcDataSourcePool(); + } + } + } + Connection connection = jdbcDataSourcePool.getConnection(); + try { + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(script.substring(startPoint, endPoint)); + int columnCount = resultSet.getMetaData().getColumnCount(); + int rowNum = 0; + while (resultSet.next()) { + String line = ""; + for (int i = 1; i <= columnCount; i++) { + line += resultSet.getString(i) + " "; + } + logConsole(line); + rowNum++; + if (rowNum == maxOutputNum) { + logConsole("The part of rows exceed " + maxOutputNum + ", won't be displayed"); + break; + } + } + stmt.close(); + resultSet.close(); + } catch (Exception e) { + log("执行或打印结果错误"); + return false; + } finally { + try { + connection.close(); + } catch (Exception e) { + ErrorLog.error("连接归还失败", e); + } + } + return true; + } + + @Override + public List getCommandList() { + //该方法此处无用(不会被调到) + return null; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/SparkJob.java b/hera-core/src/main/java/com/dfire/core/job/SparkJob.java new file mode 100755 index 00000000..cfaa6d37 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/SparkJob.java @@ -0,0 +1,115 @@ +package com.dfire.core.job; + +import com.dfire.common.constants.Constants; +import com.dfire.common.constants.RunningJobKeyConstant; +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +/** + * @Description : SparkJob + * @Author : HeGuoZi + * @Date : 15:53 2018/8/20 + * @Modified : + */ +public class SparkJob extends ProcessJob { + + + public SparkJob(JobContext jobContext) { + super(jobContext); + jobContext.getProperties().setProperty(RunningJobKeyConstant.JOB_RUN_TYPE, "SparkJob"); + } + + @Override + public int run() throws Exception { + return runInner(); + } + + private Integer runInner() throws Exception { + String script = getProperties().getLocalProperty(RunningJobKeyConstant.JOB_SCRIPT); + File file = new File(jobContext.getWorkDir() + File.separator + System.currentTimeMillis() + ".spark"); + if (!file.exists()) { + try { + if (!file.createNewFile()) { + throw new IOException(); + } + } catch (IOException e) { + ErrorLog.error("创建.spark失败", e); + } + } + + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), + Charset.forName(jobContext.getProperties().getProperty("hera.fs.encode", "utf-8")))) { + writer.write(dosToUnix(script.replaceAll("^--.*", "--"))); + } catch (Exception e) { + throw new HeraException("写入文件失败:", e); + } + + getProperties().setProperty(RunningJobKeyConstant.RUN_SPARK_PATH, file.getAbsolutePath()); + + return super.run(); + } + + @Override + public List getCommandList() throws HeraException { + String sparkFilePath = getProperty(RunningJobKeyConstant.RUN_SPARK_PATH, ""); + + String shellPrefix = getJobPrefix(); + boolean isDocToUnix = checkDosToUnix(sparkFilePath); + List list = new ArrayList<>(); + if (isDocToUnix) { + list.add("dos2unix " + sparkFilePath); + log("dos2unix file" + sparkFilePath); + } else { + log("file path :" + sparkFilePath); + } + + + String prefix = getProperty(Constants.HERA_SPARK_CONF, + getProperty(HeraGlobalEnv.getArea() + Constants.POINT + Constants.HERA_SPARK_CONF, + HeraGlobalEnv.getSparkMaster() + + " " + + HeraGlobalEnv.getSparkDriverCores() + + " " + + HeraGlobalEnv.getSparkDriverMemory())); + String tmpFilePath = jobContext.getWorkDir() + File.separator + "tmp.sh"; + File tmpFile = new File(tmpFilePath); + OutputStreamWriter tmpWriter = null; + if (!tmpFile.exists()) { + try { + if (!tmpFile.createNewFile()) { + throw new HeraException("创建临时文件失败" + tmpFile.getAbsolutePath()); + } + tmpWriter = new OutputStreamWriter(new FileOutputStream(tmpFile), + Charset.forName(jobContext.getProperties().getProperty("hera.fs.encode", "utf-8"))); + tmpWriter.write(generateRunCommand(JobRunTypeEnum.Spark, prefix, sparkFilePath)); + } catch (Exception e) { + throw new HeraException("组装命令异常", e); + } finally { + if (tmpWriter != null) { + try { + tmpWriter.close(); + } catch (IOException e) { + ErrorLog.error("关闭输出流异常", e); + } + } + } + list.add("chmod -R 777 " + jobContext.getWorkDir()); + list.add(shellPrefix + " sh " + tmpFilePath); + } else { + list.add("chmod -R 777 " + jobContext.getWorkDir()); + list.add(shellPrefix + " " + HeraGlobalEnv.getJobSparkSqlBin() + "-f" + sparkFilePath); + } + + return list; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/UploadEmrFileJob.java b/hera-core/src/main/java/com/dfire/core/job/UploadEmrFileJob.java new file mode 100755 index 00000000..fa5e7cc3 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/UploadEmrFileJob.java @@ -0,0 +1,72 @@ +package com.dfire.core.job; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.Pair; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.util.CommandUtils; +import com.dfire.logs.MonitorLog; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @author scx + * @desc 先从hera机器 上传到emr集群 上传到hadoop + */ +public class UploadEmrFileJob extends ProcessJob { + + + private String sourcePath; + + + private String fileName; + + private String ip; + + private String targetPath; + + private String prefix; + + private String host; + /** + * 是否上传到hdfs 默认是,否则保存到/tmp + */ + private boolean moveHadoop; + + public UploadEmrFileJob(JobContext jobContext, String sourcePath, String fileName, String ip) { + super(jobContext); + this.sourcePath = sourcePath; + this.fileName = fileName; + this.ip = ip; + this.moveHadoop = true; + } + + + public UploadEmrFileJob(String prefix, String sourcePath, String targetPath, String host, JobContext jobContext) { + super(jobContext); + this.prefix = prefix; + this.targetPath = targetPath; + this.sourcePath = sourcePath; + this.moveHadoop = false; + this.host = host; + } + + + @Override + public List getCommandList() throws HeraException { + List commands = new ArrayList<>(); + //从固定集群上传到hadoop + if (moveHadoop) { + String fixLogin = emr.getFixLogin(ip); + Pair pair = CommandUtils.parseCmd(fixLogin); + commands.add(pair.fst() + sourcePath + " " + pair.snd() + ":/tmp/"); + commands.add(fixLogin + " hadoop fs -moveFromLocal /tmp/" + fileName + " " + HeraGlobalEnv.getHdfsUploadPath()); + } else {//上传到机器上即可 + commands.add(prefix + " " + sourcePath + " " + host + ":" + targetPath); + } + MonitorLog.info("组装后的命令为:" + JSONObject.toJSONString(commands)); + return commands; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/job/UploadLocalFileJob.java b/hera-core/src/main/java/com/dfire/core/job/UploadLocalFileJob.java new file mode 100755 index 00000000..e961d448 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/job/UploadLocalFileJob.java @@ -0,0 +1,36 @@ +package com.dfire.core.job; + +import com.dfire.config.HeraGlobalEnv; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 下午5:57 2018/5/1 + * @desc 文件上传,先上传服务器,然后存入hadoop + */ + +public class UploadLocalFileJob extends ProcessJob { + + private String hadoopPath; + private String localPath; + + public UploadLocalFileJob(JobContext jobContext, String localPath, String hadoopPath) { + super(jobContext); + this.hadoopPath = hadoopPath; + this.localPath = localPath; + } + + + @Override + public List getCommandList() { + List commands = new ArrayList<>(); + if (StringUtils.isNotBlank(HeraGlobalEnv.getKerberosKeytabPath()) && StringUtils.isNotBlank(HeraGlobalEnv.getKerberosPrincipal())) { + commands.add("kinit -kt " + HeraGlobalEnv.getKerberosKeytabPath() + " " + HeraGlobalEnv.getKerberosPrincipal()); + } + commands.add("hadoop fs -copyFromLocal " + localPath + " " + hadoopPath); + return commands; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/lock/DistributeLock.java b/hera-core/src/main/java/com/dfire/core/lock/DistributeLock.java new file mode 100755 index 00000000..5917ee95 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/lock/DistributeLock.java @@ -0,0 +1,116 @@ +package com.dfire.core.lock; + +import com.dfire.common.entity.HeraLock; +import com.dfire.common.service.HeraHostRelationService; +import com.dfire.common.service.HeraLockService; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.worker.WorkClient; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.core.schedule.HeraSchedule; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author: 凌霄 + * @time: Created in 20:47 2018/1/10 + * @desc 基于数据库实现的分布式锁方案,后面优化成基于redis实现分布式锁 + */ +@Component +public class DistributeLock { + + + @Getter + private static boolean isMaster = false; + private final long timeout = 1000 * 60 * 5L; + private final String ON_LINE = "online"; + @Autowired + private HeraHostRelationService hostGroupService; + @Autowired + private HeraLockService heraLockService; + @Autowired + private WorkClient workClient; + @Autowired + private HeraSchedule heraSchedule; + + @PostConstruct + public void init() { + + + + workClient.workSchedule.scheduleAtFixedRate(this::checkLock, 10, 60, TimeUnit.SECONDS); + } + + public void checkLock() { + try { + HeraLock heraLock = heraLockService.findBySubgroup(ON_LINE); + if (heraLock == null) { + Date date = new Date(); + heraLock = HeraLock.builder() + .id(1) + .host(WorkContext.host) + .serverUpdate(date) + .subgroup(ON_LINE) + .gmtCreate(date) + .gmtModified(date) + .build(); + Integer lock = heraLockService.insert(heraLock); + if (lock == null || lock <= 0) { + return; + } + } + + if (isMaster = WorkContext.host.equals(heraLock.getHost().trim())) { + heraLock.setServerUpdate(new Date()); + heraLockService.update(heraLock); + HeraLog.info("hold lock and update time"); + heraSchedule.startup(); + } else { + long currentTime = System.currentTimeMillis(); + long lockTime = heraLock.getServerUpdate().getTime(); + long interval = currentTime - lockTime; + if (interval > timeout && isPreemptionHost()) { + Date date = new Date(); + Integer lock = heraLockService.changeLock(WorkContext.host, date, date, heraLock.getHost()); + if (lock != null && lock > 0) { + ErrorLog.error("master 发生切换,{} 抢占成功", WorkContext.host); + heraSchedule.startup(); + heraLock.setHost(WorkContext.host); + //TODO 接入master切换通知 + } else { + HeraLog.info("master抢占失败,由其它worker抢占成功"); + } + } else { + //非主节点,调度器不执行 + heraSchedule.shutdown(); + } + } + workClient.init(); + workClient.connect(heraLock.getHost().trim()); + } catch (Exception e) { + ErrorLog.error("检测锁异常", e); + } + } + + /** + * 检测该ip是否具有抢占master的权限 + * + * @return 是/否 + */ + private boolean isPreemptionHost() { + List preemptionHostList = hostGroupService.findPreemptionGroup(HeraGlobalEnv.preemptionMasterGroup); + if (preemptionHostList.contains(WorkContext.host)) { + return true; + } else { + HeraLog.info(WorkContext.host + " is not in master group " + preemptionHostList.toString()); + return false; + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/message/HeartBeatInfo.java b/hera-core/src/main/java/com/dfire/core/message/HeartBeatInfo.java new file mode 100755 index 00000000..645bc224 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/message/HeartBeatInfo.java @@ -0,0 +1,54 @@ +package com.dfire.core.message; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 16:17 2018/1/12 + * @desc 心跳中传递的机器信息 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HeartBeatInfo { + + private Float memRate; + + private List running; + + private List manualRunning; + + private List debugRunning; + + private List rerunRunning; + + private List superRunning; + + private Long timestamp; + + private String date; + + private String host; + + /** + * cpu load per core等于最近1分钟系统的平均cpu负载÷cpu核心数量 + */ + private Float cpuLoadPerCore; + + /** + * 每个机器的总内存数 + */ + private Float memTotal; + + /** + * 逻辑cpu核数 + */ + private Integer cores; +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/ChoreService.java b/hera-core/src/main/java/com/dfire/core/netty/ChoreService.java new file mode 100755 index 00000000..04c1c8c6 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/ChoreService.java @@ -0,0 +1,157 @@ +package com.dfire.core.netty; + +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; + +/** + * desc: + * + * @author scx + * @create 2020/01/06 + */ +public class ChoreService implements ChoreServicer { + + private final ScheduledThreadPoolExecutor scheduler; + + private final Integer MIN_CORE_POOL_SIZE = 1; + + private final Map> scheduledChores; + + + public ChoreService(Integer coreSize) { + this(coreSize, new NamedThreadFactory("chore-service", true)); + } + + public ChoreService(Integer coreSize, String factoryName) { + this(coreSize, new NamedThreadFactory(factoryName, true)); + } + + public ChoreService(Integer coreSize, ThreadFactory factory) { + if (coreSize < MIN_CORE_POOL_SIZE) { + coreSize = MIN_CORE_POOL_SIZE; + } + scheduler = new ScheduledThreadPoolExecutor(coreSize, factory); + scheduler.setRemoveOnCancelPolicy(true); + scheduledChores = new ConcurrentHashMap<>(); + } + + + @Override + public void cancelChore(ScheduledChore chore) { + cancelChore(chore, true); + } + + @Override + public void cancelChore(ScheduledChore chore, boolean mayInterruptIfRunning) { + ScheduledFuture future; + if (chore != null && (future = scheduledChores.get(chore)) != null) { + future.cancel(mayInterruptIfRunning); + scheduledChores.remove(chore); + HeraLog.info("cancel {} chore schedule success", chore.getName()); + + } + } + + @Override + public boolean isChoreScheduled(ScheduledChore chore) { + return chore != null && scheduledChores.containsKey(chore) && !scheduledChores.get(chore).isDone(); + } + + @Override + public boolean triggerNow(ScheduledChore chore) { + if (chore == null) { + return false; + } + reScheduleChore(chore); + return true; + } + + @Override + public void shutDown() { + HeraLog.info("shutdown chore service"); + scheduler.shutdownNow(); + cancelAllChores(true); + scheduledChores.clear(); + } + + private void cancelAllChores(boolean mayInterruptIfRunning) { + List scheduledChoreList = new ArrayList<>(scheduledChores.size()); + scheduledChoreList.addAll(scheduledChores.keySet()); + for (ScheduledChore scheduledChore : scheduledChoreList) { + this.cancelChore(scheduledChore, mayInterruptIfRunning); + } + } + + private void reScheduleChore(ScheduledChore chore) { + if (chore == null) { + return; + } + ScheduledFuture future = scheduledChores.get(chore); + if (future != null && !future.isDone()) { + future.cancel(false); + } + scheduledChore(chore); + } + + /** + * 以rate方式调度 + * + * @param chore + * @return + */ + + public boolean scheduledChore(ScheduledChore chore) { + if (chore == null) { + return false; + } + try { + chore.setChoreService(this); + ScheduledFuture future = scheduler.scheduleAtFixedRate(chore, chore.getInitialDelay(), chore.getPeriod(), chore.getUnit()); + scheduledChores.put(chore, future); + HeraLog.info("start {} chore schedule success", chore.getName()); + return true; + } catch (Exception e) { + ErrorLog.error("Could not successfully schedule chore ", e); + } + return false; + } + + /** + * 只调度一次 + * + * @param chore + * @return + */ + public boolean scheduledChoreOnce(ScheduledChore chore) { + if (chore == null) { + return false; + } + try { + ScheduledFuture future = scheduledChores.get(chore); + if (future != null && !future.isDone()) { + future.cancel(false); + } + chore.setChoreService(this); + future = scheduler.schedule(() -> { + //关于为什么run 而不是start 是为了保证同步,在下面移除chore + chore.run(); + scheduledChores.remove(chore); + }, chore.getInitialDelay(), chore.getUnit()); + scheduledChores.put(chore, future); + return true; + } catch (Exception e) { + ErrorLog.error("Could not successfully schedule chore ", e); + } + return false; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/ChoreServicer.java b/hera-core/src/main/java/com/dfire/core/netty/ChoreServicer.java new file mode 100755 index 00000000..47de74f6 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/ChoreServicer.java @@ -0,0 +1,14 @@ +package com.dfire.core.netty; + +public interface ChoreServicer { + + void cancelChore(ScheduledChore chore); + + void cancelChore(ScheduledChore chore, boolean mayInterruptIfRunning); + + boolean isChoreScheduled(ScheduledChore chore); + + boolean triggerNow(ScheduledChore chore); + + void shutDown(); +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/HeraChannel.java b/hera-core/src/main/java/com/dfire/core/netty/HeraChannel.java new file mode 100755 index 00000000..b24550a3 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/HeraChannel.java @@ -0,0 +1,25 @@ +package com.dfire.core.netty; + +import com.dfire.core.exception.RemotingException; +import com.dfire.protocol.RpcSocketMessage; +import io.netty.channel.Channel; + +import java.net.SocketAddress; + +/** + * @author xiaosuda + * @date 2018/11/16 + */ +public interface HeraChannel { + + + void writeAndFlush(RpcSocketMessage.SocketMessage msg) throws RemotingException; + + SocketAddress getRemoteAddress(); + + SocketAddress getLocalAddress(); + + Channel getChannel(); + + void close(); +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/NettyChannel.java b/hera-core/src/main/java/com/dfire/core/netty/NettyChannel.java new file mode 100755 index 00000000..2b96cd83 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/NettyChannel.java @@ -0,0 +1,72 @@ +package com.dfire.core.netty; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.exception.RemotingException; +import com.dfire.protocol.RpcSocketMessage; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; + +import java.net.SocketAddress; + + +/** + * @author xiaosuda + * @date 2018/11/16 + */ +public class NettyChannel implements HeraChannel { + + + private Channel channel; + + public NettyChannel(Channel channel) { + this.channel = channel; + } + + + @Override + public void writeAndFlush(RpcSocketMessage.SocketMessage message) throws RemotingException { + ChannelFuture channelFuture = channel.writeAndFlush(message); + boolean success; + long timeout = HeraGlobalEnv.getChannelTimeout(); + try { + success = channelFuture.await(timeout); + Throwable cause = channelFuture.cause(); + if (cause != null) { + throw cause; + } + } catch (Throwable e) { + throw new RemotingException(this, getLocalAddress() + "Failed to send message to " + getRemoteAddress() + ", cause: " + e.getMessage(), e); + } + if (!success) { + throw new RemotingException(this, getLocalAddress() + "Failed to send message to " + getRemoteAddress() + + "in timeout(" + timeout + "ms) limit"); + } + } + + @Override + public SocketAddress getRemoteAddress() { + return channel.remoteAddress(); + } + + @Override + public SocketAddress getLocalAddress() { + return channel.localAddress(); + } + + @Override + public void close() { + channel.close(); + } + + @Override + public Channel getChannel() { + return channel; + } + + @Override + public String toString() { + return "NettyChannel{" + + "channel=" + channel + + '}'; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/ScheduledChore.java b/hera-core/src/main/java/com/dfire/core/netty/ScheduledChore.java new file mode 100755 index 00000000..c911129e --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/ScheduledChore.java @@ -0,0 +1,78 @@ +package com.dfire.core.netty; + +import com.dfire.logs.ErrorLog; + +import java.util.concurrent.TimeUnit; + +/** + * desc: + * + * @author scx + * @create 2020/01/06 + */ +public abstract class ScheduledChore implements Runnable { + + private final Integer MAX_EXCEPTION_TIMES = 99; + protected ChoreService choreService; + + private long initialDelay; + private long period; + private TimeUnit unit; + private Integer exceptionTimes = 0; + private String name; + + public ScheduledChore(String name, long initialDelay, long period, TimeUnit unit) { + this.name = name; + this.initialDelay = initialDelay; + this.period = period; + this.unit = unit; + } + + protected void setInitialDelay(long initialDelay) { + this.initialDelay = initialDelay; + } + + + protected String getName() { + return name; + } + + public long getInitialDelay() { + return initialDelay; + } + + public long getPeriod() { + return period; + } + + public TimeUnit getUnit() { + return unit; + } + + public void setChoreService(ChoreService service) { + if (choreService != null && choreService != service) { + choreService.cancelChore(this, false); + } + choreService = service; + } + + @Override + public void run() { + try { + chore(); + } catch (Exception e) { + ErrorLog.error(name + " schedule chore exception:" + e); + if (++exceptionTimes > MAX_EXCEPTION_TIMES) { + String errorMsg = "cause exception for " + exceptionTimes + " times, stop it :" + name; + ErrorLog.error(errorMsg); + throw new RuntimeException(errorMsg); + } else { + exceptionTimes = 0; + } + } + } + + protected abstract void chore(); + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/cluster/AbstractCluster.java b/hera-core/src/main/java/com/dfire/core/netty/cluster/AbstractCluster.java new file mode 100755 index 00000000..803e8a7f --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/cluster/AbstractCluster.java @@ -0,0 +1,49 @@ +package com.dfire.core.netty.cluster; + +import com.dfire.core.netty.HeraChannel; +import io.netty.channel.Channel; + +import java.net.SocketAddress; + +/** + * + * @author xiaosuda + * @date 2019/2/23 + */ +public abstract class AbstractCluster implements Cluster { + + + protected HeraChannel channel; + + public AbstractCluster(HeraChannel channel) { + this.channel = channel; + } + + @Override + public SocketAddress getRemoteAddress() { + return channel.getRemoteAddress(); + } + + @Override + public SocketAddress getLocalAddress() { + return channel.getLocalAddress(); + } + + @Override + public Channel getChannel() { + return channel.getChannel(); + } + + @Override + public void close() { + channel.close(); + } + + + @Override + public String toString() { + return "NettyChannel{" + + "channel=" + channel + + '}'; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/cluster/Cluster.java b/hera-core/src/main/java/com/dfire/core/netty/cluster/Cluster.java new file mode 100755 index 00000000..2869f4f2 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/cluster/Cluster.java @@ -0,0 +1,14 @@ +package com.dfire.core.netty.cluster; + +import com.dfire.core.netty.HeraChannel; + +/** + * + * @author xiaosuda + * @date 2019/2/23 + */ +public interface Cluster extends HeraChannel { + + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/cluster/FailBackCluster.java b/hera-core/src/main/java/com/dfire/core/netty/cluster/FailBackCluster.java new file mode 100755 index 00000000..db87d6c5 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/cluster/FailBackCluster.java @@ -0,0 +1,73 @@ +package com.dfire.core.netty.cluster; + +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.HeraChannel; +import com.dfire.core.netty.NettyChannel; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.RpcSocketMessage.SocketMessage; +import io.netty.channel.Channel; +import io.netty.util.HashedWheelTimer; +import io.netty.util.Timer; + +import java.util.concurrent.TimeUnit; + +/** + * 集群容错之失败重试 + * + * @author xiaosuda + * @date 2019/2/23 + */ +public class FailBackCluster extends AbstractCluster { + + + /** + * 最大重试次数 + */ + private static final int RETRY_TIMES = 100; + /** + * 重试 delay 时间 + */ + private static final int RETRY_DELAY = 5; + + private volatile Timer retryTimer; + + + public static HeraChannel wrap(HeraChannel channel) { + return new FailBackCluster(channel); + } + + public static HeraChannel wrap(Channel channel) { + return wrap(new NettyChannel(channel)); + } + + private FailBackCluster(HeraChannel channel) { + super(channel); + } + + @Override + public void writeAndFlush(SocketMessage msg) { + try { + channel.writeAndFlush(msg); + } catch (RemotingException e) { + SocketLog.error("send netty msg cause exception, retry it", e); + addFailed(channel, msg); + } + } + + private void addFailed(HeraChannel channel, SocketMessage msg) { + if (retryTimer == null) { + synchronized (this) { + if (retryTimer == null) { + retryTimer = new HashedWheelTimer( + new NamedThreadFactory("failback-cluster-timer", true), + 1, + TimeUnit.SECONDS); + } + } + } + retryTimer.newTimeout(new RetryTimerTask(channel, msg, RETRY_TIMES, RETRY_DELAY), RETRY_DELAY, TimeUnit.SECONDS); + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/cluster/FailFastCluster.java b/hera-core/src/main/java/com/dfire/core/netty/cluster/FailFastCluster.java new file mode 100755 index 00000000..56a2f8f6 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/cluster/FailFastCluster.java @@ -0,0 +1,34 @@ +package com.dfire.core.netty.cluster; + +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.HeraChannel; +import com.dfire.core.netty.NettyChannel; +import com.dfire.protocol.RpcSocketMessage; +import io.netty.channel.Channel; + +/** + * + * 快速失败集群容错 比如心跳 + * @author xiaosuda + * @date 2019/2/23 + */ +public class FailFastCluster extends AbstractCluster { + + + public static HeraChannel wrap(HeraChannel channel) { + return new FailFastCluster(channel); + } + + public static HeraChannel wrap(Channel channel) { + return wrap(new NettyChannel(channel)); + } + + private FailFastCluster(HeraChannel channel) { + super(channel); + } + + @Override + public void writeAndFlush(RpcSocketMessage.SocketMessage msg) throws RemotingException { + channel.writeAndFlush(msg); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/cluster/RetryTimerTask.java b/hera-core/src/main/java/com/dfire/core/netty/cluster/RetryTimerTask.java new file mode 100755 index 00000000..915a3212 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/cluster/RetryTimerTask.java @@ -0,0 +1,64 @@ +package com.dfire.core.netty.cluster; + +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.HeraChannel; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.RpcSocketMessage.SocketMessage; +import io.netty.util.Timeout; +import io.netty.util.TimerTask; + +import java.util.concurrent.TimeUnit; + +/** + * @author xiaosuda + * @date 2019/2/23 + */ +public class RetryTimerTask implements TimerTask { + + + private int maxRetryTimes; + + private int retryTimes; + + private int tick; + + private HeraChannel channel; + + private SocketMessage msg; + + public RetryTimerTask(HeraChannel channel, SocketMessage msg, int maxRetryTimes, int tick) { + this.channel = channel; + this.maxRetryTimes = maxRetryTimes; + this.retryTimes = 0; + this.msg = msg; + this.tick = tick; + } + + private void rePut(Timeout timeout) { + if (timeout == null) { + return; + } + + if (++retryTimes > maxRetryTimes) { + SocketLog.error("send netty msg cause exception, retryTimes is {}, stop send", retryTimes); + return; + } + + if (timeout.isCancelled()) { + SocketLog.error("send netty msg cause exception, retryTimes is {}, timeout is canceled, stop send", retryTimes); + return; + } + + SocketLog.error("send netty msg cause exception, retryTimes is {}", retryTimes); + timeout.timer().newTimeout(this, tick, TimeUnit.SECONDS); + } + + @Override + public void run(Timeout timeout) { + try { + this.channel.writeAndFlush(msg); + } catch (RemotingException e) { + rePut(timeout); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/enums/MessageEnum.java b/hera-core/src/main/java/com/dfire/core/netty/enums/MessageEnum.java new file mode 100755 index 00000000..a6d347d8 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/enums/MessageEnum.java @@ -0,0 +1,51 @@ +package com.dfire.core.netty.enums; + +/** + * desc: + * + * @author scx + * @create 2020/04/03 + */ +public enum MessageEnum { + + + /** + * 更新重跑判断 + */ + UPDATE_RERUN_JUDGE(1), + + /** + * 更新重跑最大并行度 + */ + UPDATE_RERUN_NUMS(2), + + /** + * 更新任务的优先级 + */ + UPDATE_TASK_PRIORITY(3), + /** + * 更新机器组信息 + */ + UPDATE_WORK_INFO(4); + + Integer type; + + + MessageEnum(Integer type) { + this.type = type; + } + + public static MessageEnum parser(Integer type) { + for (MessageEnum msg : MessageEnum.values()) { + if (msg.type.equals(type)) { + return msg; + } + } + return null; + } + + public Integer getType() { + return type; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/enums/RerunCheck.java b/hera-core/src/main/java/com/dfire/core/netty/enums/RerunCheck.java new file mode 100755 index 00000000..d739ff90 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/enums/RerunCheck.java @@ -0,0 +1,41 @@ +package com.dfire.core.netty.enums; + +/** + * desc: + * + * @author scx + * @create 2020/04/04 + */ +public enum RerunCheck { + + /** + * 非重跑任务限制,即:当前队列中有其它任务等待,则不允许重跑任务执行 + */ + + OTHER_TASK_CHECK(1), + /** + * 重跑并行度限制,即:当前执行的任务数达到RuntimeConf.maxRerunNum时不允许执行 + */ + RERUN_NUM_CHECK(2), + + /** + * 上面两者同时生效 + */ + ALL(0); + + Integer type; + + RerunCheck(Integer type) { + this.type = type; + } + + public static RerunCheck parser(Integer type) { + for (RerunCheck check : RerunCheck.values()) { + if (check.type.equals(type)) { + return check; + } + } + return null; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/listener/MasterResponseListener.java b/hera-core/src/main/java/com/dfire/core/netty/listener/MasterResponseListener.java new file mode 100755 index 00000000..e3ec3e7c --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/listener/MasterResponseListener.java @@ -0,0 +1,44 @@ +package com.dfire.core.netty.listener; + +import com.dfire.core.netty.listener.adapter.ResponseListenerAdapter; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.TaskLog; +import com.dfire.protocol.RpcRequest; +import com.dfire.protocol.RpcResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.concurrent.CountDownLatch; + +/** + * @author xiaosuda + * @date 2018/7/31 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class MasterResponseListener extends ResponseListenerAdapter { + + private RpcRequest.Request request; + private volatile Boolean receiveResult; + private CountDownLatch latch; + private RpcResponse.Response response; + + @Override + public void onResponse(RpcResponse.Response response) { + if (response.getRid() == request.getRid()) { + try { + this.response = response; + receiveResult = true; + } catch (Exception e) { + ErrorLog.error("release lock exception {}", e); + } finally { + latch.countDown(); + } + } + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/listener/ResponseListener.java b/hera-core/src/main/java/com/dfire/core/netty/listener/ResponseListener.java new file mode 100755 index 00000000..d5f821a6 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/listener/ResponseListener.java @@ -0,0 +1,26 @@ +package com.dfire.core.netty.listener; + +import com.dfire.protocol.RpcResponse; +import com.dfire.protocol.RpcWebResponse; + +/** + * @author: 凌霄 + * @time: Created in 14:48 2018/1/10 + * @desc web请求在netty中的handler处理响应监听 + */ +public abstract class ResponseListener { + + /** + * 自动调度层消息response + * + * @param response + */ + public abstract void onResponse(RpcResponse.Response response); + + /** + * 页面任务执行请求response + * + * @param webResponse + */ + public abstract void onWebResponse(RpcWebResponse.WebResponse webResponse); +} \ No newline at end of file diff --git a/hera-core/src/main/java/com/dfire/core/netty/listener/WorkResponseListener.java b/hera-core/src/main/java/com/dfire/core/netty/listener/WorkResponseListener.java new file mode 100755 index 00000000..c25bb71e --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/listener/WorkResponseListener.java @@ -0,0 +1,45 @@ +package com.dfire.core.netty.listener; + +import com.dfire.core.netty.listener.adapter.ResponseListenerAdapter; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.TaskLog; +import com.dfire.protocol.RpcWebRequest; +import com.dfire.protocol.RpcWebResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.concurrent.CountDownLatch; + +/** + * @author xiaosuda + * @date 2018/7/31 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class WorkResponseListener extends ResponseListenerAdapter { + + + private RpcWebRequest.WebRequest request; + private volatile Boolean receiveResult; + private CountDownLatch latch; + private RpcWebResponse.WebResponse webResponse; + + @Override + public void onWebResponse(RpcWebResponse.WebResponse response) { + if (request.getRid() == response.getRid()) { + try { + webResponse = response; + receiveResult = true; + } catch (Exception e) { + ErrorLog.error("work release exception {}", e); + } finally { + latch.countDown(); + } + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/listener/adapter/ResponseListenerAdapter.java b/hera-core/src/main/java/com/dfire/core/netty/listener/adapter/ResponseListenerAdapter.java new file mode 100755 index 00000000..33d537c4 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/listener/adapter/ResponseListenerAdapter.java @@ -0,0 +1,24 @@ +package com.dfire.core.netty.listener.adapter; + +import com.dfire.core.netty.listener.ResponseListener; +import com.dfire.protocol.RpcResponse; +import com.dfire.protocol.RpcWebResponse; + +/** + * @author: 凌霄 + * @time: Created in 下午4:10 2018/9/26 + * @desc 接口适配 + */ +public class ResponseListenerAdapter extends ResponseListener { + + + @Override + public void onResponse(RpcResponse.Response response) { + + } + + @Override + public void onWebResponse(RpcWebResponse.WebResponse webResponse) { + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/Master.java b/hera-core/src/main/java/com/dfire/core/netty/master/Master.java new file mode 100755 index 00000000..816e6111 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/Master.java @@ -0,0 +1,1003 @@ +package com.dfire.core.netty.master; + + +import com.dfire.common.constants.Constants; +import com.dfire.common.constants.LogConstant; +import com.dfire.common.constants.TimeFormatConstant; +import com.dfire.common.entity.*; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.exception.HostGroupNotExistsException; +import com.dfire.common.kv.Tuple; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.util.HeraDateTool; +import com.dfire.common.util.StringUtil; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.event.Dispatcher; +import com.dfire.core.event.handler.AbstractHandler; +import com.dfire.core.event.handler.JobHandler; +import com.dfire.core.event.listenter.*; +import com.dfire.core.message.HeartBeatInfo; +import com.dfire.core.netty.master.constant.MasterConstant; +import com.dfire.core.route.loadbalance.LoadBalance; +import com.dfire.core.route.loadbalance.LoadBalanceFactory; +import com.dfire.core.util.CronParse; +import com.dfire.event.Events; +import com.dfire.event.HeraJobMaintenanceEvent; +import com.dfire.event.HeraJobSuccessEvent; +import com.dfire.logs.*; +import com.dfire.monitor.domain.AlarmInfo; +import io.netty.channel.Channel; +import lombok.Getter; +import org.apache.commons.lang.StringUtils; +import org.joda.time.DateTime; +import org.springframework.beans.BeanUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 16:24 2018/1/12 + * @desc hera核心任务调度器 + */ +@Component +@Order(1) +public class Master { + + @Getter + private MasterContext masterContext; + @Getter + private ConcurrentHashMap heraActionMap; + + private volatile boolean isGenerateActioning = false; + + private LoadBalance loadBalance; + + private MasterRunJob masterRunJob; + + + private Channel lastWork; + + public void init(MasterContext masterContext) { + this.masterContext = masterContext; + masterRunJob = new MasterRunJob(masterContext, this); + loadBalance = LoadBalanceFactory.getLoadBalance(); + heraActionMap = new ConcurrentHashMap<>(); + if (HeraGlobalEnv.getEnv().equalsIgnoreCase(Constants.PRE_ENV)) { + //可以在此关闭预发环境执行任务 + //masterContext.getDispatcher().addDispatcherListener(new HeraStopScheduleJobListener()); + } + //关于为什么异步 因为版本过多时会导致启动时长较长,导致master断线,重新选举出新的work,然后周而复始,进入死循环 + masterContext.getThreadPool().execute(() -> { + HeraLog.info("-----------------------------init action,time: {}-----------------------------", System.currentTimeMillis()); + masterContext.getDispatcher().addDispatcherListener(new HeraAddJobListener(this, masterContext)); + masterContext.getDispatcher().addDispatcherListener(new HeraJobFailListener(masterContext)); + masterContext.getDispatcher().addDispatcherListener(new HeraDebugListener(masterContext)); + masterContext.getDispatcher().addDispatcherListener(new HeraJobSuccessListener(masterContext)); + masterContext.getDispatcher().addDispatcherListener(new HeraJobFinishListener(masterContext)); + List allJobList = masterContext.getHeraJobActionService().getAfterAction(getBeforeDayAction()); + HeraLog.info("-----------------------------action size:{}, time {}-----------------------------", allJobList.size(), System.currentTimeMillis()); + allJobList.forEach(heraAction -> { + masterContext.getDispatcher(). + addJobHandler(new JobHandler(heraAction.getId(), this, masterContext)); + heraActionMap.put(heraAction.getId(), heraAction); + }); + HeraLog.info("-----------------------------add actions to handler success, time:{}-----------------------------", System.currentTimeMillis()); + masterContext.getDispatcher().forwardEvent(Events.Initialize); + HeraLog.info("-----------------------------dispatcher actions success, time{}-----------------------------", System.currentTimeMillis()); + masterContext.refreshHostGroupCache(); + HeraLog.info("refresh hostGroup cache"); + }); + } + public boolean isTaskLimit() { + return masterRunJob.isTaskLimit(); + } + + public Integer getRunningTaskNum() { + return masterRunJob.getRunningTaskNum(); + } + + private long getBeforeDayAction() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_YEAR, -HeraGlobalEnv.getJobCacheDay()); + return Long.parseLong(ActionUtil.getActionVersionByDate(calendar.getTime())); + } + + + public boolean checkJobRun(HeraJob heraJob) { + if (heraJob == null) { + ScheduleLog.warn("任务被删除,取消执行"); + return false; + } + if (heraJob.getAuto() == 0) { + ScheduleLog.warn("任务被关闭,取消执行:" + heraJob.getId()); + return false; + } + return true; + } + + private Set areaList(String areas) { + if (StringUtils.isBlank(areas)) { + return new HashSet<>(0); + } + Map areaMap = masterContext.getHeraAreaService().findAll().stream() + .collect(Collectors.toMap(HeraArea::getId, HeraArea::getName)); + return Arrays.stream(areas.split(Constants.COMMA)) + .distinct() + .map(Integer::parseInt) + .map(areaMap::get) + .collect(Collectors.toSet()); + } + + + public boolean generateSingleAction(Integer jobId) { + ScheduleLog.info("单个任务版本生成:{}", jobId); + return generateAction(true, jobId, false); + } + + public boolean generateBatchAction(boolean mustExe) { + ScheduleLog.info("全量任务版本生成"); + long begin = System.currentTimeMillis(); + boolean flag = generateAction(false, null, mustExe); + ScheduleLog.info("生成版本时间:" + (System.currentTimeMillis() - begin) + " ms"); + return flag; + } + + private boolean generateAction(boolean isSingle, Integer jobId, boolean mustExe) { + try { + if (isGenerateActioning) { + return true; + } + DateTime dateTime = new DateTime(); + Date now = dateTime.toDate(); + int executeHour = dateTime.getHourOfDay(); + //只在凌晨23、0点生成版本 + // boolean execute = mustExe || executeHour == 23 || executeHour == 0; + boolean execute = mustExe || executeHour == 0 || (executeHour > ActionUtil.ACTION_CREATE_MIN_HOUR && executeHour <= ActionUtil.ACTION_CREATE_MAX_HOUR); + if (execute || isSingle) { + String currString = ActionUtil.getCurrHourVersion(); + if (executeHour == ActionUtil.ACTION_CREATE_MAX_HOUR) { + Tuple nextDayString = ActionUtil.getNextDayString(); + //例如:今天 2018.07.17 23:50 currString = 201807180000000000 now = 2018.07.18 23:50 + currString = nextDayString.getSource(); + now = nextDayString.getTarget(); + } + Long nowAction = Long.parseLong(currString); + ConcurrentHashMap actionMap = new ConcurrentHashMap<>(heraActionMap.size()); + List jobList = new ArrayList<>(); + //批量生成 + if (!isSingle) { + isGenerateActioning = true; + jobList = masterContext.getHeraJobService().getAll(); + } else { //单个任务生成版本 + HeraJob heraJob = masterContext.getHeraJobService().findById(jobId); + jobList.add(heraJob); + if (heraJob.getScheduleType() == 1) { + jobList.addAll(getParentJob(heraJob.getDependencies(), new HashSet<>())); + } + actionMap = heraActionMap; + List shouldRemove = new ArrayList<>(); + for (Long actionId : actionMap.keySet()) { + if (StringUtil.actionIdToJobId(String.valueOf(actionId), String.valueOf(jobId))) { + shouldRemove.add(actionId); + } + } + shouldRemove.forEach(actionMap::remove); + List handlers = new ArrayList<>(masterContext.getDispatcher().getJobHandlers()); + if (handlers.size() > 0) { + for (AbstractHandler handler : handlers) { + JobHandler jobHandler = (JobHandler) handler; + if (StringUtil.actionIdToJobId(jobHandler.getActionId(), String.valueOf(jobId))) { + masterContext.getQuartzSchedulerService().deleteJob(jobHandler.getActionId()); + masterContext.getDispatcher().removeJobHandler(jobHandler); + } + } + } + } + String cronDate = ActionUtil.getActionVersionPrefix(now); + Map> idMap = new HashMap<>(jobList.size()); + Map jobMap = new HashMap<>(jobList.size()); + generateScheduleJobAction(jobList, cronDate, actionMap, nowAction, idMap, jobMap); + for (Map.Entry entry : jobMap.entrySet()) { + generateDependJobAction(jobMap, entry.getValue(), actionMap, nowAction, idMap); + } + if (executeHour < ActionUtil.ACTION_CREATE_MAX_HOUR) { + heraActionMap = actionMap; + } + Dispatcher dispatcher = masterContext.getDispatcher(); + if (dispatcher != null) { + if (actionMap.size() > 0) { + for (Long id : actionMap.keySet()) { + dispatcher.addJobHandler(new JobHandler(id, masterContext.getMaster(), masterContext)); + //如果是今天的版本 更新缓存 + if (ActionUtil.isTodayActionVersion(id.toString())) { + dispatcher.forwardEvent(new HeraJobMaintenanceEvent(Events.UpdateActions, id)); + } + } + } + } + ScheduleLog.info("[单个任务:{},任务id:{}]generate action success", isSingle, jobId); + return true; + } + } catch (Exception e) { + ErrorLog.error("生成版本异常", e); + notifyAdmin("版本生成异常警告", e.getMessage()); + } finally { + isGenerateActioning = false; + } + return false; + } + + + /** + * 递归获取所有父级依赖任务 + * + * @param dpIdStr + * @return + */ + public Set getParentJob(String dpIdStr, Set jobCheck) { + Set jobSet = new HashSet<>(); + Arrays.stream(dpIdStr.split(Constants.COMMA)).forEach(id -> { + HeraJob dpJob = masterContext.getHeraJobService().findMemById(Integer.parseInt(id)); + if (dpJob != null && !jobCheck.contains(dpJob.getId())) { + jobCheck.add(dpJob.getId()); + if (dpJob.getScheduleType() == 1) { + jobSet.addAll(getParentJob(dpJob.getDependencies(), jobCheck)); + } + jobSet.add(dpJob); + } + }); + return jobSet; + } + + /** + * 自动任务的版本生成 + * + * @param jobList 任务集合 + * @param cronDate 日期 + * @param actionMap actionMap集合 + * @param nowAction 生成版本时间的action + * @param idMap 已经遍历过的idMap + * @param jobMap 依赖任务map映射 + */ + public void generateScheduleJobAction(List jobList, String + cronDate, Map actionMap, Long + nowAction, Map> idMap, Map jobMap) { + List insertActionList = new ArrayList<>(); + for (HeraJob heraJob : jobList) { + if (heraJob.getScheduleType() != null) { + if (heraJob.getScheduleType() == 1) { + jobMap.put(heraJob.getId(), heraJob); + } else if (heraJob.getScheduleType() == 0) { + String cron = heraJob.getCronExpression(); + List list = new ArrayList<>(); + if (StringUtils.isNotBlank(cron)) { + boolean isCronExp = CronParse.Parser(cron, cronDate, list); + if (!isCronExp) { + HeraLog.warn("cron parse error,jobId={},cron = {}", heraJob.getId(), cron); + continue; + } + List heraAction = createHeraAction(list, heraJob); + idMap.put(heraJob.getId(), heraAction); + insertActionList.addAll(heraAction); + } + } else { + ErrorLog.error("任务{}未知的调度类型{}", heraJob.getId(), heraJob.getScheduleType()); + } + } + } + batchInsertList(insertActionList, actionMap, nowAction); + + } + + + /** + * 批量插入 + * + * @param insertActionList 要插入/更新的hera_action 集合 + */ + private void batchInsertList(List insertActionList, Map actionMap, Long + nowAction) { + // 每次批量的条数 + int maxSize = insertActionList.size(); + int batchNum = 500; + int step = batchNum > maxSize ? maxSize : batchNum; + if (maxSize != 0) { + for (int i = 0; i < maxSize; i = i + batchNum) { + List insertList; + if ((step + batchNum) > maxSize) { + insertList = insertActionList.subList(i, step); + step = maxSize; + } else { + insertList = insertActionList.subList(i, step); + step = step + batchNum; + } + masterContext.getHeraJobActionService().batchInsert(insertList, nowAction); + for (HeraAction action : insertList) { + actionMap.put(action.getId(), action); + } + + } + } + } + + + /** + * 生成action + * + * @param list 表格cronTab 表达式,对应多了时间点的版本集合 + * @param heraJob hera_job 表对象 + * @return 更新后的action 信息,保存到内存 + */ + private List createHeraAction(List list, HeraJob heraJob) { + List heraActionList = new ArrayList<>(); + for (String str : list) { + String actionDate = HeraDateTool.StringToDateStr(str, ActionUtil.DEFAULT_FORMAT, ActionUtil.ACTION_MIN); + String actionCron = HeraDateTool.StringToDateStr(str, ActionUtil.DEFAULT_FORMAT, ActionUtil.ACTION_CRON) + " ?"; + HeraAction heraAction = new HeraAction(); + BeanUtils.copyProperties(heraJob, heraAction); + Long actionId = Long.parseLong(actionDate) * 1000000 + Long.parseLong(String.valueOf(heraJob.getId())); + heraAction.setId(actionId); + heraAction.setCronExpression(actionCron); + heraAction.setGmtCreate(new Date()); + heraAction.setJobId(heraJob.getId()); + heraAction.setHistoryId(heraJob.getHistoryId()); + heraAction.setAuto(heraJob.getAuto()); + heraAction.setGmtModified(new Date()); + heraAction.setJobDependencies(null); + heraAction.setDependencies(null); + heraAction.setReadyDependency(null); + heraAction.setHostGroupId(heraJob.getHostGroupId()); + heraAction.setBatchId(getBatchIdFromActionIdPeriod(actionId,heraJob.getCronPeriod(),heraJob.getCronInterval())); //批次号 + heraActionList.add(heraAction); + } + return heraActionList; + } + + + public void clearInvalidAction() { + ScheduleLog.warn("开始进行版本清理"); + Dispatcher dispatcher = masterContext.getDispatcher(); + Long currDate = ActionUtil.getLongCurrActionVersion(); + Long nextDay = ActionUtil.getLongNextDayActionVersion(); + Long preCheckTime = currDate - MasterConstant.PRE_CHECK_MIN; + + Map actionMapNew = heraActionMap; + //移除未生成的调度 + List handlers = dispatcher.getJobHandlers(); + List shouldRemove = new ArrayList<>(); + Long dayAction = getBeforeDayAction(); + if (handlers != null && handlers.size() > 0) { + handlers.forEach(handler -> { + JobHandler jobHandler = (JobHandler) handler; + Long actionId = jobHandler.getActionId(); + // Long = Long.parseLong(actionId); + if (actionId < preCheckTime) { + masterContext.getQuartzSchedulerService().deleteJob(actionId); + } else if (actionId >= currDate && actionId < nextDay) { + if (!actionMapNew.containsKey(actionId)) { + masterContext.getQuartzSchedulerService().deleteJob(actionId); + masterContext.getHeraJobActionService().delete(actionId); + shouldRemove.add(jobHandler); + } + } + //移除非缓存时间内的版本的订阅者 + if (actionId.compareTo(dayAction) < 0) { + shouldRemove.add(jobHandler); + } + }); + } + //移除 过期 失效的handler + shouldRemove.forEach(dispatcher::removeJobHandler); + ScheduleLog.warn("版本清理完成,清理handler个数为:" + shouldRemove.size()); + } + + + /** + * 递归生成任务依赖action + * + * @param jobMap 任务映射map + * @param heraJob 当前生成版本的任务 + * @param actionMap 版本map + * @param nowAction 生成版本时间的action + * @param idMap job的id集合 只要已经检测过的id都放入idSet中 + */ + public void generateDependJobAction(Map jobMap, HeraJob + heraJob, Map actionMap, Long nowAction, Map> idMap) { + if (heraJob == null || idMap.containsKey(heraJob.getId())) { + return; + } + String jobDependencies = heraJob.getDependencies(); + if (StringUtils.isNotBlank(jobDependencies)) { + Map> dependenciesMap = new HashMap<>(1024); + String[] dependencies = jobDependencies.split(Constants.COMMA); + String actionMinDeps = ""; + boolean noAction = false; + for (String dependentId : dependencies) { + Integer dpId = Integer.parseInt(dependentId); + //如果idSet不包含依赖任务dpId 则递归查找 + if (!idMap.containsKey(dpId)) { + generateDependJobAction(jobMap, jobMap.get(dpId), actionMap, nowAction, idMap); + } + List dpActions = idMap.get(dpId); + dependenciesMap.put(dependentId, dpActions); + if (dpActions == null || dpActions.size() == 0) { + HeraLog.info("{}今天找不到版本,无法为任务{}生成版本", dependentId, heraJob.getId()); + noAction = true; + break; + } + if (StringUtils.isBlank(actionMinDeps)) { + actionMinDeps = dependentId; + } + //找到所依赖的任务中版本最少的作为基准版本。 + if (dependenciesMap.get(actionMinDeps).size() > dependenciesMap.get(dependentId).size()) { + actionMinDeps = dependentId; + } else if (dependenciesMap.get(dependentId).size() > 0 && dependenciesMap.get(actionMinDeps).size() == dependenciesMap.get(dependentId).size() && + dependenciesMap.get(actionMinDeps).get(0).getId() < dependenciesMap.get(dependentId).get(0).getId()) { + //如果两个版本的个数一样 那么应该找一个时间较大的 + actionMinDeps = dependentId; + } + } + if (noAction) { + idMap.put(heraJob.getId(), null); + } else { + List actionMinList = dependenciesMap.get(actionMinDeps); + if (actionMinList != null && actionMinList.size() > 0) { + List insertList = new ArrayList<>(); + for (HeraAction action : actionMinList) { + StringBuilder actionDependencies = new StringBuilder(action.getId().toString()); + Long longActionId = Long.parseLong(actionDependencies.toString()); + for (String dependency : dependencies) { + if (!dependency.equals(actionMinDeps)) { + List otherAction = dependenciesMap.get(dependency); + if (otherAction == null || otherAction.size() == 0) { + continue; + } + //找到一个离基准版本时间最近的action,添加为该任务的依赖 + String otherActionId = otherAction.get(0).getId().toString(); + for (HeraAction o : otherAction) { + if (Math.abs(o.getId() - longActionId) < Math.abs(Long.parseLong(otherActionId) - longActionId)) { + otherActionId = o.getId().toString(); + } + } + actionDependencies.append(","); + actionDependencies.append(Long.parseLong(otherActionId) / 1000000 * 1000000 + Long.parseLong(dependency)); + } + } + HeraAction actionNew = new HeraAction(); + BeanUtils.copyProperties(heraJob, actionNew); + Long actionId = longActionId / 1000000 * 1000000 + Long.parseLong(String.valueOf(heraJob.getId())); + actionNew.setId(actionId); + actionNew.setGmtCreate(new Date()); + actionNew.setDependencies(actionDependencies.toString()); + actionNew.setJobDependencies(heraJob.getDependencies()); + actionNew.setJobId(heraJob.getId()); + actionNew.setAuto(heraJob.getAuto()); + actionNew.setHostGroupId(heraJob.getHostGroupId()); + actionNew.setBatchId(getBatchIdFromActionIdPeriod(actionId,heraJob.getCronPeriod(),heraJob.getCronInterval()));//批次号 + masterContext.getHeraJobActionService().insert(actionNew, nowAction); + actionMap.put(actionNew.getId(), actionNew); + insertList.add(actionNew); + } + idMap.put(heraJob.getId(), insertList); + } + } + } + + } + + + + public boolean scanQueue(BlockingQueue queue) throws InterruptedException { + if (!queue.isEmpty()) { + JobElement jobElement = queue.take(); + MasterWorkHolder selectWork; + try { + selectWork = getRunnableWork(jobElement); + if (selectWork == null) { + queue.put(jobElement); + ScheduleLog.warn("can not get work to execute job in master,job is:{}", jobElement.toString()); + } else { + masterRunJob.run(selectWork, jobElement); + return true; + } + } catch (HostGroupNotExistsException e) { + updateStatus(e.getMessage(), jobElement.getJobId(), jobElement.getTriggerType()); + ErrorLog.error("can not get work to execute job in master", e); + } + } + return false; + } + + private void updateStatus(String msg, Long id, TriggerTypeEnum typeEnum) { + switch (typeEnum) { + case SCHEDULE: + case MANUAL_RECOVER: + case MANUAL: + HeraAction heraAction = masterContext.getHeraJobActionService().findById(id); + masterContext.getHeraJobActionService().updateStatus(id, StatusEnum.FAILED.name()); + masterContext.getHeraJobHistoryService().updateHeraJobHistoryLogAndStatus(HeraJobHistory.builder() + .id(heraAction.getHistoryId()) + .log(msg) + .status(StatusEnum.FAILED.name()) + .illustrate("自动取消") + .endTime(new Date()) + .build()); + break; + case DEBUG: + masterContext.getHeraDebugHistoryService().updateStatus(id, msg, StatusEnum.FAILED.name()); + break; + default: + break; + } + } + + + /** + * 获取hostGroupId中可以分发任务的worker + * + * @param jobElement job 部分信息 + * @return + */ + private MasterWorkHolder getRunnableWork(JobElement jobElement) throws HostGroupNotExistsException { + //TODO 如果是emr集群 是否可以在这里判断内存信息? + MasterWorkHolder selectWork = loadBalance.select(jobElement, masterContext); + if (selectWork == null) { + return null; + } + Channel channel = selectWork.getChannel().getChannel(); + HeartBeatInfo beatInfo = selectWork.getHeartBeatInfo(); + // 如果最近两次选择的work一致 需要等待机器最新状态发来之后(睡眠)再进行任务分发 + if (HeraGlobalEnv.getWarmUpCheck() > 0 && lastWork != null && channel == lastWork && (beatInfo.getCpuLoadPerCore() > 0.6F || beatInfo.getMemRate() > 0.7F)) { + ScheduleLog.info("达到预热条件,睡眠" + HeraGlobalEnv.getWarmUpCheck() + "秒"); + try { + TimeUnit.SECONDS.sleep(HeraGlobalEnv.getWarmUpCheck()); + } catch (InterruptedException e) { + ErrorLog.error("InterruptedException", e); + } + lastWork = null; + return null; + } + lastWork = channel; + return selectWork; + } + + public void debug(HeraDebugHistoryVo debugHistory) { + //如果是emr集群,开发中心任务直接在固定集群跑 + boolean fixedEmr = HeraGlobalEnv.isEmrJob(); + JobElement element = JobElement.builder() + .jobId(debugHistory.getId()) + .hostGroupId(debugHistory.getHostGroupId()) + .historyId(debugHistory.getId()) + .triggerType(TriggerTypeEnum.DEBUG) + .fixedEmr(fixedEmr) + .costMinute(0) + .build(); + debugHistory.setStatus(StatusEnum.RUNNING); + debugHistory.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + debugHistory.getLog().append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 进入任务队列"); + masterContext.getHeraDebugHistoryService().update(BeanConvertUtils.convert(debugHistory)); + try { + masterContext.getDebugQueue().put(element); + } catch (InterruptedException e) { + ErrorLog.error("添加开发中心执行任务失败:" + element.getJobId(), e); + } + } + + + private String getInheritVal(Integer groupId, String key, String defaultKey) { + HeraGroup group = masterContext.getHeraGroupService().findConfigById(groupId); + String defaultVal = null; + while (group != null && groupId != null && groupId != 0) { + Map map = StringUtil.convertStringToMap(group.getConfigs()); + // 多重继承相同变量,以第一个的为准 + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey().equals(key)) { + return entry.getValue(); + } + if (StringUtils.isBlank(defaultVal) && entry.getKey().equals(defaultKey)) { + defaultVal = entry.getValue(); + } + } + groupId = group.getParent(); + group = masterContext.getHeraGroupService().findConfigById(groupId); + } + return defaultVal; + } + + /** + * 手动执行任务或者手动恢复任务的时候,先进行任务是否在执行的判断, + * 没有在运行进入队列等待,已经在运行的任务不入队列,避免重复执行 + * + * @param heraJobHistory heraJobHistory表信息 + */ + public void run(HeraJobHistoryVo heraJobHistory, HeraJob heraJob) { + Long actionId = heraJobHistory.getActionId(); + //重复job检测 + if (checkJobExists(heraJobHistory, false)) { + return; + } + HeraAction heraAction = masterContext.getHeraJobActionService().findById(actionId); + Set areaList = areaList(heraJob.getAreaId()); + //非执行区域任务直接设置为成功 + if (!areaList.contains(HeraGlobalEnv.getArea()) && !areaList.contains(Constants.ALL_AREA)) { + ScheduleLog.info("非{}区域任务,直接设置为成功:{}", HeraGlobalEnv.getArea(), heraJob.getId()); + heraAction.setLastResult(heraAction.getStatus()); + heraAction.setStatus(StatusEnum.SUCCESS.toString()); + heraAction.setHistoryId(heraJobHistory.getId()); + heraAction.setReadyDependency("{}"); + String host = "localhost"; + heraAction.setHost(host); + Date endTime = new Date(); + heraAction.setStatisticStartTime(endTime); + heraAction.setStatisticEndTime(endTime); + masterContext.getHeraJobActionService().update(heraAction); + heraJobHistory.getLog().append("非" + HeraGlobalEnv.getArea() + "区域任务,直接设置为成功"); + heraJobHistory.setStatusEnum(StatusEnum.SUCCESS); + heraJobHistory.setEndTime(endTime); + heraJobHistory.setStartTime(endTime); + heraJobHistory.setExecuteHost(host); + masterContext.getHeraJobHistoryService().update(BeanConvertUtils.convert(heraJobHistory)); + HeraJobSuccessEvent successEvent = new HeraJobSuccessEvent(actionId, heraJobHistory.getTriggerType(), heraJobHistory); + masterContext.getDispatcher().forwardEvent(successEvent); + return; + } + + //先在数据库中set一些执行任务所需的必须值 然后再加入任务队列 + heraAction.setLastResult(heraAction.getStatus()); + heraAction.setStatus(StatusEnum.RUNNING.toString()); + heraAction.setHistoryId(heraJobHistory.getId()); + heraAction.setStatisticStartTime(new Date()); + heraAction.setStatisticEndTime(null); + masterContext.getHeraJobActionService().update(heraAction); + heraJobHistory.getLog().append(ActionUtil.getTodayString() + " 进入任务队列"); + masterContext.getHeraJobHistoryService().update(BeanConvertUtils.convert(heraJobHistory)); + + + boolean isFixed; + int priorityLevel = 3; + Map configs = StringUtil.convertStringToMap(heraAction.getConfigs()); + String priorityLevelValue = configs.get("run.priority.level"); + if (priorityLevelValue != null) { + priorityLevel = Integer.parseInt(priorityLevelValue); + } + String areaFixed = HeraGlobalEnv.getArea() + Constants.POINT + Constants.HERA_EMR_FIXED; + if (configs.containsKey(Constants.HERA_EMR_FIXED) || configs.containsKey(areaFixed)) { + isFixed = Boolean.parseBoolean(configs.get(areaFixed)) || Boolean.parseBoolean(configs.get(Constants.HERA_EMR_FIXED)); + } else { + isFixed = Boolean.parseBoolean(getInheritVal(heraAction.getGroupId(), areaFixed, Constants.HERA_EMR_FIXED)); + } + Integer endMinute = masterContext.getHeraJobService().findMustEndMinute(heraAction.getJobId()); + JobElement element = JobElement.builder() + .jobId(heraJobHistory.getActionId()) + .hostGroupId(heraJobHistory.getHostGroupId()) + .priorityLevel(priorityLevel) + .historyId(heraJobHistory.getId()) + .fixedEmr(isFixed) + .owner(heraJob.getOwner()) + .costMinute(endMinute) + .build(); + try { + element.setTriggerType(heraJobHistory.getTriggerType()); + HeraAction cacheAction = heraActionMap.get(element.getJobId()); + if (cacheAction != null) { + cacheAction.setStatus(StatusEnum.RUNNING.toString()); + } + switch (heraJobHistory.getTriggerType()) { + case MANUAL: + masterContext.getManualQueue().put(element); + break; + case AUTO_RERUN: + masterContext.getRerunQueue().put(element); + break; + case MANUAL_RECOVER: + case SCHEDULE: + masterContext.getScheduleQueue().put(element); + break; + case SUPER_RECOVER: + masterContext.getSuperRecovery().put(element); + break; + default: + ErrorLog.error("不支持的调度类型:{},id:{}", heraJobHistory.getTriggerType().toName(), heraJobHistory.getActionId()); + break; + } + } catch (InterruptedException e) { + ErrorLog.error("添加任务" + element.getJobId() + "失败", e); + } + } + + + public boolean checkJobExists(HeraJobHistoryVo heraJobHistory, boolean checkOnly) { + // 允许重复的话 不检测,重跑任务也不检测 + if (masterContext.getHeraJobService().isRepeat(heraJobHistory.getJobId()) || heraJobHistory.getTriggerType() == TriggerTypeEnum.AUTO_RERUN) { + return false; + } + Long actionId = heraJobHistory.getActionId(); + Integer jobId = heraJobHistory.getJobId(); + + boolean exists = false; + if (heraJobHistory.getTriggerType() == TriggerTypeEnum.MANUAL_RECOVER || heraJobHistory.getTriggerType() == TriggerTypeEnum.SCHEDULE) { + // check调度器等待队列是否有此任务在排队 + for (JobElement jobElement : masterContext.getScheduleQueue()) { + if (ActionUtil.jobEquals(jobElement.getJobId(), actionId)) { + exists = true; + TaskLog.warn("调度队列已存在该任务,添加失败 {}", actionId); + } + } + // check所有的worker中是否有此任务的id在执行,如果有,不进入队列等待 + for (MasterWorkHolder workHolder : masterContext.getWorkMap().values()) { + if (!exists) { + for (Long aLong : workHolder.getRunning()) { + if (Objects.equals(ActionUtil.getJobId(aLong.toString()), jobId)) { + exists = true; + TaskLog.warn("该任务正在执行,添加失败 {}", actionId); + break; + } + } + } + + } + } else if (heraJobHistory.getTriggerType() == TriggerTypeEnum.SUPER_RECOVER) { + // check调度器等待队列是否有此任务在排队 + for (JobElement jobElement : masterContext.getSuperRecovery()) { + if (ActionUtil.jobEquals(jobElement.getJobId(), actionId)) { + exists = true; + TaskLog.warn("调度队列已存在该任务,添加失败 {}", actionId); + } + } + // check所有的worker中是否有此任务的id在执行,如果有,不进入队列等待 + for (MasterWorkHolder workHolder : masterContext.getWorkMap().values()) { + if (!exists) { + for (Long aLong : workHolder.getSuperRunning()) { + if (Objects.equals(ActionUtil.getJobId(aLong.toString()), jobId)) { + exists = true; + TaskLog.warn("该任务正在执行,添加失败 {}", actionId); + break; + } + } + } + + } + } else if (heraJobHistory.getTriggerType() == TriggerTypeEnum.MANUAL) { + + for (JobElement jobElement : masterContext.getManualQueue()) { + if (ActionUtil.jobEquals(jobElement.getJobId(), actionId)) { + exists = true; + TaskLog.warn("手动任务队列已存在该任务,添加失败 {}", actionId); + } + } + + for (MasterWorkHolder workHolder : masterContext.getWorkMap().values()) { + if (!exists) { + for (Long aLong : workHolder.getManningRunning()) { + if (Objects.equals(ActionUtil.getJobId(aLong.toString()), jobId)) { + exists = true; + TaskLog.warn("该任务正在执行,添加失败 {}", actionId); + break; + } + } + } + + } + } + if (exists && !checkOnly) { + heraJobHistory.getLog().append(LogConstant.CHECK_QUEUE_LOG); + heraJobHistory.setStartTime(new Date()); + heraJobHistory.setEndTime(new Date()); + heraJobHistory.setIllustrate("任务已在调度队列"); + //由于设置为失败会被告警 所以暂时设置为wait状态 + heraJobHistory.setStatusEnum(StatusEnum.WAIT); + masterContext.getHeraJobHistoryService().update(BeanConvertUtils.convert(heraJobHistory)); + } + return exists; + + } + + + private void notifyAdmin(String title, String content) { + HeraUser admin = masterContext.getHeraUserService().findByName(HeraGlobalEnv.getAdmin()); + if (admin != null) { + masterContext.getAlarmCenter().sendToEmail(title, content, admin.getEmail()); + masterContext.getAlarmCenter().sendToPhone(AlarmInfo.builder().message(title + "\n" + content).phone(admin.getPhone()).build()); + } else { + ErrorLog.error("内部异常{}:{},找不到{}管理员的联系方式", title, content, HeraGlobalEnv.getAdmin()); + } + + } + + /** + * work断开的处理 + * + * @param channel channel + */ + public void workerDisconnectProcess(Channel channel) { + String ip = getIpFromChannel(channel); + ErrorLog.error("work:{}断线", ip); + notifyAdmin("警告:work断线了", ip); + MasterWorkHolder workHolder = masterContext.getWorkMap().get(channel); + masterContext.getWorkMap().remove(channel); + if (workHolder != null) { + Set scheduleTask = workHolder.getRunning(); + + if (scheduleTask == null || scheduleTask.size() == 0) { + return; + } + //十分钟后开始检查 work是否重连成功 + masterContext.masterSchedule.schedule(() -> { + try { + Channel newChannel = null; + HeraAction heraAction; + HeraJobHistory heraJobHistory; + //遍历新的心跳信息 匹配断线ip是否重新连接 + Set channels = masterContext.getWorkMap().keySet(); + for (Channel cha : channels) { + if (getIpFromChannel(cha).equals(ip)) { + newChannel = cha; + break; + } + } + + if (newChannel != null) { + SocketLog.warn("work重连成功:{}", newChannel.remoteAddress()); + // 判断任务状态 无论是否成功,全部重新广播一遍 + + for (Long action : scheduleTask) { + heraAction = masterContext.getHeraJobActionService().findById(action); + //检测action表是否已经更新 如果更新 证明work的成功信号发送给了master已经广播 + if (StatusEnum.SUCCESS.toString().equals(heraAction.getStatus())) { + SocketLog.warn("任务{}已经执行完成并发信号给master,无需重试", action); + continue; + } + heraJobHistory = masterContext.getHeraJobHistoryService().findById(heraAction.getHistoryId()); + //如果work已经运行成功但是成功信号没有发送给master master做一次广播 + if (StatusEnum.SUCCESS.toString().equals(heraJobHistory.getStatus())) { + HeraJobSuccessEvent successEvent = new HeraJobSuccessEvent(action, TriggerTypeEnum.parser(heraJobHistory.getTriggerType()) + , BeanConvertUtils.convert(heraJobHistory)); + heraAction.setStatus(heraJobHistory.getStatus()); + masterContext.getHeraJobActionService().updateStatus(heraAction.getId(), heraAction.getStatus()); + SocketLog.warn("任务{}已经执行完成但是信号未发送给master,手动广播成功事件", action); + //成功时间广播 + masterContext.getDispatcher().forwardEvent(successEvent); + } else if (StatusEnum.FAILED.toString().equals(heraJobHistory.getStatus())) { + + SocketLog.warn("任务{}执行失败,但是丢失重试次数,重新调度", action); + //丢失重试次数信息 master直接重试 + heraJobHistory.setIllustrate("work断线,丢失任务重试次数,重新执行该任务"); + startNewJob(heraJobHistory, LogConstant.RETRY_JOB); + } else if (StatusEnum.RUNNING.toString().equals(heraJobHistory.getStatus())) { + //如果仍然在运行中,那么检测新的心跳信息 判断work是断线重连 or 重启 + HeartBeatInfo newBeatInfo = masterContext.getWorkMap().get(newChannel).getHeartBeatInfo(); + if (newBeatInfo == null) { + TimeUnit.SECONDS.sleep(HeraGlobalEnv.getHeartBeat() * 2); + + newBeatInfo = masterContext.getWorkMap().get(newChannel).getHeartBeatInfo(); + } + if (newBeatInfo != null) { + List newRunning = newBeatInfo.getRunning(); + //如果work新的心跳信息 包含该任务的信息 work继续执行即可 + if (newRunning.contains(action)) { + SocketLog.warn("任务{}还在运行中,并且work重连后心跳信息存在,等待work执行完成", action); + continue; + } + } + heraJobHistory.setIllustrate("work心跳该任务信息为空,重新执行该任务"); + SocketLog.warn("任务{}还在运行中,但是work已经无该任务的相关信息,重新调度该任务", action); + //不包含该任务信息,重新调度 + startNewJob(heraJobHistory, LogConstant.RETRY_JOB); + } + } + } else { + for (Long action : scheduleTask) { + heraAction = masterContext.getHeraJobActionService().findById(action); + heraJobHistory = masterContext.getHeraJobHistoryService().findById(heraAction.getHistoryId()); + heraJobHistory.setIllustrate("work断线超出十分钟,重新执行该任务"); + SocketLog.warn("work断线并且未重连,重新调度任务{}", action); + startNewJob(heraJobHistory, LogConstant.RETRY_JOB); + } + } + } catch (InterruptedException e) { + ErrorLog.error("work断线任务检测异常{}", e); + } + }, 10, TimeUnit.MINUTES); + + String content = "不幸的消息,work宕机了:" + channel.remoteAddress() + "
                              " + + "自动调度队列任务:" + workHolder.getHeartBeatInfo().getRunning() + "
                              " + + "手动队列任务:" + workHolder.getHeartBeatInfo().getManualRunning() + "
                              " + + "开发中心队列任务:" + workHolder.getHeartBeatInfo().getDebugRunning() + "
                              "; + ErrorLog.error(content); + } + } + + public void startNewJob(HeraJobHistory heraJobHistory, String illustrate) { + HeraJob heraJob = masterContext.getHeraJobService().findById(heraJobHistory.getJobId()); + if (heraJob == null || heraJob.getAuto() == 0 || !checkJobRun(heraJob)) { + ScheduleLog.warn("任务已关闭或者删除,取消重跑." + heraJobHistory.getJobId()); + return; + } + heraJobHistory.setStatus(StatusEnum.FAILED.toString()); + masterContext.getHeraJobHistoryService().update(heraJobHistory); + HeraJobHistory newHistory = HeraJobHistory.builder(). + actionId(heraJobHistory.getActionId()). + illustrate(illustrate). + jobId(heraJobHistory.getJobId()). + triggerType(heraJobHistory.getTriggerType()). + operator(heraJobHistory.getOperator()). + hostGroupId(heraJobHistory.getHostGroupId()). + batchId(heraJobHistory.getBatchId()). + bizLabel(heraJobHistory.getBizLabel()). + log(heraJobHistory.getIllustrate()).build(); + masterContext.getHeraJobHistoryService().insert(newHistory); + run(BeanConvertUtils.convert(newHistory), heraJob); + } + + private String getIpFromChannel(Channel channel) { + return channel.remoteAddress().toString().split(":")[0]; + } + + public void printThreadPoolLog() { + masterRunJob.printThreadPoolLog(); + } + + /** + * 输出批次号 + * @param actionId + * @param cronPeriod 周期 + * @param cronInterval 间隔 + * @return 批次号;示例actionId=20190102112233,cronPeriod=day,cronInterval=-1,则批次号=2019-01-01 + */ + public String getBatchIdFromActionIdPeriod(Long actionId,String cronPeriod,int cronInterval) { + cronPeriod=cronPeriod.toLowerCase(); + if(cronPeriod.equals("other")){ + return actionId.toString(); + }else{ + String dmStr=actionId.toString().substring(0, 14); + Date currDate = HeraDateTool.StringToDate(dmStr, "yyyyMMddHHmmss"); + Calendar cal=Calendar.getInstance(); + cal.setTime(currDate); + String outDateStr; + SimpleDateFormat outDateFormat = new SimpleDateFormat(TimeFormatConstant.YYYY_MM_DD_HH_MM_SS); + if(cronPeriod.equals("year")){ + cal.add(Calendar.YEAR, cronInterval); + outDateStr = outDateFormat.format(cal.getTime()); + return outDateStr.substring(0,4); + }else if(cronPeriod.equals("month")){ + cal.add(Calendar.MONTH, cronInterval); + outDateStr = outDateFormat.format(cal.getTime()); + return outDateStr.substring(0,7); + }else if(cronPeriod.equals("day")){ + cal.add(Calendar.DATE, cronInterval); + outDateStr = outDateFormat.format(cal.getTime()); + return outDateStr.substring(0,10); + }else if(cronPeriod.equals("hour")){ + cal.add(Calendar.HOUR, cronInterval); + outDateStr = outDateFormat.format(cal.getTime()); + return outDateStr.substring(0,13); + }else if(cronPeriod.equals("minute")){ + cal.add(Calendar.MINUTE, cronInterval); + outDateStr = outDateFormat.format(cal.getTime()); + return outDateStr.substring(0,16); + }else if(cronPeriod.equals("second")){ + cal.add(Calendar.SECOND, cronInterval); + outDateStr = outDateFormat.format(cal.getTime()); + return outDateStr.substring(0,19); + }else{//未知,使用秒方案 + cal.add(Calendar.SECOND, cronInterval); + outDateStr = outDateFormat.format(cal.getTime()); + return outDateStr.substring(0,19); + } + } + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/MasterContext.java b/hera-core/src/main/java/com/dfire/core/netty/master/MasterContext.java new file mode 100755 index 00000000..43291f59 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/MasterContext.java @@ -0,0 +1,197 @@ +package com.dfire.core.netty.master; + +import com.dfire.common.entity.vo.HeraHostGroupVo; +import com.dfire.common.service.*; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.event.Dispatcher; +import com.dfire.core.netty.ChoreService; +import com.dfire.core.netty.master.comparator.FiFoComp; +import com.dfire.core.netty.master.schedule.*; +import com.dfire.core.quartz.QuartzSchedulerService; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import com.dfire.monitor.service.AlarmCenter; +import io.netty.channel.Channel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.joda.time.DateTime; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.*; + +/** + * @author: 凌霄 + * @time: Created in 14:10 2018/1/12 + * @desc hera调度器执行上下文 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Component +@Order(2) +public class MasterContext { + + /** + * todo 参数可配置 + */ + + protected ScheduledThreadPoolExecutor masterSchedule; + @Autowired + private Master master; + private Map workMap = new ConcurrentHashMap<>(); + @Autowired + private HeraHostGroupService heraHostGroupService; + @Autowired + @Qualifier("heraFileMemoryService") + private HeraFileService heraFileService; + @Autowired + private QuartzSchedulerService quartzSchedulerService; + @Autowired + @Qualifier("heraGroupMemoryService") + private HeraGroupService heraGroupService; + @Autowired + private HeraJobHistoryService heraJobHistoryService; + @Autowired + private HeraUserService heraUserService; + @Autowired + @Qualifier("heraJobMemoryService") + private HeraJobService heraJobService; + @Autowired + private HeraAreaService heraAreaService; + @Autowired + private HeraDebugHistoryService heraDebugHistoryService; + @Autowired + private HeraJobActionService heraJobActionService; + @Autowired + private EmailService emailService; + @Autowired + private AlarmCenter alarmCenter; + @Autowired + private HeraJobMonitorService heraJobMonitorService; + @Autowired + private HeraSsoService heraSsoService; + @Autowired + private HeraRerunService heraRerunService; + private Dispatcher dispatcher; + private Map hostGroupCache; + private BlockingQueue scheduleQueue = new PriorityBlockingQueue<>(10000, new FiFoComp()); + private BlockingQueue debugQueue = new LinkedBlockingQueue<>(10000); + private BlockingQueue manualQueue = new LinkedBlockingQueue<>(10000); + private BlockingQueue rerunQueue = new LinkedBlockingQueue<>(10000); + private BlockingQueue superRecovery = new LinkedBlockingQueue<>(10000); + private MasterHandler handler; + private MasterServer masterServer; + @Getter + private ExecutorService threadPool; + private ChoreService choreService; + private RerunJobInit rerunJobInit; + private RerunJobLaunch rerunJobLaunch; + private LostJobCheck lostJobCheck; + private WorkHeartCheck heartCheck; + private JobActionInit actionInit; + private JobFinishCheck finishCheck; + private JobQueueScan queueScan; + @Getter + private boolean isStop; + + + public void init() { + //主要处理work的请求信息 + threadPool = new ThreadPoolExecutor( + 0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("master-wait-response"), new ThreadPoolExecutor.AbortPolicy()); + //主要管理master的一些延迟任务处理 + masterSchedule = new ScheduledThreadPoolExecutor(2, new NamedThreadFactory("master-schedule", false)); + masterSchedule.setKeepAliveTime(5, TimeUnit.MINUTES); + masterSchedule.allowCoreThreadTimeOut(true); + //开启quartz服务 + getQuartzSchedulerService().start(); + dispatcher = new Dispatcher(); + //初始化master端的netty消息handler + handler = new MasterHandler(this); + //初始化master server + masterServer = new MasterServer(handler); + masterServer.start(HeraGlobalEnv.getConnectPort()); + master.init(this); + + //master的定时任务管理者 + choreService = new ChoreService(5, "chore-service"); + //重跑任务初始化 + rerunJobInit = new RerunJobInit(master); + choreService.scheduledChore(rerunJobInit); + //重跑任务启动 + rerunJobLaunch = new RerunJobLaunch(master); + choreService.scheduledChore(rerunJobLaunch); + //信号丢失检测 + lostJobCheck = new LostJobCheck(master, new DateTime().getMinuteOfHour()); + choreService.scheduledChore(lostJobCheck); + //心跳检测 + heartCheck = new WorkHeartCheck(master); + choreService.scheduledChore(heartCheck); + //版本生成 + actionInit = new JobActionInit(master); + choreService.scheduledChore(actionInit); + //任务是否完成检测 + finishCheck = new JobFinishCheck(master); + choreService.scheduledChore(finishCheck); + //队列扫描 + queueScan = new JobQueueScan(master); + choreService.scheduledChoreOnce(queueScan); + HeraLog.info("end init master content success "); + } + + public void destroy() { + threadPool.shutdownNow(); + HeraLog.info("shutdown master-wait-response pool success"); + masterSchedule.shutdownNow(); + HeraLog.info("shutdown master-schedule pool success"); + + if (choreService != null) { + choreService.cancelChore(rerunJobInit); + choreService.cancelChore(lostJobCheck); + choreService.cancelChore(heartCheck); + choreService.cancelChore(rerunJobLaunch); + choreService.cancelChore(actionInit); + choreService.cancelChore(finishCheck); + choreService.cancelChore(queueScan); + choreService.shutDown(); + HeraLog.info("shutdown chore-service pool success"); + } + if (masterServer != null) { + masterServer.shutdown(); + HeraLog.info("shutdown master-server success"); + } + if (quartzSchedulerService != null) { + try { + quartzSchedulerService.shutdown(); + HeraLog.info("shutdown quartz schedule success"); + } catch (Exception e) { + ErrorLog.error("shutdown quartz schedule error", e); + } + } + HeraLog.info("destroy master context success"); + } + + public synchronized Map getHostGroupCache() { + return hostGroupCache; + } + + + public synchronized void refreshHostGroupCache() { + try { + hostGroupCache = getHeraHostGroupService().getAllHostGroupInfo(); + } catch (Exception e) { + HeraLog.info("refresh host group error"); + } + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/MasterHandler.java b/hera-core/src/main/java/com/dfire/core/netty/master/MasterHandler.java new file mode 100755 index 00000000..78ee42db --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/MasterHandler.java @@ -0,0 +1,225 @@ +package com.dfire.core.netty.master; + +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.core.netty.HeraChannel; +import com.dfire.core.netty.NettyChannel; +import com.dfire.core.netty.cluster.FailBackCluster; +import com.dfire.core.netty.listener.ResponseListener; +import com.dfire.core.netty.master.response.MasterHandleRequest; +import com.dfire.core.netty.master.response.MasterHandlerWebResponse; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.SocketLog; +import com.dfire.logs.TaskLog; +import com.dfire.protocol.RpcRequest.Request; +import com.dfire.protocol.RpcResponse.Response; +import com.dfire.protocol.RpcSocketMessage.SocketMessage; +import com.dfire.protocol.RpcWebRequest.WebRequest; +import com.dfire.protocol.RpcWebResponse.WebResponse; +import com.google.protobuf.InvalidProtocolBufferException; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +import java.net.SocketAddress; +import java.util.List; +import java.util.concurrent.*; + +/** + * @author: 凌霄 + * @time: Created in 1:34 2018/1/4 + * @desc SocketMessage为rpc消息体 + */ +@ChannelHandler.Sharable +public class MasterHandler extends ChannelInboundHandlerAdapter { + + private CompletionService completionService; + + /** + * 调度器执行上下文信息 + */ + private MasterContext masterContext; + + private volatile boolean shutdown = false; + + public MasterHandler(MasterContext masterContext) { + this.masterContext = masterContext; + completionService = new ExecutorCompletionService<>( + new ThreadPoolExecutor( + 0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("master-execute", false), new ThreadPoolExecutor.AbortPolicy())); + ThreadPoolExecutor executor = new ThreadPoolExecutor( + 1, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("master-deal", false), new ThreadPoolExecutor.AbortPolicy()); + executor.execute(() -> { + Future future; + ChannelResponse response; + while (!shutdown) { + try { + future = completionService.take(); + response = future.get(); + TaskLog.info("3-1.MasterHandler:-->master prepare send status : {}", response.webResponse.getStatus()); + response.channel.writeAndFlush(wrapper(response.webResponse)); + TaskLog.info("3-2.MasterHandler:-->master send response success, requestId={}", response.webResponse.getRid()); + } catch (Exception e) { + ErrorLog.error("master handler future take error:{}", e); + } catch (Throwable throwable) { + ErrorLog.error("master handler future take throwable{}", throwable); + } + } + } + ); + executor.shutdown(); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + SocketMessage socketMessage = (SocketMessage) msg; + Channel channel = ctx.channel(); + switch (socketMessage.getKind()) { + //心跳 + case REQUEST: + Request request = Request.newBuilder().mergeFrom(socketMessage.getBody()).build(); + switch (request.getOperate()) { + case HeartBeat: + masterContext.getThreadPool().execute(() -> MasterHandleRequest.handleHeartBeat(masterContext, channel, request)); + break; + case SetWorkInfo: + masterContext.getThreadPool().execute(() -> MasterHandleRequest.setWorkInfo(masterContext, channel, request)); + break; + default: + ErrorLog.error("unknow request operate error.{}", request.getOperateValue()); + break; + } + break; + case WEB_REQUEST: + final WebRequest webRequest = WebRequest.newBuilder().mergeFrom(socketMessage.getBody()).build(); + switch (webRequest.getOperate()) { + case ExecuteJob: + completionService.submit(() -> + new ChannelResponse(FailBackCluster.wrap(channel), MasterHandlerWebResponse.handleWebExecute(masterContext, webRequest))); + break; + case CancelJob: + completionService.submit(() -> + new ChannelResponse(FailBackCluster.wrap(channel), MasterHandlerWebResponse.handleWebCancel(masterContext, webRequest))); + break; + case UpdateJob: + completionService.submit(() -> + new ChannelResponse(FailBackCluster.wrap(channel), MasterHandlerWebResponse.handleWebUpdate(masterContext, webRequest))); + break; + case ExecuteDebug: + completionService.submit(() -> + new ChannelResponse(FailBackCluster.wrap(channel), MasterHandlerWebResponse.handleWebDebug(masterContext, webRequest))); + break; + case GenerateAction: + completionService.submit(() -> + new ChannelResponse(FailBackCluster.wrap(channel), MasterHandlerWebResponse.generateActionByJobId(masterContext, webRequest))); + break; + + case GetAllHeartBeatInfo: + completionService.submit(() -> + new ChannelResponse(FailBackCluster.wrap(channel), MasterHandlerWebResponse.buildJobQueueInfo(masterContext, webRequest))); + break; + case GetAllWorkInfo: + completionService.submit(() -> + new ChannelResponse(FailBackCluster.wrap(channel), MasterHandlerWebResponse.buildAllWorkInfo(masterContext, webRequest))); + break; + default: + ErrorLog.error("unknown webRequest operate error:{}", webRequest.getOperate()); + break; + } + break; + case RESPONSE: + masterContext.getThreadPool().execute(() -> { + Response response = null; + try { + response = Response.newBuilder().mergeFrom(socketMessage.getBody()).build(); + + SocketLog.info("6.MasterHandler:receiver socket info from work {}, response is {}", ctx.channel().remoteAddress(), response.getRid()); + for (ResponseListener listener : listeners) { + listener.onResponse(response); + } + } catch (InvalidProtocolBufferException e) { + ErrorLog.error("解析消息异常", e); + } + }); + + break; + case WEB_RESPONSE: + masterContext.getThreadPool().execute(() -> { + WebResponse webResponse = null; + try { + webResponse = WebResponse.newBuilder().mergeFrom(socketMessage.getBody()).build(); + } catch (InvalidProtocolBufferException e) { + ErrorLog.error("解析消息异常", e); + } + SocketLog.info("6.MasterHandler:receiver socket info from work {}, webResponse is {}", ctx.channel().remoteAddress(), webResponse.getRid()); + for (ResponseListener listener : listeners) { + listener.onWebResponse(webResponse); + } + }); + break; + default: + ErrorLog.error("unknown request type : {}", socketMessage.getKind()); + break; + } + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) { + masterContext.getThreadPool().execute(() -> { + Channel channel = ctx.channel(); + masterContext.getWorkMap().put(channel, new MasterWorkHolder(FailBackCluster.wrap(channel))); + SocketAddress remoteAddress = channel.remoteAddress(); + SocketLog.info("worker client channel registered connect success : {}", remoteAddress.toString()); + }); + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + masterContext.getThreadPool().execute(() -> { + ErrorLog.error("worker miss connection !!!"); + masterContext.getMaster().workerDisconnectProcess(ctx.channel()); + }); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) { + Channel channel = ctx.channel(); + SocketAddress remoteAddress = channel.remoteAddress(); + SocketLog.info("worker client channel active success : {}", remoteAddress.toString()); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ErrorLog.error("cause exception {}", cause); + } + + private SocketMessage wrapper(WebResponse response) { + return SocketMessage.newBuilder().setKind(SocketMessage.Kind.WEB_RESPONSE).setBody(response.toByteString()).build(); + } + + private List listeners = new CopyOnWriteArrayList<>(); + + public void addListener(ResponseListener listener) { + listeners.add(listener); + } + + public void removeListener(ResponseListener listener) { + listeners.remove(listener); + } + + public void shutdown() { + shutdown = true; + } + + + private class ChannelResponse { + HeraChannel channel; + WebResponse webResponse; + + public ChannelResponse(HeraChannel channel, WebResponse webResponse) { + this.channel = channel; + this.webResponse = webResponse; + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/MasterRunJob.java b/hera-core/src/main/java/com/dfire/core/netty/master/MasterRunJob.java new file mode 100755 index 00000000..d38f0904 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/MasterRunJob.java @@ -0,0 +1,387 @@ +package com.dfire.core.netty.master; + +import com.dfire.common.constants.Constants; +import com.dfire.common.constants.LogConstant; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.vo.HeraActionVo; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.JobScheduleTypeEnum; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.master.response.MasterExecuteJob; +import com.dfire.event.*; +import com.dfire.logs.*; +import com.dfire.protocol.JobExecuteKind; +import com.dfire.protocol.ResponseStatus; +import com.dfire.protocol.RpcResponse; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + + +/** + * desc: + * + * @author scx + * @create 2019/04/23 + */ +public class MasterRunJob implements RunJob { + + private Master master; + + private MasterContext masterContext; + + private RunJobThreadPool executeJobPool; + + private int cacheCoreSize; + + public MasterRunJob(MasterContext masterContext, Master master) { + this.master = master; + this.masterContext = masterContext; + this.cacheCoreSize = HeraGlobalEnv.getMaxParallelNum(); + executeJobPool = new RunJobThreadPool(masterContext, cacheCoreSize, cacheCoreSize, 10L, TimeUnit.MINUTES, + new LinkedBlockingQueue<>(Integer.MAX_VALUE), new NamedThreadFactory("master-execute-job"), new ThreadPoolExecutor.AbortPolicy()); + executeJobPool.allowCoreThreadTimeOut(true); + } + + /** + * 开发中心脚本执行逻辑 + * + * @param selectWork 所选机器 + * @param debugId debugId + */ + private void runDebugJob(MasterWorkHolder selectWork, Long debugId) { + HeraDebugHistoryVo history = masterContext.getHeraDebugHistoryService().findById(debugId); + history.getLog().append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 开始运行"); + masterContext.getHeraDebugHistoryService().update(BeanConvertUtils.convert(history)); + Exception exception = null; + RpcResponse.Response response = null; + Future future = null; + try { + future = new MasterExecuteJob().executeJob(masterContext, selectWork, TriggerTypeEnum.DEBUG, debugId); + response = future.get(HeraGlobalEnv.getTaskTimeout(), TimeUnit.HOURS); + } catch (Exception e) { + exception = e; + if (future != null) { + future.cancel(true); + } + DebugLog.error(String.format("debugId:%s run failed", debugId), e); + } + boolean success = response != null && response.getStatusEnum() == ResponseStatus.Status.OK; + if (!success) { + exception = new HeraException(String.format("fileId:%s run failed ", history.getFileId()), exception); + TaskLog.info("8.Master: debug job error"); + history = masterContext.getHeraDebugHistoryService().findById(debugId); + HeraDebugFailEvent failEvent = HeraDebugFailEvent.builder() + .debugHistory(BeanConvertUtils.convert(history)) + .throwable(exception) + .fileId(history.getFileId()) + .build(); + masterContext.getDispatcher().forwardEvent(failEvent); + } else { + TaskLog.info("7.Master: debug success"); + HeraDebugSuccessEvent successEvent = HeraDebugSuccessEvent.builder() + .fileId(history.getFileId()) + .history(BeanConvertUtils.convert(history)) + .build(); + masterContext.getDispatcher().forwardEvent(successEvent); + } + } + + /** + * 手动执行任务调度器执行逻辑,向master的channel写manual任务执行请求 + * + * @param selectWork selectWork 所选机器 + * @param actionId actionId + */ + private void runManualJob(MasterWorkHolder selectWork, Long actionId, TriggerTypeEnum triggerType) { + SocketLog.info("start run manual job, actionId = {}", actionId); + HeraAction heraAction = masterContext.getHeraJobActionService().findById(actionId); + HeraJobHistory history = masterContext.getHeraJobHistoryService().findById(heraAction.getHistoryId()); + HeraJobHistoryVo historyVo = BeanConvertUtils.convert(history); + historyVo.getLog().append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 开始运行"); + heraAction.setStatus(StatusEnum.RUNNING.toString()); + historyVo.setStatusEnum(StatusEnum.RUNNING); + HeraAction cacheAction = master.getHeraActionMap().get(actionId); + if (cacheAction != null) { + cacheAction.setStatus(StatusEnum.RUNNING.toString()); + cacheAction.setHistoryId(heraAction.getHistoryId()); + } + masterContext.getHeraJobHistoryService().updateHeraJobHistoryLogAndStatus(BeanConvertUtils.convert(historyVo)); + + Exception exception = null; + RpcResponse.Response response = null; + Future future = null; + try { + future = new MasterExecuteJob().executeJob(masterContext, selectWork, + triggerType, actionId); + response = future.get(); + } catch (Exception e) { + exception = e; + if (future != null) { + future.cancel(true); + } + ErrorLog.error("manual job run error {}", e); + } + boolean success = response != null && response.getStatusEnum() != null && response.getStatusEnum() == ResponseStatus.Status.OK; + if (response != null) { + ScheduleLog.info("actionId 执行结果" + actionId + "---->" + response.getStatusEnum()); + } + ApplicationEvent event; + if (!success) { + if (exception != null) { + HeraException heraException = new HeraException(exception); + ErrorLog.error("manual actionId = {} error, {}", history.getActionId(), heraException.getMessage()); + } + ScheduleLog.info("actionId = {} manual execute failed", history.getActionId()); + heraAction.setStatus(StatusEnum.FAILED.toString()); + HeraJobHistory jobHistory = masterContext.getHeraJobHistoryService().findById(history.getId()); + if (LogConstant.CANCEL_JOB_LOG.equals(jobHistory.getIllustrate())) { + event = null; + } else { + HeraJobHistoryVo jobHistoryVo = BeanConvertUtils.convert(jobHistory); + event = new HeraJobFailedEvent(history.getActionId(), jobHistoryVo.getTriggerType(), jobHistoryVo); + } + } else { + heraAction.setStatus(StatusEnum.SUCCESS.toString()); + event = new HeraJobSuccessEvent(history.getActionId(), historyVo.getTriggerType(), historyVo); + } + updateCacheAction(actionId, heraAction.getStatus()); + heraAction.setStatisticEndTime(new Date()); + masterContext.getHeraJobActionService().update(heraAction); + if (event != null) { + masterContext.getDispatcher().forwardEvent(event); + } + } + + /** + * 调度任务执行前,先获取任务的执行重试时间间隔和重试次数 + * + * @param selectWork 所选机器 + * @param actionId actionId + * @param triggerType + */ + private void runScheduleJob(MasterWorkHolder selectWork, Long actionId, TriggerTypeEnum triggerType) { + int runCount = 0; + int retryCount = 0; + int retryWaitTime = 1; + HeraActionVo heraActionVo = masterContext.getHeraJobActionService().findHeraActionVo(actionId).getSource(); + Map properties = heraActionVo.getConfigs(); + if (properties != null && properties.size() > 0) { + retryCount = Integer.parseInt(properties.get("roll.back.times") == null ? "0" : properties.get("roll.back.times")); + retryWaitTime = Integer.parseInt(properties.get("roll.back.wait.time") == null ? "0" : properties.get("roll.back.wait.time")); + } + runScheduleJobContext(selectWork, actionId, runCount, retryCount, retryWaitTime, triggerType); + } + + /** + * 自动调度任务开始执行入口,向master端的channel写请求任务执行请求 + * + * @param selectWork selectWork + * @param actionId actionId + * @param runCount runCount + * @param retryCount retryCount + * @param retryWaitTime retryWaitTime + * @param triggerType + */ + private void runScheduleJobContext(MasterWorkHolder selectWork, Long actionId, int runCount, int retryCount, int retryWaitTime, TriggerTypeEnum triggerType) { + DebugLog.info("重试次数:{},重试时间:{},actionId:{}", retryCount, retryWaitTime, actionId); + runCount++; + boolean isCancelJob = false; + if (runCount > 1) { + HeraJob memJob = masterContext.getHeraJobService().findMemById(ActionUtil.getJobId(actionId)); + //如果任务已经关闭,取消执行 + if (memJob == null || memJob.getAuto() != 1) { + ScheduleLog.info("任务{}已关闭,取消重试:{}", actionId, runCount); + return; + } + if (master.checkJobExists(HeraJobHistoryVo.builder() + .actionId(actionId) + .jobId(memJob.getId()) + .triggerType(triggerType) + .build() + , true)) { + ScheduleLog.info("--------------------------{}正在执行,取消重试--------------------------", actionId); + return; + } + HeraJobHistory lastHistory = masterContext.getHeraJobHistoryService().findNewest(ActionUtil.getJobId(actionId)); + boolean checkCancel = lastHistory.getActionId().equals(actionId) && + (lastHistory.getTriggerType().equals(TriggerTypeEnum.MANUAL_RECOVER.getId()) + || lastHistory.getTriggerType().equals(TriggerTypeEnum.SCHEDULE.getId())); + //判断是否为同一个版本,且为手动恢复 + if (checkCancel) { + //如果有正在执行的,或已经完成 取消重试 + if (StatusEnum.RUNNING.toString().equals(lastHistory.getStatus()) || StatusEnum.SUCCESS.toString().equals(lastHistory.getStatus())) { + ScheduleLog.info(String.format("cancel job {} retry, there is another task running or success", actionId)); + return; + } + } + + DebugLog.info("任务重试,睡眠:{}分钟", retryWaitTime); + try { + TimeUnit.MINUTES.sleep(retryWaitTime); + } catch (InterruptedException e) { + ErrorLog.error("sleep interrupted", e); + } + } + HeraJobHistoryVo heraJobHistoryVo; + HeraJobHistory heraJobHistory; + HeraAction heraAction; + if (runCount == 1) { + heraAction = masterContext.getHeraJobActionService().findById(actionId); + heraJobHistory = masterContext.getHeraJobHistoryService(). + findById(heraAction.getHistoryId()); + heraJobHistoryVo = BeanConvertUtils.convert(heraJobHistory); + triggerType = heraJobHistoryVo.getTriggerType(); + heraJobHistoryVo.getLog().append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 开始运行"); + + } else { + heraAction = masterContext.getHeraJobActionService().findById(actionId); + HeraJob heraJob = masterContext.getHeraJobService().findMemById(heraAction.getJobId()); + heraJobHistory = HeraJobHistory.builder() + .illustrate(LogConstant.FAIL_JOB_RETRY) + .triggerType(TriggerTypeEnum.SCHEDULE.getId()) + .jobId(heraAction.getJobId()) + .actionId(heraAction.getId()) + .operator(heraAction.getOwner()) + .hostGroupId(heraAction.getHostGroupId()) + .batchId(heraAction.getBatchId()) + .bizLabel(heraJob.getBizLabel()) + .build(); + masterContext.getHeraJobHistoryService().insert(heraJobHistory); + heraAction.setHistoryId(heraJobHistory.getId()); + heraAction.setStatus(StatusEnum.RUNNING.toString()); + masterContext.getHeraJobActionService().update(heraAction); + heraJobHistoryVo = BeanConvertUtils.convert(heraJobHistory); + heraJobHistoryVo.getLog().append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 第" + (runCount - 1) + "次重试运行\n"); + triggerType = heraJobHistoryVo.getTriggerType(); + } + HeraAction cacheAction = master.getHeraActionMap().get(actionId); + if (cacheAction != null) { + cacheAction.setStatus(StatusEnum.RUNNING.toString()); + cacheAction.setHistoryId(heraJobHistory.getId()); + } + heraJobHistoryVo.setStatusEnum(StatusEnum.RUNNING); + masterContext.getHeraJobHistoryService().updateHeraJobHistoryLogAndStatus(BeanConvertUtils.convert(heraJobHistoryVo)); + RpcResponse.Response response = null; + Future future = null; + try { + future = new MasterExecuteJob().executeJob(masterContext, selectWork, + triggerType, actionId); + response = future.get(HeraGlobalEnv.getTaskTimeout(), TimeUnit.HOURS); + } catch (Exception e) { + ErrorLog.error("schedule job run error :" + actionId, e); + if (future != null) { + future.cancel(true); + } + heraAction.setStatus(StatusEnum.FAILED.toString()); + heraJobHistoryVo.setStatusEnum(StatusEnum.FAILED); + masterContext.getHeraJobHistoryService().updateHeraJobHistoryStatus(BeanConvertUtils.convert(heraJobHistoryVo)); + } + boolean success = response != null && response.getStatusEnum() == ResponseStatus.Status.OK; + ScheduleLog.info("job_id 执行结果" + actionId + "---->" + (response == null ? "空指针" : response.getStatusEnum().toString())); + ApplicationEvent event; + if (!success) { + heraAction.setStatus(StatusEnum.FAILED.toString()); + HeraJobHistory history = masterContext.getHeraJobHistoryService().findById(heraJobHistoryVo.getId()); + HeraJobHistoryVo jobHistory = BeanConvertUtils.convert(history); + event = new HeraJobFailedEvent(actionId, triggerType, jobHistory); + ((HeraJobFailedEvent) event).setRollBackTime(retryWaitTime); + ((HeraJobFailedEvent) event).setRunCount(runCount); + ((HeraJobFailedEvent) event).setRetryCount(retryCount); + if (Constants.CANCEL_JOB_MESSAGE.equals(jobHistory.getIllustrate()) || StatusEnum.WAIT.toString().equals(history.getStatus())) { + isCancelJob = true; + ScheduleLog.info("任务取消或者暂停,取消重试:{}", jobHistory.getActionId()); + } + } else { + //如果是依赖任务 置空依赖 + if (JobScheduleTypeEnum.Dependent.getType().equals(heraAction.getScheduleType())) { + heraAction.setReadyDependency("{}"); + } + heraAction.setStatus(StatusEnum.SUCCESS.toString()); + event = new HeraJobSuccessEvent(actionId, triggerType, heraJobHistoryVo); + } + updateCacheAction(actionId, heraAction.getStatus()); + heraAction.setStatisticEndTime(new Date()); + masterContext.getHeraJobActionService().update(heraAction); + masterContext.getDispatcher().forwardEvent(event); + if (runCount < (retryCount + 1) && !success && !isCancelJob) { + DebugLog.info("--------------------------失败任务,准备重试--------------------------"); + runScheduleJobContext(selectWork, actionId, runCount, retryCount, retryWaitTime, triggerType); + } + } + + private void updateCacheAction(Long actionId, String status) { + HeraAction cacheAction = master.getHeraActionMap().get(actionId); + if (cacheAction != null) { + cacheAction.setStatus(status); + } + } + + /** + * 任务超出最大并行度 放入任务队列,不要放到线程池队列 + * + * @return + */ + public boolean isTaskLimit() { + //可能会被apollo等配置中心修改,检测limit的时候进行判断 + setCoreSize(HeraGlobalEnv.getMaxParallelNum()); + return executeJobPool.getActiveCount() >= HeraGlobalEnv.getMaxParallelNum(); + } + + public void setCoreSize(int size) { + if (size > 0 && size != cacheCoreSize) { + cacheCoreSize = size; + executeJobPool.setMaximumPoolSize(size); + executeJobPool.setCorePoolSize(size); + } + } + + public void printThreadPoolLog() { + String sb = "当前线程池信息" + "[ActiveCount: " + executeJobPool.getActiveCount() + "," + + "CompletedTaskCount:" + executeJobPool.getCompletedTaskCount() + "," + + "PoolSize:" + executeJobPool.getPoolSize() + "," + + "LargestPoolSize:" + executeJobPool.getLargestPoolSize() + "," + + "TaskCount:" + executeJobPool.getTaskCount() + "]"; + ScheduleLog.info(sb); + } + + @Override + public void run(MasterWorkHolder workHolder, JobElement element) { + switch (element.getTriggerType()) { + case SCHEDULE: + case SUPER_RECOVER: + case MANUAL_RECOVER: + executeJobPool.execute(() -> runScheduleJob(workHolder, element.getJobId(), element.getTriggerType()), element); + break; + case MANUAL: + case AUTO_RERUN: + executeJobPool.execute(() -> runManualJob(workHolder, element.getJobId(), element.getTriggerType()), element); + break; + case DEBUG: + executeJobPool.execute(() -> runDebugJob(workHolder, element.getJobId()), element); + break; + default: + ErrorLog.error("未知的执行类型:" + element.getTriggerType().toString()); + break; + } + } + + public Integer getRunningTaskNum() { + return executeJobPool.getActiveCount(); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/MasterServer.java b/hera-core/src/main/java/com/dfire/core/netty/master/MasterServer.java new file mode 100755 index 00000000..c18b7d43 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/MasterServer.java @@ -0,0 +1,89 @@ +package com.dfire.core.netty.master; + +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import com.dfire.protocol.RpcSocketMessage; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.protobuf.ProtobufDecoder; +import io.netty.handler.codec.protobuf.ProtobufEncoder; +import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder; +import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender; +import io.netty.handler.timeout.IdleStateHandler; + +import java.util.concurrent.TimeUnit; + +/** + * @author: 凌霄 + * @time: Created in 10:34 2018/1/10 + * @desc + */ +public class MasterServer { + + private ServerBootstrap serverBootstrap; + private EventLoopGroup bossGroup; + private EventLoopGroup workGroup; + + private MasterHandler handler; + + /** + * ProtobufVarint32LengthFieldPrepender:对protobuf协议的的消息头上加上一个长度为32的整形字段,用于标志这个消息的长度。 + * ProtobufVarint32FrameDecoder:针对protobuf协议的ProtobufVarint32LengthFieldPrepender()所加的长度属性的解码器 + * + * @param handler + */ + public MasterServer(final MasterHandler handler) { + serverBootstrap = new ServerBootstrap(); + //服务端接受客户端的连接, Reactor线程组 + bossGroup = new NioEventLoopGroup(1); + //SocketChannel的网络读写 + workGroup = new NioEventLoopGroup(1); + this.handler = handler; + serverBootstrap.group(bossGroup, workGroup) + .channel(NioServerSocketChannel.class) + .childOption(ChannelOption.SO_KEEPALIVE, true) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ch.pipeline().addLast("frameDecoder", new ProtobufVarint32FrameDecoder()) + .addLast("decoder", new ProtobufDecoder(RpcSocketMessage.SocketMessage.getDefaultInstance())) + .addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender()) + .addLast("encoder", new ProtobufEncoder()) + .addLast(new IdleStateHandler(0, 0, 10, TimeUnit.SECONDS)) + .addLast("handler", handler); + } + }); + } + + public synchronized boolean start(int port) { + ChannelFuture channelFuture = null; + try { + channelFuture = serverBootstrap.bind(port).sync(); + } catch (InterruptedException e) { + ErrorLog.error("InterruptedException", e); + } + if (channelFuture != null && channelFuture.isSuccess()) { + HeraLog.info("start master server success"); + } else { + ErrorLog.error("start master server failed"); + } + + return true; + } + + public synchronized boolean shutdown() { + bossGroup.shutdownGracefully(); + workGroup.shutdownGracefully(); + handler.shutdown(); + HeraLog.info("stop master server gracefully"); + return true; + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/MasterWorkHolder.java b/hera-core/src/main/java/com/dfire/core/netty/master/MasterWorkHolder.java new file mode 100755 index 00000000..793878ee --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/MasterWorkHolder.java @@ -0,0 +1,52 @@ +package com.dfire.core.netty.master; + +import com.dfire.core.message.HeartBeatInfo; +import com.dfire.core.netty.HeraChannel; +import com.dfire.protocol.RpcWorkInfo.WorkInfo; +import lombok.Data; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author: 凌霄 + * @time: Created in 16:13 2018/1/12 + * @desc + */ + +@Data +public class MasterWorkHolder { + + private HeraChannel channel; + + /** + * 存放的actionId + */ + private Set running = new HashSet<>(); + /** + * 存放的actionId + */ + private Set manningRunning = new HashSet<>(); + + /** + * 存放的actionId + */ + private Set rerunRunning = new HashSet<>(); + /** + * 存放的actionId + */ + private Set superRunning = new HashSet<>(); + /** + * 存放的debugId + */ + private Set debugRunning = new HashSet<>(); + + private HeartBeatInfo heartBeatInfo; + + private volatile WorkInfo workInfo; + + public MasterWorkHolder(HeraChannel channel) { + this.channel = channel; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/RunJob.java b/hera-core/src/main/java/com/dfire/core/netty/master/RunJob.java new file mode 100755 index 00000000..f3364d11 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/RunJob.java @@ -0,0 +1,17 @@ +package com.dfire.core.netty.master; + +import com.dfire.common.vo.JobElement; + +/** + * @author scx + */ +public interface RunJob { + + /** + * 任务执行 + * @param workHolder 选择的机器 + * @param element 任务 + */ + void run( MasterWorkHolder workHolder, JobElement element); + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/RunJobThreadPool.java b/hera-core/src/main/java/com/dfire/core/netty/master/RunJobThreadPool.java new file mode 100755 index 00000000..dbadf54a --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/RunJobThreadPool.java @@ -0,0 +1,203 @@ +package com.dfire.core.netty.master; + +import com.dfire.common.config.ExecuteFilter; +import com.dfire.common.config.FilterType; +import com.dfire.common.config.ServiceLoader; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.JobStatus; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.service.HeraDebugHistoryService; +import com.dfire.common.service.HeraJobHistoryService; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.emr.EmrJob; +import com.dfire.core.emr.FixedEmr; +import com.dfire.core.emr.WrapEmr; +import com.dfire.logs.ErrorLog; + +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.Collectors; + +/** + * desc: + * + * @author scx + * @create 2019/04/24 + */ +public class RunJobThreadPool extends ThreadPoolExecutor { + + + private static ConcurrentHashMap jobEmrType; + private final EmrJob emr; + private final HeraJobHistoryService jobHistoryService; + + private final HeraDebugHistoryService debugHistoryService; + + private final boolean emrCluster; + + public RunJobThreadPool(MasterContext masterContext, int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); + emr = new WrapEmr(); + jobHistoryService = masterContext.getHeraJobHistoryService(); + debugHistoryService = masterContext.getHeraDebugHistoryService(); + jobEmrType = new ConcurrentHashMap<>(maximumPoolSize); + emrCluster = HeraGlobalEnv.isEmrJob() && FixedEmr.NAME.equals(HeraGlobalEnv.getEmrCluster()); + } + + public static List getWaitClusterJob(TriggerTypeEnum... typeEnum) { + if (jobEmrType == null) { + return new ArrayList<>(0); + } + Set typeSet = new HashSet<>(Arrays.asList(typeEnum)); + return new ArrayList<>(jobEmrType.values()) + .stream() + .filter(element -> element.getStatus().equals(JobStatus.waitCluster) && typeSet.contains(element.getTriggerType())) + .map(JobElement::getJobId) + .collect(Collectors.toList()); + } + + public static boolean cancelJob(Long id, TriggerTypeEnum... typeEnum) { + if (jobEmrType == null) { + return false; + } + Set typeSet = new HashSet<>(Arrays.asList(typeEnum)); + Optional jobElement = jobEmrType.values().stream() + .filter(element -> element.getStatus().equals(JobStatus.waitCluster) && typeSet.contains(element.getTriggerType())) + .filter(element -> element.getJobId().equals(id)).findFirst(); + if (jobElement.isPresent()) { + jobElement.get().setCancel(true); + return true; + } + return false; + } + + @Override + protected void beforeExecute(Thread t, Runnable r) { + JobElement jobElement = jobEmrType.get(r); + try { + if (jobElement.isCancel()) { + appendCreateLog(jobElement, "任务手动取消"); + //使用异常来取消该任务的执行 + throw new IllegalStateException("任务被手动取消:" + jobElement.getJobId()); + } + if (!emrCluster) { + appendCreateLog(jobElement, "本地执行任务"); + } else { + if (isEmrDynamicJob(jobElement)) { + appendCreateLog(jobElement, "动态集群创建中.."); + emr.addJob(jobElement.getOwner()); + } else { + appendCreateLog(jobElement, "使用固定集群执行任务"); + } + } + jobElement.setStatus(JobStatus.running); + } catch (Exception e) { + ErrorLog.error("任务前置执行异常" + e.getMessage(), e); + } + + if (jobElement.isCancel()) { + appendCreateLog(jobElement, "任务手动取消"); + //手动触发一次后置执行 + afterExecute(r, null); + //抛出异常打断任务的执行 + throw new IllegalStateException("任务被手动取消:" + jobElement.getJobId()); + } + doFilter(FilterType.execute, jobElement); + } + + private void doFilter(FilterType filterType, JobElement element) { + List filters = ServiceLoader.getFilters(); + try { + switch (filterType) { + case execute: + for (ExecuteFilter filter : filters) { + try { + filter.onExecute(element); + } catch (Exception e) { + ErrorLog.error("拦截器前置执行异常", e); + } + } + break; + case response: + for (ExecuteFilter filter : filters) { + try { + filter.onResponse(element); + } catch (Exception e) { + ErrorLog.error("拦截器后置执行异常", e); + } + } + break; + default: + break; + } + } catch (Exception e) { + ErrorLog.error("拦截器异常:" + e.getMessage(), e); + } + } + + @Override + protected void afterExecute(Runnable r, Throwable t) { + JobElement jobElement = jobEmrType.get(r); + try { + if (isEmrDynamicJob(jobElement)) { + emr.removeJob(jobElement.getOwner()); + } + } catch (Exception e) { + ErrorLog.error("任务后置执行异常" + e.getMessage(), e); + } finally { + jobEmrType.remove(r); + jobElement.setStatus(JobStatus.complete); + doFilter(FilterType.response, jobElement); + } + } + + private void appendCreateLog(JobElement element, String log) { + switch (element.getTriggerType()) { + case SCHEDULE: + case MANUAL_RECOVER: + case MANUAL: + case AUTO_RERUN: + case SUPER_RECOVER: + HeraJobHistoryVo historyVo = BeanConvertUtils.convert(jobHistoryService.findById(element.getHistoryId())); + historyVo.getLog().appendHera(log); + jobHistoryService.updateHeraJobHistoryLog(BeanConvertUtils.convert(historyVo)); + break; + case DEBUG: + HeraDebugHistoryVo heraDebugHistoryVo = debugHistoryService.findById(element.getHistoryId()); + heraDebugHistoryVo.getLog().appendHera(log); + debugHistoryService.updateLog(BeanConvertUtils.convert(heraDebugHistoryVo)); + break; + default: + ErrorLog.error("未知的执行类型:" + element.getTriggerType().toString()); + break; + } + } + + private boolean isEmrDynamicJob(JobElement element) { + return emrCluster && element != null && !element.isFixedEmr(); + } + + @Override + public List shutdownNow() { + List alive = super.shutdownNow(); + for (Runnable runnable : alive) { + jobEmrType.remove(runnable); + } + return alive; + } + + /** + * 任务执行的入口 + * + * @param command 执行的内容 + * @param jobElement JobElement + */ + public void execute(Runnable command, JobElement jobElement) { + jobElement.setStatus(JobStatus.waitCluster); + jobEmrType.putIfAbsent(command, jobElement); + super.execute(command); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/comparator/FiFoComp.java b/hera-core/src/main/java/com/dfire/core/netty/master/comparator/FiFoComp.java new file mode 100755 index 00000000..cc212927 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/comparator/FiFoComp.java @@ -0,0 +1,25 @@ +package com.dfire.core.netty.master.comparator; + +import com.dfire.common.vo.JobElement; + +import java.util.Comparator; + +/** + * desc: + * + * @author scx + * @create 2020/04/02 + */ +public class FiFoComp implements Comparator { + + @Override + public int compare(JobElement o1, JobElement o2) { + //优先根据任务优先级排列 + if (o1.getPriorityLevel() > o2.getPriorityLevel()) { + return -1; + } else if (o1.getPriorityLevel().equals(o2.getPriorityLevel())) { + return 0; + } + return 1; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/comparator/TimeFirstComp.java b/hera-core/src/main/java/com/dfire/core/netty/master/comparator/TimeFirstComp.java new file mode 100755 index 00000000..40307bbb --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/comparator/TimeFirstComp.java @@ -0,0 +1,32 @@ +package com.dfire.core.netty.master.comparator; + +import com.dfire.common.vo.JobElement; + +import java.util.Comparator; + +/** + * desc: + * + * @author scx + * @create 2020/04/02 + */ +public class TimeFirstComp implements Comparator { + + @Override + public int compare(JobElement o1, JobElement o2) { + //优先根据任务优先级排列 + if (o1.getPriorityLevel() > o2.getPriorityLevel()) { + return -1; + } else if (o1.getPriorityLevel().equals(o2.getPriorityLevel())) { + //如果任务优先级相等,根据版本的时间排序,一般来说版本时间越小越优先执行 + long firstId = o1.getJobId() / 1000000; + long secondId = o2.getJobId() / 1000000; + if (firstId < secondId) { + return -1; + } else if (firstId == secondId) { + return 0; + } + } + return 1; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/constant/MasterConstant.java b/hera-core/src/main/java/com/dfire/core/netty/master/constant/MasterConstant.java new file mode 100755 index 00000000..98d19ba0 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/constant/MasterConstant.java @@ -0,0 +1,16 @@ +package com.dfire.core.netty.master.constant; + + +/** + * master 相关静态配置参数 + * @author 火锅 + * @time 2018/11/28 + */ +public class MasterConstant { + + /** 默认8点为早上(其他时区要动态处理) */ + public static final int MORNING_TIME = 8; + + /** 向前15分钟检查,尽量选择确定漏跑的任务,15分钟作为一个界限 */ + public static final long PRE_CHECK_MIN = 15000000; +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterCancelJob.java b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterCancelJob.java new file mode 100755 index 00000000..13195f52 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterCancelJob.java @@ -0,0 +1,133 @@ +package com.dfire.core.netty.master.response; + +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.core.netty.master.RunJobThreadPool; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.*; + +import java.util.Date; +import java.util.Iterator; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + * 取消任务统一管理类 + * + * @author xiaosuda + * @date 2018/11/9 + */ +public class MasterCancelJob { + + private static final String NOT_FOUNT_MSG = "任务已结束"; + + public static RpcWebResponse.WebResponse cancel(JobExecuteKind.ExecuteKind ek, MasterContext context, RpcWebRequest.WebRequest request) { + RpcWebResponse.WebResponse webResponse = null; + Long historyId = Long.parseLong(request.getId()); + Long actionId = historyId; + Iterator iterator; + TriggerTypeEnum typeEnum; + HeraJobHistory scheduleHistory = null, manualHistory = null; + if (ek == JobExecuteKind.ExecuteKind.ScheduleKind) { + scheduleHistory = context.getHeraJobHistoryService().findById(historyId); + actionId = scheduleHistory.getActionId(); + iterator = context.getManualQueue().iterator(); + typeEnum = TriggerTypeEnum.MANUAL_RECOVER; + } else if (ek == JobExecuteKind.ExecuteKind.ManualKind) { + manualHistory = context.getHeraJobHistoryService().findById(historyId); + actionId = manualHistory.getActionId(); + iterator = context.getScheduleQueue().iterator(); + typeEnum = TriggerTypeEnum.MANUAL; + + } else { + iterator = context.getDebugQueue().iterator(); + typeEnum = TriggerTypeEnum.DEBUG; + } + + if (RunJobThreadPool.cancelJob(actionId, typeEnum)) { + webResponse = RpcWebResponse.WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(request.getOperate()) + .setStatus(ResponseStatus.Status.OK) + .build(); + SocketLog.info("任务在等待创建集群中,已取消{}", actionId); + } + //首先在队列中查找该job是否存在 + if (remove(iterator, actionId)) { + webResponse = RpcWebResponse.WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(request.getOperate()) + .setStatus(ResponseStatus.Status.OK) + .build(); + SocketLog.info("任务仍在手动队列中,从队列删除该任务{}", actionId); + } else { + for (MasterWorkHolder workHolder : context.getWorkMap().values()) { + boolean exists = false; + if (ek == JobExecuteKind.ExecuteKind.ScheduleKind && workHolder.getRunning().contains(actionId)) { + exists = true; + } else if (ek == JobExecuteKind.ExecuteKind.ManualKind && workHolder.getManningRunning().contains(actionId)) { + exists = true; + } else if (ek == JobExecuteKind.ExecuteKind.DebugKind && workHolder.getDebugRunning().contains(actionId)) { + exists = true; + } + if (exists) { + Future future = new MasterHandleCancelJob().cancel(context, + workHolder.getChannel(), ek, historyId); + try { + future.get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + } catch (Exception e) { + ErrorLog.error("请求超时 ", e); + } finally { + webResponse = RpcWebResponse.WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(request.getOperate()) + .setStatus(ResponseStatus.Status.OK) + .build(); + SocketLog.info("send web cancel response, actionId = " + historyId); + } + } + } + } + if (webResponse == null) { + + if (manualHistory != null) { + manualHistory.setStatus(StatusEnum.FAILED.toString()); + manualHistory.setEndTime(new Date()); + manualHistory.setIllustrate(NOT_FOUNT_MSG); + context.getHeraJobHistoryService().update(manualHistory); + } else if (scheduleHistory != null) { + scheduleHistory.setStatus(StatusEnum.FAILED.toString()); + scheduleHistory.setEndTime(new Date()); + scheduleHistory.setIllustrate(NOT_FOUNT_MSG); + context.getHeraJobHistoryService().update(scheduleHistory); + } + + webResponse = RpcWebResponse.WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(request.getOperate()) + .setStatus(ResponseStatus.Status.ERROR) + .setErrorText(NOT_FOUNT_MSG) + .build(); + } + return webResponse; + } + + + private static boolean remove(Iterator iterator, Long id) { + JobElement jobElement; + while (iterator.hasNext()) { + jobElement = iterator.next(); + if (jobElement.getJobId().equals(id)) { + iterator.remove(); + return true; + } + } + return false; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterExecuteJob.java b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterExecuteJob.java new file mode 100755 index 00000000..c7b72a87 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterExecuteJob.java @@ -0,0 +1,214 @@ +package com.dfire.core.netty.master.response; + +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.listener.MasterResponseListener; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.core.netty.util.AtomicIncrease; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.TaskLog; +import com.dfire.protocol.JobExecuteKind.ExecuteKind; +import com.dfire.protocol.RpcDebugMessage.DebugMessage; +import com.dfire.protocol.RpcExecuteMessage.ExecuteMessage; +import com.dfire.protocol.RpcOperate.Operate; +import com.dfire.protocol.RpcRequest.Request; +import com.dfire.protocol.RpcResponse.Response; +import com.dfire.protocol.RpcSocketMessage.SocketMessage; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + * @author xiaosuda + * @date 2018/11/10 + */ +public class MasterExecuteJob { + + public Future executeJob(final MasterContext context, final MasterWorkHolder holder, TriggerTypeEnum triggerTypeEnum, final Long id) { + switch (triggerTypeEnum) { + case MANUAL_RECOVER: + case SCHEDULE: + return executeScheduleJob(context, holder, id, triggerTypeEnum); + case SUPER_RECOVER: + return executeSuperRecoveryJob(context, holder, id, triggerTypeEnum); + case MANUAL: + return executeManualJob(context, holder, id, triggerTypeEnum); + case DEBUG: + return executeDebugJob(context, holder, id, triggerTypeEnum); + case AUTO_RERUN: + return executeRerunJob(context, holder, id, triggerTypeEnum); + default: + return null; + } + } + + + /** + * 请求work 执行手动任务 + * + * @param context MasterContext + * @param workHolder MasterWorkHolder + * @param triggerTypeEnum + * @return Future + */ + private Future executeManualJob(MasterContext context, MasterWorkHolder workHolder, Long actionId, TriggerTypeEnum triggerTypeEnum) { + workHolder.getManningRunning().add(actionId); + return buildFuture(context, Request.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(Operate.Manual) + .setBody(ExecuteMessage + .newBuilder() + .setActionId(String.valueOf(actionId)) + .build().toByteString()) + .build(), workHolder, actionId, triggerTypeEnum); + } + + /** + * 请求work 执行自动重跑任务 + * + * @param context MasterContext + * @param workHolder MasterWorkHolder + * @return Future + */ + private Future executeSuperRecoveryJob(MasterContext context, MasterWorkHolder workHolder, Long actionId, TriggerTypeEnum triggerTypeEnum) { + workHolder.getSuperRunning().add(actionId); + return buildFuture(context, Request.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(Operate.SuperRecovery) + .setBody(ExecuteMessage + .newBuilder() + .setActionId(String.valueOf(actionId)) + .build().toByteString()) + .build(), workHolder, actionId, triggerTypeEnum); + } + + + /** + * 请求work 执行自动重跑任务 + * + * @param context MasterContext + * @param workHolder MasterWorkHolder + * @param triggerTypeEnum + * @return Future + */ + private Future executeRerunJob(MasterContext context, MasterWorkHolder workHolder, Long actionId, TriggerTypeEnum triggerTypeEnum) { + workHolder.getRerunRunning().add(actionId); + return buildFuture(context, Request.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(Operate.Rerun) + .setBody(ExecuteMessage + .newBuilder() + .setActionId(String.valueOf(actionId)) + .build().toByteString()) + .build(), workHolder, actionId, triggerTypeEnum); + } + + /** + * 请求work 执行调度任务/恢复任务 + * + * @param context MasterContext + * @param workHolder MasterWorkHolder + * @param actionId String + * @param triggerTypeEnum + * @return Future + */ + private Future executeScheduleJob(MasterContext context, MasterWorkHolder workHolder, Long actionId, TriggerTypeEnum triggerTypeEnum) { + workHolder.getRunning().add(actionId); + return buildFuture(context, Request.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(Operate.Schedule) + .setBody(ExecuteMessage + .newBuilder() + .setActionId(String.valueOf(actionId)) + .build().toByteString()) + .build(), workHolder, actionId, triggerTypeEnum); + + } + + + /** + * 请求work 执行开发中心任务 + * + * @param context MasterContext + * @param workHolder MasterWorkHolder + * @param id String + * @param triggerTypeEnum + * @return Future + */ + private Future executeDebugJob(MasterContext context, MasterWorkHolder workHolder, Long id, TriggerTypeEnum triggerTypeEnum) { + workHolder.getDebugRunning().add(id); + return buildFuture(context, Request.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(Operate.Debug) + .setBody(DebugMessage + .newBuilder() + .setDebugId(String.valueOf(id)) + .build().toByteString()) + .build(), workHolder, id, triggerTypeEnum); + + } + + /** + * 向work发送执行任务的命令 并等待work返回结果 + * + * @param context MasterContext + * @param request Request + * @param holder MasterWorkHolder + * @param actionId String + * @param typeEnum TriggerTypeEnum + * @return Future + */ + + private Future buildFuture(MasterContext context, Request request, MasterWorkHolder holder, Long actionId, TriggerTypeEnum typeEnum) { + final CountDownLatch latch = new CountDownLatch(1); + MasterResponseListener responseListener = new MasterResponseListener(request, false, latch, null); + context.getHandler().addListener(responseListener); + Future future = context.getThreadPool().submit(() -> { + try { + latch.await(HeraGlobalEnv.getTaskTimeout(), TimeUnit.HOURS); + if (!responseListener.getReceiveResult()) { + ErrorLog.error("任务({})信号丢失,{}小时未收到work返回:{}", typeEnum.toName(), HeraGlobalEnv.getTaskTimeout(), actionId); + } + } finally { + context.getHandler().removeListener(responseListener); + switch (typeEnum) { + case MANUAL: + holder.getManningRunning().remove(actionId); + break; + case SCHEDULE: + case MANUAL_RECOVER: + holder.getRunning().remove(actionId); + break; + case DEBUG: + holder.getDebugRunning().remove(actionId); + break; + case AUTO_RERUN: + holder.getRerunRunning().remove(actionId); + break; + case SUPER_RECOVER: + holder.getSuperRunning().remove(actionId); + break; + default: + ErrorLog.warn("未识别的任务执行类型{}", typeEnum); + } + } + return responseListener.getResponse(); + }); + try { + holder.getChannel().writeAndFlush(SocketMessage + .newBuilder() + .setKind(SocketMessage.Kind.REQUEST) + .setBody(request.toByteString()) + .build()); + TaskLog.info("5.MasterExecuteJob:master send debug command to worker,rid = " + request.getRid() + ",actionId = " + actionId + ",address " + holder.getChannel().getRemoteAddress()); + } catch (RemotingException e) { + context.getHandler().removeListener(responseListener); + ErrorLog.error("5.MasterExecuteJob:master send debug command to worker exception,rid = " + request.getRid() + ",actionId = " + actionId + ",address " + holder.getChannel().getRemoteAddress(), e); + } + return future; + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandleCancelJob.java b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandleCancelJob.java new file mode 100755 index 00000000..06640be1 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandleCancelJob.java @@ -0,0 +1,57 @@ +package com.dfire.core.netty.master.response; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.HeraChannel; +import com.dfire.core.netty.listener.MasterResponseListener; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.util.AtomicIncrease; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.*; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + * @author: 凌霄 + * @time: Created in 下午3:42 2018/5/11 + * @desc master接收到worker端取消任务执行请求时,处理逻辑 + */ +public class MasterHandleCancelJob { + + public Future cancel(final MasterContext context, HeraChannel channel, JobExecuteKind.ExecuteKind kind, Long jobId) { + RpcCancelMessage.CancelMessage cancelMessage = RpcCancelMessage.CancelMessage.newBuilder() + .setEk(kind) + .setId(String.valueOf(jobId)) + .build(); + final RpcRequest.Request request = RpcRequest.Request.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(RpcOperate.Operate.Cancel) + .setBody(cancelMessage.toByteString()) + .build(); + RpcSocketMessage.SocketMessage socketMessage = RpcSocketMessage.SocketMessage.newBuilder() + .setKind(RpcSocketMessage.SocketMessage.Kind.REQUEST) + .setBody(request.toByteString()) + .build(); + final CountDownLatch latch = new CountDownLatch(1); + MasterResponseListener responseListener = new MasterResponseListener(request, false, latch, null); + context.getHandler().addListener(responseListener); + Future future = context.getThreadPool().submit(() -> { + latch.await(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (!responseListener.getReceiveResult()) { + ErrorLog.warn("取消任务信号消失,三小时未收到work返回:{}", jobId); + } + context.getHandler().removeListener(responseListener); + return responseListener.getResponse(); + }); + try { + SocketLog.info("send cancel job success {}", request.getRid()); + channel.writeAndFlush(socketMessage); + } catch (RemotingException e) { + ErrorLog.error("send cancel job exception {}", e); + } + return future; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandleRequest.java b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandleRequest.java new file mode 100755 index 00000000..9f6a0514 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandleRequest.java @@ -0,0 +1,55 @@ +package com.dfire.core.netty.master.response; + +import com.alibaba.fastjson.JSONObject; +import com.dfire.core.message.HeartBeatInfo; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeartLog; +import com.dfire.logs.HeraLog; +import com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage; +import com.dfire.protocol.RpcRequest.Request; +import com.dfire.protocol.RpcWorkInfo.WorkInfo; +import com.google.protobuf.InvalidProtocolBufferException; +import io.netty.channel.Channel; + + +/** + * @author xiaosuda + * @date 2018/4/13 + */ +public class MasterHandleRequest { + + public static void handleHeartBeat(MasterContext masterContext, Channel channel, Request request) { + MasterWorkHolder workHolder = masterContext.getWorkMap().get(channel); + HeartBeatInfo heartBeatInfo = new HeartBeatInfo(); + HeartBeatMessage heartBeatMessage; + try { + heartBeatMessage = HeartBeatMessage.newBuilder().mergeFrom(request.getBody()).build(); + heartBeatInfo.setHost(heartBeatMessage.getHost()); + heartBeatInfo.setMemRate(heartBeatMessage.getMemRate()); + heartBeatInfo.setMemTotal(heartBeatMessage.getMemTotal()); + heartBeatInfo.setCpuLoadPerCore(heartBeatMessage.getCpuLoadPerCore()); + heartBeatInfo.setRunning(heartBeatMessage.getRunningList()); + heartBeatInfo.setDebugRunning(heartBeatMessage.getDebugRunningList()); + heartBeatInfo.setManualRunning(heartBeatMessage.getManualRunningList()); + heartBeatInfo.setTimestamp(heartBeatMessage.getTimestamp()); + heartBeatInfo.setCores(heartBeatMessage.getCores()); + workHolder.setHeartBeatInfo(heartBeatInfo); + HeartLog.debug("received heart beat from {} : {}", heartBeatMessage.getHost(), JSONObject.toJSONString(heartBeatInfo)); + } catch (InvalidProtocolBufferException e) { + ErrorLog.error("解析消息异常", e); + } + } + + public static void setWorkInfo(MasterContext masterContext, Channel channel, Request request) { + MasterWorkHolder workHolder = masterContext.getWorkMap().get(channel); + try { + WorkInfo workInfo = WorkInfo.parseFrom(request.getBody()); + workHolder.setWorkInfo(workInfo); + HeraLog.info("set workInfo success,{}", channel.remoteAddress()); + } catch (InvalidProtocolBufferException e) { + ErrorLog.error("解析消息异常", e); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandlerWebResponse.java b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandlerWebResponse.java new file mode 100755 index 00000000..3d551abc --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/response/MasterHandlerWebResponse.java @@ -0,0 +1,341 @@ +package com.dfire.core.netty.master.response; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.vo.JobElement; +import com.dfire.core.exception.RemotingException; +import com.dfire.core.message.HeartBeatInfo; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.core.netty.master.RunJobThreadPool; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.core.tool.CpuLoadPerCoreJob; +import com.dfire.core.tool.MemUseRateJob; +import com.dfire.event.Events; +import com.dfire.event.HeraJobMaintenanceEvent; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import com.dfire.logs.SocketLog; +import com.dfire.logs.TaskLog; +import com.dfire.protocol.JobExecuteKind.ExecuteKind; +import com.dfire.protocol.*; +import com.dfire.protocol.ResponseStatus.Status; +import com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage; +import com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage; +import com.dfire.protocol.RpcWebOperate.WebOperate; +import com.dfire.protocol.RpcWebRequest.WebRequest; +import com.dfire.protocol.RpcWebResponse.WebResponse; +import com.google.protobuf.InvalidProtocolBufferException; + +import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * master处理work发起的web请求 + * + * @author xiaosuda + * @date 2018/11/9 + */ +public class MasterHandlerWebResponse { + + + private static volatile boolean workReady = false; + + /** + * 处理work发起的调度中心任务执行 操作 + * + * @param context MasterContext + * @param request WebRequest + * @return WebResponse + */ + public static WebResponse handleWebExecute(MasterContext context, WebRequest request) { + if (request.getEk() == ExecuteKind.ManualKind || request.getEk() == ExecuteKind.ScheduleKind) { + Long historyId = Long.parseLong(request.getId()); + HeraJobHistory heraJobHistory = context.getHeraJobHistoryService().findById(historyId); + HeraJobHistoryVo history = BeanConvertUtils.convert(heraJobHistory); + context.getMaster().run(history, context.getHeraJobService().findById(history.getJobId())); + WebResponse webResponse = WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(WebOperate.ExecuteJob) + .setStatus(Status.OK) + .build(); + TaskLog.info("MasterHandlerWebResponse: send web execute response, actionId = {} ", history.getJobId()); + return webResponse; + } else if (request.getEk() == ExecuteKind.DebugKind) { + Long debugId = Long.parseLong(request.getId()); + HeraDebugHistoryVo debugHistory = context.getHeraDebugHistoryService().findById(debugId); + TaskLog.info("2-1.MasterHandlerWebResponse: receive web debug response, debugId = " + debugId); + context.getMaster().debug(debugHistory); + + WebResponse webResponse = WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(WebOperate.ExecuteJob) + .setStatus(Status.OK) + .build(); + TaskLog.info("2-2.MasterHandlerWebResponse : send web debug response, debugId = {}", debugId); + return webResponse; + } + return WebResponse.newBuilder() + .setRid(request.getRid()) + .setErrorText("未识别的操作类型" + request.getEk()) + .setStatus(Status.ERROR) + .build(); + } + + /** + * 处理work发起的开发中心任务执行 操作 + * + * @param context MasterContext + * @param request WebRequest + * @return WebResponse + */ + public static WebResponse handleWebDebug(MasterContext context, WebRequest request) { + Long debugId = Long.parseLong(request.getId()); + Queue queue = context.getDebugQueue(); + WebResponse response; + for (JobElement jobElement : queue) { + if (jobElement.getJobId().equals(debugId)) { + response = WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(WebOperate.ExecuteDebug) + .setStatus(Status.ERROR) + .setErrorText("任务已经在队列中") + .build(); + return response; + } + } + HeraDebugHistoryVo debugHistory = context.getHeraDebugHistoryService().findById(debugId); + context.getMaster().debug(debugHistory); + return WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(WebOperate.ExecuteDebug) + .setStatus(Status.OK) + .build(); + } + + /** + * 处理work发起的任务更新 操作 + * + * @param context MasterContext + * @param request WebRequest + * @return WebResponse + */ + public static WebResponse handleWebUpdate(MasterContext context, WebRequest request) { + Long id = Long.parseLong(request.getId()); + context.getMaster().generateSingleAction(Integer.parseInt(request.getId())); + context.getDispatcher().forwardEvent(new HeraJobMaintenanceEvent(Events.UpdateJob, id)); + return WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(WebOperate.UpdateJob) + .setStatus(Status.OK) + .build(); + + } + + /** + * 处理work发起的生成版本 操作 + * + * @param context MasterContext + * @param request WebRequest + * @return WebResponse + */ + public static WebResponse generateActionByJobId(MasterContext context, WebRequest request) { + boolean result = String.valueOf(Constants.ALL_JOB_ID).equals(request.getId()) ? context.getMaster().generateBatchAction(true) : context.getMaster().generateSingleAction(Integer.parseInt(request.getId())); + return WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(WebOperate.ExecuteJob) + .setStatus(result ? Status.OK : Status.ERROR) + .build(); + + } + + /** + * 处理work发起的任务取消操作 + * + * @param context MasterContext + * @param request WebRequest + * @return WebResponse + */ + public static WebResponse handleWebCancel(MasterContext context, WebRequest request) { + switch (request.getEk()) { + case ManualKind: + case DebugKind: + case ScheduleKind: + case AutoRerunKind: + return MasterCancelJob.cancel(request.getEk(), context, request); + default: + return WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(request.getOperate()) + .setStatus(ResponseStatus.Status.ERROR) + .setErrorText("无法识别的任务取消类型:" + request.getEk()) + .build(); + } + } + + /** + * 处理work发起的任务执行 操作 + * + * @param context MasterContext + * @param request WebRequest + * @return WebResponse + */ + public static WebResponse buildJobQueueInfo(MasterContext context, WebRequest request) { + //输出线程池信息 + context.getMaster().printThreadPoolLog(); + Map allInfo = new HashMap<>(context.getWorkMap().size()); + context.getWorkMap().values().forEach(workHolder -> { + HeartBeatInfo beatInfo = workHolder.getHeartBeatInfo(); + if (beatInfo != null) { + allInfo.put(Constants.WORK_PREFIX + beatInfo.getHost(), HeartBeatMessage.newBuilder() + .addAllDebugRunning(beatInfo.getDebugRunning()) + .addAllRunning(beatInfo.getRunning()) + .addAllManualRunning(beatInfo.getManualRunning()) + .addAllRerunRunning(beatInfo.getRerunRunning()) + .setMemRate(beatInfo.getMemRate()) + .setMemTotal(beatInfo.getMemTotal()) + .setCpuLoadPerCore(beatInfo.getCpuLoadPerCore()) + .setTimestamp(beatInfo.getTimestamp()) + .setHost(beatInfo.getHost()) + .setCores(beatInfo.getCores()) + .build()); + + } + }); + + + //debug任务队列 + List waitDebugQueue = RunJobThreadPool.getWaitClusterJob(TriggerTypeEnum.DEBUG); + List masterDebugQueue = new ArrayList<>(waitDebugQueue.size() + context.getDebugQueue().size()); + context.getDebugQueue().forEach(jobElement -> masterDebugQueue.add(jobElement.getJobId())); + masterDebugQueue.addAll(waitDebugQueue); + //自动任务队列 + + waitDebugQueue = RunJobThreadPool.getWaitClusterJob(TriggerTypeEnum.SCHEDULE, TriggerTypeEnum.MANUAL_RECOVER); + List masterScheduleQueue = new ArrayList<>(waitDebugQueue.size() + context.getScheduleQueue().size()); + masterScheduleQueue.addAll(waitDebugQueue); + context.getScheduleQueue().forEach(jobElement -> masterScheduleQueue.add(jobElement.getJobId())); + + //手动任务队列 + waitDebugQueue = RunJobThreadPool.getWaitClusterJob(TriggerTypeEnum.MANUAL); + List masterManualQueue = new ArrayList<>(waitDebugQueue.size() + context.getManualQueue().size()); + masterManualQueue.addAll(waitDebugQueue); + context.getManualQueue().forEach(jobElement -> masterManualQueue.add(jobElement.getJobId())); + + //重跑任务队列 + waitDebugQueue = RunJobThreadPool.getWaitClusterJob(TriggerTypeEnum.AUTO_RERUN); + List masterRerunQueue = new ArrayList<>(waitDebugQueue.size() + context.getRerunQueue().size()); + masterRerunQueue.addAll(waitDebugQueue); + context.getRerunQueue().forEach(jobElement -> masterRerunQueue.add(jobElement.getJobId())); + //超级恢复队列 + waitDebugQueue = RunJobThreadPool.getWaitClusterJob(TriggerTypeEnum.SUPER_RECOVER); + List masterSuperRecoveryQueue = new ArrayList<>(waitDebugQueue.size() + context.getSuperRecovery().size()); + masterSuperRecoveryQueue.addAll(waitDebugQueue); + context.getSuperRecovery().forEach(jobElement -> masterSuperRecoveryQueue.add(jobElement.getJobId())); + + MemUseRateJob memUseRateJob = new MemUseRateJob(1); + memUseRateJob.readMemUsed(); + CpuLoadPerCoreJob loadPerCoreJob = new CpuLoadPerCoreJob(); + loadPerCoreJob.run(); + + allInfo.put(Constants.MASTER_PREFIX + WorkContext.host, HeartBeatMessage.newBuilder() + .addAllDebugRunning(masterDebugQueue.stream().map(String::valueOf).collect(Collectors.toList())) + .addAllRunning(masterScheduleQueue.stream().map(String::valueOf).collect(Collectors.toList())) + .addAllManualRunning(masterManualQueue.stream().map(String::valueOf).collect(Collectors.toList())) + .addAllRerunRunning(masterRerunQueue.stream().map(String::valueOf).collect(Collectors.toList())) + .addAllSuperRunning(masterSuperRecoveryQueue.stream().map(String::valueOf).collect(Collectors.toList())) + .setMemRate(memUseRateJob.getRate()) + .setMemTotal(memUseRateJob.getMemTotal()) + .setCpuLoadPerCore(loadPerCoreJob.getLoadPerCore()) + .setTimestamp(System.currentTimeMillis()) + .setHost(WorkContext.host) + .setCores(WorkContext.cpuCoreNum) + .build()); + + return WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(request.getOperate()) + .setStatus(Status.OK) + .setBody(AllHeartBeatInfoMessage.newBuilder().putAllValues(allInfo).build().toByteString()) + .build(); + } + + public static synchronized WebResponse buildAllWorkInfo(MasterContext context, WebRequest request) { + if (!workReady) { + HeraLog.info("workInfo未准备,准备请求work组装workInfo"); + //发送workInfo build 请求 + context.getThreadPool().submit(() -> context.getWorkMap().values().parallelStream().forEach(workHolder -> { + try { + workHolder.getChannel().writeAndFlush(RpcSocketMessage.SocketMessage.newBuilder() + .setKind(RpcSocketMessage.SocketMessage.Kind.REQUEST) + .setBody(RpcRequest.Request.newBuilder().setOperate(RpcOperate.Operate.GetWorkInfo).build().toByteString()) + .build()); + } catch (RemotingException e) { + ErrorLog.error("发送消息异常", e); + } + })); + CountDownLatch latch = new CountDownLatch(1); + context.getThreadPool().submit(() -> { + int maxTime = 300, cnt = 0; + boolean canExit; + try { + while (cnt++ < maxTime) { + canExit = true; + for (MasterWorkHolder workHolder : context.getWorkMap().values()) { + if (workHolder.getWorkInfo() == null) { + canExit = false; + break; + } + } + if (canExit) { + HeraLog.info("所有workInfo已准备完毕"); + workReady = true; + break; + } + TimeUnit.MILLISECONDS.sleep(10); + } + } catch (InterruptedException e) { + ErrorLog.error("InterruptedException ", e); + } finally { + latch.countDown(); + } + }); + try { + latch.await(); + } catch (InterruptedException e) { + ErrorLog.error("InterruptedException", e); + } + + context.getMasterSchedule().schedule(() -> { + HeraLog.info("开始清理workInfo"); + workReady = false; + context.getWorkMap().values().forEach(workHolder -> workHolder.setWorkInfo(null)); + }, 30, TimeUnit.SECONDS); + } + HeraLog.info("开始组装workInfo"); + + Map workInfoMap = new HashMap<>(context.getWorkMap().size()); + context.getWorkMap().values().forEach(workHolder -> { + String host = workHolder.getHeartBeatInfo().getHost(); + if (workHolder.getWorkInfo() != null) { + if (host.equals(WorkContext.host)) { + workInfoMap.put(Constants.MASTER_PREFIX + host, workHolder.getWorkInfo()); + } else { + workInfoMap.put(Constants.WORK_PREFIX + host, workHolder.getWorkInfo()); + } + } + }); + return WebResponse.newBuilder() + .setRid(request.getRid()) + .setOperate(request.getOperate()) + .setStatus(Status.OK) + .setBody(RpcWorkInfo.AllWorkInfo.newBuilder().putAllValues(workInfoMap).build().toByteString()) + .build(); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobActionInit.java b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobActionInit.java new file mode 100755 index 00000000..ec758221 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobActionInit.java @@ -0,0 +1,53 @@ +package com.dfire.core.netty.master.schedule; + +import com.dfire.core.netty.ScheduledChore; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.constant.MasterConstant; +import com.dfire.logs.ErrorLog; + +import org.joda.time.DateTime; + +import java.util.concurrent.TimeUnit; + +/** + * desc: 任务版本的生成初始化 + * + * @author scx + * @create 2020/01/07 + */ +public class JobActionInit extends ScheduledChore { + + private Master master; + + private JobActionInit(Master master, long initialDelay, long period, TimeUnit unit) { + super("JobActionInit", initialDelay, period, unit); + this.master = master; + Thread thread = new Thread(() -> { + try { + TimeUnit.MINUTES.sleep(1); + } catch (InterruptedException e) { + ErrorLog.error(Thread.currentThread().getName() + "is interrupted", e); + } + master.generateBatchAction(false); + master.clearInvalidAction(); + }); + thread.setName("first-start-action-init"); + thread.setDaemon(true); + thread.start(); + } + + public JobActionInit(Master master) { + this(master, 60 - new DateTime().getMinuteOfHour(), 60, TimeUnit.MINUTES); + } + + + @Override + protected void chore() { + this.master.generateBatchAction(false); + if (DateTime.now().getHourOfDay() == MasterConstant.MORNING_TIME) { + this.master.clearInvalidAction(); + + } + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobFinishCheck.java b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobFinishCheck.java new file mode 100755 index 00000000..cb8309eb --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobFinishCheck.java @@ -0,0 +1,184 @@ +package com.dfire.core.netty.master.schedule; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraJobMonitor; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.util.ActionUtil; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.ScheduledChore; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.logs.MonitorLog; +import com.dfire.monitor.domain.AlarmInfo; +import com.google.common.collect.Sets; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; +import org.joda.time.DateTime; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * 任务定时是否完成检测 + * @author scx + */ +public class JobFinishCheck extends ScheduledChore { + + private MasterContext masterContext; + private Master master; + private Set checkSet; + private int lastCheckTime = 0; + + private JobFinishCheck(Master master, long initialDelay, long period, TimeUnit unit) { + super("JobFinishCheck", initialDelay, period, unit); + this.master = master; + this.masterContext = master.getMasterContext(); + checkSet = Sets.newHashSet(); + } + + public JobFinishCheck(Master master) { + //保证每隔5分钟一次 + this(master, 5 - new DateTime().getMinuteOfHour() % 5, 5, TimeUnit.MINUTES); + //this(master, 1, 1, TimeUnit.MINUTES); + } + + + private void check() { + Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + + //如果是整点 初始化 + if (hour == 0 && minute == 0) { + lastCheckTime = 0; + //昨天的就清理掉吧 + checkSet.clear(); + } + + + //先检测之前未成功的 + List finish = new ArrayList<>(); + checkSet.forEach(check -> { + HeraAction heraAction = master.getMasterContext().getHeraJobActionService().findTodaySuccessByJobId(check.getJobId()); + if (heraAction != null) { + finish.add(check); + } else { + //还需要判断任务是否关闭、结束时间修改等操作 + HeraJob heraJob = master.getMasterContext().getHeraJobService().findById(check.getJobId()); + if (heraJob.getAuto() == 0) { + finish.add(check); + MonitorLog.info("任务[id:{}]关闭,取消检测", check.getJobId()); + } else if (heraJob.getEstimatedEndHour() > check.getEndTime()) { + finish.add(check); + MonitorLog.info("任务[id:{}]结束定时修改为{},取消检测此次检测:{}", check.getJobId(), heraJob.getEstimatedEndHour(), check.getEndTime()); + } else { + MonitorLog.info("任务[id:{},time:{}]未按时完成", check.getJobId(), ActionUtil.intTOHour(check.getEndTime())); + notice(check); + } + } + }); + //删除已经执行完成的 + if (!finish.isEmpty()) { + checkSet.removeAll(finish); + } + + int nowTime = ActionUtil.hourToInt(hour + Constants.COLON + minute); + List heraJobs = masterContext.getHeraJobService() + .findEstimatedEndHours(lastCheckTime, nowTime); + heraJobs.forEach(job -> { + HeraAction heraAction = master.getMasterContext().getHeraJobActionService().findTodaySuccessByJobId(job.getId()); + if (heraAction != null) { + MonitorLog.info("任务[id:{},time:{}]按时完成", job.getId(), ActionUtil.intTOHour(job.getEstimatedEndHour())); + } else { + MonitorLog.info("任务[id:{},time:{}]未按时完成", job.getId(), ActionUtil.intTOHour(job.getEstimatedEndHour())); + JobChecker jobChecker = new JobChecker(job.getEstimatedEndHour(), job.getId(), job.getName()); + notice(jobChecker); + checkSet.add(jobChecker); + } + }); + lastCheckTime = nowTime; + } + + private void notice(JobChecker job) { + Set monitorUser = Sets.newConcurrentHashSet(); + Optional.ofNullable(masterContext.getHeraJobMonitorService().findByJobId(job.getJobId())) + .map(HeraJobMonitor::getUserIds) + .ifPresent(ids -> Arrays.stream(ids + .split(Constants.COMMA)) + .filter(StringUtils::isNotBlank) + .forEach(id -> { + Optional.ofNullable(masterContext.getHeraSsoService().findSsoById(Integer.parseInt(id))) + .ifPresent(monitorUser::add); + })); + String split = "|"; + //获得监控该任务的人员的工号 + StringBuilder noticeIds = new StringBuilder(); + Optional.of(monitorUser) + .ifPresent(users -> + users.forEach(user -> + noticeIds.append(split).append(user.getJobNumber()))); + //加上关注任务的所有人 + noticeIds.append(split) + .append(HeraGlobalEnv.getMonitorUsers()); + masterContext.getAlarmCenter().sendToWeChat(AlarmInfo.builder() + .message("【任务未完成告警】" + + "hera任务" + job.getName() + " [" + job.getJobId() + "]\n" + + "预计完成时间:" + ActionUtil.intTOHour(job.getEndTime()) + "\n" + + "检测时间:" + new DateTime().toString("HH:mm") + "\n" + + "环境:" + HeraGlobalEnv.getEnv() + "\n" + + "区域:" + HeraGlobalEnv.getArea() + "\n") + .userId(noticeIds.toString()) + .build()); + + + String phoneMsg = "赫拉任务" + job.getJobId() + "未按时完成请尽快排查"; + + Optional.of(monitorUser) + .ifPresent(users -> + users.forEach(user -> { + masterContext.getAlarmCenter().sendToPhone(AlarmInfo.builder() + .message(phoneMsg) + .phone(user.getPhone()) + .build()); + })); + + } + + @Override + protected void chore() { + check(); + } + + class JobChecker { + @Getter + private int endTime; + + @Getter + private String name; + + @Getter + private Integer jobId; + + + JobChecker(int endTime, Integer jobId, String name) { + this.endTime = endTime; + this.jobId = jobId; + this.name = name; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof JobChecker)) { + return false; + } + return ((JobChecker) obj).getJobId().equals(this.getJobId()); + } + + @Override + public int hashCode() { + return jobId.hashCode(); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobQueueScan.java b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobQueueScan.java new file mode 100755 index 00000000..423bc8ac --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/JobQueueScan.java @@ -0,0 +1,74 @@ +package com.dfire.core.netty.master.schedule; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.ScheduledChore; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.logs.ScanLog; +import com.dfire.logs.ScheduleLog; + +import java.util.concurrent.TimeUnit; + +/** + * desc:任务队列扫描 + * + * @author scx + * @create 2020/01/09 + */ +public class JobQueueScan extends ScheduledChore { + + /** + * scan频率递增的步长 + */ + private final Integer DELAY_TIME = 100; + /** + * 最大scan频率 + */ + private final Integer MAX_DELAY_TIME = 10 * 1000; + private Integer nextTime = HeraGlobalEnv.getScanRate(); + private Master master; + private MasterContext masterContext; + + + private JobQueueScan(Master master, long initialDelay, long period, TimeUnit unit) { + super("JobQueueScan", initialDelay, period, unit); + this.master = master; + this.masterContext = master.getMasterContext(); + } + + public JobQueueScan(Master master) { + this(master, 60, HeraGlobalEnv.getScanRate(), TimeUnit.MILLISECONDS); + } + + @Override + protected void chore() { + try { + if (master.getMasterContext().isStop()) { + ScheduleLog.info("master is on stop status,stop run JobQueueScan"); + return; + } + // 每次add任务都需要检测isTaskLimit 是否已经满了 ,并且要优先遍历schedule队列 + boolean scheduleTake = !master.isTaskLimit() && master.scanQueue(masterContext.getScheduleQueue()); + boolean superTask = !master.isTaskLimit() && master.scanQueue(masterContext.getSuperRecovery()); + boolean manualTake = !master.isTaskLimit() && master.scanQueue(masterContext.getManualQueue()); + boolean debugTake = !master.isTaskLimit() && master.scanQueue(masterContext.getDebugQueue()); + boolean rerunTake = false; + //rerunQueue优先级最低,只有当手动执行、超级恢复、手动恢复、开发中心无任务执行时才判断 + if (!scheduleTake && !superTask && !manualTake && !debugTake && !master.isTaskLimit()) { + if (master.getRunningTaskNum() < HeraGlobalEnv.getMaxRerunParallelNum()) { + rerunTake = master.scanQueue(masterContext.getRerunQueue()); + } + } + if (scheduleTake || manualTake || debugTake || rerunTake) { + nextTime = HeraGlobalEnv.getScanRate(); + } else { + nextTime = (nextTime + DELAY_TIME) > MAX_DELAY_TIME ? MAX_DELAY_TIME : nextTime + DELAY_TIME; + } + this.setInitialDelay(nextTime); + } catch (Exception e) { + ScanLog.error("scan waiting queueTask exception", e); + } finally { + choreService.scheduledChoreOnce(this); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/schedule/LostJobCheck.java b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/LostJobCheck.java new file mode 100755 index 00000000..f572a8bd --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/LostJobCheck.java @@ -0,0 +1,161 @@ +package com.dfire.core.netty.master.schedule; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.util.ActionUtil; +import com.dfire.core.event.Dispatcher; +import com.dfire.core.netty.ScheduledChore; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.constant.MasterConstant; +import com.dfire.event.Events; +import com.dfire.event.HeraJobLostEvent; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeartLog; +import com.dfire.logs.ScheduleLog; +import org.apache.commons.lang.StringUtils; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * desc:任务信号丢失定时检测backup + * + * @author scx + * @create 2020/01/06 + */ +public class LostJobCheck extends ScheduledChore { + + private Master master; + + private LostJobCheck(Master master, long initialDelay, long period, TimeUnit unit) { + super("LostJobCheck", initialDelay, period, unit); + this.master = master; + } + + public LostJobCheck(Master master, Integer minuteOfHour) { + this(master, minuteOfHour <= 30 ? 40 - minuteOfHour : 70 - minuteOfHour, 30, TimeUnit.MINUTES); + } + + @Override + protected void chore() { + //信号丢失检测 + ScheduleLog.info("refresh host group success, start roll back"); + master.getMasterContext().refreshHostGroupCache(); + String currDate = ActionUtil.getCurrActionVersion(); + Dispatcher dispatcher = master.getMasterContext().getDispatcher(); + if (dispatcher != null) { + Map actionMapNew = new HashMap<>(master.getHeraActionMap()); + if (actionMapNew.size() > 0) { + List actionIdList = new ArrayList<>(); + Long tmp = Long.parseLong(currDate) - MasterConstant.PRE_CHECK_MIN; + for (Long actionId : actionMapNew.keySet()) { + if (actionId < tmp) { + rollBackLostJob(actionId, actionMapNew, actionIdList); + checkLostSingle(actionId, actionMapNew); + } + } + ScheduleLog.info("roll back action count:" + actionIdList.size()); + } + ScheduleLog.info("clear job scheduler ok"); + } + } + + + /** + * 漏跑检测 + * + * @param actionId 版本id + * @param actionMapNew actionMap集合 + * @param actionIdList 重跑的actionId + */ + + private void rollBackLostJob(Long actionId, Map actionMapNew, List actionIdList) { + HeraAction lostJob = actionMapNew.get(actionId); + boolean isCheck = lostJob != null + && lostJob.getAuto() == 1 + && lostJob.getStatus() == null; + if (isCheck && master.checkJobRun(master.getMasterContext().getHeraJobService().findById(lostJob.getJobId()))) { + String dependencies = lostJob.getDependencies(); + if (StringUtils.isNotBlank(dependencies)) { + List jobDependList = Arrays.asList(dependencies.split(Constants.COMMA)); + boolean isAllComplete = false; + HeraAction heraAction; + if (jobDependList.size() > 0) { + for (String jobDepend : jobDependList) { + heraAction = actionMapNew.get(Long.parseLong(jobDepend)); + if (heraAction == null || !(isAllComplete = StatusEnum.SUCCESS.toString().equals(heraAction.getStatus()))) { + break; + } + } + } + if (isAllComplete) { + addRollBackJob(actionIdList, actionId); + } + } else { //独立任务情况 + addRollBackJob(actionIdList, actionId); + } + } + } + + /** + * 信号丢失处理 + * + * @param actionId hera_action 表信息id /版本id + * @param actionMapNew hera_action 内存信息 /内存保存的今天版本信息 + */ + private void checkLostSingle(Long actionId, Map actionMapNew) { + try { + HeraAction checkJob = actionMapNew.get(actionId); + if (checkJob == null) { + return; + } + if (StatusEnum.RUNNING.toString().equals(checkJob.getStatus())) { + HeraJobHistory actionHistory = master.getMasterContext().getHeraJobHistoryService().findById(checkJob.getHistoryId()); + if (actionHistory == null) { + return; + } + if (actionHistory.getStatus() != null && !actionHistory.getStatus().equals(StatusEnum.RUNNING.toString())) { + master.getMasterContext().getMasterSchedule().schedule(() -> { + HeraAction newAction = master.getMasterContext().getHeraJobActionService().findById(actionId); + if (StatusEnum.RUNNING.toString().equals(newAction.getStatus())) { + HeartLog.warn("任务信号丢失actionId:{},historyId:{}", actionId, newAction.getHistoryId()); + boolean scheduleType = actionHistory.getTriggerType().equals(TriggerTypeEnum.SCHEDULE.getId()) + || actionHistory.getTriggerType().equals(TriggerTypeEnum.MANUAL_RECOVER.getId()); + //TODO 可以选择重跑 or 广播 + 设置状态 这里偷懒 直接重跑 + master.getMasterContext().getWorkMap().values().forEach(workHolder -> { + if (scheduleType) { + workHolder.getRunning().remove(actionId); + } else { + workHolder.getManningRunning().remove(actionId); + } + }); + master.startNewJob(actionHistory, "任务信号丢失重试"); + } + }, 1, TimeUnit.MINUTES); + + } + } + } catch (Exception e) { + ErrorLog.error("信号丢失检测异常", e); + } + + } + + private void addRollBackJob(List actionIdList, Long actionId) { + if (!actionIdList.contains(actionId) && + !master.checkJobExists(HeraJobHistoryVo + .builder() + .actionId(actionId) + .triggerType(TriggerTypeEnum.SCHEDULE) + .jobId((ActionUtil.getJobId(actionId))) + .build(), true)) { + master.getMasterContext().getDispatcher().forwardEvent(new HeraJobLostEvent(Events.UpdateJob, actionId)); + actionIdList.add(actionId); + ScheduleLog.info("roll back lost actionId :" + actionId); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/schedule/RerunJobInit.java b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/RerunJobInit.java new file mode 100755 index 00000000..286914e8 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/RerunJobInit.java @@ -0,0 +1,82 @@ +package com.dfire.core.netty.master.schedule; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.vo.HeraRerunVo; +import com.dfire.common.util.ActionUtil; +import com.dfire.core.netty.ScheduledChore; +import com.dfire.core.netty.master.Master; +import com.dfire.logs.MonitorLog; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * desc:重跑任务的初始化,比如生成版本,总共要执行的次数等 + * + * @author scx + * @create 2020/01/06 + */ +public class RerunJobInit extends ScheduledChore { + + private Master master; + + private RerunJobInit(Master master, long initialDelay, long period, TimeUnit unit) { + super("RerunJobInit",initialDelay, period, unit); + this.master = master; + } + + public RerunJobInit(Master master) { + this(master, 60, 300, TimeUnit.SECONDS); + } + + @Override + protected void chore() { + List rerunVos = master.getMasterContext().getHeraRerunService().findByEnd(0); + for (HeraRerunVo rerunVo : rerunVos) { + if (Boolean.TRUE.toString().equals(rerunVo.getExtra().get(Constants.ACTION_DONE))) { + continue; + } + HeraJob heraJob = master.getMasterContext().getHeraJobService().findMemById(rerunVo.getJobId()); + Long nowAction = Long.parseLong(ActionUtil.getCurrActionVersion()); + Calendar startTime = Calendar.getInstance(); + Calendar endTime = Calendar.getInstance(); + startTime.setTimeInMillis(ActionUtil.getMillisFromStrDate(rerunVo.getStartTime())); + endTime.setTimeInMillis(ActionUtil.getMillisFromStrDate(rerunVo.getEndTime())); + List heraJobs = new ArrayList<>(); + heraJobs.add(heraJob); + if (heraJob.getScheduleType() == 1) { + heraJobs.addAll(master.getParentJob(heraJob.getDependencies(), new HashSet<>())); + } + String cronDate; + int allAction = 0; + Long startAction = ActionUtil.getActionByDateStr(rerunVo.getStartTime()); + Long endAction = ActionUtil.getActionByDateStr(rerunVo.getEndTime()); + long formatNum = 10000000000L; + master.getMasterContext().getHeraJobActionService().deleteAction(startAction / formatNum * formatNum, endAction / formatNum * formatNum, rerunVo.getJobId()); + while (startTime.compareTo(endTime) <= 0) { + Map actionMap = new HashMap<>(8); + Map> idMap = new HashMap<>(8); + Map jobMap = new HashMap<>(8); + cronDate = ActionUtil.getActionVersionPrefix(startTime.getTime()); + master.generateScheduleJobAction(heraJobs, cronDate, actionMap, nowAction, idMap, jobMap); + jobMap.values().forEach(job -> master.generateDependJobAction(jobMap, job, actionMap, nowAction, idMap)); + startTime.add(Calendar.DAY_OF_YEAR, 1); + for (Long aLong : actionMap.keySet()) { + if (Objects.equals(ActionUtil.getJobId(String.valueOf(aLong)), rerunVo.getJobId()) && aLong >= startAction && aLong <= endAction) { + allAction++; + } + } + } + rerunVo.getExtra().put(Constants.ACTION_DONE, Boolean.TRUE.toString()); + rerunVo.getExtra().put(Constants.ACTION_PROCESS_NUM, "0"); + rerunVo.getExtra().put(Constants.ACTION_ALL_NUM, String.valueOf(allAction)); + if (allAction == 0) { + rerunVo.setIsEnd(1); + } + master.getMasterContext().getHeraRerunService().updateById(rerunVo); + MonitorLog.info("添加重跑任务{}成功,start:{},end:{}", rerunVo.getJobId(), rerunVo.getStartTime(), rerunVo.getEndTime()); + } + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/schedule/RerunJobLaunch.java b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/RerunJobLaunch.java new file mode 100755 index 00000000..480d39e6 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/RerunJobLaunch.java @@ -0,0 +1,123 @@ +package com.dfire.core.netty.master.schedule; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.vo.HeraRerunVo; +import com.dfire.common.enums.TriggerTypeEnum; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.util.StringUtil; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.ScheduledChore; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.ScheduleLog; + +import java.util.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * desc:重跑任务的触发 + * + * @author scx + * @create 2020/01/06 + */ +public class RerunJobLaunch extends ScheduledChore { + + private Master master; + + private RerunJobLaunch(Master master, long initialDelay, long period, TimeUnit unit) { + super("RerunJobLaunch", initialDelay, period, unit); + this.master = master; + } + + public RerunJobLaunch(Master master) { + this(master, 60, 60, TimeUnit.SECONDS); + } + + @Override + protected void chore() { + if (master.getMasterContext().isStop()) { + ScheduleLog.info("master is on stop status,stop run rerunJobLaunch"); + return; + } + Integer hourOfDay = ActionUtil.getHourOfDay(); + //重跑时间范围检测 + if (!(hourOfDay >= HeraGlobalEnv.getRerunStartTime() && hourOfDay < HeraGlobalEnv.getRerunEndTime())) { + return; + } + List rerunVos = master.getMasterContext().getHeraRerunService().findByEnd(0); + for (HeraRerunVo rerunVo : rerunVos) { + if (!Boolean.TRUE.toString().equals(rerunVo.getExtra().get(Constants.ACTION_DONE))) { + continue; + } + BlockingQueue rerunQueue = new LinkedBlockingQueue<>(master.getMasterContext().getRerunQueue()); + int isRunning = 0; + for (JobElement element : rerunQueue) { + if (Objects.equals(ActionUtil.getJobId(element.getJobId()), rerunVo.getJobId())) { + isRunning++; + } + } + for (MasterWorkHolder workHolder : new ArrayList<>(master.getMasterContext().getWorkMap().values())) { + for (Long aLong : workHolder.getRerunRunning()) { + if (Objects.equals(ActionUtil.getJobId(aLong.toString()), rerunVo.getJobId())) { + isRunning++; + } + } + } + int rerunThread = Integer.parseInt(rerunVo.getExtra().getOrDefault(Constants.RERUN_THREAD, "1")); + if (rerunThread > isRunning) { + rerunThread -= isRunning; + Long startAction = rerunVo.getActionNow() == null || rerunVo.getActionNow() == 0L ? ActionUtil.getActionByDateStr(rerunVo.getStartTime()) - 1 : rerunVo.getActionNow(); + Long endAction = ActionUtil.getActionByDateStr(rerunVo.getEndTime()); + List heraActions; + if (Boolean.parseBoolean(rerunVo.getExtra().getOrDefault(Constants.RERUN_FAILED, "false"))) { + String lastRerunId = rerunVo.getExtra().get(Constants.LAST_RERUN_ID); + if (lastRerunId == null) { + ErrorLog.error("last rerun id is null ,cancel rerun"); + rerunVo.setIsEnd(1); + master.getMasterContext().getHeraRerunService().updateById(rerunVo); + continue; + } + heraActions = master.getMasterContext() + .getHeraJobHistoryService() + .findRerunFailedIdsByLimit(startAction, rerunVo.getJobId(), lastRerunId, rerunThread) + .stream() + .map(history -> HeraAction.builder().id(history.getActionId()).owner(history.getOperator()).hostGroupId(history.getHostGroupId()).build()) + .collect(Collectors.toList()); + } else { + heraActions = master.getMasterContext().getHeraJobActionService() + .findByStartAndEnd(startAction, endAction, rerunVo.getJobId(), rerunThread); + } + if (heraActions.size() > 0) { + heraActions.stream().sorted(Comparator.comparingLong(HeraAction::getId)).forEach(action -> { + HeraJobHistory history = HeraJobHistory.builder() + .actionId(action.getId()) + .illustrate("自动重跑") + .jobId(rerunVo.getJobId()) + .triggerType(TriggerTypeEnum.AUTO_RERUN.getId()) + .operator(action.getOwner()) + .hostGroupId(action.getHostGroupId()) + .properties(StringUtil.convertMapToString(Collections.singletonMap(Constants.RERUN_ID, String.valueOf(rerunVo.getId())))). + build(); + master.getMasterContext().getHeraJobHistoryService().insert(history); + master.run(BeanConvertUtils.convert(history), master.getMasterContext().getHeraJobService().findMemById(rerunVo.getJobId())); + master.getMasterContext().getHeraRerunService().updateById(HeraRerunVo.builder() + .id(rerunVo.getId()) + .actionNow(history.getActionId()) + .build()); + }); + } + } + } + + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/master/schedule/WorkHeartCheck.java b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/WorkHeartCheck.java new file mode 100755 index 00000000..290dcba1 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/master/schedule/WorkHeartCheck.java @@ -0,0 +1,52 @@ +package com.dfire.core.netty.master.schedule; + +import com.dfire.core.netty.ScheduledChore; +import com.dfire.core.netty.master.Master; +import com.dfire.core.netty.master.MasterWorkHolder; +import io.netty.channel.Channel; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * desc: work心跳超时check + * + * @author scx + * @create 2020/01/06 + */ +public class WorkHeartCheck extends ScheduledChore { + + + private Master master; + + private WorkHeartCheck(Master master, long initialDelay, long period, TimeUnit unit) { + super("WorkHeartCheck", initialDelay, period, unit); + this.master = master; + } + + public WorkHeartCheck(Master master) { + this(master, 1, 1, TimeUnit.MINUTES); + } + + @Override + protected void chore() { + Date now = new Date(); + Map workMap = master.getMasterContext().getWorkMap(); + List removeChannel = new ArrayList<>(workMap.size()); + for (Channel channel : workMap.keySet()) { + MasterWorkHolder workHolder = workMap.get(channel); + if (workHolder.getHeartBeatInfo() == null) { + continue; + } + Long workTime = workHolder.getHeartBeatInfo().getTimestamp(); + if (workTime == null || now.getTime() - workTime > 1000 * 60L) { + workHolder.getChannel().close(); + removeChannel.add(channel); + } + } + removeChannel.forEach(workMap::remove); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/util/AtomicIncrease.java b/hera-core/src/main/java/com/dfire/core/netty/util/AtomicIncrease.java new file mode 100755 index 00000000..b82c28b7 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/util/AtomicIncrease.java @@ -0,0 +1,20 @@ +package com.dfire.core.netty.util; + +import java.util.concurrent.atomic.AtomicInteger; + + +/** + * @author: 凌霄 + * @time: Created in 下午8:00 2018/4/16 + * @desc 生成全局唯一id, 标志所有的netty层request与之对应的response, + * 当request.id == response.id,标志一次请求结束,可解除对request的response的监听ResponseListener,标志一次请求结束 + */ +public class AtomicIncrease { + + private static AtomicInteger rid = new AtomicInteger(); + + public static int getAndIncrement() { + + return rid.getAndIncrement(); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/HistoryPair.java b/hera-core/src/main/java/com/dfire/core/netty/worker/HistoryPair.java new file mode 100755 index 00000000..10265715 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/HistoryPair.java @@ -0,0 +1,33 @@ +package com.dfire.core.netty.worker; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * desc: + * + * @author scx + * @create 2019/12/02 + */ +@Data +@AllArgsConstructor +public class HistoryPair { + + private Long actionId; + + private Long historyId; + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof HistoryPair)) { + return false; + } + HistoryPair pair = (HistoryPair) obj; + return actionId.equals(pair.getActionId()) && historyId.equals(pair.getHistoryId()); + } + + @Override + public int hashCode() { + return actionId.hashCode() * 1996 + historyId.hashCode() * 811; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/WorkClient.java b/hera-core/src/main/java/com/dfire/core/netty/worker/WorkClient.java new file mode 100755 index 00000000..90028d6d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/WorkClient.java @@ -0,0 +1,450 @@ +package com.dfire.core.netty.worker; + + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.common.vo.MachineInfoVo; +import com.dfire.common.vo.OSInfoVo; +import com.dfire.common.vo.ProcessMonitorVo; +import com.dfire.common.vo.WorkInfoVo; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.job.Job; +import com.dfire.core.message.HeartBeatInfo; +import com.dfire.core.netty.cluster.FailFastCluster; +import com.dfire.core.netty.worker.request.WorkerHandleWebRequest; +import com.dfire.core.netty.worker.request.WorkerHandlerHeartBeat; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeartLog; +import com.dfire.logs.HeraLog; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.JobExecuteKind.ExecuteKind; +import com.dfire.protocol.ResponseStatus; +import com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage; +import com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage; +import com.dfire.protocol.RpcSocketMessage; +import com.dfire.protocol.RpcWebResponse; +import com.dfire.protocol.RpcWorkInfo.*; +import com.google.protobuf.InvalidProtocolBufferException; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.protobuf.ProtobufDecoder; +import io.netty.handler.codec.protobuf.ProtobufEncoder; +import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder; +import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender; +import io.netty.handler.timeout.IdleStateHandler; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.net.InetSocketAddress; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; + + +/** + * @author: 凌霄 + * @time: Created in 10:34 2018/1/10 + * @desc + */ +@Data +@Component +public class WorkClient { + + public ScheduledThreadPoolExecutor workSchedule; + private Bootstrap bootstrap; + private EventLoopGroup eventLoopGroup; + @Autowired + private WorkContext workContext; + private ScheduledExecutorService service; + private AtomicBoolean clientSwitch = new AtomicBoolean(false); + + { + workSchedule = new ScheduledThreadPoolExecutor(3, new NamedThreadFactory("work-schedule", false)); + workSchedule.setKeepAliveTime(5, TimeUnit.MINUTES); + workSchedule.allowCoreThreadTimeOut(true); + } + + /** + * ProtobufVarint32FrameDecoder: 针对protobuf协议的ProtobufVarint32LengthFieldPrepender()所加的长度属性的解码器 + *
                              +     *  * BEFORE DECODE (302 bytes)       AFTER DECODE (300 bytes)
                              +     *  * +--------+---------------+      +---------------+
                              +     *  * | Length | Protobuf Data |----->| Protobuf Data |
                              +     *  * | 0xAC02 |  (300 bytes)  |      |  (300 bytes)  |
                              +     *  * +--------+---------------+      +---------------+
                              +     * 
                              + *

                              + * ProtobufVarint32LengthFieldPrepender: 对protobuf协议的的消息头上加上一个长度为32的整形字段,用于标志这个消息的长度。 + *

                              +     * * BEFORE DECODE (300 bytes)       AFTER DECODE (302 bytes)
                              +     *  * +---------------+               +--------+---------------+
                              +     *  * | Protobuf Data |-------------->| Length | Protobuf Data |
                              +     *  * |  (300 bytes)  |               | 0xAC02 |  (300 bytes)  |
                              +     *  * +---------------+               +--------+---------------+
                              +     * 
                              + */ + public void init() { + if (!clientSwitch.compareAndSet(false, true)) { + return; + } + workContext.setWorkClient(this); + workContext.init(); + eventLoopGroup = new NioEventLoopGroup(); + bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup) + .channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(new IdleStateHandler(0, 0, 5, TimeUnit.SECONDS)) + .addLast("frameDecoder", new ProtobufVarint32FrameDecoder()) + .addLast("decoder", new ProtobufDecoder(RpcSocketMessage.SocketMessage.getDefaultInstance())) + .addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender()) + .addLast("encoder", new ProtobufEncoder()) + .addLast(new WorkHandler(workContext)); + } + }); + HeraLog.info("init work client success "); + + workSchedule.schedule(new Runnable() { + + private WorkerHandlerHeartBeat workerHandlerHeartBeat = new WorkerHandlerHeartBeat(); + private int failCount = 0; + + @Override + public void run() { + try { + if (workContext.getServerChannel() != null) { + boolean send = workerHandlerHeartBeat.send(workContext); + if (!send) { + failCount++; + ErrorLog.error("send heart beat failed ,failCount :" + failCount); + } else { + failCount = 0; + HeartLog.debug("send heart beat success:{}", workContext.getServerChannel().getRemoteAddress()); + } + } else { + ErrorLog.error("server channel can not find on " + WorkContext.host); + } + } catch (Exception e) { + ErrorLog.error("heart beat error:", e); + } finally { + workSchedule.schedule(this, (failCount + 1) * HeraGlobalEnv.getHeartBeat(), TimeUnit.SECONDS); + } + } + }, HeraGlobalEnv.getHeartBeat(), TimeUnit.SECONDS); + + /** + * 定时 刷新日志到数据库 + */ + workSchedule.scheduleWithFixedDelay(new Runnable() { + /** + * 处理任务调度的异常日志 + * @param job + * @param e + */ + private void printScheduleLog(Job job, Exception e) { + try { + HeraJobHistoryVo his = job.getJobContext().getHeraJobHistory(); + String logContent = his.getLog().getContent(); + if (logContent == null) { + logContent = ""; + } + ErrorLog.error("log output error!\n" + + "[actionId:" + his.getJobId() + + ", hisId:" + his.getId() + + ", logLength:" + + logContent.length() + "]", e); + } catch (Exception ex) { + ErrorLog.error("log exception error!", ex); + } + } + + /** + * 处理 开发中心的日志 + * @param job + * @param e + */ + private void printDebugLog(Job job, Exception e) { + try { + HeraDebugHistoryVo history = job.getJobContext().getDebugHistory(); + String logContent = history.getLog().getContent(); + if (logContent == null) { + logContent = ""; + } + ErrorLog.error("log output error!\n" + + "[fileId:" + history.getFileId() + + ", hisId:" + history.getId() + + ", logLength:" + + logContent.length() + "]", e); + } catch (Exception ex) { + ErrorLog.error("log exception error!", ex); + } + } + + @Override + public void run() { + try { + for (Job job : new ArrayList<>(workContext.getRunning().values())) { + try { + HeraJobHistoryVo history = job.getJobContext().getHeraJobHistory(); + workContext.getHeraJobHistoryService().updateHeraJobHistoryLog(BeanConvertUtils.convert(history)); + } catch (Exception e) { + printScheduleLog(job, e); + } + } + + for (Job job : new ArrayList<>(workContext.getManualRunning().values())) { + try { + HeraJobHistoryVo history = job.getJobContext().getHeraJobHistory(); + workContext.getHeraJobHistoryService().updateHeraJobHistoryLog(BeanConvertUtils.convert(history)); + } catch (Exception e) { + printScheduleLog(job, e); + } + } + + for (Job job : new ArrayList<>(workContext.getDebugRunning().values())) { + try { + HeraDebugHistoryVo history = job.getJobContext().getDebugHistory(); + workContext.getHeraDebugHistoryService().updateLog(BeanConvertUtils.convert(history)); + } catch (Exception e) { + printDebugLog(job, e); + } + } + } catch (Exception e) { + ErrorLog.error("job log flush exception:{}", e.toString()); + } + + } + }, 0, 5, TimeUnit.SECONDS); + } + + /** + * 机器启动spring-boot时,worker向主节点发起netty请求连接,成功之后,worker异步获取channel,并设置在work context中 + * + * @param host + * @throws Exception + */ + public synchronized void connect(String host) throws Exception { + if (workContext.getServerChannel() != null) { + if (workContext.getServerHost().equals(host)) { + return; + } else { + workContext.getServerChannel().close(); + workContext.setServerChannel(null); + } + } + workContext.setServerHost(host); + CountDownLatch latch = new CountDownLatch(1); + ChannelFutureListener futureListener = (future) -> { + try { + if (future.isSuccess()) { + workContext.setServerChannel(FailFastCluster.wrap(future.channel())); + SocketLog.info(workContext.getServerChannel().toString()); + } + } catch (Exception e) { + ErrorLog.error("连接master异常", e); + } finally { + latch.countDown(); + } + }; + ChannelFuture connectFuture = bootstrap.connect(new InetSocketAddress(host, HeraGlobalEnv.getConnectPort())); + connectFuture.addListener(futureListener); + if (!latch.await(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS)) { + connectFuture.removeListener(futureListener); + connectFuture.cancel(true); + throw new ExecutionException(new TimeoutException("connect server consumption of 2 seconds")); + } + if (!connectFuture.isSuccess()) { + throw new RuntimeException("connect server failed " + host, + connectFuture.cause()); + } + SocketLog.info("connect server success"); + } + + /** + * 取消执行开发中心任务 + * + * @param debugId + */ + public void cancelDebugJob(Long debugId) { + Job job = workContext.getDebugRunning().remove(debugId); + job.getJobContext().getDebugHistory().getLog().appendHera(Constants.CANCEL_JOB_MESSAGE); + job.cancel(); + } + + + public void cancelJob(Job job) { + if (job == null) { + return; + } + HeraJobHistoryVo history = job.getJobContext().getHeraJobHistory(); + String illustrate = history.getIllustrate(); + if (illustrate != null && illustrate.trim().length() > 0) { + history.setIllustrate(illustrate + Constants.SEMICOLON + Constants.CANCEL_JOB_MESSAGE); + } else { + history.setIllustrate(Constants.CANCEL_JOB_MESSAGE); + } + job.cancel(); + } + + + /** + * 页面开发中心发动执行脚本时,发起请求, + * + * @param kind + * @param id + * @throws ExecutionException + * @throws InterruptedException + */ + public void executeJobFromWeb(ExecuteKind kind, Long id) throws ExecutionException, InterruptedException, TimeoutException { + RpcWebResponse.WebResponse response = WorkerHandleWebRequest.handleWebExecute(workContext, kind, id).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (response.getStatus() == ResponseStatus.Status.ERROR) { + ErrorLog.error(response.getErrorText()); + } + } + + public String cancelJobFromWeb(ExecuteKind kind, Long id) throws ExecutionException, InterruptedException, TimeoutException { + RpcWebResponse.WebResponse webResponse = WorkerHandleWebRequest.handleCancel(workContext, kind, id).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (webResponse.getStatus() == ResponseStatus.Status.ERROR) { + ErrorLog.error(webResponse.getErrorText()); + return webResponse.getErrorText(); + } + return "取消任务成功"; + } + + public void updateJobFromWeb(String jobId) throws ExecutionException, InterruptedException, TimeoutException { + RpcWebResponse.WebResponse webResponse = WorkerHandleWebRequest.handleUpdate(workContext, jobId).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (webResponse.getStatus() == ResponseStatus.Status.ERROR) { + ErrorLog.error(webResponse.getErrorText()); + } + } + + public String generateActionFromWeb(ExecuteKind kind, Long id) throws ExecutionException, InterruptedException, TimeoutException { + RpcWebResponse.WebResponse response = WorkerHandleWebRequest.handleWebAction(workContext, kind, id).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.MINUTES); + if (response.getStatus() == ResponseStatus.Status.ERROR) { + ErrorLog.error("generate action error"); + return "生成版本失败"; + } + return "生成版本成功"; + } + + public Map getJobQueueInfoFromWeb() throws ExecutionException, InterruptedException, InvalidProtocolBufferException, TimeoutException { + RpcWebResponse.WebResponse response = WorkerHandleWebRequest.getJobQueueInfoFromMaster(workContext).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (response.getStatus() == ResponseStatus.Status.ERROR) { + ErrorLog.error("获取心跳信息失败:{}", response.getErrorText()); + return null; + } + Map map = AllHeartBeatInfoMessage.parseFrom(response.getBody()).getValuesMap(); + Map infoMap = new HashMap<>(map.size()); + for (Map.Entry entry : map.entrySet()) { + HeartBeatMessage beatMessage = entry.getValue(); + infoMap.put(entry.getKey(), HeartBeatInfo.builder() + .cpuLoadPerCore(beatMessage.getCpuLoadPerCore()) + .debugRunning(beatMessage.getDebugRunningList()) + .manualRunning(beatMessage.getManualRunningList()) + .running(beatMessage.getRunningList()) + .rerunRunning(beatMessage.getRerunRunningList()) + .superRunning(beatMessage.getSuperRunningList()) + .memRate(beatMessage.getMemRate()) + .memTotal(beatMessage.getMemTotal()) + .host(beatMessage.getHost()) + .cores(beatMessage.getCores()) + .timestamp(beatMessage.getTimestamp()) + .date(ActionUtil.getDefaultFormatterDate(new Date(beatMessage.getTimestamp()))) + .build()); + } + + return infoMap; + } + + + public String increaseActionPriority(Long actionId) throws ExecutionException, InterruptedException, TimeoutException { + RpcWebResponse.WebResponse response = WorkerHandleWebRequest.increaseActionPriority(workContext, actionId).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (response.getStatus() == ResponseStatus.Status.ERROR) { + return "优先级修改异常"; + } + return "优先级修改成功"; + } + + public HashMap getAllWorkInfo() throws ExecutionException, InterruptedException, InvalidProtocolBufferException, TimeoutException { + RpcWebResponse.WebResponse response = WorkerHandleWebRequest.getAllWorkInfoFromMaster(workContext).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (response == null || response.getStatus() == ResponseStatus.Status.ERROR) { + ErrorLog.error("获取work信息失败:{}", response.getErrorText()); + return null; + } + Map allWorkInfo = AllWorkInfo.parseFrom(response.getBody()).getValuesMap(); + + HashMap workInfoHashMap = new HashMap<>(allWorkInfo.size()); + + allWorkInfo.forEach((ip, workInfo) -> { + WorkInfoVo workInfoVo = new WorkInfoVo(); + List monitorList = workInfo.getProcessMonitorList(); + if (monitorList != null && monitorList.size() > 0) { + List monitorVoList = new ArrayList<>(monitorList.size()); + monitorList.forEach(m -> { + ProcessMonitorVo monitorVo = new ProcessMonitorVo(); + monitorVo.setUser(m.getUser()); + monitorVo.setViri(m.getViri()); + monitorVo.setTime(m.getTime()); + monitorVo.setRes(m.getRes()); + monitorVo.setMem(m.getMem()); + monitorVo.setPid(m.getPid()); + monitorVo.setCommand(m.getCommand()); + monitorVo.setCpu(m.getCpu()); + monitorVoList.add(monitorVo); + }); + workInfoVo.setProcessMonitor(monitorVoList); + } + OSInfo osInfo = workInfo.getOSInfo(); + if (osInfo != null) { + OSInfoVo osInfoVo = new OSInfoVo(); + osInfoVo.setCpu(osInfo.getCpu()); + osInfoVo.setSwap(osInfo.getSwap()); + osInfoVo.setSystem(osInfo.getSystem()); + osInfoVo.setUser(osInfo.getUser()); + osInfoVo.setMem(osInfo.getMem()); + workInfoVo.setOsInfo(osInfoVo); + } + List machineInfoList = workInfo.getMachineInfoList(); + if (machineInfoList != null && machineInfoList.size() > 0) { + List machineInfoVoList = new ArrayList<>(machineInfoList.size()); + machineInfoList.forEach(m -> { + MachineInfoVo machineInfoVo = new MachineInfoVo(); + machineInfoVo.setSize(m.getSize()); + machineInfoVo.setMountedOn(m.getMountedOn()); + machineInfoVo.setType(m.getType()); + machineInfoVo.setFilesystem(m.getFilesystem()); + machineInfoVo.setAvail(m.getAvail()); + machineInfoVo.setUse(m.getUse()); + machineInfoVoList.add(machineInfoVo); + }); + workInfoVo.setMachineInfo(machineInfoVoList); + } + + workInfoHashMap.put(ip, workInfoVo); + }); + + return workInfoHashMap; + } + + public String updateWorkFromWeb() throws ExecutionException, InterruptedException, TimeoutException { + RpcWebResponse.WebResponse response = WorkerHandleWebRequest.updateWorkFromWeb(workContext).get(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (response.getStatus() == ResponseStatus.Status.ERROR) { + return "更新work失败"; + } + return "更新work成功"; + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/WorkContext.java b/hera-core/src/main/java/com/dfire/core/netty/worker/WorkContext.java new file mode 100755 index 00000000..00b12fa9 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/WorkContext.java @@ -0,0 +1,101 @@ +package com.dfire.core.netty.worker; + +import com.dfire.common.service.*; +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.job.Job; +import com.dfire.core.netty.HeraChannel; +import com.dfire.core.tool.RunShell; +import com.dfire.core.util.NetUtils; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.*; + +/** + * @author: 凌霄 + * @time: Created in 11:30 2018/1/10 + * @desc + */ +@Data +@NoArgsConstructor +@Component +public class WorkContext { + + private static final String loadStr = "cat /proc/cpuinfo |grep processor | wc -l"; + public static String host; + public static Integer cpuCoreNum; + + public static Map cacheDBMap; + + static { + host = NetUtils.getLocalAddress(); + HeraLog.info("-----------------------------当前机器的IP为:{}-----------------------------", host); + if (HeraGlobalEnv.isLinuxSystem()) { + RunShell shell = new RunShell(loadStr); + Integer exitCode = shell.run(); + if (exitCode == 0) { + try { + cpuCoreNum = Integer.parseInt(shell.getResult()); + } catch (IOException e) { + ErrorLog.error("获取cpu核数失败,使用默认配置", e); + cpuCoreNum = 4; + } + } + } else { + cpuCoreNum = 4; + } + } + + public String serverHost; + @Autowired + private HeraDebugHistoryService heraDebugHistoryService; + @Autowired + private HeraJobHistoryService heraJobHistoryService; + @Autowired + @Qualifier("heraGroupMemoryService") + private HeraGroupService heraGroupService; + @Autowired + private HeraJobActionService heraJobActionService; + @Autowired + @Qualifier("heraFileMemoryService") + private HeraFileService heraFileService; + @Autowired + private HeraProfileService heraProfileService; + @Autowired + @Qualifier("heraJobMemoryService") + private HeraJobService heraJobService; + private HeraChannel serverChannel; + private Map running = new ConcurrentHashMap<>(); + private Map manualRunning = new ConcurrentHashMap<>(); + private Map debugRunning = new ConcurrentHashMap<>(); + private Map rerunRunning = new ConcurrentHashMap<>(); + private Map superRunning = new ConcurrentHashMap<>(); + private WorkHandler handler; + private WorkClient workClient; + /** + * 处理web 异步请求 + */ + private ExecutorService workWebThreadPool = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 1L, TimeUnit.MINUTES, + new SynchronousQueue<>(), new NamedThreadFactory("worker-web"), new ThreadPoolExecutor.AbortPolicy()); + /** + * 执行任务 + */ + private ExecutorService workExecuteThreadPool = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 1L, TimeUnit.MINUTES, + new SynchronousQueue<>(), new NamedThreadFactory("worker-execute"), new ThreadPoolExecutor.AbortPolicy()); + + public void init() { + //TODO 可以在这里接入统一数据源或者全局的自定义配置。 + cacheDBMap = new HashMap<>(0); + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/WorkHandler.java b/hera-core/src/main/java/com/dfire/core/netty/worker/WorkHandler.java new file mode 100755 index 00000000..74dccc56 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/WorkHandler.java @@ -0,0 +1,187 @@ +package com.dfire.core.netty.worker; + +import com.dfire.common.util.NamedThreadFactory; +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.HeraChannel; +import com.dfire.core.netty.cluster.FailBackCluster; +import com.dfire.core.netty.listener.ResponseListener; +import com.dfire.core.netty.worker.request.WorkExecuteJob; +import com.dfire.core.netty.worker.request.WorkHandleCancel; +import com.dfire.core.netty.worker.request.WorkHandlerRequest; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.SocketLog; +import com.dfire.logs.TaskLog; +import com.dfire.protocol.RpcRequest.Request; +import com.dfire.protocol.RpcResponse.Response; +import com.dfire.protocol.RpcSocketMessage.SocketMessage; +import com.dfire.protocol.RpcWebResponse.WebResponse; +import com.google.protobuf.InvalidProtocolBufferException; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.List; +import java.util.concurrent.*; + +/** + * @author: 凌霄 + * @time: Created in 1:32 2018/1/4 + * @desc SocketMessage为RPC消息体 + */ +public class WorkHandler extends SimpleChannelInboundHandler { + + + private WorkHandlerRequest handlerRequest = new WorkHandlerRequest(); + + private CompletionService completionService = new ExecutorCompletionService<>( + new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, + TimeUnit.SECONDS, + new SynchronousQueue<>(), + new NamedThreadFactory("worker-send:", false), + new ThreadPoolExecutor.AbortPolicy())); + + private WorkContext workContext; + + private ConcurrentHashMap channelMap = new ConcurrentHashMap<>(2); + private List listeners = new CopyOnWriteArrayList<>(); + + + public WorkHandler(final WorkContext workContext) { + this.workContext = workContext; + workContext.setHandler(this); + Executor executor = Executors.newSingleThreadExecutor(new NamedThreadFactory("send-message-to-master-thread", true)); + executor.execute(() -> { + ChannelResponse response = null; + Future future; + while (true) { + try { + future = completionService.take(); + response = future.get(); + response.channel.writeAndFlush(wrapper(response.response)); + TaskLog.info("1.WorkHandler: worker send response,rid={}", response.response.getRid()); + } catch (InterruptedException | ExecutionException | RemotingException e) { + ErrorLog.error("1.WorkHandler: worker send response timeout,rid=" + (response == null ? "" : response.response.getRid()), e); + } + } + }); + } + + public void addListener(ResponseListener listener) { + listeners.add(listener); + } + + public void removeListener(ResponseListener listener) { + listeners.remove(listener); + } + + public SocketMessage wrapper(Response response) { + return SocketMessage + .newBuilder() + .setKind(SocketMessage.Kind.RESPONSE) + .setBody(response.toByteString()).build(); + } + + + @Override + protected void channelRead0(ChannelHandlerContext ctx, SocketMessage socketMessage) throws Exception { + + Channel channel = ctx.channel(); + switch (socketMessage.getKind()) { + case REQUEST: + final Request request = Request.newBuilder().mergeFrom(socketMessage.getBody()).build(); + switch (request.getOperate()) { + case Schedule: + case Manual: + case Debug: + case Rerun: + case SuperRecovery: + completionService.submit(() -> + new ChannelResponse(getChannel(channel), new WorkExecuteJob().execute(workContext, request).get())); + break; + case Cancel: + completionService.submit(() -> + new ChannelResponse(getChannel(channel), new WorkHandleCancel().handleCancel(workContext, request).get())); + break; + case GetWorkInfo: + workContext.getWorkExecuteThreadPool().execute(() -> handlerRequest.getWorkInfo(getChannel(channel))); + break; + default: + ErrorLog.warn("unknow operate value {}", request.getOperateValue()); + break; + } + case RESPONSE: + workContext.getWorkWebThreadPool().execute(() -> { + Response response = null; + try { + response = Response.newBuilder().mergeFrom(socketMessage.getBody()).build(); + } catch (InvalidProtocolBufferException e) { + ErrorLog.error("解析消息异常", e); + } + TaskLog.info("4.WorkHandler:receiver: socket info from master {}, response is {}", ctx.channel().remoteAddress(), response.getRid()); + for (ResponseListener listener : listeners) { + listener.onResponse(response); + } + }); + + break; + case WEB_RESPONSE: + workContext.getWorkWebThreadPool().execute(() -> { + WebResponse webResponse = null; + try { + webResponse = WebResponse.newBuilder().mergeFrom(socketMessage.getBody()).build(); + } catch (InvalidProtocolBufferException e) { + ErrorLog.error("解析消息失败", e); + } + TaskLog.info("4.WorkHandler:receiver socket info from master {}, webResponse is {}", ctx.channel().remoteAddress(), webResponse.getRid()); + for (ResponseListener listener : listeners) { + listener.onWebResponse(webResponse); + } + }); + break; + default: + ErrorLog.error("WorkHandler:can not recognition "); + break; + + } + } + + + private HeraChannel getChannel(Channel channel) { + if (channelMap.get(channel) == null) { + channelMap.putIfAbsent(channel, FailBackCluster.wrap(channel)); + } + return channelMap.get(channel); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) { + SocketLog.info("客户端与服务端连接开启"); + ctx.fireChannelActive(); + getChannel(ctx.channel()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) { + SocketLog.warn("客户端与服务端连接关闭"); + workContext.setServerChannel(null); + ctx.fireChannelInactive(); + channelMap.remove(ctx.channel()); + } + + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + ErrorLog.error("work exception: " + ctx.channel().remoteAddress(), cause.toString()); + } + + private class ChannelResponse { + HeraChannel channel; + Response response; + + public ChannelResponse(HeraChannel channel, Response response) { + this.channel = channel; + this.response = response; + } + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkExecuteJob.java b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkExecuteJob.java new file mode 100755 index 00000000..22f8e027 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkExecuteJob.java @@ -0,0 +1,316 @@ +package com.dfire.core.netty.worker.request; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraAction; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.model.HeraJobBean; +import com.dfire.common.entity.vo.HeraDebugHistoryVo; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.enums.StatusEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.vo.JobStatus; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.job.Job; +import com.dfire.core.job.JobContext; +import com.dfire.core.netty.worker.HistoryPair; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.core.util.JobUtils; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import com.dfire.logs.ScheduleLog; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.*; +import com.google.protobuf.InvalidProtocolBufferException; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.Future; + +/** + * @author: 凌霄 + * @time: Created in 下午4:20 2018/4/25 + * @desc worker job 最终执行体,收到master handler执行请求的时候,开始创建Job processor + */ +public class WorkExecuteJob { + + public Future execute(WorkContext workContext, RpcRequest.Request request) { + try { + switch (request.getOperate()) { + case Debug: + return debug(workContext, request); + case Manual: + case Rerun: + return manual(workContext, request); + case Schedule: + case SuperRecovery: + return schedule(workContext, request); + default: + + } + + } catch (HeraException e) { + ErrorLog.error("执行任务失败", e); + } + return null; + } + + + /** + * worker中,调度中心手动执行任务最终执行位置,JobUtils.createDebugJob创建job文件到服务器,拼接shell,并调用命令执行 + * + * @param workContext + * @param request + * @return + */ + + + private Future manual(WorkContext workContext, RpcRequest.Request request) throws HeraException { + RpcExecuteMessage.ExecuteMessage message; + try { + message = RpcExecuteMessage.ExecuteMessage.newBuilder().mergeFrom(request.getBody()).build(); + } catch (InvalidProtocolBufferException e) { + throw new HeraException("解析消息异常", e); + } + final Long actionId = Long.parseLong(message.getActionId()); + SocketLog.info("worker received master request to run manual job, actionId = {}", actionId); + HeraAction heraAction = workContext.getHeraJobActionService().findById(actionId); + HeraJobHistoryVo history = BeanConvertUtils.convert(workContext.getHeraJobHistoryService().findById(heraAction.getHistoryId())); + + Map runningMap; + if (request.getOperate() == RpcOperate.Operate.Rerun) { + runningMap = workContext.getRerunRunning(); + } else { + runningMap = workContext.getManualRunning(); + } + + return workContext.getWorkExecuteThreadPool().submit(() -> { + history.setExecuteHost(WorkContext.host); + history.setStartTime(new Date()); + workContext.getHeraJobHistoryService().update(BeanConvertUtils.convert(history)); + + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + File directory = new File(HeraGlobalEnv.getWorkDir() + + File.separator + date + File.separator + "manual-" + history.getId()); + if (!directory.exists()) { + if (!directory.mkdirs()) { + HeraLog.error("创建文件失败:" + directory.getAbsolutePath()); + } + } + int exitCode = -1; + Exception exception = null; + HistoryPair historyPair = new HistoryPair(actionId, heraAction.getHistoryId()); + try { + HeraJobBean jobBean = workContext.getHeraGroupService().getUpstreamJobBean(history.getJobId()); + Job job = JobUtils.createScheduleJob(new JobContext(JobContext.SCHEDULE_RUN), + jobBean, history, directory.getAbsolutePath()); + runningMap.put(historyPair, job); + exitCode = job.run(); + } catch (Exception e) { + exception = e; + history.getLog().appendHeraException(e); + } finally { + StatusEnum statusEnum = getStatusFromCode(exitCode); + //更新状态和日志 + workContext.getHeraJobHistoryService().updateHeraJobHistoryLogAndStatus( + HeraJobHistory.builder() + .id(history.getId()) + .log(history.getLog().getContent()) + .status(statusEnum.toString()) + .illustrate(history.getIllustrate()) + .endTime(new Date()) + .build()); + runningMap.remove(historyPair); + } + + ResponseStatus.Status status = ResponseStatus.Status.OK; + String errorText = ""; + if (exitCode != 0) { + status = ResponseStatus.Status.ERROR; + } + if (exception != null && exception.getMessage() != null) { + errorText = exception.getMessage(); + } + + RpcResponse.Response response = RpcResponse.Response.newBuilder() + .setRid(request.getRid()) + .setOperate(RpcOperate.Operate.Schedule) + .setStatusEnum(status) + .setErrorText(errorText) + .build(); + SocketLog.info("send execute message, actionId = {}", actionId); + return response; + }); + } + + /** + * worker中,调度中心自动调度任务最终执行位置,JobUtils.createDebugJob创建job文件到服务器,拼接shell,并调用命令执行 + * + * @param workContext + * @param request + * @return + */ + + private Future schedule(WorkContext workContext, RpcRequest.Request request) throws HeraException { + RpcExecuteMessage.ExecuteMessage message; + try { + message = RpcExecuteMessage.ExecuteMessage.newBuilder().mergeFrom(request.getBody()).build(); + } catch (InvalidProtocolBufferException e) { + throw new HeraException("解析消息异常", e); + } + // 查看master分发 actionHistoryId + final Long jobId = Long.parseLong(message.getActionId()); + SocketLog.info("worker received master request to run schedule, actionId :" + jobId); + JobStatus jobStatus = workContext.getHeraJobActionService().findJobStatus(jobId); + HeraJobHistory heraJobHistory = workContext.getHeraJobHistoryService().findById(jobStatus.getHistoryId()); + HeraJobHistoryVo history = BeanConvertUtils.convert(heraJobHistory); + Map running; + if (request.getOperate() == RpcOperate.Operate.SuperRecovery) { + running = workContext.getSuperRunning(); + } else { + running = workContext.getRunning(); + } + return workContext.getWorkExecuteThreadPool().submit(() -> { + history.setExecuteHost(WorkContext.host); + history.setStartTime(new Date()); + workContext.getHeraJobHistoryService().update(BeanConvertUtils.convert(history)); + HeraJobBean jobBean = workContext.getHeraGroupService().getUpstreamJobBean(heraJobHistory.getJobId()); + String date = ActionUtil.getCurrDate(); + File directory = new File(HeraGlobalEnv.getWorkDir() + + File.separator + date + File.separator + history.getId()); + if (!directory.exists()) { + if (!directory.mkdirs()) { + HeraLog.error("创建文件失败:" + directory.getAbsolutePath()); + } + } + + int exitCode = -1; + Exception exception = null; + HistoryPair historyPair = new HistoryPair(jobId, jobStatus.getHistoryId()); + try { + Job job = JobUtils.createScheduleJob(new JobContext(JobContext.SCHEDULE_RUN), jobBean, history, directory.getAbsolutePath()); + + + running.put(historyPair, job); + exitCode = job.run(); + } catch (Exception e) { + exception = e; + history.getLog().appendHeraException(e); + } finally { + StatusEnum statusEnum = getStatusFromCode(exitCode); + //更新状态和日志 + workContext.getHeraJobHistoryService().updateHeraJobHistoryLogAndStatus( + HeraJobHistory.builder(). + id(history.getId()). + log(history.getLog().getContent()).status(statusEnum.toString()). + endTime(new Date()) + .illustrate(history.getIllustrate()) + .build()); + running.remove(historyPair); + } + + ResponseStatus.Status status = ResponseStatus.Status.OK; + String errorText = ""; + if (exitCode != 0) { + status = ResponseStatus.Status.ERROR; + } + if (exception != null) { + errorText = exception.toString(); + } + + RpcResponse.Response response = RpcResponse.Response.newBuilder() + .setRid(request.getRid()) + .setOperate(RpcOperate.Operate.Schedule) + .setStatusEnum(status) + .setErrorText(errorText) + .build(); + ScheduleLog.info("send execute message, resId = {} actionId = {}", request.getRid(), jobId); + return response; + }); + + } + + /** + * worker中,开发中心脚本执行最终执行位置,JobUtils.createDebugJob创建job文件到服务器,拼接shell,并调用命令执行 + * + * @param workContext + * @param request + * @return + */ + private Future debug(WorkContext workContext, RpcRequest.Request request) throws HeraException { + RpcDebugMessage.DebugMessage debugMessage; + try { + debugMessage = RpcDebugMessage.DebugMessage.newBuilder().mergeFrom(request.getBody()).build(); + } catch (InvalidProtocolBufferException e) { + throw new HeraException("解析消息异常", e); + } + Long debugId = Long.parseLong(debugMessage.getDebugId()); + HeraDebugHistoryVo history = workContext.getHeraDebugHistoryService().findById(debugId); + return workContext.getWorkExecuteThreadPool().submit(() -> { + int exitCode = -1; + Exception exception = null; + ResponseStatus.Status status; + history.setExecuteHost(WorkContext.host); + workContext.getHeraDebugHistoryService().update(BeanConvertUtils.convert(history)); + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + try { + File directory = new File(HeraGlobalEnv.getWorkDir() + File.separator + date + File.separator + "debug-" + debugId); + if (!directory.exists()) { + if (!directory.mkdirs()) { + HeraLog.error("创建文件失败:" + directory.getAbsolutePath()); + } + } + HeraJobBean jobBean = workContext.getHeraGroupService().getUpstreamJobBean(history.getJobId()); + Job job = JobUtils.createDebugJob(new JobContext(JobContext.DEBUG_RUN), BeanConvertUtils.convert(history), jobBean, + directory.getAbsolutePath(), workContext); + workContext.getDebugRunning().putIfAbsent(debugId, job); + exitCode = job.run(); + } catch (Exception e) { + exception = e; + history.getLog().appendHeraException(e); + } finally { + HeraDebugHistoryVo heraDebugHistoryVo = workContext.getHeraDebugHistoryService().findById(debugId); + heraDebugHistoryVo.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + StatusEnum statusEnum = getStatusFromCode(exitCode); + if (exitCode == 0) { + status = ResponseStatus.Status.OK; + heraDebugHistoryVo.setStatus(statusEnum); + } else { + status = ResponseStatus.Status.ERROR; + heraDebugHistoryVo.setStatus(statusEnum); + } + workContext.getHeraDebugHistoryService().updateStatus(BeanConvertUtils.convert(heraDebugHistoryVo)); + HeraDebugHistoryVo debugHistory = workContext.getDebugRunning().get(debugId).getJobContext().getDebugHistory(); + workContext.getHeraDebugHistoryService().updateLog(BeanConvertUtils.convert(debugHistory)); + workContext.getDebugRunning().remove(debugId); + } + String errorText = ""; + if (exception != null && exception.getMessage() != null) { + errorText = exception.getMessage(); + } + return RpcResponse.Response.newBuilder() + .setRid(request.getRid()) + .setOperate(RpcOperate.Operate.Debug) + .setStatusEnum(status) + .setErrorText(errorText) + .build(); + }); + } + + + private StatusEnum getStatusFromCode(int exitCode) { + if (exitCode == Constants.SUCCESS_EXIT_CODE) { + return StatusEnum.SUCCESS; + } + + if (exitCode == Constants.WAIT_EXIT_CODE) { + return StatusEnum.WAIT; + } + return StatusEnum.FAILED; + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkHandleCancel.java b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkHandleCancel.java new file mode 100755 index 00000000..0895d419 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkHandleCancel.java @@ -0,0 +1,78 @@ +package com.dfire.core.netty.worker.request; + +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.core.job.Job; +import com.dfire.core.netty.worker.HistoryPair; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.*; +import com.google.protobuf.InvalidProtocolBufferException; + +import java.util.Map; +import java.util.concurrent.Future; + +/** + * @author: 凌霄 + * @time: Created in 下午10:57 2018/5/11 + * @desc worker端执行接受到master hander端的取消任务指令的时候,开始执行取消任务逻辑 + */ +public class WorkHandleCancel { + + public Future handleCancel(final WorkContext workContext, final RpcRequest.Request request) { + try { + RpcCancelMessage.CancelMessage cancelMessage = RpcCancelMessage.CancelMessage.newBuilder() + .mergeFrom(request.getBody()) + .build(); + + Long id = Long.parseLong(cancelMessage.getId()); + switch (cancelMessage.getEk()) { + case ManualKind: + return cancelJob(workContext, request, id, workContext.getManualRunning()); + case ScheduleKind: + return cancelJob(workContext, request, id, workContext.getRunning()); + case SuperRecoveryKind: + return cancelJob(workContext, request, id, workContext.getSuperRunning()); + case AutoRerunKind: + return cancelJob(workContext, request, id, workContext.getRerunRunning()); + case DebugKind: + return cancelDebug(workContext, request, id); + default: + ErrorLog.error("不支持的取消类型:" + cancelMessage.getEk().name()); + } + } catch (InvalidProtocolBufferException e) { + ErrorLog.error("解析异常", e); + } + return null; + } + + + private Future cancelJob(WorkContext workContext, RpcRequest.Request request, Long historyId, Map running) { + HeraJobHistory heraJobHistory = workContext.getHeraJobHistoryService().findById(historyId); + Long actionId = heraJobHistory.getActionId(); + SocketLog.info("worker receive cancel job, actionId =" + actionId); + return workContext.getWorkExecuteThreadPool().submit(() -> { + workContext.getWorkClient().cancelJob(running.get(new HistoryPair(actionId, historyId))); + return RpcResponse.Response.newBuilder() + .setRid(request.getRid()) + .setOperate(RpcOperate.Operate.Cancel) + .setStatusEnum(ResponseStatus.Status.OK) + .build(); + }); + } + + /** + * 取消执行开发中心任务,先判断任务是否在运行队列中,再执行取消任务逻辑 + */ + private Future cancelDebug(WorkContext workContext, RpcRequest.Request request, Long debugId) { + return workContext.getWorkExecuteThreadPool().submit(() -> { + workContext.getWorkClient().cancelDebugJob(debugId); + return RpcResponse.Response.newBuilder() + .setRid(request.getRid()) + .setOperate(RpcOperate.Operate.Cancel) + .setStatusEnum(ResponseStatus.Status.OK) + .build(); + }); + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkHandlerRequest.java b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkHandlerRequest.java new file mode 100755 index 00000000..ff70196e --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkHandlerRequest.java @@ -0,0 +1,43 @@ +package com.dfire.core.netty.worker.request; + +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.HeraChannel; +import com.dfire.core.netty.NettyChannel; +import com.dfire.core.tool.OsProcessJob; +import com.dfire.logs.ErrorLog; +import com.dfire.protocol.RpcOperate; +import com.dfire.protocol.RpcRequest.Request; +import com.dfire.protocol.RpcSocketMessage.SocketMessage; +import com.dfire.protocol.RpcWorkInfo.WorkInfo; +import io.netty.channel.Channel; + +/** + * @author xiaosuda + * @date 2018/11/20 + */ +public class WorkHandlerRequest { + + public void getWorkInfo(HeraChannel channel) { + OsProcessJob processJob = new OsProcessJob(); + Integer exitCode = processJob.run(); + if (exitCode == 0) { + try { + channel.writeAndFlush( + SocketMessage.newBuilder() + .setKind(SocketMessage.Kind.REQUEST) + .setBody(Request.newBuilder() + .setBody(WorkInfo.newBuilder() + .setOSInfo(processJob.getOsInfo()) + .addAllProcessMonitor(processJob.getProcessMonitors()) + .build().toByteString()) + .setOperate(RpcOperate.Operate.SetWorkInfo) + .build() + .toByteString()) + .build()); + } catch (RemotingException e) { + ErrorLog.error("发送消息失败", e); + } + } + + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkerHandleWebRequest.java b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkerHandleWebRequest.java new file mode 100755 index 00000000..ef6e359d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkerHandleWebRequest.java @@ -0,0 +1,120 @@ +package com.dfire.core.netty.worker.request; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.enums.MessageEnum; +import com.dfire.core.netty.listener.WorkResponseListener; +import com.dfire.core.netty.util.AtomicIncrease; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.SocketLog; +import com.dfire.protocol.JobExecuteKind.ExecuteKind; +import com.dfire.protocol.RpcPair; +import com.dfire.protocol.RpcSocketMessage.SocketMessage; +import com.dfire.protocol.RpcWebOperate.WebOperate; +import com.dfire.protocol.RpcWebRequest.WebRequest; +import com.dfire.protocol.RpcWebResponse.WebResponse; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + * @author xiaosuda + * @date 2018/11/9 + */ +public class WorkerHandleWebRequest { + + public static Future handleWebExecute(final WorkContext workContext, ExecuteKind kind, Long id) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.ExecuteJob) + .setEk(kind) + .setId(String.valueOf(id)) + .build(), workContext, "[执行]-任务超出" + HeraGlobalEnv.getRequestTimeout() + "秒未得到master消息返回:" + id); + } + + public static Future handleWebAction(final WorkContext workContext, ExecuteKind kind, Long id) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.GenerateAction) + .setEk(kind) + .setId(String.valueOf(id)) + .build(), workContext, "[更新]-action超出3小时未得到master消息返回:" + id); + } + + public static Future handleCancel(final WorkContext workContext, ExecuteKind kind, Long id) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.CancelJob) + .setEk(kind) + .setId(String.valueOf(id)) + .build(), workContext, "[取消]-任务超出3小时未得到master消息返回:" + id); + } + + public static Future handleUpdate(final WorkContext workContext, String jobId) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.UpdateJob) + .setEk(ExecuteKind.ManualKind) + .setId(jobId) + .build(), workContext, "[更新]-job超出3小时未得到master消息返回:" + jobId); + } + + public static Future getJobQueueInfoFromMaster(WorkContext workContext) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.GetAllHeartBeatInfo) + .build(), workContext, "三个小时未获得master任务队列的获取信息"); + } + + + public static Future getAllWorkInfoFromMaster(WorkContext workContext) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.GetAllWorkInfo) + .build(), workContext, "三个小时未获得master所有work信息"); + } + + public static Future increaseActionPriority(WorkContext workContext, Long actionId) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.UpdateConf) + .setBody(RpcPair.Pair.newBuilder().setType(MessageEnum.UPDATE_TASK_PRIORITY.getType()).setValue(String.valueOf(actionId)).build().toByteString()) + .build(), workContext, "三个小时未获得master所有work信息"); + } + + private static Future buildMessage(WebRequest request, WorkContext workContext, String errorMsg) { + CountDownLatch latch = new CountDownLatch(1); + WorkResponseListener responseListener = new WorkResponseListener(request, false, latch, null); + workContext.getHandler().addListener(responseListener); + Future future = workContext.getWorkWebThreadPool().submit(() -> { + latch.await(HeraGlobalEnv.getRequestTimeout(), TimeUnit.SECONDS); + if (!responseListener.getReceiveResult()) { + ErrorLog.error(errorMsg); + } + workContext.getHandler().removeListener(responseListener); + return responseListener.getWebResponse(); + }); + try { + workContext.getServerChannel().writeAndFlush(SocketMessage.newBuilder() + .setKind(SocketMessage.Kind.WEB_REQUEST) + .setBody(request.toByteString()) + .build()); + SocketLog.info("1.WorkerHandleWebRequest: send web request to master requestId ={}", request.getRid()); + } catch (RemotingException e) { + workContext.getHandler().removeListener(responseListener); + ErrorLog.error("1.WorkerHandleWebRequest: send web request to master exception requestId =" + request.getRid(), e); + } + return future; + } + + + public static Future updateWorkFromWeb(WorkContext workContext) { + return buildMessage(WebRequest.newBuilder() + .setRid(AtomicIncrease.getAndIncrement()) + .setOperate(WebOperate.UpdateConf) + .setBody(RpcPair.Pair.newBuilder().setType(MessageEnum.UPDATE_WORK_INFO.getType()).build().toByteString()) + .build(), workContext, "三个小时未获得master所有work信息"); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkerHandlerHeartBeat.java b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkerHandlerHeartBeat.java new file mode 100755 index 00000000..9c6097d1 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/netty/worker/request/WorkerHandlerHeartBeat.java @@ -0,0 +1,59 @@ +package com.dfire.core.netty.worker.request; + +import com.dfire.common.exception.HeraException; +import com.dfire.core.exception.RemotingException; +import com.dfire.core.netty.util.AtomicIncrease; +import com.dfire.core.netty.worker.HistoryPair; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.core.tool.CpuLoadPerCoreJob; +import com.dfire.core.tool.MemUseRateJob; +import com.dfire.protocol.RpcHeartBeatMessage; +import com.dfire.protocol.RpcOperate; +import com.dfire.protocol.RpcRequest; +import com.dfire.protocol.RpcSocketMessage; + +import java.util.ArrayList; +import java.util.stream.Collectors; + +/** + * @author xiaosuda + * @date 2018/4/12 + */ +public class WorkerHandlerHeartBeat { + + + public boolean send(WorkContext context) throws HeraException { + try { + MemUseRateJob memUseRateJob = new MemUseRateJob(1); + memUseRateJob.readMemUsed(); + CpuLoadPerCoreJob loadPerCoreJob = new CpuLoadPerCoreJob(); + loadPerCoreJob.run(); + + RpcHeartBeatMessage.HeartBeatMessage hbm = RpcHeartBeatMessage.HeartBeatMessage.newBuilder() + .setHost(WorkContext.host) + .setMemTotal(memUseRateJob.getMemTotal()) + .setMemRate(memUseRateJob.getRate()) + .setCpuLoadPerCore(loadPerCoreJob.getLoadPerCore()) + .setTimestamp(System.currentTimeMillis()) + .addAllDebugRunning(context.getDebugRunning().keySet().stream().map(String::valueOf).collect(Collectors.toList())) + .addAllManualRunning(context.getManualRunning().keySet().stream().map(HistoryPair::getActionId).map(String::valueOf).collect(Collectors.toList())) + .addAllRunning(context.getRunning().keySet().stream().map(HistoryPair::getActionId).map(String::valueOf).collect(Collectors.toList())) + .addAllRerunRunning(context.getRerunRunning().keySet().stream().map(HistoryPair::getActionId).map(String::valueOf).collect(Collectors.toList())) + .addAllSuperRunning(context.getSuperRunning().keySet().stream().map(HistoryPair::getActionId).map(String::valueOf).collect(Collectors.toList())) + .setCores(WorkContext.cpuCoreNum) + .build(); + context.getServerChannel().writeAndFlush(RpcSocketMessage.SocketMessage.newBuilder(). + setKind(RpcSocketMessage.SocketMessage.Kind.REQUEST). + setBody(RpcRequest.Request.newBuilder(). + setRid(AtomicIncrease.getAndIncrement()). + setOperate(RpcOperate.Operate.HeartBeat). + setBody(hbm.toByteString()). + build().toByteString()). + build()); + } catch (RemotingException e) { + throw new HeraException("发送心跳消息失败", e); + } + return true; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/quartz/HeraQuartzJob.java b/hera-core/src/main/java/com/dfire/core/quartz/HeraQuartzJob.java new file mode 100755 index 00000000..53045f7e --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/quartz/HeraQuartzJob.java @@ -0,0 +1,24 @@ +package com.dfire.core.quartz; + +import com.dfire.common.constants.Constants; +import com.dfire.core.event.Dispatcher; +import com.dfire.event.HeraScheduleTriggerEvent; +import com.dfire.logs.ScheduleLog; +import org.quartz.Job; +import org.quartz.JobExecutionContext; + +/** + * @author xiaosuda + * @date 2018/6/26 + */ +public class HeraQuartzJob implements Job { + + @Override + public void execute(JobExecutionContext context) { + Long actionId = context.getJobDetail().getJobDataMap().getLong(Constants.QUARTZ_ID); + Dispatcher dispatcher = (Dispatcher) context.getJobDetail().getJobDataMap().get(Constants.QUARTZ_DISPATCHER); + HeraScheduleTriggerEvent scheduledEvent = HeraScheduleTriggerEvent.builder().actionId(actionId).build(); + dispatcher.forwardEvent(scheduledEvent); + ScheduleLog.info("execute schedule job {}", actionId); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/quartz/QuartzSchedulerService.java b/hera-core/src/main/java/com/dfire/core/quartz/QuartzSchedulerService.java new file mode 100755 index 00000000..bf0828cb --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/quartz/QuartzSchedulerService.java @@ -0,0 +1,88 @@ +package com.dfire.core.quartz; + +import com.dfire.common.constants.Constants; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import jdk.nashorn.internal.objects.annotations.Constructor; +import org.quartz.*; +import org.quartz.impl.StdSchedulerFactory; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Service; + +import java.util.Properties; + +/** + * @author: 凌霄 + * @time: Created in 1:19 2018/1/14 + * @desc quartz调度器初始化 + */ +@Configuration +@Service("quartzSchedulerService") +public class QuartzSchedulerService { + + private Scheduler scheduler; + + /** + * 设置quartz配置: @Constructor 先于 @PostConstruct执行 + */ + @Constructor + public Properties setQuartzProperties() { + HeraLog.info("start init quartz properties"); + Properties prop = new Properties(); + prop.put("org.quartz.scheduler.instanceName", "heraQuartzSchedulerPool"); + prop.put("org.quartz.scheduler.rmi.export", "false"); + prop.put("org.quartz.scheduler.rmi.proxy", "false"); + prop.put("org.quartz.scheduler.wrapJobExecutionInUserTransaction", "false"); + prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); + prop.put("org.quartz.threadPool.threadCount", String.valueOf(Constants.AVAILABLE_CORES)); + prop.put("org.quartz.threadPool.threadPriority", "5"); + prop.put("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread", "true"); + prop.put("org.quartz.jobStore.misfireThreshold", "60000"); + prop.put("org.quartz.jobStore.class", "org.quartz.simpl.RAMJobStore"); + return prop; + } + + public void start() { + HeraLog.info("start init quartz schedule"); + try { + SchedulerFactory schedulerFactory = new StdSchedulerFactory(setQuartzProperties()); + scheduler = schedulerFactory.getScheduler(); + scheduler.start(); + HeraLog.info("start init quartz scheduler"); + } catch (SchedulerException e) { + ErrorLog.error("failed init quartz scheduler", e); + } + } + + + public void shutdown() { + if (scheduler != null) { + try { + scheduler.shutdown(); + HeraLog.info("worker shutdown quartz service"); + } catch (SchedulerException e) { + ErrorLog.error("failed shutdown quartz scheduler", e); + } + } + } + + public Scheduler getScheduler() { + return scheduler; + } + + public void deleteJob(Long actionId) { + try { + JobKey jobKey = new JobKey(String.valueOf(actionId), Constants.HERA_GROUP); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + if (jobDetail != null) { + scheduler.deleteJob(jobKey); + HeraLog.warn("remove action {} from quartz", actionId); + } + } catch (SchedulerException e) { + ErrorLog.error("remove quartz schedule error : " + actionId, e); + } + + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/route/check/ResultReason.java b/hera-core/src/main/java/com/dfire/core/route/check/ResultReason.java new file mode 100755 index 00000000..c56d7c01 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/route/check/ResultReason.java @@ -0,0 +1,31 @@ +package com.dfire.core.route.check; + +/** + * worker 检测的结果信息 + * @author 火锅 + * @time 2018/11/9 + */ +public enum ResultReason { + + NULL_WORKER("节点不存在"), + NULL_HEART("心跳信息为空"), + MEM_LIMIT("内存超过限制"), + LOAD_LIMIT("CPU LOAD 超过限制"), + HOSTS_ERROR("hosts 不匹配"), + TASK_LIMIT("运行任务数量超过限制"); + + private String msg; + + ResultReason(String msg) { + this.msg = msg; + } + + @Override + public String toString() { + return msg; + } + + public String getMsg() { + return msg; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/route/loadbalance/AbstractLoadBalance.java b/hera-core/src/main/java/com/dfire/core/route/loadbalance/AbstractLoadBalance.java new file mode 100755 index 00000000..373cea7f --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/route/loadbalance/AbstractLoadBalance.java @@ -0,0 +1,68 @@ +package com.dfire.core.route.loadbalance; + +import com.dfire.common.entity.vo.HeraHostGroupVo; +import com.dfire.common.exception.HostGroupNotExistsException; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.message.HeartBeatInfo; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.core.route.check.ResultReason; +import com.dfire.logs.MasterLog; + +/** + * @author: 凌霄 + * @time: Created in 上午11:09 2018/10/10 + * @desc 任务执行worker选择路由 + */ +public abstract class AbstractLoadBalance implements LoadBalance { + + + @Override + public MasterWorkHolder select(JobElement jobElement, MasterContext masterContext) throws HostGroupNotExistsException { + if (masterContext.getHostGroupCache() != null) { + HeraHostGroupVo hostGroup = masterContext.getHostGroupCache().get(jobElement.getHostGroupId()); + if (hostGroup == null) { + throw new HostGroupNotExistsException("机器组ID:" + jobElement.getHostGroupId() + "不存在,任务Id:" + jobElement.getJobId()); + } + if (hostGroup.getHosts() == null || hostGroup.getHosts().size() == 0) { + throw new HostGroupNotExistsException("机器组:[" + hostGroup.getName() + "]无存活的work,请在work管理页面配置work,并启动它,任务Id:" + jobElement.getJobId()); + } + return doSelect(hostGroup, masterContext); + } + return null; + } + + protected boolean check(MasterWorkHolder worker) { + if (worker == null) { + MasterLog.warn(ResultReason.NULL_WORKER.getMsg()); + return false; + } + if (worker.getHeartBeatInfo() == null) { + MasterLog.warn(ResultReason.NULL_HEART.getMsg()); + return false; + } + HeartBeatInfo heartBeatInfo = worker.getHeartBeatInfo(); + + if (heartBeatInfo.getMemRate() == null || heartBeatInfo.getMemRate() > HeraGlobalEnv.getMaxMemRate()) { + MasterLog.warn(ResultReason.MEM_LIMIT.getMsg() + ":{}, host:{}", heartBeatInfo.getMemRate(), heartBeatInfo.getHost()); + return false; + } + if (heartBeatInfo.getCpuLoadPerCore() == null || heartBeatInfo.getCpuLoadPerCore() > HeraGlobalEnv.getMaxCpuLoadPerCore()) { + MasterLog.warn(ResultReason.LOAD_LIMIT.getMsg() + ":{}, host:{}", heartBeatInfo.getCpuLoadPerCore(), heartBeatInfo.getHost()); + return false; + } + + // 配置计算数量 + Float assignTaskNum = (heartBeatInfo.getMemTotal() - HeraGlobalEnv.getSystemMemUsed()) / HeraGlobalEnv.getPerTaskUseMem(); + int sum = heartBeatInfo.getDebugRunning().size() + heartBeatInfo.getManualRunning().size() + heartBeatInfo.getRunning().size(); + if (sum > assignTaskNum.intValue()) { + MasterLog.warn(ResultReason.TASK_LIMIT.getMsg() + ":{}, host:{}", sum, heartBeatInfo.getHost()); + return false; + } + return true; + } + + + protected abstract MasterWorkHolder doSelect(HeraHostGroupVo hostGroup, MasterContext masterContext); +} diff --git a/hera-core/src/main/java/com/dfire/core/route/loadbalance/LoadBalance.java b/hera-core/src/main/java/com/dfire/core/route/loadbalance/LoadBalance.java new file mode 100755 index 00000000..025109c5 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/route/loadbalance/LoadBalance.java @@ -0,0 +1,23 @@ +package com.dfire.core.route.loadbalance; + + +import com.dfire.common.exception.HostGroupNotExistsException; +import com.dfire.common.vo.JobElement; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; + +/** + * 负载均衡器 + * @author xiaosuda + */ +public interface LoadBalance { + + /** + * 选择work + * @param jobElement + * @param masterContext + * @return + */ + MasterWorkHolder select(JobElement jobElement, MasterContext masterContext) throws HostGroupNotExistsException; + +} diff --git a/hera-core/src/main/java/com/dfire/core/route/loadbalance/LoadBalanceFactory.java b/hera-core/src/main/java/com/dfire/core/route/loadbalance/LoadBalanceFactory.java new file mode 100755 index 00000000..cd457c8a --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/route/loadbalance/LoadBalanceFactory.java @@ -0,0 +1,28 @@ +package com.dfire.core.route.loadbalance; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.route.loadbalance.impl.RandomLoadBalance; +import com.dfire.core.route.loadbalance.impl.RoundRobinLoadBalance; + + +/** + * 负载均衡实例工厂 + * + * @author xiaosuda + */ +public class LoadBalanceFactory { + + public static LoadBalance getLoadBalance() { + + if (RoundRobinLoadBalance.NAME.equals(HeraGlobalEnv.getLoadBalance())) { + return new RoundRobinLoadBalance(); + } + + if (RandomLoadBalance.NAME.equals(HeraGlobalEnv.getLoadBalance())) { + return new RandomLoadBalance(); + } + + return new RoundRobinLoadBalance(); + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/route/loadbalance/impl/RandomLoadBalance.java b/hera-core/src/main/java/com/dfire/core/route/loadbalance/impl/RandomLoadBalance.java new file mode 100755 index 00000000..08ef0c64 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/route/loadbalance/impl/RandomLoadBalance.java @@ -0,0 +1,48 @@ +package com.dfire.core.route.loadbalance.impl; + +import com.dfire.common.entity.vo.HeraHostGroupVo; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.core.route.loadbalance.AbstractLoadBalance; +import com.dfire.logs.ScheduleLog; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 随机算法 + * @author xiaosdua + */ +public class RandomLoadBalance extends AbstractLoadBalance { + + public static final String NAME = "random"; + + @Override + protected MasterWorkHolder doSelect(HeraHostGroupVo hostGroup, MasterContext masterContext) { + List hosts = hostGroup.getHosts(); + int size = hosts.size(); + Set hasCheck = new HashSet<>(size); + int select; + for (int i = 0; i < size; i++) { + for (; ; ) { + select = ThreadLocalRandom.current().nextInt(size); + if (!hasCheck.contains(select)) { + hasCheck.add(select); + break; + } + } + for (MasterWorkHolder workHolder : masterContext.getWorkMap().values()) { + if (workHolder.getHeartBeatInfo() != null && workHolder.getHeartBeatInfo().getHost().equals(hosts.get(select).trim())) { + if (check(workHolder)) { + ScheduleLog.warn("select work is :{}", workHolder.getChannel().getRemoteAddress()); + return workHolder; + } + break; + } + } + } + return null; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/route/loadbalance/impl/RoundRobinLoadBalance.java b/hera-core/src/main/java/com/dfire/core/route/loadbalance/impl/RoundRobinLoadBalance.java new file mode 100755 index 00000000..56c1c573 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/route/loadbalance/impl/RoundRobinLoadBalance.java @@ -0,0 +1,45 @@ +package com.dfire.core.route.loadbalance.impl; + +import com.dfire.common.entity.vo.HeraHostGroupVo; +import com.dfire.core.netty.master.MasterContext; +import com.dfire.core.netty.master.MasterWorkHolder; +import com.dfire.core.route.loadbalance.AbstractLoadBalance; +import com.dfire.logs.ScheduleLog; + +import java.util.List; + +/** + * 轮询 + * + * @author wyr + */ +public class RoundRobinLoadBalance extends AbstractLoadBalance { + + + public static final String NAME = "roundrobin"; + + @Override + protected MasterWorkHolder doSelect(HeraHostGroupVo hostGroup, MasterContext masterContext) { + List hosts = hostGroup.getHosts(); + int index = hostGroup.getNextPos(); + int size = hosts.size(); + for (int i = 0; i < size; i++) { + String host = hosts.get(index); + for (MasterWorkHolder workHolder : masterContext.getWorkMap().values()) { + if (workHolder.getHeartBeatInfo() != null && workHolder.getHeartBeatInfo().getHost().equals(host.trim())) { + if (check(workHolder)) { + hostGroup.setNextPos(++index >= size ? 0 : index); + ScheduleLog.warn("select work is :{}", workHolder.getChannel().getRemoteAddress()); + return workHolder; + } + break; + } + } + if (++index >= size) { + index = 0; + } + } + return null; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/schedule/HeraSchedule.java b/hera-core/src/main/java/com/dfire/core/schedule/HeraSchedule.java new file mode 100755 index 00000000..b4757942 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/schedule/HeraSchedule.java @@ -0,0 +1,38 @@ +package com.dfire.core.schedule; + +import com.dfire.core.netty.master.MasterContext; +import com.dfire.logs.HeraLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * @author: 凌霄 + * @time: Created in 14:04 2018/1/12 + * @desc + */ +@Component +public class HeraSchedule { + + private AtomicBoolean running = new AtomicBoolean(false); + + @Autowired + private MasterContext masterContext; + + + public void startup() { + if (!running.compareAndSet(false, true)) { + return; + } + HeraLog.info("begin to start master context"); + masterContext.init(); + } + + public void shutdown() { + if (running.compareAndSet(true, false)) { + masterContext.destroy(); + } + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/tool/CpuLoadPerCoreJob.java b/hera-core/src/main/java/com/dfire/core/tool/CpuLoadPerCoreJob.java new file mode 100755 index 00000000..5d83c96a --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/tool/CpuLoadPerCoreJob.java @@ -0,0 +1,46 @@ +package com.dfire.core.tool; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.logs.ErrorLog; + +import java.io.IOException; + +/** + * @author xiaosuda + * @date 2018/8/6 + */ +public class CpuLoadPerCoreJob extends RunShell { + + private float loadPerCore = 1f; + public CpuLoadPerCoreJob() { + super("uptime | awk '{print $(NF-2)}'"); + } + + @Override + public Integer run() { + if (!HeraGlobalEnv.isLinuxSystem()) { + return -1; + } + Integer exitCode = super.run(); + if (exitCode == 0) { + try { + String result = super.getResult(); + loadPerCore = getCpuLoad(result) / WorkContext.cpuCoreNum; + } catch (IOException e) { + ErrorLog.error("获取负载信息失败", e); + } + } + return exitCode; + } + + + private Float getCpuLoad(String result) { + return Float.parseFloat(result.replace(",", "")); + } + + public float getLoadPerCore() { + return loadPerCore; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/tool/MemUseRateJob.java b/hera-core/src/main/java/com/dfire/core/tool/MemUseRateJob.java new file mode 100755 index 00000000..ec81a4ee --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/tool/MemUseRateJob.java @@ -0,0 +1,108 @@ +package com.dfire.core.tool; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import lombok.Data; + +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author xiaosuda + * @date 2018/4/13 + */ +@Data +public class MemUseRateJob { + + private float rate; + + private static Pattern pattern = Pattern.compile("\\d+"); + + private final String MEM_TOTAL = "MemTotal"; + + private final String MEM_AVAILABLE = "MemAvailable"; + + private final String MEM_FREE = "MemFree"; + + private final String BUFFERS = "Buffers"; + + private final String CACHED = "Cached"; + + private final String MEM_INFO_PATH = "/proc/meminfo"; + + private float memAvailable = 0.0f; + + private float memTotal = 0.0f; + + public MemUseRateJob(float rate) { + this.rate = rate; + } + + /** + * 在 /proc/meminfo 文件有系统内存的实时信息 + */ + public void readMemUsed() { + if (!HeraGlobalEnv.isLinuxSystem()) { + rate = 0.1f; + memTotal = 10240f; + return; + } + File file = new File(MEM_INFO_PATH); + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); + } catch (FileNotFoundException e) { + ErrorLog.error("文件不存在:{}", MEM_INFO_PATH); + return; + } + String line; + Float memFree = null, buffers = null, cached = null; + try { + while ((line = reader.readLine()) != null) { + if (line.contains(MEM_TOTAL)) { + memTotal = matchVal(line); + } else { + //如果linux内核3.4 直接读 MemAvailable + if (line.contains(MEM_AVAILABLE)) { + memAvailable = matchVal(line); + break; + } else { + if (line.contains(MEM_FREE)) { + memFree = matchVal(line); + } else if (line.contains(BUFFERS)) { + buffers = matchVal(line); + } else if (line.contains(CACHED)) { + cached = matchVal(line); + } + + if (memFree != null && buffers != null && cached != null) { + memAvailable = memFree + buffers + cached; + break; + } + } + } + } + + } catch (IOException e) { + ErrorLog.error("读取内存信息失败", e); + } finally { + try { + reader.close(); + } catch (IOException e) { + ErrorLog.error("关闭/proc/meminfo文件失败", e); + } + } + rate = (memTotal - memAvailable) / memTotal; + } + + public float matchVal(String target) { + float x = 0.0f; + Matcher matcher = pattern.matcher(target); + if (matcher.find()) { + x = Float.parseFloat(matcher.group()) / 1024; + } + return x; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/tool/OsProcessJob.java b/hera-core/src/main/java/com/dfire/core/tool/OsProcessJob.java new file mode 100755 index 00000000..c59ebe47 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/tool/OsProcessJob.java @@ -0,0 +1,283 @@ +package com.dfire.core.tool; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import com.dfire.protocol.RpcWorkInfo; +import com.dfire.protocol.RpcWorkInfo.OSInfo; +import com.dfire.protocol.RpcWorkInfo.ProcessMonitor; +import org.apache.commons.lang.StringUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author xiaosuda + * @date 2018/11/12 + */ +public class OsProcessJob extends RunShell { + + + private OSInfo osInfo; + + private List processMonitors; + + + private final String KB = "K"; + private final String MB = "M"; + private final String GB = "G"; + private final String numRegex = "[^.&&\\D]"; + + private float zero = 0.0f; + + + private final String command; + + { + switch (HeraGlobalEnv.getSystemEnum()) { + case LINUX: + command = "ps aux | awk '{if (NR>1) {print $0}}'"; + break; + case MAC: + command = "top -s 0 -n 30 -o cpu -O mem -l 2 -stats pid,user,cpu,time,mem,command,cpu_me"; + break; + default: + String oSName = System.getProperties().getProperty("os.name"); + command = "echo 未知的操作系统类型" + oSName; + ErrorLog.error("未知的操作系统类型{}", oSName); + } + } + + public OsProcessJob() { + super(); + } + + @Override + public Integer run() { + if (command == null) { + throw new NullPointerException("指令为空,无法执行Shell"); + } + super.setCommand(command); + switch (HeraGlobalEnv.getSystemEnum()) { + case LINUX: + return runLinux(); + case MAC: + return runMac(); + default: + return -1; + } + } + + private Integer runMac() { + Integer exitCode = -1; + try { + exitCode = super.run(); + if (exitCode == 0) { + String result = super.getResult(); + result = result.substring(result.lastIndexOf("Processes")); + String[] lines = result.split("\n"); + float user = 0.0f, sys = 0.0f, cpu = 0.0f; + float memUsed = 0.0f, memWired = 0.0f, memUnUsed = 0.0f; + String regex = "\\s+"; + String[] words; + processMonitors = new ArrayList<>(); + for (String line : lines) { + words = line.split(regex); + if (StringUtils.isBlank(words[0])) { + continue; + } + if ("CPU".equals(words[0])) { + user = parseFloat(words[2]); + sys = parseFloat(words[4]); + cpu = parseFloat(words[6]); + } else if ("PhysMem:".equals(words[0])) { + memUsed = parseFloat(words[1]); + memWired = parseFloat(words[3]); + memUnUsed = parseFloat(words[5]); + } else if (StringUtils.isNumeric(words[0])) { + processMonitors.add(RpcWorkInfo.ProcessMonitor.newBuilder() + .setPid(words[0]) + .setUser(words[1]) + .setCpu(words[2]) + .setTime(words[3]) + .setMem(String.valueOf(getMemPercent(words[4], memUnUsed + memUsed))) + .setRes(words[4]) + .setCommand(words[5]) + .build()); + } + + osInfo = OSInfo.newBuilder() + .setUser(user) + .setSystem(sys) + .setCpu(cpu) + .setSwap(100f) + .setMem(memUsed / (memUnUsed + memUsed) * 100f) + .build(); + } + } + } catch (Exception e) { + ErrorLog.error("读取mac进行信息失败", e); + } + + return exitCode; + } + + private Float getMemPercent(String used, float total) { + return getMb(used) / total * 100; + } + + private Float getMb(String used) { + float res = 0.0f; + if (used.contains(KB)) { + res = parseFloat(used) / 1024; + } else if (used.contains(MB)) { + res = parseFloat(used); + } else if (used.contains(GB)) { + res = parseFloat(used) * 1024; + } + return res; + } + + /** + * used 数字必须连续 + * + * @param used + * @return + */ + + private float parseFloat(String used) { + try { + return Float.parseFloat(used.replaceAll(numRegex, "")); + } catch (Exception e) { + return 0f; + } + } + + + private Integer runLinux() { + Integer exitCode = -1; + try { + exitCode = super.run(); + if (exitCode == 0) { + String result = super.getResult(); + if (result != null) { + String[] lines = result.split("\n"); + processMonitors = new ArrayList<>(); + + for (String line : lines) { + int len = line.length(); + StringBuilder word = new StringBuilder(); + char ch; + int index = -1; + int wordIndex = 0; + boolean workSplit = true; + String user = null, pid = null, cpu = null, mem = null, time = null, command; + while (++index < len) { + ch = line.charAt(index); + if (ch == ' ') { + if (wordIndex < 11 && workSplit) { + workSplit = false; + wordIndex++; + if (wordIndex == 1) { + user = word.toString(); + } else if (wordIndex == 2) { + pid = word.toString(); + } else if (wordIndex == 3) { + cpu = word.toString(); + } else if (wordIndex == 4) { + mem = word.toString(); + } else if (wordIndex == 10) { + time = word.toString(); + } + word = new StringBuilder(); + } else if (wordIndex >= 11) { + word.append(' '); + } + } else { + workSplit = true; + word.append(ch); + } + } + command = word.toString(); + + processMonitors.add(ProcessMonitor.newBuilder() + .setUser(user) + .setPid(pid) + .setCpu(cpu) + .setMem(mem) + .setTime(time) + .setRes("") + .setCommand(command) + .build()); + + } + + + processMonitors.sort((o1, o2) -> { + int comp; + if ((comp = o1.getMem().compareTo(o2.getMem())) == 0) { + return -o1.getCpu().compareTo(o2.getCpu()); + } + return -comp; + }); + float user, system, cpu, + swap = zero, swapTotal, swapCached, swapFree, + mem = zero, memTotal, memFree, memBuffers; + // 设置cpu信息 + super.setCommand("vmstat 1 1 | awk '{if (NR >2) print $13,$14,$15}'"); + super.run(); + String[] cpuVal = super.getResult().split(" "); + user = parseFloat(cpuVal[0]); + system = parseFloat(cpuVal[1]); + cpu = parseFloat(cpuVal[2]); + + //设置内存信息 + super.setCommand("vmstat -s | grep -E 'total memory|used memory|free memory|buffer memory|swap cache|free swap|total swap' | awk '{print $1}'"); + super.run(); + String[] memInfo = super.getResult().split("\n"); + memTotal = parseKb(memInfo[0]); + memFree = parseKb(memInfo[2]); + memBuffers = parseKb(memInfo[3]); + swapCached = parseKb(memInfo[4]); + swapTotal = parseKb(memInfo[5]); + swapFree = parseKb(memInfo[6]); + + if (memTotal != zero) { + mem = 1.0f - ((memFree + memBuffers + swapCached) / memTotal); + } + if (swapTotal != zero) { + swap = 1.0f - ((swapFree) / swapTotal); + } + osInfo = OSInfo.newBuilder() + .setUser(user) + .setSystem(system) + .setCpu(cpu) + .setSwap(swap * 100f) + .setMem(mem * 100f) + .build(); + } + } + } catch (IOException e) { + ErrorLog.error("读取linux进程信息失败", e); + } + return exitCode; + } + + private float parseKb(String str) { + float res; + try { + res = Float.parseFloat(str.replace("k", "")); + } catch (Exception e) { + res = 0.0f; + } + return res; + } + + public List getProcessMonitors() { + return processMonitors; + } + + public OSInfo getOsInfo() { + return osInfo; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/tool/RunShell.java b/hera-core/src/main/java/com/dfire/core/tool/RunShell.java new file mode 100755 index 00000000..ec1ca893 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/tool/RunShell.java @@ -0,0 +1,78 @@ +package com.dfire.core.tool; + +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import lombok.Data; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author xiaosuda + * @date 2018/8/6 + */ +@Data +public class RunShell { + private List commands; + private ProcessBuilder builder; + private Integer exitCode = -1; + private Process process; + private String directory = "/tmp"; + + public RunShell(String command) { + setCommand(command); + } + + public RunShell() { + + } + + public void setCommand(String command) { + commands = new ArrayList<>(3); + commands.add("sh"); + commands.add("-c"); + commands.add(command); + } + + public Integer run() { + builder = new ProcessBuilder(commands); + builder.directory(new File(directory)); + builder.environment().putAll(HeraGlobalEnv.userEnvMap); + try { + process = builder.start(); + if (process.waitFor(2, TimeUnit.SECONDS)) { + return exitCode = 0; + } + return exitCode; + } catch (IOException | InterruptedException e) { + ErrorLog.error("执行shell异常", e); + } + return exitCode; + } + + public void setDirectory(String directory) { + this.directory = directory; + } + + public String getResult() throws IOException { + if (exitCode == 0) { + return readFromInputStream(process.getInputStream()); + } else { + return readFromInputStream(process.getErrorStream()); + } + } + + private String readFromInputStream(InputStream inputStream) throws IOException { + BufferedReader input = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); + String line; + StringBuilder result = new StringBuilder(); + while ((line = input.readLine()) != null) { + result.append(line).append("\n"); + } + input.close(); + return result.toString().trim(); + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/tool/pool/AbstractDataSourcePool.java b/hera-core/src/main/java/com/dfire/core/tool/pool/AbstractDataSourcePool.java new file mode 100755 index 00000000..5af87dec --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/tool/pool/AbstractDataSourcePool.java @@ -0,0 +1,63 @@ +package com.dfire.core.tool.pool; + +import com.alibaba.druid.pool.DruidDataSource; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; + +import java.sql.Connection; + +/** + * @Description : Druid连接池 + * @Author : HeGuoZi + * @Date : 10:04 2018/8/24 + * @Modified : + */ +public abstract class AbstractDataSourcePool { + + private volatile boolean isClose; + + private DruidDataSource dataSource; + + public AbstractDataSourcePool() { + dataSource = new DruidDataSource(); + dataSource.setDriverClassName(HeraGlobalEnv.getSparkDriver()); + dataSource.setUrl(HeraGlobalEnv.getSparkAddress()); + dataSource.setUsername(HeraGlobalEnv.getSparkUser()); + dataSource.setPassword(HeraGlobalEnv.getSparkPassword()); + dataSource.setInitialSize(1); + dataSource.setMaxActive(20); + dataSource.setMinIdle(1); + dataSource.setTestOnBorrow(true); + dataSource.setTestOnReturn(false); + dataSource.setTestWhileIdle(true); + dataSource.setTimeBetweenEvictionRunsMillis(600 * 1000); + isClose = false; + } + + public Connection getConnection() { + if (isClose || dataSource == null) { + return null; + } + try { + return dataSource.getConnection(); + } catch (Exception e) { + ErrorLog.error("获取连接失败", e); + return null; + } + } + + public void close() { + if (!isClose) { + isClose = true; + if (dataSource != null) { + dataSource.close(); + dataSource = null; + } + } + } + + public boolean isClose() { + return isClose; + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/tool/pool/JdbcDataSourcePool.java b/hera-core/src/main/java/com/dfire/core/tool/pool/JdbcDataSourcePool.java new file mode 100755 index 00000000..ebe24041 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/tool/pool/JdbcDataSourcePool.java @@ -0,0 +1,16 @@ +package com.dfire.core.tool.pool; + +/** + * @Description : + * @Author : HeGuoZi + * @Date : 10:11 2018/8/24 + * @Modified : + */ +public class JdbcDataSourcePool extends AbstractDataSourcePool { + + public JdbcDataSourcePool() { + super(); + } + +} + diff --git a/hera-core/src/main/java/com/dfire/core/util/CommandUtils.java b/hera-core/src/main/java/com/dfire/core/util/CommandUtils.java new file mode 100755 index 00000000..26490c3c --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/util/CommandUtils.java @@ -0,0 +1,57 @@ +package com.dfire.core.util; + +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.Pair; +import com.dfire.config.HeraGlobalEnv; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author xiaosuda + * @date 2018/4/16 + */ +public class CommandUtils { + + private static final String CHANGE_AUTHORITY = "chmod -R 777 "; + private static final String RUN_SH_COMMAND = " " + HeraGlobalEnv.getJobShellBin() + " "; + private static Pattern hostPattern = Pattern.compile("\\w+@[\\w\\.-]+\\s*"); + + /** + * 修改文件权限命令 + * + * @param filePath 文件路径 + * @return 民营 + */ + public static String changeFileAuthority(String filePath) { + return CHANGE_AUTHORITY + filePath; + } + + /** + * 关闭终端不影响提交的程序 + * + * @param prefix 切换的用户命令 + * @param shellFilePath 脚本路径 + * @return 命令 + */ + public static String getRunShCommand(String prefix, String shellFilePath) { + if (HeraGlobalEnv.isLinuxSystem()) { + return "setsid " + prefix + RUN_SH_COMMAND + shellFilePath; + } + return prefix + RUN_SH_COMMAND + shellFilePath; + } + + public static Pair parseCmd(String loginCmd) throws HeraException { + String scpCmd = loginCmd.replace("ssh", "scp"); + Matcher matcher = hostPattern.matcher(scpCmd); + String loginStr; + if (matcher.find()) { + loginStr = matcher.group(0); + } else { + throw new HeraException("查找ip失败" + scpCmd); + } + String prefix = scpCmd.replace(loginStr, "").replace("-p", "-P") + " -r "; + + return Pair.of(prefix, loginStr); + } +} diff --git a/hera-core/src/main/java/com/dfire/core/util/CronParse.java b/hera-core/src/main/java/com/dfire/core/util/CronParse.java new file mode 100755 index 00000000..c5def31d --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/util/CronParse.java @@ -0,0 +1,65 @@ +package com.dfire.core.util; + +import com.dfire.common.util.ActionUtil; +import com.dfire.logs.ErrorLog; +import org.quartz.CronExpression; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * @author: 凌霄 + * @time: Created in 上午10:15 2018/5/10 + * @desc cron表达式解析工具,返回解析result + */ +public class CronParse { + + public static boolean Parser(String cronExpression, String cronDate, List result) { + if (cronExpression == null || cronExpression.length() < 1 + || cronDate == null || cronDate.length() < 1) { + return false; + } else { + CronExpression exp; + try { + // 初始化cron表达式解析器 + exp = new CronExpression(cronExpression); + } catch (ParseException e) { + ErrorLog.error("解析cron表达式异常", e); + return false; + } + // 定义生成时间范围 + // 定义开始时间,前一天的23点59分59秒 + Calendar c = Calendar.getInstance(); + String sStart = cronDate + " 00:00:00"; + SimpleDateFormat sdf = new java.text.SimpleDateFormat( + ActionUtil.DEFAULT_FORMAT); + Date dStart = null; + try { + dStart = sdf.parse(sStart); + } catch (ParseException e) { + ErrorLog.error("日期解析失败", e); + return false; + } + c.setTime(dStart); + c.add(Calendar.SECOND, -1); + dStart = c.getTime(); + + // 定义结束时间,当天的23点59分59秒 + c.add(Calendar.DATE, 1); + Date dEnd = c.getTime(); + + // 生成时间序列 + Date dd = dStart; + dd = exp.getNextValidTimeAfter(dd); + while ((dd.getTime() >= dStart.getTime()) + && (dd.getTime() <= dEnd.getTime())) { + result.add(sdf.format(dd)); + dd = exp.getNextValidTimeAfter(dd); + } + } + return true; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/util/FileUtils.java b/hera-core/src/main/java/com/dfire/core/util/FileUtils.java new file mode 100755 index 00000000..24defd0e --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/util/FileUtils.java @@ -0,0 +1,40 @@ +package com.dfire.core.util; + +import com.dfire.logs.HeraLog; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Properties; + +/** + * desc: + * + * @author scx + * @create 2020/09/22 + */ +public class FileUtils { + + private static Properties properties; + + static { + InputStream stream = NetUtils.class.getClassLoader().getResourceAsStream("config/hera.properties"); + + properties = new Properties(); + try { + properties.load(stream); + } catch (IOException e) { + throw new RuntimeException(e); + } + for (Map.Entry entry : properties.entrySet()) { + HeraLog.info(String.format("load hera properties: %s=%s", entry.getKey(), entry.getValue())); + } + } + + + public static String getKey(String key) { + return properties.getProperty(key); + } + + +} diff --git a/hera-core/src/main/java/com/dfire/core/util/JobUtils.java b/hera-core/src/main/java/com/dfire/core/util/JobUtils.java new file mode 100755 index 00000000..fbdb7a31 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/util/JobUtils.java @@ -0,0 +1,226 @@ +package com.dfire.core.util; + +import com.dfire.common.constants.Constants; +import com.dfire.common.constants.RunningJobKeyConstant; +import com.dfire.common.entity.HeraDebugHistory; +import com.dfire.common.entity.model.HeraJobBean; +import com.dfire.common.entity.vo.HeraJobHistoryVo; +import com.dfire.common.entity.vo.HeraProfileVo; +import com.dfire.common.enums.JobRunTypeEnum; +import com.dfire.common.exception.HeraException; +import com.dfire.common.util.BeanConvertUtils; +import com.dfire.common.util.HierarchyProperties; +import com.dfire.common.util.PasswordUtils; +import com.dfire.common.util.RenderHierarchyProperties; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.core.job.*; +import com.dfire.core.netty.worker.WorkContext; +import com.dfire.logs.HeraLog; +import com.google.common.collect.Lists; +import org.apache.commons.lang.StringUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author: 凌霄 + * @time: Created in 上午12:13 2018/4/26 + * @desc 任务执行体job的创建工具,创建任务依据任务配置创建任务前置处理,核心执行体,后置处理,以及脚本中的变量替换 + */ +public class JobUtils { + + private static final Pattern downloadPatt = Pattern.compile("download\\[.*://.+]"); + + + private static final Pattern valPatt = Pattern.compile("\\$\\{([^}{$])*\\}"); + + + public static Job createDebugJob(JobContext jobContext, HeraDebugHistory heraDebugHistory, HeraJobBean heraJobBean, + String workDir, WorkContext workContext) throws HeraException { + jobContext.setDebugHistory(BeanConvertUtils.convert(heraDebugHistory)); + jobContext.setWorkDir(workDir); + if (heraJobBean != null) { + jobContext.setProperties(new RenderHierarchyProperties(heraJobBean.getHierarchyProperties())); + } + + HierarchyProperties hierarchyProperties = new HierarchyProperties(new HashMap<>()); + String script = heraDebugHistory.getScript(); + List> resources = new ArrayList<>(); + script = resolveScriptResource(resources, script); + script = replace(jobContext.getProperties().getAllProperties(), script); + script = RenderHierarchyProperties.render(script, null); + jobContext.setResources(resources); + hierarchyProperties.setProperty(RunningJobKeyConstant.JOB_SCRIPT, script); + + String owner = workContext.getHeraFileService().findById(heraDebugHistory.getFileId()).getOwner(); + HeraProfileVo heraProfile = workContext.getHeraProfileService().findByOwner(owner); + if (heraProfile != null && heraProfile.getHadoopConf() != null) { + for (String key : heraProfile.getHadoopConf().keySet()) { + hierarchyProperties.setProperty(key, heraProfile.getHadoopConf().get(key)); + } + } + + jobContext.setProperties(new RenderHierarchyProperties(hierarchyProperties)); + hierarchyProperties.setProperty("hadoop.mappred.job.hera_id", "hera_debug_" + heraDebugHistory.getId()); + + List pres = buildPreJob(jobContext); + + Job core = null; + + if (heraDebugHistory.getRunType().equalsIgnoreCase(JobRunTypeEnum.Shell.toString())) { + jobContext.putData(RunningJobKeyConstant.JOB_RUN_TYPE, JobRunTypeEnum.Shell.toString()); + core = new HadoopShellJob(jobContext); + } else if (heraDebugHistory.getRunType().equalsIgnoreCase(JobRunTypeEnum.Hive.toString())) { + jobContext.putData(RunningJobKeyConstant.JOB_RUN_TYPE, JobRunTypeEnum.Hive.toString()); + core = new HiveJob(jobContext); + } else if (heraDebugHistory.getRunType().equalsIgnoreCase(JobRunTypeEnum.Spark.toString())) { + jobContext.putData(RunningJobKeyConstant.JOB_RUN_TYPE, JobRunTypeEnum.Spark.toString()); + core = new SparkJob(jobContext); + } else if (heraDebugHistory.getRunType().equalsIgnoreCase(JobRunTypeEnum.Spark2.toString())) { + jobContext.putData(RunningJobKeyConstant.JOB_RUN_TYPE, JobRunTypeEnum.Spark2.toString()); + core = new Spark2Job(jobContext); + } + return new ProcessJobContainer(jobContext, pres, new ArrayList<>(), core); + } + + + public static Job createScheduleJob(JobContext jobContext, HeraJobBean jobBean, + HeraJobHistoryVo history, String workDir) throws HeraException { + jobContext.setHeraJobHistory(history); + jobContext.setWorkDir(workDir); + jobContext.getProperties().setProperty("hera.encode", "utf-8"); + HierarchyProperties hierarchyProperties = jobBean.getHierarchyProperties(); + + jobContext.setProperties(new RenderHierarchyProperties(hierarchyProperties)); + List> resource = jobBean.getHierarchyResources(); + String script = jobBean.getHeraJob().getScript(); + if (jobBean.getHeraJob().getRunType().equals(JobRunTypeEnum.Shell.toString()) + || jobBean.getHeraJob().getRunType().equals(JobRunTypeEnum.Hive.toString()) + || jobBean.getHeraJob().getRunType().equals(JobRunTypeEnum.Spark.toString())) { + script = resolveScriptResource(resource, script); + } + jobContext.setResources(resource); + script = replace(jobContext.getProperties().getAllProperties(), script); + script = RenderHierarchyProperties.render(script, String.valueOf(history.getActionId()).substring(0, 12)); + hierarchyProperties.setProperty(RunningJobKeyConstant.JOB_SCRIPT, script); +// List pres = buildPreJob(jobContext); + List pres = Lists.newArrayList(new DownLoadJob(jobContext), new EmptyJob(jobContext)); + List posts = new ArrayList<>(); + Job core = null; + JobRunTypeEnum runType = JobRunTypeEnum.parser(jobBean.getHeraJob().getRunType()); + if (runType == JobRunTypeEnum.Shell) { + core = new HadoopShellJob(jobContext); + } else if (runType == JobRunTypeEnum.Hive) { + core = new HiveJob(jobContext); + } else if (runType == JobRunTypeEnum.Spark) { + core = new SparkJob(jobContext); + } else if (runType == JobRunTypeEnum.Spark2) { + core = new Spark2Job(jobContext); + } + return new ProcessJobContainer(jobContext, pres, posts, core); + + } + + private static List buildPreJob(JobContext jobContext) { + List pres = new ArrayList<>(1); + pres.add(new DownLoadJob(jobContext)); + return pres; + } + + private static String replace(Map allProperties, String script, boolean dbReplace) { + if (script == null) { + return null; + } + Map varMap = new HashMap<>(allProperties.size()); + if (dbReplace && WorkContext.cacheDBMap != null && WorkContext.cacheDBMap.size() != 0) { + varMap.putAll(WorkContext.cacheDBMap); + } + String key; + String areaSuffix = HeraGlobalEnv.getArea() + "."; + for (Map.Entry entry : allProperties.entrySet()) { + key = entry.getKey(); + varMap.put(key, entry.getValue()); + if (key.startsWith(areaSuffix)) { + varMap.putIfAbsent(key.replaceFirst(areaSuffix, ""), entry.getValue()); + } + if (key.toLowerCase().startsWith(Constants.SECRET_PREFIX)) { + varMap.put(key, PasswordUtils.aesDecrypt(entry.getValue())); + } + } + return replaceVal(script, varMap); + } + + private static String replace(Map allProperties, String script) { + return replace(allProperties, script, true); + } + + public static String previewScript(Map allProperties, String script) { + return replace(allProperties, script, false); + } + + /** + * 解析脚本中download开头的脚本,解析后存储在jobContext的resources中,在生成ProcessJobContainer时,根据属性生成preProcess,postProcess + * + * @param resources 资源下载 + * @param script 脚本内容 + * @return + */ + private static String resolveScriptResource(List> resources, String script) { + Matcher matcher = downloadPatt.matcher(script); + while (matcher.find()) { + String group = matcher.group(); + group = group.substring(group.indexOf("[") + 1, group.indexOf("]")); + String[] url = StringUtils.split(group, " "); + String uri = null; + String name = null; + if (url.length == 1) { + uri = url[0]; + HeraLog.warn("can not found download name,will use default name,{}", group); + } else if (url.length == 2) { + uri = url[0]; + name = url[1]; + } + Map map = new HashMap<>(2); + boolean exist = false; + for (Map env : resources) { + if (env.get("name").equals(name)) { + exist = true; + break; + } + } + //TODO 脚本中不存在 就不用下载了 + if (!exist) { + map.put("uri", uri); + map.put("name", name); + resources.add(map); + } + } + script = matcher.replaceAll(""); + return script; + } + + private static String replaceVal(String script, Map confs) { + Matcher matcher = valPatt.matcher(script); + StringBuilder newScript = new StringBuilder(); + int start = 0, end; + + while (matcher.find()) { + String var = matcher.group(); + end = matcher.start(); + newScript.append(script, start, end); + String val; + while (!(val = confs.getOrDefault(var.substring(2, var.length() - 1), var)).equals(var) && val.matches(valPatt.pattern())) { + var = val; + } + newScript.append(val); + start = matcher.end(); + } + newScript.append(script, start, script.length()); + return newScript.toString(); + } + +} diff --git a/hera-core/src/main/java/com/dfire/core/util/JwtUtils.java b/hera-core/src/main/java/com/dfire/core/util/JwtUtils.java new file mode 100755 index 00000000..b6740ec3 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/util/JwtUtils.java @@ -0,0 +1,100 @@ +package com.dfire.core.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.dfire.common.constants.Constants; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import java.io.UnsupportedEncodingException; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author xiaosuda + * @date 2018/7/13 + */ +public class JwtUtils { + + private final static String secret = "WWW.TWO_D_FIRE.COM/INFRASTRUCTURE"; + + private static Algorithm algorithm = null; + + static { + try { + algorithm = Algorithm.HMAC256(secret); + } catch (UnsupportedEncodingException e) { + ErrorLog.error("不支持的编码方式", e); + } + } + + public static String createToken(String username, String userId, String ssoId, String ssoName) { + Map header = new HashMap<>(2); + header.put("alg", "HS256"); + header.put("typ", "JWT"); + Calendar calendar = Calendar.getInstance(); + Date now = calendar.getTime(); + calendar.add(Calendar.MINUTE, HeraGlobalEnv.getWebSessionExpire().intValue()); + Date expireDate = calendar.getTime(); + return JWT.create().withHeader(header) + .withClaim("iss", "hera") + .withClaim("aud", "2dfire") + .withClaim(Constants.SESSION_USERNAME, username) + .withClaim(Constants.SESSION_USER_ID, userId) + .withClaim(Constants.SESSION_SSO_ID, ssoId) + .withClaim(Constants.SESSION_SSO_NAME, ssoName) + .withIssuedAt(now) + .withExpiresAt(expireDate) + .sign(algorithm); + } + + public static boolean verifyToken(String token) { + return getClaims(token) != null; + } + + + private static Map getClaims(String token) { + DecodedJWT jwt; + JWTVerifier verifier = JWT.require(algorithm).build(); + try { + jwt = verifier.verify(token); + } catch (Exception e) { + HeraLog.info("token 过期"); + return null; + } + return jwt.getClaims(); + } + + public static String getObjectFromToken(String token, String key) { + Map claimMap = getClaims(token); + if (claimMap != null && claimMap.get(key) != null) { + return claimMap.get(key).asString(); + } + return null; + } + + public static String getObjectFromToken(String tokenName, HttpServletRequest request, String key) { + String token = getValFromCookies(tokenName, request); + return getObjectFromToken(token, key); + } + + public static String getValFromCookies(String tokenName, HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + if (cookies != null && cookies.length > 0) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals(tokenName)) { + return cookie.getValue(); + } + } + } + return null; + } +} diff --git a/hera-core/src/main/java/com/dfire/core/util/NetUtils.java b/hera-core/src/main/java/com/dfire/core/util/NetUtils.java new file mode 100755 index 00000000..57313bf4 --- /dev/null +++ b/hera-core/src/main/java/com/dfire/core/util/NetUtils.java @@ -0,0 +1,142 @@ +package com.dfire.core.util; + +import com.dfire.common.constants.Constants; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.HeraLog; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.UnknownHostException; +import java.util.Enumeration; +import java.util.Optional; +import java.util.regex.Pattern; + +import static com.dfire.common.constants.Constants.ANYHOST_VALUE; +import static com.dfire.common.constants.Constants.LOCALHOST_VALUE; + +/** + * reference dubbo: org.apache.dubbo.common.utils.NetUtils + * + * @author xiaosuda + * @date 2018/6/13 + */ + +@Slf4j +public class NetUtils { + + private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$"); + private static String LOCAL_ADDRESS = null; + + public static String getLocalAddress() { + String ip = FileUtils.getKey(Constants.SERVER_KEY); + if (ip != null && !ip.equals(LOCALHOST_VALUE)) { + return ip; + } + if (LOCAL_ADDRESS != null) { + return LOCAL_ADDRESS; + } + InetAddress localAddress = getLocalAddress0(); + LOCAL_ADDRESS = localAddress.getHostAddress(); + return localAddress.getHostAddress(); + } + + private static InetAddress getLocalAddress0() { + InetAddress localAddress = null; + try { + localAddress = InetAddress.getLocalHost(); + Optional addressOp = toValidAddress(localAddress); + if (addressOp.isPresent()) { + return addressOp.get(); + } + } catch (Throwable e) { + ErrorLog.error(e); + } + + try { + Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); + if (null == interfaces) { + return localAddress; + } + while (interfaces.hasMoreElements()) { + try { + NetworkInterface network = interfaces.nextElement(); + if (network.isLoopback() || network.isVirtual() || !network.isUp()) { + continue; + } + Enumeration addresses = network.getInetAddresses(); + while (addresses.hasMoreElements()) { + try { + Optional addressOp = toValidAddress(addresses.nextElement()); + if (addressOp.isPresent()) { + try { + if (addressOp.get().isReachable(100)) { + return addressOp.get(); + } + } catch (IOException e) { + // ignore + } + } + } catch (Throwable e) { + ErrorLog.error(e); + } + } + } catch (Throwable e) { + ErrorLog.error(e); + } + } + } catch (Throwable e) { + ErrorLog.error(e); + } + return localAddress; + } + + private static Optional toValidAddress(InetAddress address) { + if (address instanceof Inet6Address) { + Inet6Address v6Address = (Inet6Address) address; + if (isPreferIPV6Address()) { + return Optional.ofNullable(normalizeV6Address(v6Address)); + } + } + if (isValidV4Address(address)) { + return Optional.of(address); + } + return Optional.empty(); + } + + static boolean isValidV4Address(InetAddress address) { + if (address == null || address.isLoopbackAddress()) { + return false; + } + String name = address.getHostAddress(); + boolean result = (name != null + && IP_PATTERN.matcher(name).matches() + && !ANYHOST_VALUE.equals(name) + && !LOCALHOST_VALUE.equals(name)); + return result; + } + + static boolean isPreferIPV6Address() { + boolean preferIpv6 = Boolean.getBoolean("java.net.preferIPv6Addresses"); + if (!preferIpv6) { + return false; + } + return false; + } + + static InetAddress normalizeV6Address(Inet6Address address) { + String addr = address.getHostAddress(); + int i = addr.lastIndexOf('%'); + if (i > 0) { + try { + return InetAddress.getByName(addr.substring(0, i) + '%' + address.getScopeId()); + } catch (UnknownHostException e) { + // ignore + HeraLog.info("Unknown IPV6 address: ", e); + } + } + return address; + } +} diff --git a/hera-core/src/test/java/SparkTest.java b/hera-core/src/test/java/SparkTest.java new file mode 100755 index 00000000..eb6ed034 --- /dev/null +++ b/hera-core/src/test/java/SparkTest.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.util.Date; + +/** + * @Description : spark test + * @Author : HeGuoZi + * @Date : 15:57 2018/8/20 + * @Modified : + */ +public class SparkTest { + + @Test + public void test() { + System.out.println(new Date().getTime()); + System.out.println(System.currentTimeMillis()); + } +} diff --git a/hera-monitor/pom.xml b/hera-monitor/pom.xml new file mode 100755 index 00000000..2edfc899 --- /dev/null +++ b/hera-monitor/pom.xml @@ -0,0 +1,40 @@ + + + + + hera + com.dfire.hera + 2.4.2 + + 4.0.0 + + hera-monitor + ${hera.monitor.version} + hera-monitor + http://www.example.com + + + UTF-8 + + + + + + com.dfire.hera + hera-common + + + + + junit + junit + 4.11 + test + + + + + + + diff --git a/hera-monitor/src/main/java/com/dfire/monitor/domain/ActionTime.java b/hera-monitor/src/main/java/com/dfire/monitor/domain/ActionTime.java new file mode 100755 index 00000000..ab332d01 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/domain/ActionTime.java @@ -0,0 +1,20 @@ +package com.dfire.monitor.domain; + +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 上午10:58 2018/8/15 + * @desc + */ +@Data +public class ActionTime { + + private Integer jobId; + + private String actionId; + + private String jobTime; + + private Integer yesterdayTime; +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/domain/AlarmInfo.java b/hera-monitor/src/main/java/com/dfire/monitor/domain/AlarmInfo.java new file mode 100755 index 00000000..8624e052 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/domain/AlarmInfo.java @@ -0,0 +1,21 @@ +package com.dfire.monitor.domain; + +import lombok.*; + +/** + * desc: + * + * @author scx + * @create 2019/04/27 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class AlarmInfo { + + private String message; + private String userId; + private String phone; +} \ No newline at end of file diff --git a/hera-monitor/src/main/java/com/dfire/monitor/domain/JobHistoryVo.java b/hera-monitor/src/main/java/com/dfire/monitor/domain/JobHistoryVo.java new file mode 100755 index 00000000..567c3fd9 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/domain/JobHistoryVo.java @@ -0,0 +1,39 @@ +package com.dfire.monitor.domain; + +import lombok.Data; + + +/** + * @author: 凌霄 + * @time: Created in 下午3:42 2018/8/15 + * @desc + */ +@Data +public class JobHistoryVo { + + private String jobId; + + //private String actionId; + + private String startTime; + + private String endTime; + + private String executeHost; + + private String status; + + private String operator; + + private String description; + + private String jobName; + + private String groupId; + + private String groupName; + + private Integer times; + + private String bizLabel; +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/domain/JobStatusNum.java b/hera-monitor/src/main/java/com/dfire/monitor/domain/JobStatusNum.java new file mode 100755 index 00000000..01a6836c --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/domain/JobStatusNum.java @@ -0,0 +1,18 @@ +package com.dfire.monitor.domain; + +import lombok.Data; + +/** + * @author: 凌霄 + * @time: Created in 上午11:35 2018/8/15 + * @desc + */ +@Data +public class JobStatusNum { + + private String status; + + private Integer num; + + private String curDate; +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/mapper/JobManagerMapper.java b/hera-monitor/src/main/java/com/dfire/monitor/mapper/JobManagerMapper.java new file mode 100755 index 00000000..1e761ffb --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/mapper/JobManagerMapper.java @@ -0,0 +1,131 @@ +package com.dfire.monitor.mapper; + +import com.dfire.monitor.domain.ActionTime; +import com.dfire.monitor.domain.JobHistoryVo; +import com.dfire.monitor.domain.JobStatusNum; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * @author: 凌霄 + * @time: Created in 下午3:05 2018/8/14 + * @desc + */ +public interface JobManagerMapper { + + /** + * 今日任务详情 + * + * @param status + * @return + */ + +// @Select("select " + +// " his.job_id,job.name as job_name,job.description,his.start_time,his.end_time,his.execute_host,his.status,his.operator,count(*) as times " + +// " from" + +// " (select job_id,start_time start_time,end_time,execute_host,status,operator from hera_action_history " + +// " where action_id >= CURRENT_DATE () * 10000000000 and status = #{status,jdbcType=VARCHAR}) his " + +// " left join hera_job job on his.job_id = job.id" + +// " group by his.job_id,job.name,job.description,his.start_time,his.end_time,his.execute_host,his.status,his.operator" + +// " order by job_id") + + + /** + * ADDDATE(CAST(#{dt,jdbcType=VARCHAR} AS date) ,1) ) + * @param status + * @param begindt + * @param enddt + * @return + */ + @Select( + "select his.job_id,job.name as job_name,job.description,his.start_time,his.end_time " + + " ,his.execute_host, his.status ,his.operator ,his.biz_label " + + " ,j.times " + + " ,CAST(timestampdiff(SECOND, his.start_time,CASE WHEN his.end_time IS NOT NULL THEN his.end_time WHEN his.status='running' THEN NOW() END)/60.0 AS decimal(10,1)) AS durations " + + " ,job.group_id as groupId,grp.name as groupName" + + " FROM " + + " (SELECT job_id,MAX(`id`) as id_max,count(1) as times " + + " FROM hera_action_history " + + " WHERE (start_time>=CAST(#{begindt,jdbcType=VARCHAR} AS date) and start_time< ADDDATE( CAST(#{enddt,jdbcType=VARCHAR} AS date) ,1) )" + + " and ( status = #{status,jdbcType=VARCHAR} or 'all' = #{status,jdbcType=VARCHAR} ) " + + " GROUP BY job_id ) j " + + " left join hera_action_history his on j.job_id=his.job_id and j.id_max=his.`id` " + + " left join hera_job job on j.job_id = job.`id` " + + " left join hera_group grp on job.group_id=grp.`id` " + + " ORDER BY his.start_time DESC, grp.name,job.name" + ) + List findAllJobHistoryByStatus(@Param("status") String status,@Param("begindt") String begindt,@Param("enddt") String enddt); + + + /** + * 任务运行时长top10 + * + * @param map + * @return + */ + + + @Select("select job_id,action_id, timestampdiff(SECOND,start_time,end_time)/60 as job_time " + + "from hera_action_history " + + "where action_id >= #{startDate} and action_id < #{endDate} " + + "order by job_time desc limit #{limitNum}") + List findJobRunTimeTop10(Map map); + + /** + * 任务昨日运行时长 + * + * @param jobId + * @param id + * @return + */ + @Select(" select max(timestampdiff(SECOND,start_time,end_time)/60) from hera_action_history" + + " WHERE job_id = #{jobId}" + + " AND left(action_id,8) = #{id}") + Integer getYesterdayRunTime(@Param("jobId") Integer jobId, @Param("id") String id); + + /** + * 按照运行状态汇总,初始化首页饼图 + * + * @return + */ + @Select(" select status,count(1) as num" + + " from" + + " (" + + " select job_id,substring_index(group_concat(status order by start_time desc),\",\",1) as status" + + " from hera_action_history" + + " where action_id>=CURRENT_DATE () * 10000000000" + + " group by job_id" + + " ) t" + + " group by status") + List findAllJobStatus(); + + + /** + * 按照日期查询任务明细 + * + * @return + */ + + @Select("select status, count(1) as num " + + "from (" + + "select job_id, status from hera_action where id >= #{startDate} and id < #{endDate} and status is not null group by job_id ,status " + + ") tmp group by status") + List findJobDetailByDate(@Param("startDate") long startDate, @Param("endDate") long endDate); + + /** + * 按照status查询任务明细 + * + * @param status + * @return + */ + @Select(" select count(1) num ,status, LEFT(start_time,10) curDate " + + " from hera_action_history " + + " where " + + " action_id >= #{lastDate} " + + " and status = #{status,jdbcType=VARCHAR} " + + " GROUP BY LEFT(start_time,10)") + List findJobDetailByStatus(@Param("lastDate") long lastDate, @Param("status") String status); +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/AlarmCenter.java b/hera-monitor/src/main/java/com/dfire/monitor/service/AlarmCenter.java new file mode 100755 index 00000000..156323f2 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/AlarmCenter.java @@ -0,0 +1,36 @@ +package com.dfire.monitor.service; + +import com.dfire.monitor.domain.AlarmInfo; + +/** + * @author scx + */ +public interface AlarmCenter { + + /** + * 发送监控信息到企业微信 + * + * @param alarmInfo + * @return JSONObject + */ + boolean sendToWeChat(AlarmInfo alarmInfo); + + /** + * 发送监控信息到手机 + * + * @param alarmInfo alarmInfo + * @return JSONObject + */ + boolean sendToPhone(AlarmInfo alarmInfo); + + + /** + * 发送信息到邮件 + * + * @param title 邮件标题 + * @param content 邮件内容(html格式) + * @param address 邮件地址,多个使用;分割 + */ + boolean sendToEmail(String title, String content, String address); + +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/JobManageService.java b/hera-monitor/src/main/java/com/dfire/monitor/service/JobManageService.java new file mode 100755 index 00000000..2f6a0fc4 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/JobManageService.java @@ -0,0 +1,46 @@ +package com.dfire.monitor.service; + + +import com.dfire.common.entity.model.JsonResponse; + +/** + * @author: 凌霄 + * @time: Created in 下午4:12 2018/8/14 + * @desc + */ +public interface JobManageService { + + + + /** + * 进入任务详情查询 + * + * @param status + * @return + */ + JsonResponse findJobHistoryByStatus(String status, String begindt,String enddt); + + + /** + * 查询任务运行时长top10 + * + * @return + */ + JsonResponse findJobRunTimeTop10(); + + /** + * 今日所有任务状态,首页饼图 + * + * @return + */ + JsonResponse findAllJobStatus(); + + + /** + * 今日任务详情明细,初始化曲线图 + * + * @return + */ + + JsonResponse findAllJobStatusDetail(); +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/impl/AbstractJobFailAlarm.java b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/AbstractJobFailAlarm.java new file mode 100755 index 00000000..9ee3fa3c --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/AbstractJobFailAlarm.java @@ -0,0 +1,51 @@ +package com.dfire.monitor.service.impl; + +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.service.JobFailAlarm; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; + +import java.util.Set; +import java.util.stream.Collectors; + +/** + * desc: + * + * @author scx + * @create 2019/04/28 + */ +public abstract class AbstractJobFailAlarm implements JobFailAlarm { + + + /** + * 任务失败告警 + * @param heraJob 任务实例 + * @param runCount 运行次数 + * @param monitorUser 监控人 + * @return 消息 + */ + protected String buildJobErrorMsg(HeraJob heraJob, int runCount, Set monitorUser) { + + return "hera任务失败了 \n" + + "环境:" + HeraGlobalEnv.getEnv() + "\n" + + "区域:" + HeraGlobalEnv.getArea() + "\n" + + "名称:" + heraJob.getName() + "\n" + + "描述:" + heraJob.getDescription() + "\n" + + "任务ID:" + heraJob.getId() + "\n" + + "失败次数:" + runCount + "\n" + + "负责人:" + monitorUser.stream().map(HeraSso::getName).collect(Collectors.joining(Constants.SEMICOLON)) + "\n"; + } + + + protected String buildTimeoutMsg(JobElement element, Set monitorUser) { + return "【警告】任务执行超时\n" + + "环境:" + HeraGlobalEnv.getEnv() + "\n" + + "区域:" + HeraGlobalEnv.getArea() + "\n" + + "任务ID:" + ActionUtil.getJobId(element.getJobId()) + "\n" + + "预计时长:" + element.getCostMinute() + "分钟" + + "负责人:" + monitorUser.stream().map(HeraSso::getName).collect(Collectors.joining(Constants.SEMICOLON)) + "\n"; + } +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/impl/AlarmCenterImpl.java b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/AlarmCenterImpl.java new file mode 100755 index 00000000..a7940033 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/AlarmCenterImpl.java @@ -0,0 +1,52 @@ +package com.dfire.monitor.service.impl; + +import com.dfire.common.service.EmailService; +import com.dfire.logs.ErrorLog; +import com.dfire.logs.MonitorLog; +import com.dfire.monitor.domain.AlarmInfo; +import com.dfire.monitor.service.AlarmCenter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.mail.MessagingException; + + +/** + * desc: + * + * @author scx + * @create 2019/04/27 + */ +@Service +public class AlarmCenterImpl implements AlarmCenter { + + + @Autowired + private EmailService emailService; + + @Override + public boolean sendToWeChat(AlarmInfo alarmInfo) { + //TODO 使用者自己开发 + MonitorLog.info("[微信告警]userInfo:{},消息结果:{}", alarmInfo.toString(), "请管理员自己设置企业微信告警配置"); + return false; + } + + @Override + public boolean sendToPhone(AlarmInfo alarmInfo) { + //TODO 使用者自己开发 + MonitorLog.info("[电话告警]userInfo:{},消息结果:{}", alarmInfo.toString(), "请管理员自己设置企业微信告警配置"); + return false; + } + + @Override + public boolean sendToEmail(String title, String content, String address) { + try { + emailService.sendEmail(title, content, address); + return true; + } catch (MessagingException e) { + ErrorLog.error("发送邮件[title:" + title + ",content:" + content + "]失败", e); + + } + return false; + } +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/impl/EmailJobFailAlarm.java b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/EmailJobFailAlarm.java new file mode 100755 index 00000000..2b8c8e60 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/EmailJobFailAlarm.java @@ -0,0 +1,97 @@ +package com.dfire.monitor.service.impl; + +import com.dfire.common.config.Alarm; +import com.dfire.common.constants.Constants; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraJobHistory; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.enums.AlarmLevel; +import com.dfire.common.service.*; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.event.HeraJobFailedEvent; +import com.dfire.logs.ErrorLog; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.mail.MessagingException; +import java.util.Optional; +import java.util.Set; + +/** + * @author xiaosuda + * @date 2019/2/25 + */ +@Alarm("emailJobFailAlarm") +public class EmailJobFailAlarm extends AbstractJobFailAlarm { + + + @Autowired + private HeraUserService heraUserService; + + @Autowired + private EmailService emailService; + + @Autowired + private HeraJobHistoryService heraJobHistoryService; + + @Autowired + private HeraJobService heraJobService; + + @Override + public void alarm(HeraJobFailedEvent failedEvent, Set monitorUser) { + HeraJob heraJob = failedEvent.getHeraJob(); + if (AlarmLevel.lessThan(heraJob.getOffset(), AlarmLevel.EMAIL) || heraJob.getAuto() != 1) { + return; + } + StringBuilder address = new StringBuilder(); + Optional.ofNullable(heraUserService.findByName(heraJob.getOwner())) + .ifPresent(user -> address.append(user.getEmail()).append(Constants.SEMICOLON)); + StringBuilder owner = new StringBuilder(); + Optional.ofNullable(monitorUser) + .ifPresent(users -> + users.forEach(user -> { + owner.append(user.getName()).append(Constants.SEMICOLON); + address.append(user.getEmail()).append(Constants.SEMICOLON); + } + )); + String title = "【重要】hera调度任务失败[任务=" + heraJob.getName() + "(" + heraJob.getId() + ")]"; + String content = "任务ID:" + heraJob.getId() + Constants.HTML_NEW_LINE + + "环境:" + HeraGlobalEnv.getArea() + "(" + HeraGlobalEnv.getEnv() + ")" + Constants.HTML_NEW_LINE + + "任务名:" + heraJob.getName() + Constants.HTML_NEW_LINE + + "任务版本号:" + failedEvent.getActionId() + Constants.HTML_NEW_LINE + + "任务描述:" + heraJob.getDescription() + Constants.HTML_NEW_LINE + + "任务负责人:" + owner.toString() + Constants.HTML_NEW_LINE; + String errorMsg = failedEvent.getHeraJobHistory().getLog().getMailContent(); + address.append(HeraGlobalEnv.monitorEmails); + if (errorMsg != null) { + content += Constants.HTML_NEW_LINE + Constants.HTML_NEW_LINE + "--------------------------------------------" + Constants.HTML_NEW_LINE + errorMsg; + } + try { + emailService.sendEmail(title, content, address.toString()); + } catch (MessagingException e) { + ErrorLog.error("发送邮件失败", e); + + } + } + + @Override + public void alarm(JobElement element, Set monitorUser) { + HeraJobHistory jobHistory = heraJobHistoryService.findById(element.getHistoryId()); + HeraJob heraJob = heraJobService.findById(jobHistory.getJobId()); + String address = getMonitorAddress(monitorUser); + String title = "【重要】hera调度任务超时[任务=" + heraJob.getName() + "(" + heraJob.getId() + ")]"; + String content = buildTimeoutMsg(element, monitorUser) + + Constants.HTML_NEW_LINE + "任务日志:" + jobHistory.getLog(); + try { + emailService.sendEmail(title, content, address); + } catch (MessagingException e) { + ErrorLog.error("发送邮件失败", e); + } + } + + private String getMonitorAddress(Set monitorUsers) { + StringBuilder address = new StringBuilder(); + Optional.ofNullable(monitorUsers).ifPresent(users -> users.forEach(user -> address.append(user.getEmail()).append(Constants.SEMICOLON))); + return address.toString(); + } +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/impl/JobManageServiceImpl.java b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/JobManageServiceImpl.java new file mode 100755 index 00000000..0ddc25cb --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/JobManageServiceImpl.java @@ -0,0 +1,127 @@ +package com.dfire.monitor.service.impl; + +import com.dfire.common.entity.model.JsonResponse; +import com.dfire.common.util.ActionUtil; +import com.dfire.monitor.domain.ActionTime; +import com.dfire.monitor.domain.JobHistoryVo; +import com.dfire.monitor.domain.JobStatusNum; +import com.dfire.monitor.mapper.JobManagerMapper; +import com.dfire.monitor.service.JobManageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + * @author: 凌霄 + * @time: Created in 下午4:13 2018/8/14 + * @desc + */ +@Service("jobManageService") +public class JobManageServiceImpl implements JobManageService { + + @Autowired + JobManagerMapper jobManagerMapper; + + + + @Override + public JsonResponse findJobHistoryByStatus(String status,String begindt,String enddt) { + List failedJobs = jobManagerMapper.findAllJobHistoryByStatus(status,begindt,enddt); + if (failedJobs == null) { + return new JsonResponse(false, "失败任务查询数据为空"); + } + List result = failedJobs.stream().filter(distinctByKey(JobHistoryVo::getJobId)).collect(Collectors.toList()); + return new JsonResponse("查询成功", true, result); + } + + + /** + * 去除jobId相同的记录 + * + * @param keyExtractor + * @param + * @return + */ + public static Predicate distinctByKey(Function keyExtractor) { + Map map = new HashMap<>(1024); + return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; + } + + /** + * 任务top10 + * + * @return + */ + @Override + public JsonResponse findJobRunTimeTop10() { + Calendar calendar = Calendar.getInstance(); + Map map = new HashMap<>(3); + map.put("startDate", ActionUtil.getActionVersionByDate(calendar.getTime())); + calendar.add(Calendar.DAY_OF_MONTH, 1); + map.put("endDate", ActionUtil.getActionVersionByDate(calendar.getTime())); + map.put("limitNum", 10); + List jobTime = jobManagerMapper.findJobRunTimeTop10(map); + if (jobTime == null || jobTime.size() == 0) { + return new JsonResponse(false, "查询不到任务"); + } + + calendar.add(Calendar.DAY_OF_MONTH, -2); + String id = ActionUtil.getFormatterDate("yyyyMMdd", calendar.getTime()); + for (ActionTime actionTime : jobTime) { + actionTime.setYesterdayTime(jobManagerMapper.getYesterdayRunTime(actionTime.getJobId(), id)); + } + return new JsonResponse("查询成功", true, jobTime); + } + + /** + * 首页饼图 + * + * @return + */ + @Override + public JsonResponse findAllJobStatus() { + List currDayStatusNum = jobManagerMapper.findAllJobStatus(); + if (currDayStatusNum == null || currDayStatusNum.size() == 0) { + return new JsonResponse(false, "任务状态查询数据为空"); + } + return new JsonResponse("查询成功", true, currDayStatusNum); + } + + /** + * 任务执行状态 + * + * @return + */ + @Override + public JsonResponse findAllJobStatusDetail() { + Map res = new HashMap<>(9); + Integer day = 6; + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_YEAR, -day); + Long lastDate = Long.parseLong(ActionUtil.getActionVersionByDate(calendar.getTime())); + res.put("runFailed", jobManagerMapper.findJobDetailByStatus(lastDate, "failed")); + res.put("runSuccess", jobManagerMapper.findJobDetailByStatus(lastDate, "success")); + String curDate; + List xAxis = new ArrayList<>(day); + Date startDate; + for (int i = 0; i <= day; i++) { + startDate = calendar.getTime(); + curDate = ActionUtil.getFormatterDate("yyyy-MM-dd", startDate); + xAxis.add(curDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + res.put(curDate, + jobManagerMapper.findJobDetailByDate( + Long.parseLong(ActionUtil.getActionVersionByDate(startDate)), + Long.parseLong(ActionUtil.getActionVersionByDate(calendar.getTime())))); + + } + res.put("xAxis", xAxis); + return new JsonResponse("查询成功", true, res); + } + + +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/impl/PhoneJobFailAlarm.java b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/PhoneJobFailAlarm.java new file mode 100755 index 00000000..b5463017 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/PhoneJobFailAlarm.java @@ -0,0 +1,48 @@ +package com.dfire.monitor.service.impl; + +import com.dfire.common.config.Alarm; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.enums.AlarmLevel; +import com.dfire.common.vo.JobElement; +import com.dfire.event.HeraJobFailedEvent; +import com.dfire.monitor.domain.AlarmInfo; +import com.dfire.monitor.service.AlarmCenter; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Optional; +import java.util.Set; + +/** + * 电话告警 使用者自己实现 + * + * @author xiaosuda + * @date 2019/3/6 + */ +@Alarm +public class PhoneJobFailAlarm extends AbstractJobFailAlarm { + + @Autowired + private AlarmCenter alarmCenter; + + @Override + public void alarm(HeraJobFailedEvent failedEvent, Set monitorUser) { + HeraJob heraJob = failedEvent.getHeraJob(); + //低于电话等级直接跳过 + if (AlarmLevel.lessThan(heraJob.getOffset(), AlarmLevel.PHONE) || heraJob.getAuto() != 1) { + return; + } + AlarmInfo alarmInfo = new AlarmInfo(); + alarmInfo.setMessage(buildJobErrorMsg(heraJob, failedEvent.getRunCount(), monitorUser)); + Optional.ofNullable(monitorUser).ifPresent(users -> + users.forEach(user -> { + alarmInfo.setPhone(user.getPhone()); + alarmCenter.sendToPhone(alarmInfo); + })); + } + + @Override + public void alarm(JobElement element, Set monitorUser) { + + } +} diff --git a/hera-monitor/src/main/java/com/dfire/monitor/service/impl/WeChatJobFailAlarm.java b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/WeChatJobFailAlarm.java new file mode 100755 index 00000000..031eb626 --- /dev/null +++ b/hera-monitor/src/main/java/com/dfire/monitor/service/impl/WeChatJobFailAlarm.java @@ -0,0 +1,88 @@ +package com.dfire.monitor.service.impl; + +import com.dfire.common.config.Alarm; +import com.dfire.common.entity.HeraJob; +import com.dfire.common.entity.HeraSso; +import com.dfire.common.entity.HeraUser; +import com.dfire.common.enums.AlarmLevel; +import com.dfire.common.service.HeraJobService; +import com.dfire.common.service.HeraUserService; +import com.dfire.common.util.ActionUtil; +import com.dfire.common.vo.JobElement; +import com.dfire.config.HeraGlobalEnv; +import com.dfire.event.HeraJobFailedEvent; +import com.dfire.monitor.domain.AlarmInfo; +import com.dfire.monitor.service.AlarmCenter; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Optional; +import java.util.Set; + +/** + * desc: + * 企业微信告警 + * + * @author scx + * @create 2019/04/26 + */ +@Alarm +public class WeChatJobFailAlarm extends AbstractJobFailAlarm { + + + @Autowired + private AlarmCenter alarmCenter; + + @Autowired + private HeraUserService heraUserService; + + @Autowired + private HeraJobService heraJobService; + + @Override + public void alarm(HeraJobFailedEvent failedEvent, Set monitorUser) { + HeraJob heraJob = failedEvent.getHeraJob(); + //低于微信等级直接跳过 + if (AlarmLevel.lessThan(heraJob.getOffset(), AlarmLevel.WE_CHAT) || heraJob.getAuto() != 1) { + return; + } + //给监控任务的所有人告警 + String msg = buildJobErrorMsg(heraJob, failedEvent.getRunCount(), monitorUser); + String split = "|"; + //获得小组组上的工号 + StringBuilder noticeIds = new StringBuilder( + Optional.ofNullable(heraUserService.findByName(heraJob.getOwner())) + .map(HeraUser::getUid) + .orElse("")); + + //获得监控该任务的人员的工号 + Optional.ofNullable(monitorUser) + .ifPresent(users -> + users.forEach(user -> + noticeIds.append(split).append(user.getJobNumber()))); + //加上关注任务的所有人 + noticeIds.append(split).append(HeraGlobalEnv.getMonitorUsers()); + //给关注所有任务的人发送 + alarmCenter.sendToWeChat(AlarmInfo.builder() + .message(msg) + .userId(noticeIds.toString()) + .build()); + } + + @Override + public void alarm(JobElement element, Set monitorUser) { + int id = ActionUtil.getJobId(element.getJobId()); + HeraJob heraJob = heraJobService.findById(id); + String split = "|"; + StringBuilder noticeIds = new StringBuilder( + Optional.ofNullable(heraUserService.findByName(heraJob.getOwner())) + .map(HeraUser::getUid) + .orElse("")); + Optional.ofNullable(monitorUser) + .ifPresent(users -> + users.forEach(user -> + noticeIds.append(split).append(user.getJobNumber()))); + alarmCenter.sendToWeChat(AlarmInfo.builder() + .message(buildTimeoutMsg(element, monitorUser)) + .userId(noticeIds.toString()).build()); + } +} diff --git a/hera-monitor/src/test/java/com/dfire/hera/AppTest.java b/hera-monitor/src/test/java/com/dfire/hera/AppTest.java new file mode 100755 index 00000000..b15acbb8 --- /dev/null +++ b/hera-monitor/src/test/java/com/dfire/hera/AppTest.java @@ -0,0 +1,20 @@ +package com.dfire.hera; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/hera-protocol/pom.xml b/hera-protocol/pom.xml new file mode 100755 index 00000000..c193f246 --- /dev/null +++ b/hera-protocol/pom.xml @@ -0,0 +1,91 @@ + + + + hera + com.dfire.hera + 2.4.2 + + + 4.0.0 + ${hera.protocol.version} + hera-protocol + + + 3.5.1 + 3.1.0 + 1.22.1 + + + + + io.grpc + grpc-netty + ${grpc.version} + provided + + + io.grpc + grpc-protobuf + ${grpc.version} + provided + + + io.grpc + grpc-stub + ${grpc.version} + provided + + + com.google.protobuf + protobuf-java + ${protobuf.version} + + + + + + + + + + + diff --git a/hera-protocol/src/main/java/com/dfire/protocol/JobExecuteKind.java b/hera-protocol/src/main/java/com/dfire/protocol/JobExecuteKind.java new file mode 100755 index 00000000..62bedbce --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/JobExecuteKind.java @@ -0,0 +1,172 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: execute_kind.proto + +package com.dfire.protocol; + +public final class JobExecuteKind { + private JobExecuteKind() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + /** + * Protobuf enum {@code ExecuteKind} + */ + public enum ExecuteKind + implements com.google.protobuf.ProtocolMessageEnum { + /** + * ScheduleKind = 0; + */ + ScheduleKind(0), + /** + * ManualKind = 1; + */ + ManualKind(1), + /** + * DebugKind = 2; + */ + DebugKind(2), + /** + * AutoRerunKind = 3; + */ + AutoRerunKind(3), + /** + * SuperRecoveryKind = 4; + */ + SuperRecoveryKind(4), + UNRECOGNIZED(-1), + ; + + /** + * ScheduleKind = 0; + */ + public static final int ScheduleKind_VALUE = 0; + /** + * ManualKind = 1; + */ + public static final int ManualKind_VALUE = 1; + /** + * DebugKind = 2; + */ + public static final int DebugKind_VALUE = 2; + /** + * AutoRerunKind = 3; + */ + public static final int AutoRerunKind_VALUE = 3; + /** + * SuperRecoveryKind = 4; + */ + public static final int SuperRecoveryKind_VALUE = 4; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ExecuteKind valueOf(int value) { + return forNumber(value); + } + + public static ExecuteKind forNumber(int value) { + switch (value) { + case 0: return ScheduleKind; + case 1: return ManualKind; + case 2: return DebugKind; + case 3: return AutoRerunKind; + case 4: return SuperRecoveryKind; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + ExecuteKind> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public ExecuteKind findValueByNumber(int number) { + return ExecuteKind.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.dfire.protocol.JobExecuteKind.getDescriptor().getEnumTypes().get(0); + } + + private static final ExecuteKind[] VALUES = values(); + + public static ExecuteKind valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private ExecuteKind(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:ExecuteKind) + } + + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\022execute_kind.proto*h\n\013ExecuteKind\022\020\n\014S" + + "cheduleKind\020\000\022\016\n\nManualKind\020\001\022\r\n\tDebugKi" + + "nd\020\002\022\021\n\rAutoRerunKind\020\003\022\025\n\021SuperRecovery" + + "Kind\020\004B&\n\022com.dfire.protocolB\016JobExecute" + + "KindH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/ResponseStatus.java b/hera-protocol/src/main/java/com/dfire/protocol/ResponseStatus.java new file mode 100755 index 00000000..1e9803ea --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/ResponseStatus.java @@ -0,0 +1,163 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: status.proto + +package com.dfire.protocol; + +public final class ResponseStatus { + private ResponseStatus() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + /** + *
                              +   *rpc响应状态
                              +   * 
                              + * + * Protobuf enum {@code Status} + */ + public enum Status + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
                              +     *成功
                              +     * 
                              + * + * OK = 0; + */ + OK(0), + /** + *
                              +     *失败
                              +     * 
                              + * + * ERROR = 1; + */ + ERROR(1), + UNRECOGNIZED(-1), + ; + + /** + *
                              +     *成功
                              +     * 
                              + * + * OK = 0; + */ + public static final int OK_VALUE = 0; + /** + *
                              +     *失败
                              +     * 
                              + * + * ERROR = 1; + */ + public static final int ERROR_VALUE = 1; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Status valueOf(int value) { + return forNumber(value); + } + + public static Status forNumber(int value) { + switch (value) { + case 0: return OK; + case 1: return ERROR; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Status> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Status findValueByNumber(int number) { + return Status.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.dfire.protocol.ResponseStatus.getDescriptor().getEnumTypes().get(0); + } + + private static final Status[] VALUES = values(); + + public static Status valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Status(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Status) + } + + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\014status.proto*\033\n\006Status\022\006\n\002OK\020\000\022\t\n\005ERRO" + + "R\020\001B&\n\022com.dfire.protocolB\016ResponseStatu" + + "sH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcCancelMessage.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcCancelMessage.java new file mode 100755 index 00000000..2ca1a186 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcCancelMessage.java @@ -0,0 +1,676 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: cancel_message.proto + +package com.dfire.protocol; + +public final class RpcCancelMessage { + private RpcCancelMessage() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface CancelMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:CancelMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * .ExecuteKind ek = 1; + */ + int getEkValue(); + /** + * .ExecuteKind ek = 1; + */ + com.dfire.protocol.JobExecuteKind.ExecuteKind getEk(); + + /** + * string id = 2; + */ + java.lang.String getId(); + /** + * string id = 2; + */ + com.google.protobuf.ByteString + getIdBytes(); + } + /** + * Protobuf type {@code CancelMessage} + */ + public static final class CancelMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:CancelMessage) + CancelMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use CancelMessage.newBuilder() to construct. + private CancelMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CancelMessage() { + ek_ = 0; + id_ = ""; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CancelMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + + ek_ = rawValue; + break; + } + case 18: { + java.lang.String s = input.readStringRequireUtf8(); + + id_ = s; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcCancelMessage.internal_static_CancelMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcCancelMessage.internal_static_CancelMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcCancelMessage.CancelMessage.class, com.dfire.protocol.RpcCancelMessage.CancelMessage.Builder.class); + } + + public static final int EK_FIELD_NUMBER = 1; + private int ek_; + /** + * .ExecuteKind ek = 1; + */ + public int getEkValue() { + return ek_; + } + /** + * .ExecuteKind ek = 1; + */ + public com.dfire.protocol.JobExecuteKind.ExecuteKind getEk() { + com.dfire.protocol.JobExecuteKind.ExecuteKind result = com.dfire.protocol.JobExecuteKind.ExecuteKind.valueOf(ek_); + return result == null ? com.dfire.protocol.JobExecuteKind.ExecuteKind.UNRECOGNIZED : result; + } + + public static final int ID_FIELD_NUMBER = 2; + private volatile java.lang.Object id_; + /** + * string id = 2; + */ + public java.lang.String getId() { + java.lang.Object ref = id_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + id_ = s; + return s; + } + } + /** + * string id = 2; + */ + public com.google.protobuf.ByteString + getIdBytes() { + java.lang.Object ref = id_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + id_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (ek_ != com.dfire.protocol.JobExecuteKind.ExecuteKind.ScheduleKind.getNumber()) { + output.writeEnum(1, ek_); + } + if (!getIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, id_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (ek_ != com.dfire.protocol.JobExecuteKind.ExecuteKind.ScheduleKind.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, ek_); + } + if (!getIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, id_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcCancelMessage.CancelMessage)) { + return super.equals(obj); + } + com.dfire.protocol.RpcCancelMessage.CancelMessage other = (com.dfire.protocol.RpcCancelMessage.CancelMessage) obj; + + boolean result = true; + result = result && ek_ == other.ek_; + result = result && getId() + .equals(other.getId()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + EK_FIELD_NUMBER; + hash = (53 * hash) + ek_; + hash = (37 * hash) + ID_FIELD_NUMBER; + hash = (53 * hash) + getId().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcCancelMessage.CancelMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcCancelMessage.CancelMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code CancelMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:CancelMessage) + com.dfire.protocol.RpcCancelMessage.CancelMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcCancelMessage.internal_static_CancelMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcCancelMessage.internal_static_CancelMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcCancelMessage.CancelMessage.class, com.dfire.protocol.RpcCancelMessage.CancelMessage.Builder.class); + } + + // Construct using com.dfire.protocol.RpcCancelMessage.CancelMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + ek_ = 0; + + id_ = ""; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcCancelMessage.internal_static_CancelMessage_descriptor; + } + + public com.dfire.protocol.RpcCancelMessage.CancelMessage getDefaultInstanceForType() { + return com.dfire.protocol.RpcCancelMessage.CancelMessage.getDefaultInstance(); + } + + public com.dfire.protocol.RpcCancelMessage.CancelMessage build() { + com.dfire.protocol.RpcCancelMessage.CancelMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcCancelMessage.CancelMessage buildPartial() { + com.dfire.protocol.RpcCancelMessage.CancelMessage result = new com.dfire.protocol.RpcCancelMessage.CancelMessage(this); + result.ek_ = ek_; + result.id_ = id_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcCancelMessage.CancelMessage) { + return mergeFrom((com.dfire.protocol.RpcCancelMessage.CancelMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcCancelMessage.CancelMessage other) { + if (other == com.dfire.protocol.RpcCancelMessage.CancelMessage.getDefaultInstance()) return this; + if (other.ek_ != 0) { + setEkValue(other.getEkValue()); + } + if (!other.getId().isEmpty()) { + id_ = other.id_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcCancelMessage.CancelMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcCancelMessage.CancelMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int ek_ = 0; + /** + * .ExecuteKind ek = 1; + */ + public int getEkValue() { + return ek_; + } + /** + * .ExecuteKind ek = 1; + */ + public Builder setEkValue(int value) { + ek_ = value; + onChanged(); + return this; + } + /** + * .ExecuteKind ek = 1; + */ + public com.dfire.protocol.JobExecuteKind.ExecuteKind getEk() { + com.dfire.protocol.JobExecuteKind.ExecuteKind result = com.dfire.protocol.JobExecuteKind.ExecuteKind.valueOf(ek_); + return result == null ? com.dfire.protocol.JobExecuteKind.ExecuteKind.UNRECOGNIZED : result; + } + /** + * .ExecuteKind ek = 1; + */ + public Builder setEk(com.dfire.protocol.JobExecuteKind.ExecuteKind value) { + if (value == null) { + throw new NullPointerException(); + } + + ek_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .ExecuteKind ek = 1; + */ + public Builder clearEk() { + + ek_ = 0; + onChanged(); + return this; + } + + private java.lang.Object id_ = ""; + /** + * string id = 2; + */ + public java.lang.String getId() { + java.lang.Object ref = id_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + id_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string id = 2; + */ + public com.google.protobuf.ByteString + getIdBytes() { + java.lang.Object ref = id_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + id_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string id = 2; + */ + public Builder setId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + id_ = value; + onChanged(); + return this; + } + /** + * string id = 2; + */ + public Builder clearId() { + + id_ = getDefaultInstance().getId(); + onChanged(); + return this; + } + /** + * string id = 2; + */ + public Builder setIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + id_ = value; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:CancelMessage) + } + + // @@protoc_insertion_point(class_scope:CancelMessage) + private static final com.dfire.protocol.RpcCancelMessage.CancelMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcCancelMessage.CancelMessage(); + } + + public static com.dfire.protocol.RpcCancelMessage.CancelMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public CancelMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CancelMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcCancelMessage.CancelMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_CancelMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_CancelMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\024cancel_message.proto\032\022execute_kind.pro" + + "to\"5\n\rCancelMessage\022\030\n\002ek\030\001 \001(\0162\014.Execut" + + "eKind\022\n\n\002id\030\002 \001(\tB(\n\022com.dfire.protocolB" + + "\020RpcCancelMessageH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.dfire.protocol.JobExecuteKind.getDescriptor(), + }, assigner); + internal_static_CancelMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_CancelMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_CancelMessage_descriptor, + new java.lang.String[] { "Ek", "Id", }); + com.dfire.protocol.JobExecuteKind.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcDebugMessage.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcDebugMessage.java new file mode 100755 index 00000000..4b9b8cf0 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcDebugMessage.java @@ -0,0 +1,645 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: debug_message.proto + +package com.dfire.protocol; + +public final class RpcDebugMessage { + private RpcDebugMessage() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface DebugMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:DebugMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * string debugId = 1; + */ + java.lang.String getDebugId(); + /** + * string debugId = 1; + */ + com.google.protobuf.ByteString + getDebugIdBytes(); + + /** + * sint32 exitCode = 2; + */ + int getExitCode(); + } + /** + * Protobuf type {@code DebugMessage} + */ + public static final class DebugMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:DebugMessage) + DebugMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use DebugMessage.newBuilder() to construct. + private DebugMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private DebugMessage() { + debugId_ = ""; + exitCode_ = 0; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DebugMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + debugId_ = s; + break; + } + case 16: { + + exitCode_ = input.readSInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcDebugMessage.internal_static_DebugMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcDebugMessage.internal_static_DebugMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcDebugMessage.DebugMessage.class, com.dfire.protocol.RpcDebugMessage.DebugMessage.Builder.class); + } + + public static final int DEBUGID_FIELD_NUMBER = 1; + private volatile java.lang.Object debugId_; + /** + * string debugId = 1; + */ + public java.lang.String getDebugId() { + java.lang.Object ref = debugId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + debugId_ = s; + return s; + } + } + /** + * string debugId = 1; + */ + public com.google.protobuf.ByteString + getDebugIdBytes() { + java.lang.Object ref = debugId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + debugId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int EXITCODE_FIELD_NUMBER = 2; + private int exitCode_; + /** + * sint32 exitCode = 2; + */ + public int getExitCode() { + return exitCode_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getDebugIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, debugId_); + } + if (exitCode_ != 0) { + output.writeSInt32(2, exitCode_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getDebugIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, debugId_); + } + if (exitCode_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(2, exitCode_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcDebugMessage.DebugMessage)) { + return super.equals(obj); + } + com.dfire.protocol.RpcDebugMessage.DebugMessage other = (com.dfire.protocol.RpcDebugMessage.DebugMessage) obj; + + boolean result = true; + result = result && getDebugId() + .equals(other.getDebugId()); + result = result && (getExitCode() + == other.getExitCode()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + DEBUGID_FIELD_NUMBER; + hash = (53 * hash) + getDebugId().hashCode(); + hash = (37 * hash) + EXITCODE_FIELD_NUMBER; + hash = (53 * hash) + getExitCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcDebugMessage.DebugMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcDebugMessage.DebugMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code DebugMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:DebugMessage) + com.dfire.protocol.RpcDebugMessage.DebugMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcDebugMessage.internal_static_DebugMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcDebugMessage.internal_static_DebugMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcDebugMessage.DebugMessage.class, com.dfire.protocol.RpcDebugMessage.DebugMessage.Builder.class); + } + + // Construct using com.dfire.protocol.RpcDebugMessage.DebugMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + debugId_ = ""; + + exitCode_ = 0; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcDebugMessage.internal_static_DebugMessage_descriptor; + } + + public com.dfire.protocol.RpcDebugMessage.DebugMessage getDefaultInstanceForType() { + return com.dfire.protocol.RpcDebugMessage.DebugMessage.getDefaultInstance(); + } + + public com.dfire.protocol.RpcDebugMessage.DebugMessage build() { + com.dfire.protocol.RpcDebugMessage.DebugMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcDebugMessage.DebugMessage buildPartial() { + com.dfire.protocol.RpcDebugMessage.DebugMessage result = new com.dfire.protocol.RpcDebugMessage.DebugMessage(this); + result.debugId_ = debugId_; + result.exitCode_ = exitCode_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcDebugMessage.DebugMessage) { + return mergeFrom((com.dfire.protocol.RpcDebugMessage.DebugMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcDebugMessage.DebugMessage other) { + if (other == com.dfire.protocol.RpcDebugMessage.DebugMessage.getDefaultInstance()) return this; + if (!other.getDebugId().isEmpty()) { + debugId_ = other.debugId_; + onChanged(); + } + if (other.getExitCode() != 0) { + setExitCode(other.getExitCode()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcDebugMessage.DebugMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcDebugMessage.DebugMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object debugId_ = ""; + /** + * string debugId = 1; + */ + public java.lang.String getDebugId() { + java.lang.Object ref = debugId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + debugId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string debugId = 1; + */ + public com.google.protobuf.ByteString + getDebugIdBytes() { + java.lang.Object ref = debugId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + debugId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string debugId = 1; + */ + public Builder setDebugId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + debugId_ = value; + onChanged(); + return this; + } + /** + * string debugId = 1; + */ + public Builder clearDebugId() { + + debugId_ = getDefaultInstance().getDebugId(); + onChanged(); + return this; + } + /** + * string debugId = 1; + */ + public Builder setDebugIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + debugId_ = value; + onChanged(); + return this; + } + + private int exitCode_ ; + /** + * sint32 exitCode = 2; + */ + public int getExitCode() { + return exitCode_; + } + /** + * sint32 exitCode = 2; + */ + public Builder setExitCode(int value) { + + exitCode_ = value; + onChanged(); + return this; + } + /** + * sint32 exitCode = 2; + */ + public Builder clearExitCode() { + + exitCode_ = 0; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:DebugMessage) + } + + // @@protoc_insertion_point(class_scope:DebugMessage) + private static final com.dfire.protocol.RpcDebugMessage.DebugMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcDebugMessage.DebugMessage(); + } + + public static com.dfire.protocol.RpcDebugMessage.DebugMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public DebugMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DebugMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcDebugMessage.DebugMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_DebugMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_DebugMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\023debug_message.proto\"1\n\014DebugMessage\022\017\n" + + "\007debugId\030\001 \001(\t\022\020\n\010exitCode\030\002 \001(\021B\'\n\022com." + + "dfire.protocolB\017RpcDebugMessageH\001b\006proto" + + "3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_DebugMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_DebugMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_DebugMessage_descriptor, + new java.lang.String[] { "DebugId", "ExitCode", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcExecuteMessage.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcExecuteMessage.java new file mode 100755 index 00000000..849ab3a3 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcExecuteMessage.java @@ -0,0 +1,645 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: execute_message.proto + +package com.dfire.protocol; + +public final class RpcExecuteMessage { + private RpcExecuteMessage() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ExecuteMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:ExecuteMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * string actionId = 1; + */ + java.lang.String getActionId(); + /** + * string actionId = 1; + */ + com.google.protobuf.ByteString + getActionIdBytes(); + + /** + * sint32 exitCode = 2; + */ + int getExitCode(); + } + /** + * Protobuf type {@code ExecuteMessage} + */ + public static final class ExecuteMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:ExecuteMessage) + ExecuteMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use ExecuteMessage.newBuilder() to construct. + private ExecuteMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ExecuteMessage() { + actionId_ = ""; + exitCode_ = 0; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ExecuteMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + actionId_ = s; + break; + } + case 16: { + + exitCode_ = input.readSInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcExecuteMessage.internal_static_ExecuteMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcExecuteMessage.internal_static_ExecuteMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcExecuteMessage.ExecuteMessage.class, com.dfire.protocol.RpcExecuteMessage.ExecuteMessage.Builder.class); + } + + public static final int ACTIONID_FIELD_NUMBER = 1; + private volatile java.lang.Object actionId_; + /** + * string actionId = 1; + */ + public java.lang.String getActionId() { + java.lang.Object ref = actionId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + actionId_ = s; + return s; + } + } + /** + * string actionId = 1; + */ + public com.google.protobuf.ByteString + getActionIdBytes() { + java.lang.Object ref = actionId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + actionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int EXITCODE_FIELD_NUMBER = 2; + private int exitCode_; + /** + * sint32 exitCode = 2; + */ + public int getExitCode() { + return exitCode_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getActionIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, actionId_); + } + if (exitCode_ != 0) { + output.writeSInt32(2, exitCode_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getActionIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, actionId_); + } + if (exitCode_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(2, exitCode_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcExecuteMessage.ExecuteMessage)) { + return super.equals(obj); + } + com.dfire.protocol.RpcExecuteMessage.ExecuteMessage other = (com.dfire.protocol.RpcExecuteMessage.ExecuteMessage) obj; + + boolean result = true; + result = result && getActionId() + .equals(other.getActionId()); + result = result && (getExitCode() + == other.getExitCode()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ACTIONID_FIELD_NUMBER; + hash = (53 * hash) + getActionId().hashCode(); + hash = (37 * hash) + EXITCODE_FIELD_NUMBER; + hash = (53 * hash) + getExitCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcExecuteMessage.ExecuteMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code ExecuteMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:ExecuteMessage) + com.dfire.protocol.RpcExecuteMessage.ExecuteMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcExecuteMessage.internal_static_ExecuteMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcExecuteMessage.internal_static_ExecuteMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcExecuteMessage.ExecuteMessage.class, com.dfire.protocol.RpcExecuteMessage.ExecuteMessage.Builder.class); + } + + // Construct using com.dfire.protocol.RpcExecuteMessage.ExecuteMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + actionId_ = ""; + + exitCode_ = 0; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcExecuteMessage.internal_static_ExecuteMessage_descriptor; + } + + public com.dfire.protocol.RpcExecuteMessage.ExecuteMessage getDefaultInstanceForType() { + return com.dfire.protocol.RpcExecuteMessage.ExecuteMessage.getDefaultInstance(); + } + + public com.dfire.protocol.RpcExecuteMessage.ExecuteMessage build() { + com.dfire.protocol.RpcExecuteMessage.ExecuteMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcExecuteMessage.ExecuteMessage buildPartial() { + com.dfire.protocol.RpcExecuteMessage.ExecuteMessage result = new com.dfire.protocol.RpcExecuteMessage.ExecuteMessage(this); + result.actionId_ = actionId_; + result.exitCode_ = exitCode_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcExecuteMessage.ExecuteMessage) { + return mergeFrom((com.dfire.protocol.RpcExecuteMessage.ExecuteMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcExecuteMessage.ExecuteMessage other) { + if (other == com.dfire.protocol.RpcExecuteMessage.ExecuteMessage.getDefaultInstance()) return this; + if (!other.getActionId().isEmpty()) { + actionId_ = other.actionId_; + onChanged(); + } + if (other.getExitCode() != 0) { + setExitCode(other.getExitCode()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcExecuteMessage.ExecuteMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcExecuteMessage.ExecuteMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object actionId_ = ""; + /** + * string actionId = 1; + */ + public java.lang.String getActionId() { + java.lang.Object ref = actionId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + actionId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string actionId = 1; + */ + public com.google.protobuf.ByteString + getActionIdBytes() { + java.lang.Object ref = actionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + actionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string actionId = 1; + */ + public Builder setActionId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + actionId_ = value; + onChanged(); + return this; + } + /** + * string actionId = 1; + */ + public Builder clearActionId() { + + actionId_ = getDefaultInstance().getActionId(); + onChanged(); + return this; + } + /** + * string actionId = 1; + */ + public Builder setActionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + actionId_ = value; + onChanged(); + return this; + } + + private int exitCode_ ; + /** + * sint32 exitCode = 2; + */ + public int getExitCode() { + return exitCode_; + } + /** + * sint32 exitCode = 2; + */ + public Builder setExitCode(int value) { + + exitCode_ = value; + onChanged(); + return this; + } + /** + * sint32 exitCode = 2; + */ + public Builder clearExitCode() { + + exitCode_ = 0; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:ExecuteMessage) + } + + // @@protoc_insertion_point(class_scope:ExecuteMessage) + private static final com.dfire.protocol.RpcExecuteMessage.ExecuteMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcExecuteMessage.ExecuteMessage(); + } + + public static com.dfire.protocol.RpcExecuteMessage.ExecuteMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public ExecuteMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ExecuteMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcExecuteMessage.ExecuteMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_ExecuteMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_ExecuteMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\025execute_message.proto\"4\n\016ExecuteMessag" + + "e\022\020\n\010actionId\030\001 \001(\t\022\020\n\010exitCode\030\002 \001(\021B)\n" + + "\022com.dfire.protocolB\021RpcExecuteMessageH\001" + + "b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_ExecuteMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_ExecuteMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_ExecuteMessage_descriptor, + new java.lang.String[] { "ActionId", "ExitCode", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcHeartBeatMessage.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcHeartBeatMessage.java new file mode 100755 index 00000000..6f44785e --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcHeartBeatMessage.java @@ -0,0 +1,3039 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: heart_beat_message.proto + +package com.dfire.protocol; + +public final class RpcHeartBeatMessage { + private RpcHeartBeatMessage() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface AllHeartBeatInfoMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:AllHeartBeatInfoMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * map<string, .HeartBeatMessage> values = 1; + */ + int getValuesCount(); + /** + * map<string, .HeartBeatMessage> values = 1; + */ + boolean containsValues( + java.lang.String key); + /** + * Use {@link #getValuesMap()} instead. + */ + @java.lang.Deprecated + java.util.Map + getValues(); + /** + * map<string, .HeartBeatMessage> values = 1; + */ + java.util.Map + getValuesMap(); + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getValuesOrDefault( + java.lang.String key, + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage defaultValue); + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getValuesOrThrow( + java.lang.String key); + } + /** + * Protobuf type {@code AllHeartBeatInfoMessage} + */ + public static final class AllHeartBeatInfoMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:AllHeartBeatInfoMessage) + AllHeartBeatInfoMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use AllHeartBeatInfoMessage.newBuilder() to construct. + private AllHeartBeatInfoMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AllHeartBeatInfoMessage() { + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AllHeartBeatInfoMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + values_ = com.google.protobuf.MapField.newMapField( + ValuesDefaultEntryHolder.defaultEntry); + mutable_bitField0_ |= 0x00000001; + } + com.google.protobuf.MapEntry + values__ = input.readMessage( + ValuesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry); + values_.getMutableMap().put( + values__.getKey(), values__.getValue()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_AllHeartBeatInfoMessage_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 1: + return internalGetValues(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_AllHeartBeatInfoMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage.class, com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage.Builder.class); + } + + public static final int VALUES_FIELD_NUMBER = 1; + private static final class ValuesDefaultEntryHolder { + static final com.google.protobuf.MapEntry< + java.lang.String, com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage> defaultEntry = + com.google.protobuf.MapEntry + .newDefaultInstance( + com.dfire.protocol.RpcHeartBeatMessage.internal_static_AllHeartBeatInfoMessage_ValuesEntry_descriptor, + com.google.protobuf.WireFormat.FieldType.STRING, + "", + com.google.protobuf.WireFormat.FieldType.MESSAGE, + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.getDefaultInstance()); + } + private com.google.protobuf.MapField< + java.lang.String, com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage> values_; + private com.google.protobuf.MapField + internalGetValues() { + if (values_ == null) { + return com.google.protobuf.MapField.emptyMapField( + ValuesDefaultEntryHolder.defaultEntry); + } + return values_; + } + + public int getValuesCount() { + return internalGetValues().getMap().size(); + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public boolean containsValues( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + return internalGetValues().getMap().containsKey(key); + } + /** + * Use {@link #getValuesMap()} instead. + */ + @java.lang.Deprecated + public java.util.Map getValues() { + return getValuesMap(); + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public java.util.Map getValuesMap() { + return internalGetValues().getMap(); + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getValuesOrDefault( + java.lang.String key, + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage defaultValue) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getValuesOrThrow( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + com.google.protobuf.GeneratedMessageV3 + .serializeStringMapTo( + output, + internalGetValues(), + ValuesDefaultEntryHolder.defaultEntry, + 1); + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (java.util.Map.Entry entry + : internalGetValues().getMap().entrySet()) { + com.google.protobuf.MapEntry + values__ = ValuesDefaultEntryHolder.defaultEntry.newBuilderForType() + .setKey(entry.getKey()) + .setValue(entry.getValue()) + .build(); + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, values__); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage)) { + return super.equals(obj); + } + com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage other = (com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage) obj; + + boolean result = true; + result = result && internalGetValues().equals( + other.internalGetValues()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (!internalGetValues().getMap().isEmpty()) { + hash = (37 * hash) + VALUES_FIELD_NUMBER; + hash = (53 * hash) + internalGetValues().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code AllHeartBeatInfoMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:AllHeartBeatInfoMessage) + com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_AllHeartBeatInfoMessage_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 1: + return internalGetValues(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMutableMapField( + int number) { + switch (number) { + case 1: + return internalGetMutableValues(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_AllHeartBeatInfoMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage.class, com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage.Builder.class); + } + + // Construct using com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + internalGetMutableValues().clear(); + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_AllHeartBeatInfoMessage_descriptor; + } + + public com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage getDefaultInstanceForType() { + return com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage.getDefaultInstance(); + } + + public com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage build() { + com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage buildPartial() { + com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage result = new com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage(this); + int from_bitField0_ = bitField0_; + result.values_ = internalGetValues(); + result.values_.makeImmutable(); + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage) { + return mergeFrom((com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage other) { + if (other == com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage.getDefaultInstance()) return this; + internalGetMutableValues().mergeFrom( + other.internalGetValues()); + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.MapField< + java.lang.String, com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage> values_; + private com.google.protobuf.MapField + internalGetValues() { + if (values_ == null) { + return com.google.protobuf.MapField.emptyMapField( + ValuesDefaultEntryHolder.defaultEntry); + } + return values_; + } + private com.google.protobuf.MapField + internalGetMutableValues() { + onChanged();; + if (values_ == null) { + values_ = com.google.protobuf.MapField.newMapField( + ValuesDefaultEntryHolder.defaultEntry); + } + if (!values_.isMutable()) { + values_ = values_.copy(); + } + return values_; + } + + public int getValuesCount() { + return internalGetValues().getMap().size(); + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public boolean containsValues( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + return internalGetValues().getMap().containsKey(key); + } + /** + * Use {@link #getValuesMap()} instead. + */ + @java.lang.Deprecated + public java.util.Map getValues() { + return getValuesMap(); + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public java.util.Map getValuesMap() { + return internalGetValues().getMap(); + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getValuesOrDefault( + java.lang.String key, + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage defaultValue) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getValuesOrThrow( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + public Builder clearValues() { + internalGetMutableValues().getMutableMap() + .clear(); + return this; + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public Builder removeValues( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + internalGetMutableValues().getMutableMap() + .remove(key); + return this; + } + /** + * Use alternate mutation accessors instead. + */ + @java.lang.Deprecated + public java.util.Map + getMutableValues() { + return internalGetMutableValues().getMutableMap(); + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + public Builder putValues( + java.lang.String key, + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage value) { + if (key == null) { throw new java.lang.NullPointerException(); } + if (value == null) { throw new java.lang.NullPointerException(); } + internalGetMutableValues().getMutableMap() + .put(key, value); + return this; + } + /** + * map<string, .HeartBeatMessage> values = 1; + */ + + public Builder putAllValues( + java.util.Map values) { + internalGetMutableValues().getMutableMap() + .putAll(values); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:AllHeartBeatInfoMessage) + } + + // @@protoc_insertion_point(class_scope:AllHeartBeatInfoMessage) + private static final com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage(); + } + + public static com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public AllHeartBeatInfoMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AllHeartBeatInfoMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcHeartBeatMessage.AllHeartBeatInfoMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface HeartBeatMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:HeartBeatMessage) + com.google.protobuf.MessageOrBuilder { + + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + java.util.List + getRunningList(); + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + int getRunningCount(); + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + java.lang.String getRunning(int index); + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + com.google.protobuf.ByteString + getRunningBytes(int index); + + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + java.util.List + getDebugRunningList(); + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + int getDebugRunningCount(); + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + java.lang.String getDebugRunning(int index); + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + com.google.protobuf.ByteString + getDebugRunningBytes(int index); + + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + java.util.List + getManualRunningList(); + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + int getManualRunningCount(); + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + java.lang.String getManualRunning(int index); + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + com.google.protobuf.ByteString + getManualRunningBytes(int index); + + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + java.util.List + getRerunRunningList(); + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + int getRerunRunningCount(); + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + java.lang.String getRerunRunning(int index); + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + com.google.protobuf.ByteString + getRerunRunningBytes(int index); + + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + java.util.List + getSuperRunningList(); + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + int getSuperRunningCount(); + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + java.lang.String getSuperRunning(int index); + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + com.google.protobuf.ByteString + getSuperRunningBytes(int index); + + /** + *
                              +     *时间戳
                              +     * 
                              + * + * int64 timestamp = 4; + */ + long getTimestamp(); + + /** + *
                              +     *内存占用比例
                              +     * 
                              + * + * float mem_rate = 5; + */ + float getMemRate(); + + /** + *
                              +     *发送心跳的主机
                              +     * 
                              + * + * string host = 6; + */ + java.lang.String getHost(); + /** + *
                              +     *发送心跳的主机
                              +     * 
                              + * + * string host = 6; + */ + com.google.protobuf.ByteString + getHostBytes(); + + /** + *
                              +     *每个核心的cpu负载
                              +     * 
                              + * + * float cpu_load_per_core = 7; + */ + float getCpuLoadPerCore(); + + /** + *
                              +     *总内存大小,默认4096M
                              +     * 
                              + * + * float mem_total = 4096; + */ + float getMemTotal(); + + /** + * int32 cores = 8; + */ + int getCores(); + } + /** + * Protobuf type {@code HeartBeatMessage} + */ + public static final class HeartBeatMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:HeartBeatMessage) + HeartBeatMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use HeartBeatMessage.newBuilder() to construct. + private HeartBeatMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private HeartBeatMessage() { + running_ = com.google.protobuf.LazyStringArrayList.EMPTY; + debugRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + manualRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + rerunRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + superRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + timestamp_ = 0L; + memRate_ = 0F; + host_ = ""; + cpuLoadPerCore_ = 0F; + memTotal_ = 0F; + cores_ = 0; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private HeartBeatMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + running_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000001; + } + running_.add(s); + break; + } + case 18: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + debugRunning_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000002; + } + debugRunning_.add(s); + break; + } + case 26: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + manualRunning_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000004; + } + manualRunning_.add(s); + break; + } + case 32: { + + timestamp_ = input.readInt64(); + break; + } + case 45: { + + memRate_ = input.readFloat(); + break; + } + case 50: { + java.lang.String s = input.readStringRequireUtf8(); + + host_ = s; + break; + } + case 61: { + + cpuLoadPerCore_ = input.readFloat(); + break; + } + case 64: { + + cores_ = input.readInt32(); + break; + } + case 74: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + rerunRunning_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000008; + } + rerunRunning_.add(s); + break; + } + case 82: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + superRunning_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000010; + } + superRunning_.add(s); + break; + } + case 32773: { + + memTotal_ = input.readFloat(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + running_ = running_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + debugRunning_ = debugRunning_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + manualRunning_ = manualRunning_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + rerunRunning_ = rerunRunning_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + superRunning_ = superRunning_.getUnmodifiableView(); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_HeartBeatMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_HeartBeatMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.class, com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.Builder.class); + } + + private int bitField0_; + public static final int RUNNING_FIELD_NUMBER = 1; + private com.google.protobuf.LazyStringList running_; + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + public com.google.protobuf.ProtocolStringList + getRunningList() { + return running_; + } + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + public int getRunningCount() { + return running_.size(); + } + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + public java.lang.String getRunning(int index) { + return running_.get(index); + } + /** + *
                              +     *正在运行的自动调度job列表
                              +     * 
                              + * + * repeated string running = 1; + */ + public com.google.protobuf.ByteString + getRunningBytes(int index) { + return running_.getByteString(index); + } + + public static final int DEBUGRUNNING_FIELD_NUMBER = 2; + private com.google.protobuf.LazyStringList debugRunning_; + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + public com.google.protobuf.ProtocolStringList + getDebugRunningList() { + return debugRunning_; + } + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + public int getDebugRunningCount() { + return debugRunning_.size(); + } + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + public java.lang.String getDebugRunning(int index) { + return debugRunning_.get(index); + } + /** + *
                              +     *正在运行的文件脚本job列表
                              +     * 
                              + * + * repeated string debugRunning = 2; + */ + public com.google.protobuf.ByteString + getDebugRunningBytes(int index) { + return debugRunning_.getByteString(index); + } + + public static final int MANUALRUNNING_FIELD_NUMBER = 3; + private com.google.protobuf.LazyStringList manualRunning_; + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + public com.google.protobuf.ProtocolStringList + getManualRunningList() { + return manualRunning_; + } + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + public int getManualRunningCount() { + return manualRunning_.size(); + } + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + public java.lang.String getManualRunning(int index) { + return manualRunning_.get(index); + } + /** + *
                              +     *正在运行的手动执行job列表
                              +     * 
                              + * + * repeated string manualRunning = 3; + */ + public com.google.protobuf.ByteString + getManualRunningBytes(int index) { + return manualRunning_.getByteString(index); + } + + public static final int RERUNRUNNING_FIELD_NUMBER = 9; + private com.google.protobuf.LazyStringList rerunRunning_; + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + public com.google.protobuf.ProtocolStringList + getRerunRunningList() { + return rerunRunning_; + } + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + public int getRerunRunningCount() { + return rerunRunning_.size(); + } + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + public java.lang.String getRerunRunning(int index) { + return rerunRunning_.get(index); + } + /** + *
                              +     *正在运行的重跑任务列表
                              +     * 
                              + * + * repeated string rerunRunning = 9; + */ + public com.google.protobuf.ByteString + getRerunRunningBytes(int index) { + return rerunRunning_.getByteString(index); + } + + public static final int SUPERRUNNING_FIELD_NUMBER = 10; + private com.google.protobuf.LazyStringList superRunning_; + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + public com.google.protobuf.ProtocolStringList + getSuperRunningList() { + return superRunning_; + } + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + public int getSuperRunningCount() { + return superRunning_.size(); + } + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + public java.lang.String getSuperRunning(int index) { + return superRunning_.get(index); + } + /** + *
                              +     *正在运行的超级恢复任务列表
                              +     * 
                              + * + * repeated string superRunning = 10; + */ + public com.google.protobuf.ByteString + getSuperRunningBytes(int index) { + return superRunning_.getByteString(index); + } + + public static final int TIMESTAMP_FIELD_NUMBER = 4; + private long timestamp_; + /** + *
                              +     *时间戳
                              +     * 
                              + * + * int64 timestamp = 4; + */ + public long getTimestamp() { + return timestamp_; + } + + public static final int MEM_RATE_FIELD_NUMBER = 5; + private float memRate_; + /** + *
                              +     *内存占用比例
                              +     * 
                              + * + * float mem_rate = 5; + */ + public float getMemRate() { + return memRate_; + } + + public static final int HOST_FIELD_NUMBER = 6; + private volatile java.lang.Object host_; + /** + *
                              +     *发送心跳的主机
                              +     * 
                              + * + * string host = 6; + */ + public java.lang.String getHost() { + java.lang.Object ref = host_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + host_ = s; + return s; + } + } + /** + *
                              +     *发送心跳的主机
                              +     * 
                              + * + * string host = 6; + */ + public com.google.protobuf.ByteString + getHostBytes() { + java.lang.Object ref = host_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + host_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CPU_LOAD_PER_CORE_FIELD_NUMBER = 7; + private float cpuLoadPerCore_; + /** + *
                              +     *每个核心的cpu负载
                              +     * 
                              + * + * float cpu_load_per_core = 7; + */ + public float getCpuLoadPerCore() { + return cpuLoadPerCore_; + } + + public static final int MEM_TOTAL_FIELD_NUMBER = 4096; + private float memTotal_; + /** + *
                              +     *总内存大小,默认4096M
                              +     * 
                              + * + * float mem_total = 4096; + */ + public float getMemTotal() { + return memTotal_; + } + + public static final int CORES_FIELD_NUMBER = 8; + private int cores_; + /** + * int32 cores = 8; + */ + public int getCores() { + return cores_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < running_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, running_.getRaw(i)); + } + for (int i = 0; i < debugRunning_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, debugRunning_.getRaw(i)); + } + for (int i = 0; i < manualRunning_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, manualRunning_.getRaw(i)); + } + if (timestamp_ != 0L) { + output.writeInt64(4, timestamp_); + } + if (memRate_ != 0F) { + output.writeFloat(5, memRate_); + } + if (!getHostBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, host_); + } + if (cpuLoadPerCore_ != 0F) { + output.writeFloat(7, cpuLoadPerCore_); + } + if (cores_ != 0) { + output.writeInt32(8, cores_); + } + for (int i = 0; i < rerunRunning_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 9, rerunRunning_.getRaw(i)); + } + for (int i = 0; i < superRunning_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 10, superRunning_.getRaw(i)); + } + if (memTotal_ != 0F) { + output.writeFloat(4096, memTotal_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < running_.size(); i++) { + dataSize += computeStringSizeNoTag(running_.getRaw(i)); + } + size += dataSize; + size += 1 * getRunningList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < debugRunning_.size(); i++) { + dataSize += computeStringSizeNoTag(debugRunning_.getRaw(i)); + } + size += dataSize; + size += 1 * getDebugRunningList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < manualRunning_.size(); i++) { + dataSize += computeStringSizeNoTag(manualRunning_.getRaw(i)); + } + size += dataSize; + size += 1 * getManualRunningList().size(); + } + if (timestamp_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(4, timestamp_); + } + if (memRate_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(5, memRate_); + } + if (!getHostBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, host_); + } + if (cpuLoadPerCore_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(7, cpuLoadPerCore_); + } + if (cores_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(8, cores_); + } + { + int dataSize = 0; + for (int i = 0; i < rerunRunning_.size(); i++) { + dataSize += computeStringSizeNoTag(rerunRunning_.getRaw(i)); + } + size += dataSize; + size += 1 * getRerunRunningList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < superRunning_.size(); i++) { + dataSize += computeStringSizeNoTag(superRunning_.getRaw(i)); + } + size += dataSize; + size += 1 * getSuperRunningList().size(); + } + if (memTotal_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(4096, memTotal_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage)) { + return super.equals(obj); + } + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage other = (com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage) obj; + + boolean result = true; + result = result && getRunningList() + .equals(other.getRunningList()); + result = result && getDebugRunningList() + .equals(other.getDebugRunningList()); + result = result && getManualRunningList() + .equals(other.getManualRunningList()); + result = result && getRerunRunningList() + .equals(other.getRerunRunningList()); + result = result && getSuperRunningList() + .equals(other.getSuperRunningList()); + result = result && (getTimestamp() + == other.getTimestamp()); + result = result && ( + java.lang.Float.floatToIntBits(getMemRate()) + == java.lang.Float.floatToIntBits( + other.getMemRate())); + result = result && getHost() + .equals(other.getHost()); + result = result && ( + java.lang.Float.floatToIntBits(getCpuLoadPerCore()) + == java.lang.Float.floatToIntBits( + other.getCpuLoadPerCore())); + result = result && ( + java.lang.Float.floatToIntBits(getMemTotal()) + == java.lang.Float.floatToIntBits( + other.getMemTotal())); + result = result && (getCores() + == other.getCores()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getRunningCount() > 0) { + hash = (37 * hash) + RUNNING_FIELD_NUMBER; + hash = (53 * hash) + getRunningList().hashCode(); + } + if (getDebugRunningCount() > 0) { + hash = (37 * hash) + DEBUGRUNNING_FIELD_NUMBER; + hash = (53 * hash) + getDebugRunningList().hashCode(); + } + if (getManualRunningCount() > 0) { + hash = (37 * hash) + MANUALRUNNING_FIELD_NUMBER; + hash = (53 * hash) + getManualRunningList().hashCode(); + } + if (getRerunRunningCount() > 0) { + hash = (37 * hash) + RERUNRUNNING_FIELD_NUMBER; + hash = (53 * hash) + getRerunRunningList().hashCode(); + } + if (getSuperRunningCount() > 0) { + hash = (37 * hash) + SUPERRUNNING_FIELD_NUMBER; + hash = (53 * hash) + getSuperRunningList().hashCode(); + } + hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getTimestamp()); + hash = (37 * hash) + MEM_RATE_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getMemRate()); + hash = (37 * hash) + HOST_FIELD_NUMBER; + hash = (53 * hash) + getHost().hashCode(); + hash = (37 * hash) + CPU_LOAD_PER_CORE_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getCpuLoadPerCore()); + hash = (37 * hash) + MEM_TOTAL_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getMemTotal()); + hash = (37 * hash) + CORES_FIELD_NUMBER; + hash = (53 * hash) + getCores(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code HeartBeatMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:HeartBeatMessage) + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_HeartBeatMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_HeartBeatMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.class, com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.Builder.class); + } + + // Construct using com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + running_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + debugRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + manualRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + rerunRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + superRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + timestamp_ = 0L; + + memRate_ = 0F; + + host_ = ""; + + cpuLoadPerCore_ = 0F; + + memTotal_ = 0F; + + cores_ = 0; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcHeartBeatMessage.internal_static_HeartBeatMessage_descriptor; + } + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getDefaultInstanceForType() { + return com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.getDefaultInstance(); + } + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage build() { + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage buildPartial() { + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage result = new com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + running_ = running_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.running_ = running_; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + debugRunning_ = debugRunning_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.debugRunning_ = debugRunning_; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + manualRunning_ = manualRunning_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.manualRunning_ = manualRunning_; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + rerunRunning_ = rerunRunning_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.rerunRunning_ = rerunRunning_; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + superRunning_ = superRunning_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.superRunning_ = superRunning_; + result.timestamp_ = timestamp_; + result.memRate_ = memRate_; + result.host_ = host_; + result.cpuLoadPerCore_ = cpuLoadPerCore_; + result.memTotal_ = memTotal_; + result.cores_ = cores_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage) { + return mergeFrom((com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage other) { + if (other == com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage.getDefaultInstance()) return this; + if (!other.running_.isEmpty()) { + if (running_.isEmpty()) { + running_ = other.running_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureRunningIsMutable(); + running_.addAll(other.running_); + } + onChanged(); + } + if (!other.debugRunning_.isEmpty()) { + if (debugRunning_.isEmpty()) { + debugRunning_ = other.debugRunning_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureDebugRunningIsMutable(); + debugRunning_.addAll(other.debugRunning_); + } + onChanged(); + } + if (!other.manualRunning_.isEmpty()) { + if (manualRunning_.isEmpty()) { + manualRunning_ = other.manualRunning_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureManualRunningIsMutable(); + manualRunning_.addAll(other.manualRunning_); + } + onChanged(); + } + if (!other.rerunRunning_.isEmpty()) { + if (rerunRunning_.isEmpty()) { + rerunRunning_ = other.rerunRunning_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureRerunRunningIsMutable(); + rerunRunning_.addAll(other.rerunRunning_); + } + onChanged(); + } + if (!other.superRunning_.isEmpty()) { + if (superRunning_.isEmpty()) { + superRunning_ = other.superRunning_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureSuperRunningIsMutable(); + superRunning_.addAll(other.superRunning_); + } + onChanged(); + } + if (other.getTimestamp() != 0L) { + setTimestamp(other.getTimestamp()); + } + if (other.getMemRate() != 0F) { + setMemRate(other.getMemRate()); + } + if (!other.getHost().isEmpty()) { + host_ = other.host_; + onChanged(); + } + if (other.getCpuLoadPerCore() != 0F) { + setCpuLoadPerCore(other.getCpuLoadPerCore()); + } + if (other.getMemTotal() != 0F) { + setMemTotal(other.getMemTotal()); + } + if (other.getCores() != 0) { + setCores(other.getCores()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.LazyStringList running_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureRunningIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + running_ = new com.google.protobuf.LazyStringArrayList(running_); + bitField0_ |= 0x00000001; + } + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public com.google.protobuf.ProtocolStringList + getRunningList() { + return running_.getUnmodifiableView(); + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public int getRunningCount() { + return running_.size(); + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public java.lang.String getRunning(int index) { + return running_.get(index); + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public com.google.protobuf.ByteString + getRunningBytes(int index) { + return running_.getByteString(index); + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public Builder setRunning( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRunningIsMutable(); + running_.set(index, value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public Builder addRunning( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRunningIsMutable(); + running_.add(value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public Builder addAllRunning( + java.lang.Iterable values) { + ensureRunningIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, running_); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public Builder clearRunning() { + running_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的自动调度job列表
                              +       * 
                              + * + * repeated string running = 1; + */ + public Builder addRunningBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureRunningIsMutable(); + running_.add(value); + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList debugRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureDebugRunningIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + debugRunning_ = new com.google.protobuf.LazyStringArrayList(debugRunning_); + bitField0_ |= 0x00000002; + } + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public com.google.protobuf.ProtocolStringList + getDebugRunningList() { + return debugRunning_.getUnmodifiableView(); + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public int getDebugRunningCount() { + return debugRunning_.size(); + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public java.lang.String getDebugRunning(int index) { + return debugRunning_.get(index); + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public com.google.protobuf.ByteString + getDebugRunningBytes(int index) { + return debugRunning_.getByteString(index); + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public Builder setDebugRunning( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureDebugRunningIsMutable(); + debugRunning_.set(index, value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public Builder addDebugRunning( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureDebugRunningIsMutable(); + debugRunning_.add(value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public Builder addAllDebugRunning( + java.lang.Iterable values) { + ensureDebugRunningIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, debugRunning_); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public Builder clearDebugRunning() { + debugRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的文件脚本job列表
                              +       * 
                              + * + * repeated string debugRunning = 2; + */ + public Builder addDebugRunningBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureDebugRunningIsMutable(); + debugRunning_.add(value); + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList manualRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureManualRunningIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + manualRunning_ = new com.google.protobuf.LazyStringArrayList(manualRunning_); + bitField0_ |= 0x00000004; + } + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public com.google.protobuf.ProtocolStringList + getManualRunningList() { + return manualRunning_.getUnmodifiableView(); + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public int getManualRunningCount() { + return manualRunning_.size(); + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public java.lang.String getManualRunning(int index) { + return manualRunning_.get(index); + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public com.google.protobuf.ByteString + getManualRunningBytes(int index) { + return manualRunning_.getByteString(index); + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public Builder setManualRunning( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureManualRunningIsMutable(); + manualRunning_.set(index, value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public Builder addManualRunning( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureManualRunningIsMutable(); + manualRunning_.add(value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public Builder addAllManualRunning( + java.lang.Iterable values) { + ensureManualRunningIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, manualRunning_); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public Builder clearManualRunning() { + manualRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的手动执行job列表
                              +       * 
                              + * + * repeated string manualRunning = 3; + */ + public Builder addManualRunningBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureManualRunningIsMutable(); + manualRunning_.add(value); + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList rerunRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureRerunRunningIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + rerunRunning_ = new com.google.protobuf.LazyStringArrayList(rerunRunning_); + bitField0_ |= 0x00000008; + } + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public com.google.protobuf.ProtocolStringList + getRerunRunningList() { + return rerunRunning_.getUnmodifiableView(); + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public int getRerunRunningCount() { + return rerunRunning_.size(); + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public java.lang.String getRerunRunning(int index) { + return rerunRunning_.get(index); + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public com.google.protobuf.ByteString + getRerunRunningBytes(int index) { + return rerunRunning_.getByteString(index); + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public Builder setRerunRunning( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRerunRunningIsMutable(); + rerunRunning_.set(index, value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public Builder addRerunRunning( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRerunRunningIsMutable(); + rerunRunning_.add(value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public Builder addAllRerunRunning( + java.lang.Iterable values) { + ensureRerunRunningIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, rerunRunning_); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public Builder clearRerunRunning() { + rerunRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的重跑任务列表
                              +       * 
                              + * + * repeated string rerunRunning = 9; + */ + public Builder addRerunRunningBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureRerunRunningIsMutable(); + rerunRunning_.add(value); + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList superRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureSuperRunningIsMutable() { + if (!((bitField0_ & 0x00000010) == 0x00000010)) { + superRunning_ = new com.google.protobuf.LazyStringArrayList(superRunning_); + bitField0_ |= 0x00000010; + } + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public com.google.protobuf.ProtocolStringList + getSuperRunningList() { + return superRunning_.getUnmodifiableView(); + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public int getSuperRunningCount() { + return superRunning_.size(); + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public java.lang.String getSuperRunning(int index) { + return superRunning_.get(index); + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public com.google.protobuf.ByteString + getSuperRunningBytes(int index) { + return superRunning_.getByteString(index); + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public Builder setSuperRunning( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSuperRunningIsMutable(); + superRunning_.set(index, value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public Builder addSuperRunning( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSuperRunningIsMutable(); + superRunning_.add(value); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public Builder addAllSuperRunning( + java.lang.Iterable values) { + ensureSuperRunningIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, superRunning_); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public Builder clearSuperRunning() { + superRunning_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + /** + *
                              +       *正在运行的超级恢复任务列表
                              +       * 
                              + * + * repeated string superRunning = 10; + */ + public Builder addSuperRunningBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureSuperRunningIsMutable(); + superRunning_.add(value); + onChanged(); + return this; + } + + private long timestamp_ ; + /** + *
                              +       *时间戳
                              +       * 
                              + * + * int64 timestamp = 4; + */ + public long getTimestamp() { + return timestamp_; + } + /** + *
                              +       *时间戳
                              +       * 
                              + * + * int64 timestamp = 4; + */ + public Builder setTimestamp(long value) { + + timestamp_ = value; + onChanged(); + return this; + } + /** + *
                              +       *时间戳
                              +       * 
                              + * + * int64 timestamp = 4; + */ + public Builder clearTimestamp() { + + timestamp_ = 0L; + onChanged(); + return this; + } + + private float memRate_ ; + /** + *
                              +       *内存占用比例
                              +       * 
                              + * + * float mem_rate = 5; + */ + public float getMemRate() { + return memRate_; + } + /** + *
                              +       *内存占用比例
                              +       * 
                              + * + * float mem_rate = 5; + */ + public Builder setMemRate(float value) { + + memRate_ = value; + onChanged(); + return this; + } + /** + *
                              +       *内存占用比例
                              +       * 
                              + * + * float mem_rate = 5; + */ + public Builder clearMemRate() { + + memRate_ = 0F; + onChanged(); + return this; + } + + private java.lang.Object host_ = ""; + /** + *
                              +       *发送心跳的主机
                              +       * 
                              + * + * string host = 6; + */ + public java.lang.String getHost() { + java.lang.Object ref = host_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + host_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *发送心跳的主机
                              +       * 
                              + * + * string host = 6; + */ + public com.google.protobuf.ByteString + getHostBytes() { + java.lang.Object ref = host_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + host_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *发送心跳的主机
                              +       * 
                              + * + * string host = 6; + */ + public Builder setHost( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + host_ = value; + onChanged(); + return this; + } + /** + *
                              +       *发送心跳的主机
                              +       * 
                              + * + * string host = 6; + */ + public Builder clearHost() { + + host_ = getDefaultInstance().getHost(); + onChanged(); + return this; + } + /** + *
                              +       *发送心跳的主机
                              +       * 
                              + * + * string host = 6; + */ + public Builder setHostBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + host_ = value; + onChanged(); + return this; + } + + private float cpuLoadPerCore_ ; + /** + *
                              +       *每个核心的cpu负载
                              +       * 
                              + * + * float cpu_load_per_core = 7; + */ + public float getCpuLoadPerCore() { + return cpuLoadPerCore_; + } + /** + *
                              +       *每个核心的cpu负载
                              +       * 
                              + * + * float cpu_load_per_core = 7; + */ + public Builder setCpuLoadPerCore(float value) { + + cpuLoadPerCore_ = value; + onChanged(); + return this; + } + /** + *
                              +       *每个核心的cpu负载
                              +       * 
                              + * + * float cpu_load_per_core = 7; + */ + public Builder clearCpuLoadPerCore() { + + cpuLoadPerCore_ = 0F; + onChanged(); + return this; + } + + private float memTotal_ ; + /** + *
                              +       *总内存大小,默认4096M
                              +       * 
                              + * + * float mem_total = 4096; + */ + public float getMemTotal() { + return memTotal_; + } + /** + *
                              +       *总内存大小,默认4096M
                              +       * 
                              + * + * float mem_total = 4096; + */ + public Builder setMemTotal(float value) { + + memTotal_ = value; + onChanged(); + return this; + } + /** + *
                              +       *总内存大小,默认4096M
                              +       * 
                              + * + * float mem_total = 4096; + */ + public Builder clearMemTotal() { + + memTotal_ = 0F; + onChanged(); + return this; + } + + private int cores_ ; + /** + * int32 cores = 8; + */ + public int getCores() { + return cores_; + } + /** + * int32 cores = 8; + */ + public Builder setCores(int value) { + + cores_ = value; + onChanged(); + return this; + } + /** + * int32 cores = 8; + */ + public Builder clearCores() { + + cores_ = 0; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:HeartBeatMessage) + } + + // @@protoc_insertion_point(class_scope:HeartBeatMessage) + private static final com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage(); + } + + public static com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public HeartBeatMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new HeartBeatMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcHeartBeatMessage.HeartBeatMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AllHeartBeatInfoMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AllHeartBeatInfoMessage_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AllHeartBeatInfoMessage_ValuesEntry_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AllHeartBeatInfoMessage_ValuesEntry_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_HeartBeatMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_HeartBeatMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\030heart_beat_message.proto\"\221\001\n\027AllHeartB" + + "eatInfoMessage\0224\n\006values\030\001 \003(\0132$.AllHear" + + "tBeatInfoMessage.ValuesEntry\032@\n\013ValuesEn" + + "try\022\013\n\003key\030\001 \001(\t\022 \n\005value\030\002 \001(\0132\021.HeartB" + + "eatMessage:\0028\001\"\355\001\n\020HeartBeatMessage\022\017\n\007r" + + "unning\030\001 \003(\t\022\024\n\014debugRunning\030\002 \003(\t\022\025\n\rma" + + "nualRunning\030\003 \003(\t\022\024\n\014rerunRunning\030\t \003(\t\022" + + "\024\n\014superRunning\030\n \003(\t\022\021\n\ttimestamp\030\004 \001(\003" + + "\022\020\n\010mem_rate\030\005 \001(\002\022\014\n\004host\030\006 \001(\t\022\031\n\021cpu_" + + "load_per_core\030\007 \001(\002\022\022\n\tmem_total\030\200 \001(\002\022" + + "\r\n\005cores\030\010 \001(\005B+\n\022com.dfire.protocolB\023Rp" + + "cHeartBeatMessageH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_AllHeartBeatInfoMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_AllHeartBeatInfoMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AllHeartBeatInfoMessage_descriptor, + new java.lang.String[] { "Values", }); + internal_static_AllHeartBeatInfoMessage_ValuesEntry_descriptor = + internal_static_AllHeartBeatInfoMessage_descriptor.getNestedTypes().get(0); + internal_static_AllHeartBeatInfoMessage_ValuesEntry_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AllHeartBeatInfoMessage_ValuesEntry_descriptor, + new java.lang.String[] { "Key", "Value", }); + internal_static_HeartBeatMessage_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_HeartBeatMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_HeartBeatMessage_descriptor, + new java.lang.String[] { "Running", "DebugRunning", "ManualRunning", "RerunRunning", "SuperRunning", "Timestamp", "MemRate", "Host", "CpuLoadPerCore", "MemTotal", "Cores", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcManualMessage.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcManualMessage.java new file mode 100755 index 00000000..7473938e --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcManualMessage.java @@ -0,0 +1,645 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: manual_message.proto + +package com.dfire.protocol; + +public final class RpcManualMessage { + private RpcManualMessage() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ManualMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:ManualMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * string historyId = 1; + */ + java.lang.String getHistoryId(); + /** + * string historyId = 1; + */ + com.google.protobuf.ByteString + getHistoryIdBytes(); + + /** + * sint32 exitCode = 2; + */ + int getExitCode(); + } + /** + * Protobuf type {@code ManualMessage} + */ + public static final class ManualMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:ManualMessage) + ManualMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use ManualMessage.newBuilder() to construct. + private ManualMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ManualMessage() { + historyId_ = ""; + exitCode_ = 0; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ManualMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + historyId_ = s; + break; + } + case 16: { + + exitCode_ = input.readSInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcManualMessage.internal_static_ManualMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcManualMessage.internal_static_ManualMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcManualMessage.ManualMessage.class, com.dfire.protocol.RpcManualMessage.ManualMessage.Builder.class); + } + + public static final int HISTORYID_FIELD_NUMBER = 1; + private volatile java.lang.Object historyId_; + /** + * string historyId = 1; + */ + public java.lang.String getHistoryId() { + java.lang.Object ref = historyId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + historyId_ = s; + return s; + } + } + /** + * string historyId = 1; + */ + public com.google.protobuf.ByteString + getHistoryIdBytes() { + java.lang.Object ref = historyId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + historyId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int EXITCODE_FIELD_NUMBER = 2; + private int exitCode_; + /** + * sint32 exitCode = 2; + */ + public int getExitCode() { + return exitCode_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getHistoryIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, historyId_); + } + if (exitCode_ != 0) { + output.writeSInt32(2, exitCode_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getHistoryIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, historyId_); + } + if (exitCode_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(2, exitCode_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcManualMessage.ManualMessage)) { + return super.equals(obj); + } + com.dfire.protocol.RpcManualMessage.ManualMessage other = (com.dfire.protocol.RpcManualMessage.ManualMessage) obj; + + boolean result = true; + result = result && getHistoryId() + .equals(other.getHistoryId()); + result = result && (getExitCode() + == other.getExitCode()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + HISTORYID_FIELD_NUMBER; + hash = (53 * hash) + getHistoryId().hashCode(); + hash = (37 * hash) + EXITCODE_FIELD_NUMBER; + hash = (53 * hash) + getExitCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcManualMessage.ManualMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcManualMessage.ManualMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code ManualMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:ManualMessage) + com.dfire.protocol.RpcManualMessage.ManualMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcManualMessage.internal_static_ManualMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcManualMessage.internal_static_ManualMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcManualMessage.ManualMessage.class, com.dfire.protocol.RpcManualMessage.ManualMessage.Builder.class); + } + + // Construct using com.dfire.protocol.RpcManualMessage.ManualMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + historyId_ = ""; + + exitCode_ = 0; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcManualMessage.internal_static_ManualMessage_descriptor; + } + + public com.dfire.protocol.RpcManualMessage.ManualMessage getDefaultInstanceForType() { + return com.dfire.protocol.RpcManualMessage.ManualMessage.getDefaultInstance(); + } + + public com.dfire.protocol.RpcManualMessage.ManualMessage build() { + com.dfire.protocol.RpcManualMessage.ManualMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcManualMessage.ManualMessage buildPartial() { + com.dfire.protocol.RpcManualMessage.ManualMessage result = new com.dfire.protocol.RpcManualMessage.ManualMessage(this); + result.historyId_ = historyId_; + result.exitCode_ = exitCode_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcManualMessage.ManualMessage) { + return mergeFrom((com.dfire.protocol.RpcManualMessage.ManualMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcManualMessage.ManualMessage other) { + if (other == com.dfire.protocol.RpcManualMessage.ManualMessage.getDefaultInstance()) return this; + if (!other.getHistoryId().isEmpty()) { + historyId_ = other.historyId_; + onChanged(); + } + if (other.getExitCode() != 0) { + setExitCode(other.getExitCode()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcManualMessage.ManualMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcManualMessage.ManualMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object historyId_ = ""; + /** + * string historyId = 1; + */ + public java.lang.String getHistoryId() { + java.lang.Object ref = historyId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + historyId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string historyId = 1; + */ + public com.google.protobuf.ByteString + getHistoryIdBytes() { + java.lang.Object ref = historyId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + historyId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string historyId = 1; + */ + public Builder setHistoryId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + historyId_ = value; + onChanged(); + return this; + } + /** + * string historyId = 1; + */ + public Builder clearHistoryId() { + + historyId_ = getDefaultInstance().getHistoryId(); + onChanged(); + return this; + } + /** + * string historyId = 1; + */ + public Builder setHistoryIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + historyId_ = value; + onChanged(); + return this; + } + + private int exitCode_ ; + /** + * sint32 exitCode = 2; + */ + public int getExitCode() { + return exitCode_; + } + /** + * sint32 exitCode = 2; + */ + public Builder setExitCode(int value) { + + exitCode_ = value; + onChanged(); + return this; + } + /** + * sint32 exitCode = 2; + */ + public Builder clearExitCode() { + + exitCode_ = 0; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:ManualMessage) + } + + // @@protoc_insertion_point(class_scope:ManualMessage) + private static final com.dfire.protocol.RpcManualMessage.ManualMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcManualMessage.ManualMessage(); + } + + public static com.dfire.protocol.RpcManualMessage.ManualMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public ManualMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ManualMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcManualMessage.ManualMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_ManualMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_ManualMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\024manual_message.proto\"4\n\rManualMessage\022" + + "\021\n\thistoryId\030\001 \001(\t\022\020\n\010exitCode\030\002 \001(\021B(\n\022" + + "com.dfire.protocolB\020RpcManualMessageH\001b\006" + + "proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_ManualMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_ManualMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_ManualMessage_descriptor, + new java.lang.String[] { "HistoryId", "ExitCode", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcOperate.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcOperate.java new file mode 100755 index 00000000..ba9d6ad2 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcOperate.java @@ -0,0 +1,280 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: operate.proto + +package com.dfire.protocol; + +public final class RpcOperate { + private RpcOperate() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + /** + * Protobuf enum {@code Operate} + */ + public enum Operate + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
                              +     *心跳 worker->server
                              +     * 
                              + * + * HeartBeat = 0; + */ + HeartBeat(0), + /** + *
                              +     *调度执行命令 server->worker
                              +     * 
                              + * + * Schedule = 1; + */ + Schedule(1), + /** + *
                              +     *取消命令 server->worker
                              +     * 
                              + * + * Cancel = 2; + */ + Cancel(2), + /** + *
                              +     *调试命令 server->worker
                              +     * 
                              + * + * Debug = 3; + */ + Debug(3), + /** + *
                              +     *手动执行命令
                              +     * 
                              + * + * Manual = 4; + */ + Manual(4), + /** + *
                              +     *获得机器信息
                              +     * 
                              + * + * GetWorkInfo = 5; + */ + GetWorkInfo(5), + /** + *
                              +     *设置机器信息
                              +     * 
                              + * + * SetWorkInfo = 6; + */ + SetWorkInfo(6), + /** + *
                              +     *执行重跑任务
                              +     * 
                              + * + * Rerun = 7; + */ + Rerun(7), + /** + *
                              +     *执行超级恢复任务
                              +     * 
                              + * + * SuperRecovery = 8; + */ + SuperRecovery(8), + UNRECOGNIZED(-1), + ; + + /** + *
                              +     *心跳 worker->server
                              +     * 
                              + * + * HeartBeat = 0; + */ + public static final int HeartBeat_VALUE = 0; + /** + *
                              +     *调度执行命令 server->worker
                              +     * 
                              + * + * Schedule = 1; + */ + public static final int Schedule_VALUE = 1; + /** + *
                              +     *取消命令 server->worker
                              +     * 
                              + * + * Cancel = 2; + */ + public static final int Cancel_VALUE = 2; + /** + *
                              +     *调试命令 server->worker
                              +     * 
                              + * + * Debug = 3; + */ + public static final int Debug_VALUE = 3; + /** + *
                              +     *手动执行命令
                              +     * 
                              + * + * Manual = 4; + */ + public static final int Manual_VALUE = 4; + /** + *
                              +     *获得机器信息
                              +     * 
                              + * + * GetWorkInfo = 5; + */ + public static final int GetWorkInfo_VALUE = 5; + /** + *
                              +     *设置机器信息
                              +     * 
                              + * + * SetWorkInfo = 6; + */ + public static final int SetWorkInfo_VALUE = 6; + /** + *
                              +     *执行重跑任务
                              +     * 
                              + * + * Rerun = 7; + */ + public static final int Rerun_VALUE = 7; + /** + *
                              +     *执行超级恢复任务
                              +     * 
                              + * + * SuperRecovery = 8; + */ + public static final int SuperRecovery_VALUE = 8; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Operate valueOf(int value) { + return forNumber(value); + } + + public static Operate forNumber(int value) { + switch (value) { + case 0: return HeartBeat; + case 1: return Schedule; + case 2: return Cancel; + case 3: return Debug; + case 4: return Manual; + case 5: return GetWorkInfo; + case 6: return SetWorkInfo; + case 7: return Rerun; + case 8: return SuperRecovery; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Operate> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Operate findValueByNumber(int number) { + return Operate.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.dfire.protocol.RpcOperate.getDescriptor().getEnumTypes().get(0); + } + + private static final Operate[] VALUES = values(); + + public static Operate valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Operate(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Operate) + } + + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\roperate.proto*\211\001\n\007Operate\022\r\n\tHeartBeat" + + "\020\000\022\014\n\010Schedule\020\001\022\n\n\006Cancel\020\002\022\t\n\005Debug\020\003\022" + + "\n\n\006Manual\020\004\022\017\n\013GetWorkInfo\020\005\022\017\n\013SetWorkI" + + "nfo\020\006\022\t\n\005Rerun\020\007\022\021\n\rSuperRecovery\020\010B\"\n\022c" + + "om.dfire.protocolB\nRpcOperateH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcPair.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcPair.java new file mode 100755 index 00000000..36398e4d --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcPair.java @@ -0,0 +1,781 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: pair.proto + +package com.dfire.protocol; + +public final class RpcPair { + private RpcPair() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface PairOrBuilder extends + // @@protoc_insertion_point(interface_extends:Pair) + com.google.protobuf.MessageOrBuilder { + + /** + * string key = 1; + */ + java.lang.String getKey(); + /** + * string key = 1; + */ + com.google.protobuf.ByteString + getKeyBytes(); + + /** + * string value = 2; + */ + java.lang.String getValue(); + /** + * string value = 2; + */ + com.google.protobuf.ByteString + getValueBytes(); + + /** + * sint32 type = 3; + */ + int getType(); + } + /** + * Protobuf type {@code Pair} + */ + public static final class Pair extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Pair) + PairOrBuilder { + private static final long serialVersionUID = 0L; + // Use Pair.newBuilder() to construct. + private Pair(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Pair() { + key_ = ""; + value_ = ""; + type_ = 0; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Pair( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + key_ = s; + break; + } + case 18: { + java.lang.String s = input.readStringRequireUtf8(); + + value_ = s; + break; + } + case 24: { + + type_ = input.readSInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcPair.internal_static_Pair_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcPair.internal_static_Pair_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcPair.Pair.class, com.dfire.protocol.RpcPair.Pair.Builder.class); + } + + public static final int KEY_FIELD_NUMBER = 1; + private volatile java.lang.Object key_; + /** + * string key = 1; + */ + public java.lang.String getKey() { + java.lang.Object ref = key_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + key_ = s; + return s; + } + } + /** + * string key = 1; + */ + public com.google.protobuf.ByteString + getKeyBytes() { + java.lang.Object ref = key_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + key_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VALUE_FIELD_NUMBER = 2; + private volatile java.lang.Object value_; + /** + * string value = 2; + */ + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + value_ = s; + return s; + } + } + /** + * string value = 2; + */ + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TYPE_FIELD_NUMBER = 3; + private int type_; + /** + * sint32 type = 3; + */ + public int getType() { + return type_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getKeyBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, key_); + } + if (!getValueBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, value_); + } + if (type_ != 0) { + output.writeSInt32(3, type_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getKeyBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, key_); + } + if (!getValueBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, value_); + } + if (type_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(3, type_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcPair.Pair)) { + return super.equals(obj); + } + com.dfire.protocol.RpcPair.Pair other = (com.dfire.protocol.RpcPair.Pair) obj; + + boolean result = true; + result = result && getKey() + .equals(other.getKey()); + result = result && getValue() + .equals(other.getValue()); + result = result && (getType() + == other.getType()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + KEY_FIELD_NUMBER; + hash = (53 * hash) + getKey().hashCode(); + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + getType(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcPair.Pair parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcPair.Pair parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcPair.Pair parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcPair.Pair parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcPair.Pair prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Pair} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Pair) + com.dfire.protocol.RpcPair.PairOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcPair.internal_static_Pair_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcPair.internal_static_Pair_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcPair.Pair.class, com.dfire.protocol.RpcPair.Pair.Builder.class); + } + + // Construct using com.dfire.protocol.RpcPair.Pair.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + key_ = ""; + + value_ = ""; + + type_ = 0; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcPair.internal_static_Pair_descriptor; + } + + public com.dfire.protocol.RpcPair.Pair getDefaultInstanceForType() { + return com.dfire.protocol.RpcPair.Pair.getDefaultInstance(); + } + + public com.dfire.protocol.RpcPair.Pair build() { + com.dfire.protocol.RpcPair.Pair result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcPair.Pair buildPartial() { + com.dfire.protocol.RpcPair.Pair result = new com.dfire.protocol.RpcPair.Pair(this); + result.key_ = key_; + result.value_ = value_; + result.type_ = type_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcPair.Pair) { + return mergeFrom((com.dfire.protocol.RpcPair.Pair)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcPair.Pair other) { + if (other == com.dfire.protocol.RpcPair.Pair.getDefaultInstance()) return this; + if (!other.getKey().isEmpty()) { + key_ = other.key_; + onChanged(); + } + if (!other.getValue().isEmpty()) { + value_ = other.value_; + onChanged(); + } + if (other.getType() != 0) { + setType(other.getType()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcPair.Pair parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcPair.Pair) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object key_ = ""; + /** + * string key = 1; + */ + public java.lang.String getKey() { + java.lang.Object ref = key_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + key_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string key = 1; + */ + public com.google.protobuf.ByteString + getKeyBytes() { + java.lang.Object ref = key_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + key_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string key = 1; + */ + public Builder setKey( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + key_ = value; + onChanged(); + return this; + } + /** + * string key = 1; + */ + public Builder clearKey() { + + key_ = getDefaultInstance().getKey(); + onChanged(); + return this; + } + /** + * string key = 1; + */ + public Builder setKeyBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + key_ = value; + onChanged(); + return this; + } + + private java.lang.Object value_ = ""; + /** + * string value = 2; + */ + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + value_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string value = 2; + */ + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string value = 2; + */ + public Builder setValue( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + value_ = value; + onChanged(); + return this; + } + /** + * string value = 2; + */ + public Builder clearValue() { + + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + /** + * string value = 2; + */ + public Builder setValueBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + value_ = value; + onChanged(); + return this; + } + + private int type_ ; + /** + * sint32 type = 3; + */ + public int getType() { + return type_; + } + /** + * sint32 type = 3; + */ + public Builder setType(int value) { + + type_ = value; + onChanged(); + return this; + } + /** + * sint32 type = 3; + */ + public Builder clearType() { + + type_ = 0; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Pair) + } + + // @@protoc_insertion_point(class_scope:Pair) + private static final com.dfire.protocol.RpcPair.Pair DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcPair.Pair(); + } + + public static com.dfire.protocol.RpcPair.Pair getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public Pair parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Pair(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcPair.Pair getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Pair_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Pair_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\npair.proto\"0\n\004Pair\022\013\n\003key\030\001 \001(\t\022\r\n\005val" + + "ue\030\002 \001(\t\022\014\n\004type\030\003 \001(\021B\037\n\022com.dfire.prot" + + "ocolB\007RpcPairH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_Pair_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Pair_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Pair_descriptor, + new java.lang.String[] { "Key", "Value", "Type", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcRequest.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcRequest.java new file mode 100755 index 00000000..84769715 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcRequest.java @@ -0,0 +1,744 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: request.proto + +package com.dfire.protocol; + +public final class RpcRequest { + private RpcRequest() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface RequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:Request) + com.google.protobuf.MessageOrBuilder { + + /** + *
                              +     *request id 唯一标识一个请求
                              +     * 
                              + * + * sint32 rid = 1; + */ + int getRid(); + + /** + *
                              +     *操作类型
                              +     * 
                              + * + * .Operate operate = 2; + */ + int getOperateValue(); + /** + *
                              +     *操作类型
                              +     * 
                              + * + * .Operate operate = 2; + */ + com.dfire.protocol.RpcOperate.Operate getOperate(); + + /** + *
                              +     *请求体
                              +     * 
                              + * + * bytes body = 3; + */ + com.google.protobuf.ByteString getBody(); + } + /** + * Protobuf type {@code Request} + */ + public static final class Request extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Request) + RequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use Request.newBuilder() to construct. + private Request(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Request() { + rid_ = 0; + operate_ = 0; + body_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Request( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + + rid_ = input.readSInt32(); + break; + } + case 16: { + int rawValue = input.readEnum(); + + operate_ = rawValue; + break; + } + case 26: { + + body_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcRequest.internal_static_Request_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcRequest.internal_static_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcRequest.Request.class, com.dfire.protocol.RpcRequest.Request.Builder.class); + } + + public static final int RID_FIELD_NUMBER = 1; + private int rid_; + /** + *
                              +     *request id 唯一标识一个请求
                              +     * 
                              + * + * sint32 rid = 1; + */ + public int getRid() { + return rid_; + } + + public static final int OPERATE_FIELD_NUMBER = 2; + private int operate_; + /** + *
                              +     *操作类型
                              +     * 
                              + * + * .Operate operate = 2; + */ + public int getOperateValue() { + return operate_; + } + /** + *
                              +     *操作类型
                              +     * 
                              + * + * .Operate operate = 2; + */ + public com.dfire.protocol.RpcOperate.Operate getOperate() { + com.dfire.protocol.RpcOperate.Operate result = com.dfire.protocol.RpcOperate.Operate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcOperate.Operate.UNRECOGNIZED : result; + } + + public static final int BODY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString body_; + /** + *
                              +     *请求体
                              +     * 
                              + * + * bytes body = 3; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (rid_ != 0) { + output.writeSInt32(1, rid_); + } + if (operate_ != com.dfire.protocol.RpcOperate.Operate.HeartBeat.getNumber()) { + output.writeEnum(2, operate_); + } + if (!body_.isEmpty()) { + output.writeBytes(3, body_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (rid_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(1, rid_); + } + if (operate_ != com.dfire.protocol.RpcOperate.Operate.HeartBeat.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, operate_); + } + if (!body_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, body_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcRequest.Request)) { + return super.equals(obj); + } + com.dfire.protocol.RpcRequest.Request other = (com.dfire.protocol.RpcRequest.Request) obj; + + boolean result = true; + result = result && (getRid() + == other.getRid()); + result = result && operate_ == other.operate_; + result = result && getBody() + .equals(other.getBody()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + RID_FIELD_NUMBER; + hash = (53 * hash) + getRid(); + hash = (37 * hash) + OPERATE_FIELD_NUMBER; + hash = (53 * hash) + operate_; + hash = (37 * hash) + BODY_FIELD_NUMBER; + hash = (53 * hash) + getBody().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcRequest.Request parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcRequest.Request parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcRequest.Request parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcRequest.Request parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcRequest.Request prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Request} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Request) + com.dfire.protocol.RpcRequest.RequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcRequest.internal_static_Request_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcRequest.internal_static_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcRequest.Request.class, com.dfire.protocol.RpcRequest.Request.Builder.class); + } + + // Construct using com.dfire.protocol.RpcRequest.Request.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + rid_ = 0; + + operate_ = 0; + + body_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcRequest.internal_static_Request_descriptor; + } + + public com.dfire.protocol.RpcRequest.Request getDefaultInstanceForType() { + return com.dfire.protocol.RpcRequest.Request.getDefaultInstance(); + } + + public com.dfire.protocol.RpcRequest.Request build() { + com.dfire.protocol.RpcRequest.Request result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcRequest.Request buildPartial() { + com.dfire.protocol.RpcRequest.Request result = new com.dfire.protocol.RpcRequest.Request(this); + result.rid_ = rid_; + result.operate_ = operate_; + result.body_ = body_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcRequest.Request) { + return mergeFrom((com.dfire.protocol.RpcRequest.Request)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcRequest.Request other) { + if (other == com.dfire.protocol.RpcRequest.Request.getDefaultInstance()) return this; + if (other.getRid() != 0) { + setRid(other.getRid()); + } + if (other.operate_ != 0) { + setOperateValue(other.getOperateValue()); + } + if (other.getBody() != com.google.protobuf.ByteString.EMPTY) { + setBody(other.getBody()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcRequest.Request parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcRequest.Request) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int rid_ ; + /** + *
                              +       *request id 唯一标识一个请求
                              +       * 
                              + * + * sint32 rid = 1; + */ + public int getRid() { + return rid_; + } + /** + *
                              +       *request id 唯一标识一个请求
                              +       * 
                              + * + * sint32 rid = 1; + */ + public Builder setRid(int value) { + + rid_ = value; + onChanged(); + return this; + } + /** + *
                              +       *request id 唯一标识一个请求
                              +       * 
                              + * + * sint32 rid = 1; + */ + public Builder clearRid() { + + rid_ = 0; + onChanged(); + return this; + } + + private int operate_ = 0; + /** + *
                              +       *操作类型
                              +       * 
                              + * + * .Operate operate = 2; + */ + public int getOperateValue() { + return operate_; + } + /** + *
                              +       *操作类型
                              +       * 
                              + * + * .Operate operate = 2; + */ + public Builder setOperateValue(int value) { + operate_ = value; + onChanged(); + return this; + } + /** + *
                              +       *操作类型
                              +       * 
                              + * + * .Operate operate = 2; + */ + public com.dfire.protocol.RpcOperate.Operate getOperate() { + com.dfire.protocol.RpcOperate.Operate result = com.dfire.protocol.RpcOperate.Operate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcOperate.Operate.UNRECOGNIZED : result; + } + /** + *
                              +       *操作类型
                              +       * 
                              + * + * .Operate operate = 2; + */ + public Builder setOperate(com.dfire.protocol.RpcOperate.Operate value) { + if (value == null) { + throw new NullPointerException(); + } + + operate_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
                              +       *操作类型
                              +       * 
                              + * + * .Operate operate = 2; + */ + public Builder clearOperate() { + + operate_ = 0; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + *
                              +       *请求体
                              +       * 
                              + * + * bytes body = 3; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + *
                              +       *请求体
                              +       * 
                              + * + * bytes body = 3; + */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + body_ = value; + onChanged(); + return this; + } + /** + *
                              +       *请求体
                              +       * 
                              + * + * bytes body = 3; + */ + public Builder clearBody() { + + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Request) + } + + // @@protoc_insertion_point(class_scope:Request) + private static final com.dfire.protocol.RpcRequest.Request DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcRequest.Request(); + } + + public static com.dfire.protocol.RpcRequest.Request getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public Request parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Request(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcRequest.Request getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Request_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Request_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\rrequest.proto\032\roperate.proto\"?\n\007Reques" + + "t\022\013\n\003rid\030\001 \001(\021\022\031\n\007operate\030\002 \001(\0162\010.Operat" + + "e\022\014\n\004body\030\003 \001(\014B\"\n\022com.dfire.protocolB\nR" + + "pcRequestH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.dfire.protocol.RpcOperate.getDescriptor(), + }, assigner); + internal_static_Request_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Request_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Request_descriptor, + new java.lang.String[] { "Rid", "Operate", "Body", }); + com.dfire.protocol.RpcOperate.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcResponse.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcResponse.java new file mode 100755 index 00000000..e451ca66 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcResponse.java @@ -0,0 +1,1021 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: response.proto + +package com.dfire.protocol; + +public final class RpcResponse { + private RpcResponse() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:Response) + com.google.protobuf.MessageOrBuilder { + + /** + *
                              +     *状态码
                              +     * 
                              + * + * .Status statusEnum = 1; + */ + int getStatusEnumValue(); + /** + *
                              +     *状态码
                              +     * 
                              + * + * .Status statusEnum = 1; + */ + com.dfire.protocol.ResponseStatus.Status getStatusEnum(); + + /** + *
                              +     *request id,响应时原封不动返回,提供给client配对.
                              +     * 
                              + * + * sint32 rid = 2; + */ + int getRid(); + + /** + * .Operate operate = 3; + */ + int getOperateValue(); + /** + * .Operate operate = 3; + */ + com.dfire.protocol.RpcOperate.Operate getOperate(); + + /** + *
                              +     *如果出错,会有出错信息.纯文本形式.client自行包装
                              +     * 
                              + * + * string errorText = 4; + */ + java.lang.String getErrorText(); + /** + *
                              +     *如果出错,会有出错信息.纯文本形式.client自行包装
                              +     * 
                              + * + * string errorText = 4; + */ + com.google.protobuf.ByteString + getErrorTextBytes(); + + /** + *
                              +     *响应体
                              +     * 
                              + * + * bytes body = 5; + */ + com.google.protobuf.ByteString getBody(); + } + /** + *
                              +   *rpc 请求响应体
                              +   * 
                              + * + * Protobuf type {@code Response} + */ + public static final class Response extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Response) + ResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use Response.newBuilder() to construct. + private Response(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Response() { + statusEnum_ = 0; + rid_ = 0; + operate_ = 0; + errorText_ = ""; + body_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Response( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + + statusEnum_ = rawValue; + break; + } + case 16: { + + rid_ = input.readSInt32(); + break; + } + case 24: { + int rawValue = input.readEnum(); + + operate_ = rawValue; + break; + } + case 34: { + java.lang.String s = input.readStringRequireUtf8(); + + errorText_ = s; + break; + } + case 42: { + + body_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcResponse.internal_static_Response_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcResponse.internal_static_Response_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcResponse.Response.class, com.dfire.protocol.RpcResponse.Response.Builder.class); + } + + public static final int STATUSENUM_FIELD_NUMBER = 1; + private int statusEnum_; + /** + *
                              +     *状态码
                              +     * 
                              + * + * .Status statusEnum = 1; + */ + public int getStatusEnumValue() { + return statusEnum_; + } + /** + *
                              +     *状态码
                              +     * 
                              + * + * .Status statusEnum = 1; + */ + public com.dfire.protocol.ResponseStatus.Status getStatusEnum() { + com.dfire.protocol.ResponseStatus.Status result = com.dfire.protocol.ResponseStatus.Status.valueOf(statusEnum_); + return result == null ? com.dfire.protocol.ResponseStatus.Status.UNRECOGNIZED : result; + } + + public static final int RID_FIELD_NUMBER = 2; + private int rid_; + /** + *
                              +     *request id,响应时原封不动返回,提供给client配对.
                              +     * 
                              + * + * sint32 rid = 2; + */ + public int getRid() { + return rid_; + } + + public static final int OPERATE_FIELD_NUMBER = 3; + private int operate_; + /** + * .Operate operate = 3; + */ + public int getOperateValue() { + return operate_; + } + /** + * .Operate operate = 3; + */ + public com.dfire.protocol.RpcOperate.Operate getOperate() { + com.dfire.protocol.RpcOperate.Operate result = com.dfire.protocol.RpcOperate.Operate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcOperate.Operate.UNRECOGNIZED : result; + } + + public static final int ERRORTEXT_FIELD_NUMBER = 4; + private volatile java.lang.Object errorText_; + /** + *
                              +     *如果出错,会有出错信息.纯文本形式.client自行包装
                              +     * 
                              + * + * string errorText = 4; + */ + public java.lang.String getErrorText() { + java.lang.Object ref = errorText_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + errorText_ = s; + return s; + } + } + /** + *
                              +     *如果出错,会有出错信息.纯文本形式.client自行包装
                              +     * 
                              + * + * string errorText = 4; + */ + public com.google.protobuf.ByteString + getErrorTextBytes() { + java.lang.Object ref = errorText_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + errorText_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int BODY_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString body_; + /** + *
                              +     *响应体
                              +     * 
                              + * + * bytes body = 5; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (statusEnum_ != com.dfire.protocol.ResponseStatus.Status.OK.getNumber()) { + output.writeEnum(1, statusEnum_); + } + if (rid_ != 0) { + output.writeSInt32(2, rid_); + } + if (operate_ != com.dfire.protocol.RpcOperate.Operate.HeartBeat.getNumber()) { + output.writeEnum(3, operate_); + } + if (!getErrorTextBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, errorText_); + } + if (!body_.isEmpty()) { + output.writeBytes(5, body_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (statusEnum_ != com.dfire.protocol.ResponseStatus.Status.OK.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, statusEnum_); + } + if (rid_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(2, rid_); + } + if (operate_ != com.dfire.protocol.RpcOperate.Operate.HeartBeat.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, operate_); + } + if (!getErrorTextBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, errorText_); + } + if (!body_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, body_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcResponse.Response)) { + return super.equals(obj); + } + com.dfire.protocol.RpcResponse.Response other = (com.dfire.protocol.RpcResponse.Response) obj; + + boolean result = true; + result = result && statusEnum_ == other.statusEnum_; + result = result && (getRid() + == other.getRid()); + result = result && operate_ == other.operate_; + result = result && getErrorText() + .equals(other.getErrorText()); + result = result && getBody() + .equals(other.getBody()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + STATUSENUM_FIELD_NUMBER; + hash = (53 * hash) + statusEnum_; + hash = (37 * hash) + RID_FIELD_NUMBER; + hash = (53 * hash) + getRid(); + hash = (37 * hash) + OPERATE_FIELD_NUMBER; + hash = (53 * hash) + operate_; + hash = (37 * hash) + ERRORTEXT_FIELD_NUMBER; + hash = (53 * hash) + getErrorText().hashCode(); + hash = (37 * hash) + BODY_FIELD_NUMBER; + hash = (53 * hash) + getBody().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcResponse.Response parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcResponse.Response parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcResponse.Response parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcResponse.Response parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcResponse.Response prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
                              +     *rpc 请求响应体
                              +     * 
                              + * + * Protobuf type {@code Response} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Response) + com.dfire.protocol.RpcResponse.ResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcResponse.internal_static_Response_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcResponse.internal_static_Response_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcResponse.Response.class, com.dfire.protocol.RpcResponse.Response.Builder.class); + } + + // Construct using com.dfire.protocol.RpcResponse.Response.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + statusEnum_ = 0; + + rid_ = 0; + + operate_ = 0; + + errorText_ = ""; + + body_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcResponse.internal_static_Response_descriptor; + } + + public com.dfire.protocol.RpcResponse.Response getDefaultInstanceForType() { + return com.dfire.protocol.RpcResponse.Response.getDefaultInstance(); + } + + public com.dfire.protocol.RpcResponse.Response build() { + com.dfire.protocol.RpcResponse.Response result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcResponse.Response buildPartial() { + com.dfire.protocol.RpcResponse.Response result = new com.dfire.protocol.RpcResponse.Response(this); + result.statusEnum_ = statusEnum_; + result.rid_ = rid_; + result.operate_ = operate_; + result.errorText_ = errorText_; + result.body_ = body_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcResponse.Response) { + return mergeFrom((com.dfire.protocol.RpcResponse.Response)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcResponse.Response other) { + if (other == com.dfire.protocol.RpcResponse.Response.getDefaultInstance()) return this; + if (other.statusEnum_ != 0) { + setStatusEnumValue(other.getStatusEnumValue()); + } + if (other.getRid() != 0) { + setRid(other.getRid()); + } + if (other.operate_ != 0) { + setOperateValue(other.getOperateValue()); + } + if (!other.getErrorText().isEmpty()) { + errorText_ = other.errorText_; + onChanged(); + } + if (other.getBody() != com.google.protobuf.ByteString.EMPTY) { + setBody(other.getBody()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcResponse.Response parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcResponse.Response) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int statusEnum_ = 0; + /** + *
                              +       *状态码
                              +       * 
                              + * + * .Status statusEnum = 1; + */ + public int getStatusEnumValue() { + return statusEnum_; + } + /** + *
                              +       *状态码
                              +       * 
                              + * + * .Status statusEnum = 1; + */ + public Builder setStatusEnumValue(int value) { + statusEnum_ = value; + onChanged(); + return this; + } + /** + *
                              +       *状态码
                              +       * 
                              + * + * .Status statusEnum = 1; + */ + public com.dfire.protocol.ResponseStatus.Status getStatusEnum() { + com.dfire.protocol.ResponseStatus.Status result = com.dfire.protocol.ResponseStatus.Status.valueOf(statusEnum_); + return result == null ? com.dfire.protocol.ResponseStatus.Status.UNRECOGNIZED : result; + } + /** + *
                              +       *状态码
                              +       * 
                              + * + * .Status statusEnum = 1; + */ + public Builder setStatusEnum(com.dfire.protocol.ResponseStatus.Status value) { + if (value == null) { + throw new NullPointerException(); + } + + statusEnum_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
                              +       *状态码
                              +       * 
                              + * + * .Status statusEnum = 1; + */ + public Builder clearStatusEnum() { + + statusEnum_ = 0; + onChanged(); + return this; + } + + private int rid_ ; + /** + *
                              +       *request id,响应时原封不动返回,提供给client配对.
                              +       * 
                              + * + * sint32 rid = 2; + */ + public int getRid() { + return rid_; + } + /** + *
                              +       *request id,响应时原封不动返回,提供给client配对.
                              +       * 
                              + * + * sint32 rid = 2; + */ + public Builder setRid(int value) { + + rid_ = value; + onChanged(); + return this; + } + /** + *
                              +       *request id,响应时原封不动返回,提供给client配对.
                              +       * 
                              + * + * sint32 rid = 2; + */ + public Builder clearRid() { + + rid_ = 0; + onChanged(); + return this; + } + + private int operate_ = 0; + /** + * .Operate operate = 3; + */ + public int getOperateValue() { + return operate_; + } + /** + * .Operate operate = 3; + */ + public Builder setOperateValue(int value) { + operate_ = value; + onChanged(); + return this; + } + /** + * .Operate operate = 3; + */ + public com.dfire.protocol.RpcOperate.Operate getOperate() { + com.dfire.protocol.RpcOperate.Operate result = com.dfire.protocol.RpcOperate.Operate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcOperate.Operate.UNRECOGNIZED : result; + } + /** + * .Operate operate = 3; + */ + public Builder setOperate(com.dfire.protocol.RpcOperate.Operate value) { + if (value == null) { + throw new NullPointerException(); + } + + operate_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .Operate operate = 3; + */ + public Builder clearOperate() { + + operate_ = 0; + onChanged(); + return this; + } + + private java.lang.Object errorText_ = ""; + /** + *
                              +       *如果出错,会有出错信息.纯文本形式.client自行包装
                              +       * 
                              + * + * string errorText = 4; + */ + public java.lang.String getErrorText() { + java.lang.Object ref = errorText_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + errorText_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *如果出错,会有出错信息.纯文本形式.client自行包装
                              +       * 
                              + * + * string errorText = 4; + */ + public com.google.protobuf.ByteString + getErrorTextBytes() { + java.lang.Object ref = errorText_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + errorText_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *如果出错,会有出错信息.纯文本形式.client自行包装
                              +       * 
                              + * + * string errorText = 4; + */ + public Builder setErrorText( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + errorText_ = value; + onChanged(); + return this; + } + /** + *
                              +       *如果出错,会有出错信息.纯文本形式.client自行包装
                              +       * 
                              + * + * string errorText = 4; + */ + public Builder clearErrorText() { + + errorText_ = getDefaultInstance().getErrorText(); + onChanged(); + return this; + } + /** + *
                              +       *如果出错,会有出错信息.纯文本形式.client自行包装
                              +       * 
                              + * + * string errorText = 4; + */ + public Builder setErrorTextBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + errorText_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + *
                              +       *响应体
                              +       * 
                              + * + * bytes body = 5; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + *
                              +       *响应体
                              +       * 
                              + * + * bytes body = 5; + */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + body_ = value; + onChanged(); + return this; + } + /** + *
                              +       *响应体
                              +       * 
                              + * + * bytes body = 5; + */ + public Builder clearBody() { + + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Response) + } + + // @@protoc_insertion_point(class_scope:Response) + private static final com.dfire.protocol.RpcResponse.Response DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcResponse.Response(); + } + + public static com.dfire.protocol.RpcResponse.Response getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public Response parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Response(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcResponse.Response getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Response_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Response_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\016response.proto\032\014status.proto\032\roperate." + + "proto\"p\n\010Response\022\033\n\nstatusEnum\030\001 \001(\0162\007." + + "Status\022\013\n\003rid\030\002 \001(\021\022\031\n\007operate\030\003 \001(\0162\010.O" + + "perate\022\021\n\terrorText\030\004 \001(\t\022\014\n\004body\030\005 \001(\014B" + + "#\n\022com.dfire.protocolB\013RpcResponseH\001b\006pr" + + "oto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.dfire.protocol.ResponseStatus.getDescriptor(), + com.dfire.protocol.RpcOperate.getDescriptor(), + }, assigner); + internal_static_Response_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Response_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Response_descriptor, + new java.lang.String[] { "StatusEnum", "Rid", "Operate", "ErrorText", "Body", }); + com.dfire.protocol.ResponseStatus.getDescriptor(); + com.dfire.protocol.RpcOperate.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcSocketMessage.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcSocketMessage.java new file mode 100755 index 00000000..8a55c1cd --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcSocketMessage.java @@ -0,0 +1,753 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: socket_message.proto + +package com.dfire.protocol; + +public final class RpcSocketMessage { + private RpcSocketMessage() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface SocketMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:SocketMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * .SocketMessage.Kind kind = 1; + */ + int getKindValue(); + /** + * .SocketMessage.Kind kind = 1; + */ + com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind getKind(); + + /** + *
                              +     *消息体数据,字节码存储
                              +     * 
                              + * + * bytes body = 2; + */ + com.google.protobuf.ByteString getBody(); + } + /** + *
                              +   *netty rpc通信消息体
                              +   * 
                              + * + * Protobuf type {@code SocketMessage} + */ + public static final class SocketMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:SocketMessage) + SocketMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use SocketMessage.newBuilder() to construct. + private SocketMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private SocketMessage() { + kind_ = 0; + body_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SocketMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + + kind_ = rawValue; + break; + } + case 18: { + + body_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcSocketMessage.internal_static_SocketMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcSocketMessage.internal_static_SocketMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcSocketMessage.SocketMessage.class, com.dfire.protocol.RpcSocketMessage.SocketMessage.Builder.class); + } + + /** + *
                              +     *rpc通信消息类型
                              +     * 
                              + * + * Protobuf enum {@code SocketMessage.Kind} + */ + public enum Kind + implements com.google.protobuf.ProtocolMessageEnum { + /** + * REQUEST = 0; + */ + REQUEST(0), + /** + * RESPONSE = 1; + */ + RESPONSE(1), + /** + * WEB_REQUEST = 2; + */ + WEB_REQUEST(2), + /** + * WEB_RESPONSE = 3; + */ + WEB_RESPONSE(3), + UNRECOGNIZED(-1), + ; + + /** + * REQUEST = 0; + */ + public static final int REQUEST_VALUE = 0; + /** + * RESPONSE = 1; + */ + public static final int RESPONSE_VALUE = 1; + /** + * WEB_REQUEST = 2; + */ + public static final int WEB_REQUEST_VALUE = 2; + /** + * WEB_RESPONSE = 3; + */ + public static final int WEB_RESPONSE_VALUE = 3; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Kind valueOf(int value) { + return forNumber(value); + } + + public static Kind forNumber(int value) { + switch (value) { + case 0: return REQUEST; + case 1: return RESPONSE; + case 2: return WEB_REQUEST; + case 3: return WEB_RESPONSE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Kind> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Kind findValueByNumber(int number) { + return Kind.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.dfire.protocol.RpcSocketMessage.SocketMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Kind[] VALUES = values(); + + public static Kind valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Kind(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:SocketMessage.Kind) + } + + public static final int KIND_FIELD_NUMBER = 1; + private int kind_; + /** + * .SocketMessage.Kind kind = 1; + */ + public int getKindValue() { + return kind_; + } + /** + * .SocketMessage.Kind kind = 1; + */ + public com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind getKind() { + com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind result = com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind.valueOf(kind_); + return result == null ? com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind.UNRECOGNIZED : result; + } + + public static final int BODY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString body_; + /** + *
                              +     *消息体数据,字节码存储
                              +     * 
                              + * + * bytes body = 2; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (kind_ != com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind.REQUEST.getNumber()) { + output.writeEnum(1, kind_); + } + if (!body_.isEmpty()) { + output.writeBytes(2, body_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (kind_ != com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind.REQUEST.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, kind_); + } + if (!body_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, body_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcSocketMessage.SocketMessage)) { + return super.equals(obj); + } + com.dfire.protocol.RpcSocketMessage.SocketMessage other = (com.dfire.protocol.RpcSocketMessage.SocketMessage) obj; + + boolean result = true; + result = result && kind_ == other.kind_; + result = result && getBody() + .equals(other.getBody()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + KIND_FIELD_NUMBER; + hash = (53 * hash) + kind_; + hash = (37 * hash) + BODY_FIELD_NUMBER; + hash = (53 * hash) + getBody().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcSocketMessage.SocketMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcSocketMessage.SocketMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
                              +     *netty rpc通信消息体
                              +     * 
                              + * + * Protobuf type {@code SocketMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:SocketMessage) + com.dfire.protocol.RpcSocketMessage.SocketMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcSocketMessage.internal_static_SocketMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcSocketMessage.internal_static_SocketMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcSocketMessage.SocketMessage.class, com.dfire.protocol.RpcSocketMessage.SocketMessage.Builder.class); + } + + // Construct using com.dfire.protocol.RpcSocketMessage.SocketMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + kind_ = 0; + + body_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcSocketMessage.internal_static_SocketMessage_descriptor; + } + + public com.dfire.protocol.RpcSocketMessage.SocketMessage getDefaultInstanceForType() { + return com.dfire.protocol.RpcSocketMessage.SocketMessage.getDefaultInstance(); + } + + public com.dfire.protocol.RpcSocketMessage.SocketMessage build() { + com.dfire.protocol.RpcSocketMessage.SocketMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcSocketMessage.SocketMessage buildPartial() { + com.dfire.protocol.RpcSocketMessage.SocketMessage result = new com.dfire.protocol.RpcSocketMessage.SocketMessage(this); + result.kind_ = kind_; + result.body_ = body_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcSocketMessage.SocketMessage) { + return mergeFrom((com.dfire.protocol.RpcSocketMessage.SocketMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcSocketMessage.SocketMessage other) { + if (other == com.dfire.protocol.RpcSocketMessage.SocketMessage.getDefaultInstance()) return this; + if (other.kind_ != 0) { + setKindValue(other.getKindValue()); + } + if (other.getBody() != com.google.protobuf.ByteString.EMPTY) { + setBody(other.getBody()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcSocketMessage.SocketMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcSocketMessage.SocketMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int kind_ = 0; + /** + * .SocketMessage.Kind kind = 1; + */ + public int getKindValue() { + return kind_; + } + /** + * .SocketMessage.Kind kind = 1; + */ + public Builder setKindValue(int value) { + kind_ = value; + onChanged(); + return this; + } + /** + * .SocketMessage.Kind kind = 1; + */ + public com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind getKind() { + com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind result = com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind.valueOf(kind_); + return result == null ? com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind.UNRECOGNIZED : result; + } + /** + * .SocketMessage.Kind kind = 1; + */ + public Builder setKind(com.dfire.protocol.RpcSocketMessage.SocketMessage.Kind value) { + if (value == null) { + throw new NullPointerException(); + } + + kind_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .SocketMessage.Kind kind = 1; + */ + public Builder clearKind() { + + kind_ = 0; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + *
                              +       *消息体数据,字节码存储
                              +       * 
                              + * + * bytes body = 2; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + *
                              +       *消息体数据,字节码存储
                              +       * 
                              + * + * bytes body = 2; + */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + body_ = value; + onChanged(); + return this; + } + /** + *
                              +       *消息体数据,字节码存储
                              +       * 
                              + * + * bytes body = 2; + */ + public Builder clearBody() { + + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:SocketMessage) + } + + // @@protoc_insertion_point(class_scope:SocketMessage) + private static final com.dfire.protocol.RpcSocketMessage.SocketMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcSocketMessage.SocketMessage(); + } + + public static com.dfire.protocol.RpcSocketMessage.SocketMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public SocketMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SocketMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcSocketMessage.SocketMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_SocketMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_SocketMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\024socket_message.proto\"\206\001\n\rSocketMessage" + + "\022!\n\004kind\030\001 \001(\0162\023.SocketMessage.Kind\022\014\n\004b" + + "ody\030\002 \001(\014\"D\n\004Kind\022\013\n\007REQUEST\020\000\022\014\n\010RESPON" + + "SE\020\001\022\017\n\013WEB_REQUEST\020\002\022\020\n\014WEB_RESPONSE\020\003B" + + "(\n\022com.dfire.protocolB\020RpcSocketMessageH" + + "\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_SocketMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_SocketMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_SocketMessage_descriptor, + new java.lang.String[] { "Kind", "Body", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcWebOperate.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcWebOperate.java new file mode 100755 index 00000000..09f192ad --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcWebOperate.java @@ -0,0 +1,256 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: web_operate.proto + +package com.dfire.protocol; + +public final class RpcWebOperate { + private RpcWebOperate() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + /** + * Protobuf enum {@code WebOperate} + */ + public enum WebOperate + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
                              +     *更新job
                              +     * 
                              + * + * UpdateJob = 0; + */ + UpdateJob(0), + /** + *
                              +     *手动执行或者手动恢复job
                              +     * 
                              + * + * ExecuteJob = 1; + */ + ExecuteJob(1), + /** + *
                              +     *手动取消任务
                              +     * 
                              + * + * CancelJob = 2; + */ + CancelJob(2), + /** + *
                              +     *调试任务
                              +     * 
                              + * + * ExecuteDebug = 3; + */ + ExecuteDebug(3), + /** + *
                              +     *生成版本
                              +     * 
                              + * + * GenerateAction = 4; + */ + GenerateAction(4), + /** + *
                              +     *获得心跳信息
                              +     * 
                              + * + * GetAllHeartBeatInfo = 5; + */ + GetAllHeartBeatInfo(5), + /** + *
                              +     *获得所有机器信息
                              +     * 
                              + * + * GetAllWorkInfo = 6; + */ + GetAllWorkInfo(6), + /** + * UpdateConf = 7; + */ + UpdateConf(7), + UNRECOGNIZED(-1), + ; + + /** + *
                              +     *更新job
                              +     * 
                              + * + * UpdateJob = 0; + */ + public static final int UpdateJob_VALUE = 0; + /** + *
                              +     *手动执行或者手动恢复job
                              +     * 
                              + * + * ExecuteJob = 1; + */ + public static final int ExecuteJob_VALUE = 1; + /** + *
                              +     *手动取消任务
                              +     * 
                              + * + * CancelJob = 2; + */ + public static final int CancelJob_VALUE = 2; + /** + *
                              +     *调试任务
                              +     * 
                              + * + * ExecuteDebug = 3; + */ + public static final int ExecuteDebug_VALUE = 3; + /** + *
                              +     *生成版本
                              +     * 
                              + * + * GenerateAction = 4; + */ + public static final int GenerateAction_VALUE = 4; + /** + *
                              +     *获得心跳信息
                              +     * 
                              + * + * GetAllHeartBeatInfo = 5; + */ + public static final int GetAllHeartBeatInfo_VALUE = 5; + /** + *
                              +     *获得所有机器信息
                              +     * 
                              + * + * GetAllWorkInfo = 6; + */ + public static final int GetAllWorkInfo_VALUE = 6; + /** + * UpdateConf = 7; + */ + public static final int UpdateConf_VALUE = 7; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static WebOperate valueOf(int value) { + return forNumber(value); + } + + public static WebOperate forNumber(int value) { + switch (value) { + case 0: return UpdateJob; + case 1: return ExecuteJob; + case 2: return CancelJob; + case 3: return ExecuteDebug; + case 4: return GenerateAction; + case 5: return GetAllHeartBeatInfo; + case 6: return GetAllWorkInfo; + case 7: return UpdateConf; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + WebOperate> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public WebOperate findValueByNumber(int number) { + return WebOperate.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.dfire.protocol.RpcWebOperate.getDescriptor().getEnumTypes().get(0); + } + + private static final WebOperate[] VALUES = values(); + + public static WebOperate valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private WebOperate(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:WebOperate) + } + + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\021web_operate.proto*\235\001\n\nWebOperate\022\r\n\tUp" + + "dateJob\020\000\022\016\n\nExecuteJob\020\001\022\r\n\tCancelJob\020\002" + + "\022\020\n\014ExecuteDebug\020\003\022\022\n\016GenerateAction\020\004\022\027" + + "\n\023GetAllHeartBeatInfo\020\005\022\022\n\016GetAllWorkInf" + + "o\020\006\022\016\n\nUpdateConf\020\007B%\n\022com.dfire.protoco" + + "lB\rRpcWebOperateH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcWebRequest.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcWebRequest.java new file mode 100755 index 00000000..380d0e0f --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcWebRequest.java @@ -0,0 +1,1173 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: web_request.proto + +package com.dfire.protocol; + +public final class RpcWebRequest { + private RpcWebRequest() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface WebRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:WebRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * sint32 rid = 1; + */ + int getRid(); + + /** + * .WebOperate operate = 2; + */ + int getOperateValue(); + /** + * .WebOperate operate = 2; + */ + com.dfire.protocol.RpcWebOperate.WebOperate getOperate(); + + /** + * .ExecuteKind ek = 3; + */ + int getEkValue(); + /** + * .ExecuteKind ek = 3; + */ + com.dfire.protocol.JobExecuteKind.ExecuteKind getEk(); + + /** + *
                              +     * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +     * 
                              + * + * string id = 4; + */ + java.lang.String getId(); + /** + *
                              +     * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +     * 
                              + * + * string id = 4; + */ + com.google.protobuf.ByteString + getIdBytes(); + + /** + * string executor = 5; + */ + java.lang.String getExecutor(); + /** + * string executor = 5; + */ + com.google.protobuf.ByteString + getExecutorBytes(); + + /** + * bytes body = 6; + */ + com.google.protobuf.ByteString getBody(); + } + /** + * Protobuf type {@code WebRequest} + */ + public static final class WebRequest extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:WebRequest) + WebRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use WebRequest.newBuilder() to construct. + private WebRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private WebRequest() { + rid_ = 0; + operate_ = 0; + ek_ = 0; + id_ = ""; + executor_ = ""; + body_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private WebRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + + rid_ = input.readSInt32(); + break; + } + case 16: { + int rawValue = input.readEnum(); + + operate_ = rawValue; + break; + } + case 24: { + int rawValue = input.readEnum(); + + ek_ = rawValue; + break; + } + case 34: { + java.lang.String s = input.readStringRequireUtf8(); + + id_ = s; + break; + } + case 42: { + java.lang.String s = input.readStringRequireUtf8(); + + executor_ = s; + break; + } + case 50: { + + body_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWebRequest.internal_static_WebRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWebRequest.internal_static_WebRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWebRequest.WebRequest.class, com.dfire.protocol.RpcWebRequest.WebRequest.Builder.class); + } + + /** + * Protobuf enum {@code WebRequest.Trigger} + */ + public enum Trigger + implements com.google.protobuf.ProtocolMessageEnum { + /** + * MANUAL = 0; + */ + MANUAL(0), + /** + * MANUAL_RECOVER = 1; + */ + MANUAL_RECOVER(1), + UNRECOGNIZED(-1), + ; + + /** + * MANUAL = 0; + */ + public static final int MANUAL_VALUE = 0; + /** + * MANUAL_RECOVER = 1; + */ + public static final int MANUAL_RECOVER_VALUE = 1; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Trigger valueOf(int value) { + return forNumber(value); + } + + public static Trigger forNumber(int value) { + switch (value) { + case 0: return MANUAL; + case 1: return MANUAL_RECOVER; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Trigger> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Trigger findValueByNumber(int number) { + return Trigger.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.dfire.protocol.RpcWebRequest.WebRequest.getDescriptor().getEnumTypes().get(0); + } + + private static final Trigger[] VALUES = values(); + + public static Trigger valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Trigger(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:WebRequest.Trigger) + } + + public static final int RID_FIELD_NUMBER = 1; + private int rid_; + /** + * sint32 rid = 1; + */ + public int getRid() { + return rid_; + } + + public static final int OPERATE_FIELD_NUMBER = 2; + private int operate_; + /** + * .WebOperate operate = 2; + */ + public int getOperateValue() { + return operate_; + } + /** + * .WebOperate operate = 2; + */ + public com.dfire.protocol.RpcWebOperate.WebOperate getOperate() { + com.dfire.protocol.RpcWebOperate.WebOperate result = com.dfire.protocol.RpcWebOperate.WebOperate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcWebOperate.WebOperate.UNRECOGNIZED : result; + } + + public static final int EK_FIELD_NUMBER = 3; + private int ek_; + /** + * .ExecuteKind ek = 3; + */ + public int getEkValue() { + return ek_; + } + /** + * .ExecuteKind ek = 3; + */ + public com.dfire.protocol.JobExecuteKind.ExecuteKind getEk() { + com.dfire.protocol.JobExecuteKind.ExecuteKind result = com.dfire.protocol.JobExecuteKind.ExecuteKind.valueOf(ek_); + return result == null ? com.dfire.protocol.JobExecuteKind.ExecuteKind.UNRECOGNIZED : result; + } + + public static final int ID_FIELD_NUMBER = 4; + private volatile java.lang.Object id_; + /** + *
                              +     * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +     * 
                              + * + * string id = 4; + */ + public java.lang.String getId() { + java.lang.Object ref = id_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + id_ = s; + return s; + } + } + /** + *
                              +     * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +     * 
                              + * + * string id = 4; + */ + public com.google.protobuf.ByteString + getIdBytes() { + java.lang.Object ref = id_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + id_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int EXECUTOR_FIELD_NUMBER = 5; + private volatile java.lang.Object executor_; + /** + * string executor = 5; + */ + public java.lang.String getExecutor() { + java.lang.Object ref = executor_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + executor_ = s; + return s; + } + } + /** + * string executor = 5; + */ + public com.google.protobuf.ByteString + getExecutorBytes() { + java.lang.Object ref = executor_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + executor_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int BODY_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString body_; + /** + * bytes body = 6; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (rid_ != 0) { + output.writeSInt32(1, rid_); + } + if (operate_ != com.dfire.protocol.RpcWebOperate.WebOperate.UpdateJob.getNumber()) { + output.writeEnum(2, operate_); + } + if (ek_ != com.dfire.protocol.JobExecuteKind.ExecuteKind.ScheduleKind.getNumber()) { + output.writeEnum(3, ek_); + } + if (!getIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, id_); + } + if (!getExecutorBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, executor_); + } + if (!body_.isEmpty()) { + output.writeBytes(6, body_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (rid_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(1, rid_); + } + if (operate_ != com.dfire.protocol.RpcWebOperate.WebOperate.UpdateJob.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, operate_); + } + if (ek_ != com.dfire.protocol.JobExecuteKind.ExecuteKind.ScheduleKind.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, ek_); + } + if (!getIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, id_); + } + if (!getExecutorBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, executor_); + } + if (!body_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, body_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcWebRequest.WebRequest)) { + return super.equals(obj); + } + com.dfire.protocol.RpcWebRequest.WebRequest other = (com.dfire.protocol.RpcWebRequest.WebRequest) obj; + + boolean result = true; + result = result && (getRid() + == other.getRid()); + result = result && operate_ == other.operate_; + result = result && ek_ == other.ek_; + result = result && getId() + .equals(other.getId()); + result = result && getExecutor() + .equals(other.getExecutor()); + result = result && getBody() + .equals(other.getBody()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + RID_FIELD_NUMBER; + hash = (53 * hash) + getRid(); + hash = (37 * hash) + OPERATE_FIELD_NUMBER; + hash = (53 * hash) + operate_; + hash = (37 * hash) + EK_FIELD_NUMBER; + hash = (53 * hash) + ek_; + hash = (37 * hash) + ID_FIELD_NUMBER; + hash = (53 * hash) + getId().hashCode(); + hash = (37 * hash) + EXECUTOR_FIELD_NUMBER; + hash = (53 * hash) + getExecutor().hashCode(); + hash = (37 * hash) + BODY_FIELD_NUMBER; + hash = (53 * hash) + getBody().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWebRequest.WebRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcWebRequest.WebRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code WebRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:WebRequest) + com.dfire.protocol.RpcWebRequest.WebRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWebRequest.internal_static_WebRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWebRequest.internal_static_WebRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWebRequest.WebRequest.class, com.dfire.protocol.RpcWebRequest.WebRequest.Builder.class); + } + + // Construct using com.dfire.protocol.RpcWebRequest.WebRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + rid_ = 0; + + operate_ = 0; + + ek_ = 0; + + id_ = ""; + + executor_ = ""; + + body_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcWebRequest.internal_static_WebRequest_descriptor; + } + + public com.dfire.protocol.RpcWebRequest.WebRequest getDefaultInstanceForType() { + return com.dfire.protocol.RpcWebRequest.WebRequest.getDefaultInstance(); + } + + public com.dfire.protocol.RpcWebRequest.WebRequest build() { + com.dfire.protocol.RpcWebRequest.WebRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcWebRequest.WebRequest buildPartial() { + com.dfire.protocol.RpcWebRequest.WebRequest result = new com.dfire.protocol.RpcWebRequest.WebRequest(this); + result.rid_ = rid_; + result.operate_ = operate_; + result.ek_ = ek_; + result.id_ = id_; + result.executor_ = executor_; + result.body_ = body_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcWebRequest.WebRequest) { + return mergeFrom((com.dfire.protocol.RpcWebRequest.WebRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcWebRequest.WebRequest other) { + if (other == com.dfire.protocol.RpcWebRequest.WebRequest.getDefaultInstance()) return this; + if (other.getRid() != 0) { + setRid(other.getRid()); + } + if (other.operate_ != 0) { + setOperateValue(other.getOperateValue()); + } + if (other.ek_ != 0) { + setEkValue(other.getEkValue()); + } + if (!other.getId().isEmpty()) { + id_ = other.id_; + onChanged(); + } + if (!other.getExecutor().isEmpty()) { + executor_ = other.executor_; + onChanged(); + } + if (other.getBody() != com.google.protobuf.ByteString.EMPTY) { + setBody(other.getBody()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcWebRequest.WebRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcWebRequest.WebRequest) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int rid_ ; + /** + * sint32 rid = 1; + */ + public int getRid() { + return rid_; + } + /** + * sint32 rid = 1; + */ + public Builder setRid(int value) { + + rid_ = value; + onChanged(); + return this; + } + /** + * sint32 rid = 1; + */ + public Builder clearRid() { + + rid_ = 0; + onChanged(); + return this; + } + + private int operate_ = 0; + /** + * .WebOperate operate = 2; + */ + public int getOperateValue() { + return operate_; + } + /** + * .WebOperate operate = 2; + */ + public Builder setOperateValue(int value) { + operate_ = value; + onChanged(); + return this; + } + /** + * .WebOperate operate = 2; + */ + public com.dfire.protocol.RpcWebOperate.WebOperate getOperate() { + com.dfire.protocol.RpcWebOperate.WebOperate result = com.dfire.protocol.RpcWebOperate.WebOperate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcWebOperate.WebOperate.UNRECOGNIZED : result; + } + /** + * .WebOperate operate = 2; + */ + public Builder setOperate(com.dfire.protocol.RpcWebOperate.WebOperate value) { + if (value == null) { + throw new NullPointerException(); + } + + operate_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .WebOperate operate = 2; + */ + public Builder clearOperate() { + + operate_ = 0; + onChanged(); + return this; + } + + private int ek_ = 0; + /** + * .ExecuteKind ek = 3; + */ + public int getEkValue() { + return ek_; + } + /** + * .ExecuteKind ek = 3; + */ + public Builder setEkValue(int value) { + ek_ = value; + onChanged(); + return this; + } + /** + * .ExecuteKind ek = 3; + */ + public com.dfire.protocol.JobExecuteKind.ExecuteKind getEk() { + com.dfire.protocol.JobExecuteKind.ExecuteKind result = com.dfire.protocol.JobExecuteKind.ExecuteKind.valueOf(ek_); + return result == null ? com.dfire.protocol.JobExecuteKind.ExecuteKind.UNRECOGNIZED : result; + } + /** + * .ExecuteKind ek = 3; + */ + public Builder setEk(com.dfire.protocol.JobExecuteKind.ExecuteKind value) { + if (value == null) { + throw new NullPointerException(); + } + + ek_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .ExecuteKind ek = 3; + */ + public Builder clearEk() { + + ek_ = 0; + onChanged(); + return this; + } + + private java.lang.Object id_ = ""; + /** + *
                              +       * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +       * 
                              + * + * string id = 4; + */ + public java.lang.String getId() { + java.lang.Object ref = id_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + id_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +       * 
                              + * + * string id = 4; + */ + public com.google.protobuf.ByteString + getIdBytes() { + java.lang.Object ref = id_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + id_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +       * 
                              + * + * string id = 4; + */ + public Builder setId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + id_ = value; + onChanged(); + return this; + } + /** + *
                              +       * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +       * 
                              + * + * string id = 4; + */ + public Builder clearId() { + + id_ = getDefaultInstance().getId(); + onChanged(); + return this; + } + /** + *
                              +       * update 时 id=actionId  source=ScheduleJob时 id=historyId  source=DebugJob时id=debugId
                              +       * 
                              + * + * string id = 4; + */ + public Builder setIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + id_ = value; + onChanged(); + return this; + } + + private java.lang.Object executor_ = ""; + /** + * string executor = 5; + */ + public java.lang.String getExecutor() { + java.lang.Object ref = executor_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + executor_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string executor = 5; + */ + public com.google.protobuf.ByteString + getExecutorBytes() { + java.lang.Object ref = executor_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + executor_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string executor = 5; + */ + public Builder setExecutor( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + executor_ = value; + onChanged(); + return this; + } + /** + * string executor = 5; + */ + public Builder clearExecutor() { + + executor_ = getDefaultInstance().getExecutor(); + onChanged(); + return this; + } + /** + * string executor = 5; + */ + public Builder setExecutorBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + executor_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + * bytes body = 6; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + * bytes body = 6; + */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + body_ = value; + onChanged(); + return this; + } + /** + * bytes body = 6; + */ + public Builder clearBody() { + + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:WebRequest) + } + + // @@protoc_insertion_point(class_scope:WebRequest) + private static final com.dfire.protocol.RpcWebRequest.WebRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcWebRequest.WebRequest(); + } + + public static com.dfire.protocol.RpcWebRequest.WebRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public WebRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new WebRequest(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcWebRequest.WebRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_WebRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_WebRequest_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\021web_request.proto\032\021web_operate.proto\032\022" + + "execute_kind.proto\"\250\001\n\nWebRequest\022\013\n\003rid" + + "\030\001 \001(\021\022\034\n\007operate\030\002 \001(\0162\013.WebOperate\022\030\n\002" + + "ek\030\003 \001(\0162\014.ExecuteKind\022\n\n\002id\030\004 \001(\t\022\020\n\010ex" + + "ecutor\030\005 \001(\t\022\014\n\004body\030\006 \001(\014\")\n\007Trigger\022\n\n" + + "\006MANUAL\020\000\022\022\n\016MANUAL_RECOVER\020\001B%\n\022com.dfi" + + "re.protocolB\rRpcWebRequestH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.dfire.protocol.RpcWebOperate.getDescriptor(), + com.dfire.protocol.JobExecuteKind.getDescriptor(), + }, assigner); + internal_static_WebRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_WebRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_WebRequest_descriptor, + new java.lang.String[] { "Rid", "Operate", "Ek", "Id", "Executor", "Body", }); + com.dfire.protocol.RpcWebOperate.getDescriptor(); + com.dfire.protocol.JobExecuteKind.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcWebResponse.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcWebResponse.java new file mode 100755 index 00000000..fcb56789 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcWebResponse.java @@ -0,0 +1,901 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: web_response.proto + +package com.dfire.protocol; + +public final class RpcWebResponse { + private RpcWebResponse() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface WebResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:WebResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * .Status status = 1; + */ + int getStatusValue(); + /** + * .Status status = 1; + */ + com.dfire.protocol.ResponseStatus.Status getStatus(); + + /** + * sint32 rid = 2; + */ + int getRid(); + + /** + * .WebOperate operate = 3; + */ + int getOperateValue(); + /** + * .WebOperate operate = 3; + */ + com.dfire.protocol.RpcWebOperate.WebOperate getOperate(); + + /** + * string errorText = 4; + */ + java.lang.String getErrorText(); + /** + * string errorText = 4; + */ + com.google.protobuf.ByteString + getErrorTextBytes(); + + /** + * bytes body = 5; + */ + com.google.protobuf.ByteString getBody(); + } + /** + * Protobuf type {@code WebResponse} + */ + public static final class WebResponse extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:WebResponse) + WebResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use WebResponse.newBuilder() to construct. + private WebResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private WebResponse() { + status_ = 0; + rid_ = 0; + operate_ = 0; + errorText_ = ""; + body_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private WebResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + + status_ = rawValue; + break; + } + case 16: { + + rid_ = input.readSInt32(); + break; + } + case 24: { + int rawValue = input.readEnum(); + + operate_ = rawValue; + break; + } + case 34: { + java.lang.String s = input.readStringRequireUtf8(); + + errorText_ = s; + break; + } + case 42: { + + body_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWebResponse.internal_static_WebResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWebResponse.internal_static_WebResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWebResponse.WebResponse.class, com.dfire.protocol.RpcWebResponse.WebResponse.Builder.class); + } + + public static final int STATUS_FIELD_NUMBER = 1; + private int status_; + /** + * .Status status = 1; + */ + public int getStatusValue() { + return status_; + } + /** + * .Status status = 1; + */ + public com.dfire.protocol.ResponseStatus.Status getStatus() { + com.dfire.protocol.ResponseStatus.Status result = com.dfire.protocol.ResponseStatus.Status.valueOf(status_); + return result == null ? com.dfire.protocol.ResponseStatus.Status.UNRECOGNIZED : result; + } + + public static final int RID_FIELD_NUMBER = 2; + private int rid_; + /** + * sint32 rid = 2; + */ + public int getRid() { + return rid_; + } + + public static final int OPERATE_FIELD_NUMBER = 3; + private int operate_; + /** + * .WebOperate operate = 3; + */ + public int getOperateValue() { + return operate_; + } + /** + * .WebOperate operate = 3; + */ + public com.dfire.protocol.RpcWebOperate.WebOperate getOperate() { + com.dfire.protocol.RpcWebOperate.WebOperate result = com.dfire.protocol.RpcWebOperate.WebOperate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcWebOperate.WebOperate.UNRECOGNIZED : result; + } + + public static final int ERRORTEXT_FIELD_NUMBER = 4; + private volatile java.lang.Object errorText_; + /** + * string errorText = 4; + */ + public java.lang.String getErrorText() { + java.lang.Object ref = errorText_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + errorText_ = s; + return s; + } + } + /** + * string errorText = 4; + */ + public com.google.protobuf.ByteString + getErrorTextBytes() { + java.lang.Object ref = errorText_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + errorText_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int BODY_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString body_; + /** + * bytes body = 5; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (status_ != com.dfire.protocol.ResponseStatus.Status.OK.getNumber()) { + output.writeEnum(1, status_); + } + if (rid_ != 0) { + output.writeSInt32(2, rid_); + } + if (operate_ != com.dfire.protocol.RpcWebOperate.WebOperate.UpdateJob.getNumber()) { + output.writeEnum(3, operate_); + } + if (!getErrorTextBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, errorText_); + } + if (!body_.isEmpty()) { + output.writeBytes(5, body_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (status_ != com.dfire.protocol.ResponseStatus.Status.OK.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, status_); + } + if (rid_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeSInt32Size(2, rid_); + } + if (operate_ != com.dfire.protocol.RpcWebOperate.WebOperate.UpdateJob.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, operate_); + } + if (!getErrorTextBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, errorText_); + } + if (!body_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, body_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcWebResponse.WebResponse)) { + return super.equals(obj); + } + com.dfire.protocol.RpcWebResponse.WebResponse other = (com.dfire.protocol.RpcWebResponse.WebResponse) obj; + + boolean result = true; + result = result && status_ == other.status_; + result = result && (getRid() + == other.getRid()); + result = result && operate_ == other.operate_; + result = result && getErrorText() + .equals(other.getErrorText()); + result = result && getBody() + .equals(other.getBody()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + STATUS_FIELD_NUMBER; + hash = (53 * hash) + status_; + hash = (37 * hash) + RID_FIELD_NUMBER; + hash = (53 * hash) + getRid(); + hash = (37 * hash) + OPERATE_FIELD_NUMBER; + hash = (53 * hash) + operate_; + hash = (37 * hash) + ERRORTEXT_FIELD_NUMBER; + hash = (53 * hash) + getErrorText().hashCode(); + hash = (37 * hash) + BODY_FIELD_NUMBER; + hash = (53 * hash) + getBody().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWebResponse.WebResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcWebResponse.WebResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code WebResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:WebResponse) + com.dfire.protocol.RpcWebResponse.WebResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWebResponse.internal_static_WebResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWebResponse.internal_static_WebResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWebResponse.WebResponse.class, com.dfire.protocol.RpcWebResponse.WebResponse.Builder.class); + } + + // Construct using com.dfire.protocol.RpcWebResponse.WebResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + status_ = 0; + + rid_ = 0; + + operate_ = 0; + + errorText_ = ""; + + body_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcWebResponse.internal_static_WebResponse_descriptor; + } + + public com.dfire.protocol.RpcWebResponse.WebResponse getDefaultInstanceForType() { + return com.dfire.protocol.RpcWebResponse.WebResponse.getDefaultInstance(); + } + + public com.dfire.protocol.RpcWebResponse.WebResponse build() { + com.dfire.protocol.RpcWebResponse.WebResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcWebResponse.WebResponse buildPartial() { + com.dfire.protocol.RpcWebResponse.WebResponse result = new com.dfire.protocol.RpcWebResponse.WebResponse(this); + result.status_ = status_; + result.rid_ = rid_; + result.operate_ = operate_; + result.errorText_ = errorText_; + result.body_ = body_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcWebResponse.WebResponse) { + return mergeFrom((com.dfire.protocol.RpcWebResponse.WebResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcWebResponse.WebResponse other) { + if (other == com.dfire.protocol.RpcWebResponse.WebResponse.getDefaultInstance()) return this; + if (other.status_ != 0) { + setStatusValue(other.getStatusValue()); + } + if (other.getRid() != 0) { + setRid(other.getRid()); + } + if (other.operate_ != 0) { + setOperateValue(other.getOperateValue()); + } + if (!other.getErrorText().isEmpty()) { + errorText_ = other.errorText_; + onChanged(); + } + if (other.getBody() != com.google.protobuf.ByteString.EMPTY) { + setBody(other.getBody()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcWebResponse.WebResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcWebResponse.WebResponse) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int status_ = 0; + /** + * .Status status = 1; + */ + public int getStatusValue() { + return status_; + } + /** + * .Status status = 1; + */ + public Builder setStatusValue(int value) { + status_ = value; + onChanged(); + return this; + } + /** + * .Status status = 1; + */ + public com.dfire.protocol.ResponseStatus.Status getStatus() { + com.dfire.protocol.ResponseStatus.Status result = com.dfire.protocol.ResponseStatus.Status.valueOf(status_); + return result == null ? com.dfire.protocol.ResponseStatus.Status.UNRECOGNIZED : result; + } + /** + * .Status status = 1; + */ + public Builder setStatus(com.dfire.protocol.ResponseStatus.Status value) { + if (value == null) { + throw new NullPointerException(); + } + + status_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .Status status = 1; + */ + public Builder clearStatus() { + + status_ = 0; + onChanged(); + return this; + } + + private int rid_ ; + /** + * sint32 rid = 2; + */ + public int getRid() { + return rid_; + } + /** + * sint32 rid = 2; + */ + public Builder setRid(int value) { + + rid_ = value; + onChanged(); + return this; + } + /** + * sint32 rid = 2; + */ + public Builder clearRid() { + + rid_ = 0; + onChanged(); + return this; + } + + private int operate_ = 0; + /** + * .WebOperate operate = 3; + */ + public int getOperateValue() { + return operate_; + } + /** + * .WebOperate operate = 3; + */ + public Builder setOperateValue(int value) { + operate_ = value; + onChanged(); + return this; + } + /** + * .WebOperate operate = 3; + */ + public com.dfire.protocol.RpcWebOperate.WebOperate getOperate() { + com.dfire.protocol.RpcWebOperate.WebOperate result = com.dfire.protocol.RpcWebOperate.WebOperate.valueOf(operate_); + return result == null ? com.dfire.protocol.RpcWebOperate.WebOperate.UNRECOGNIZED : result; + } + /** + * .WebOperate operate = 3; + */ + public Builder setOperate(com.dfire.protocol.RpcWebOperate.WebOperate value) { + if (value == null) { + throw new NullPointerException(); + } + + operate_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .WebOperate operate = 3; + */ + public Builder clearOperate() { + + operate_ = 0; + onChanged(); + return this; + } + + private java.lang.Object errorText_ = ""; + /** + * string errorText = 4; + */ + public java.lang.String getErrorText() { + java.lang.Object ref = errorText_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + errorText_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string errorText = 4; + */ + public com.google.protobuf.ByteString + getErrorTextBytes() { + java.lang.Object ref = errorText_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + errorText_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string errorText = 4; + */ + public Builder setErrorText( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + errorText_ = value; + onChanged(); + return this; + } + /** + * string errorText = 4; + */ + public Builder clearErrorText() { + + errorText_ = getDefaultInstance().getErrorText(); + onChanged(); + return this; + } + /** + * string errorText = 4; + */ + public Builder setErrorTextBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + errorText_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + * bytes body = 5; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + * bytes body = 5; + */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + body_ = value; + onChanged(); + return this; + } + /** + * bytes body = 5; + */ + public Builder clearBody() { + + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:WebResponse) + } + + // @@protoc_insertion_point(class_scope:WebResponse) + private static final com.dfire.protocol.RpcWebResponse.WebResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcWebResponse.WebResponse(); + } + + public static com.dfire.protocol.RpcWebResponse.WebResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public WebResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new WebResponse(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcWebResponse.WebResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_WebResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_WebResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\022web_response.proto\032\014status.proto\032\021web_" + + "operate.proto\"r\n\013WebResponse\022\027\n\006status\030\001" + + " \001(\0162\007.Status\022\013\n\003rid\030\002 \001(\021\022\034\n\007operate\030\003 " + + "\001(\0162\013.WebOperate\022\021\n\terrorText\030\004 \001(\t\022\014\n\004b" + + "ody\030\005 \001(\014B&\n\022com.dfire.protocolB\016RpcWebR" + + "esponseH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.dfire.protocol.ResponseStatus.getDescriptor(), + com.dfire.protocol.RpcWebOperate.getDescriptor(), + }, assigner); + internal_static_WebResponse_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_WebResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_WebResponse_descriptor, + new java.lang.String[] { "Status", "Rid", "Operate", "ErrorText", "Body", }); + com.dfire.protocol.ResponseStatus.getDescriptor(); + com.dfire.protocol.RpcWebOperate.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/java/com/dfire/protocol/RpcWorkInfo.java b/hera-protocol/src/main/java/com/dfire/protocol/RpcWorkInfo.java new file mode 100755 index 00000000..35a44776 --- /dev/null +++ b/hera-protocol/src/main/java/com/dfire/protocol/RpcWorkInfo.java @@ -0,0 +1,5942 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: work_info.proto + +package com.dfire.protocol; + +public final class RpcWorkInfo { + private RpcWorkInfo() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface AllWorkInfoOrBuilder extends + // @@protoc_insertion_point(interface_extends:AllWorkInfo) + com.google.protobuf.MessageOrBuilder { + + /** + * map<string, .WorkInfo> values = 1; + */ + int getValuesCount(); + /** + * map<string, .WorkInfo> values = 1; + */ + boolean containsValues( + java.lang.String key); + /** + * Use {@link #getValuesMap()} instead. + */ + @java.lang.Deprecated + java.util.Map + getValues(); + /** + * map<string, .WorkInfo> values = 1; + */ + java.util.Map + getValuesMap(); + /** + * map<string, .WorkInfo> values = 1; + */ + + com.dfire.protocol.RpcWorkInfo.WorkInfo getValuesOrDefault( + java.lang.String key, + com.dfire.protocol.RpcWorkInfo.WorkInfo defaultValue); + /** + * map<string, .WorkInfo> values = 1; + */ + + com.dfire.protocol.RpcWorkInfo.WorkInfo getValuesOrThrow( + java.lang.String key); + } + /** + * Protobuf type {@code AllWorkInfo} + */ + public static final class AllWorkInfo extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:AllWorkInfo) + AllWorkInfoOrBuilder { + private static final long serialVersionUID = 0L; + // Use AllWorkInfo.newBuilder() to construct. + private AllWorkInfo(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AllWorkInfo() { + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AllWorkInfo( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + values_ = com.google.protobuf.MapField.newMapField( + ValuesDefaultEntryHolder.defaultEntry); + mutable_bitField0_ |= 0x00000001; + } + com.google.protobuf.MapEntry + values__ = input.readMessage( + ValuesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry); + values_.getMutableMap().put( + values__.getKey(), values__.getValue()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_AllWorkInfo_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 1: + return internalGetValues(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_AllWorkInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.AllWorkInfo.class, com.dfire.protocol.RpcWorkInfo.AllWorkInfo.Builder.class); + } + + public static final int VALUES_FIELD_NUMBER = 1; + private static final class ValuesDefaultEntryHolder { + static final com.google.protobuf.MapEntry< + java.lang.String, com.dfire.protocol.RpcWorkInfo.WorkInfo> defaultEntry = + com.google.protobuf.MapEntry + .newDefaultInstance( + com.dfire.protocol.RpcWorkInfo.internal_static_AllWorkInfo_ValuesEntry_descriptor, + com.google.protobuf.WireFormat.FieldType.STRING, + "", + com.google.protobuf.WireFormat.FieldType.MESSAGE, + com.dfire.protocol.RpcWorkInfo.WorkInfo.getDefaultInstance()); + } + private com.google.protobuf.MapField< + java.lang.String, com.dfire.protocol.RpcWorkInfo.WorkInfo> values_; + private com.google.protobuf.MapField + internalGetValues() { + if (values_ == null) { + return com.google.protobuf.MapField.emptyMapField( + ValuesDefaultEntryHolder.defaultEntry); + } + return values_; + } + + public int getValuesCount() { + return internalGetValues().getMap().size(); + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public boolean containsValues( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + return internalGetValues().getMap().containsKey(key); + } + /** + * Use {@link #getValuesMap()} instead. + */ + @java.lang.Deprecated + public java.util.Map getValues() { + return getValuesMap(); + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public java.util.Map getValuesMap() { + return internalGetValues().getMap(); + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public com.dfire.protocol.RpcWorkInfo.WorkInfo getValuesOrDefault( + java.lang.String key, + com.dfire.protocol.RpcWorkInfo.WorkInfo defaultValue) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public com.dfire.protocol.RpcWorkInfo.WorkInfo getValuesOrThrow( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + com.google.protobuf.GeneratedMessageV3 + .serializeStringMapTo( + output, + internalGetValues(), + ValuesDefaultEntryHolder.defaultEntry, + 1); + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (java.util.Map.Entry entry + : internalGetValues().getMap().entrySet()) { + com.google.protobuf.MapEntry + values__ = ValuesDefaultEntryHolder.defaultEntry.newBuilderForType() + .setKey(entry.getKey()) + .setValue(entry.getValue()) + .build(); + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, values__); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcWorkInfo.AllWorkInfo)) { + return super.equals(obj); + } + com.dfire.protocol.RpcWorkInfo.AllWorkInfo other = (com.dfire.protocol.RpcWorkInfo.AllWorkInfo) obj; + + boolean result = true; + result = result && internalGetValues().equals( + other.internalGetValues()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (!internalGetValues().getMap().isEmpty()) { + hash = (37 * hash) + VALUES_FIELD_NUMBER; + hash = (53 * hash) + internalGetValues().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcWorkInfo.AllWorkInfo prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code AllWorkInfo} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:AllWorkInfo) + com.dfire.protocol.RpcWorkInfo.AllWorkInfoOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_AllWorkInfo_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 1: + return internalGetValues(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMutableMapField( + int number) { + switch (number) { + case 1: + return internalGetMutableValues(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_AllWorkInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.AllWorkInfo.class, com.dfire.protocol.RpcWorkInfo.AllWorkInfo.Builder.class); + } + + // Construct using com.dfire.protocol.RpcWorkInfo.AllWorkInfo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + internalGetMutableValues().clear(); + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcWorkInfo.internal_static_AllWorkInfo_descriptor; + } + + public com.dfire.protocol.RpcWorkInfo.AllWorkInfo getDefaultInstanceForType() { + return com.dfire.protocol.RpcWorkInfo.AllWorkInfo.getDefaultInstance(); + } + + public com.dfire.protocol.RpcWorkInfo.AllWorkInfo build() { + com.dfire.protocol.RpcWorkInfo.AllWorkInfo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcWorkInfo.AllWorkInfo buildPartial() { + com.dfire.protocol.RpcWorkInfo.AllWorkInfo result = new com.dfire.protocol.RpcWorkInfo.AllWorkInfo(this); + int from_bitField0_ = bitField0_; + result.values_ = internalGetValues(); + result.values_.makeImmutable(); + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcWorkInfo.AllWorkInfo) { + return mergeFrom((com.dfire.protocol.RpcWorkInfo.AllWorkInfo)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcWorkInfo.AllWorkInfo other) { + if (other == com.dfire.protocol.RpcWorkInfo.AllWorkInfo.getDefaultInstance()) return this; + internalGetMutableValues().mergeFrom( + other.internalGetValues()); + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcWorkInfo.AllWorkInfo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcWorkInfo.AllWorkInfo) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.MapField< + java.lang.String, com.dfire.protocol.RpcWorkInfo.WorkInfo> values_; + private com.google.protobuf.MapField + internalGetValues() { + if (values_ == null) { + return com.google.protobuf.MapField.emptyMapField( + ValuesDefaultEntryHolder.defaultEntry); + } + return values_; + } + private com.google.protobuf.MapField + internalGetMutableValues() { + onChanged();; + if (values_ == null) { + values_ = com.google.protobuf.MapField.newMapField( + ValuesDefaultEntryHolder.defaultEntry); + } + if (!values_.isMutable()) { + values_ = values_.copy(); + } + return values_; + } + + public int getValuesCount() { + return internalGetValues().getMap().size(); + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public boolean containsValues( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + return internalGetValues().getMap().containsKey(key); + } + /** + * Use {@link #getValuesMap()} instead. + */ + @java.lang.Deprecated + public java.util.Map getValues() { + return getValuesMap(); + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public java.util.Map getValuesMap() { + return internalGetValues().getMap(); + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public com.dfire.protocol.RpcWorkInfo.WorkInfo getValuesOrDefault( + java.lang.String key, + com.dfire.protocol.RpcWorkInfo.WorkInfo defaultValue) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public com.dfire.protocol.RpcWorkInfo.WorkInfo getValuesOrThrow( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + java.util.Map map = + internalGetValues().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + public Builder clearValues() { + internalGetMutableValues().getMutableMap() + .clear(); + return this; + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public Builder removeValues( + java.lang.String key) { + if (key == null) { throw new java.lang.NullPointerException(); } + internalGetMutableValues().getMutableMap() + .remove(key); + return this; + } + /** + * Use alternate mutation accessors instead. + */ + @java.lang.Deprecated + public java.util.Map + getMutableValues() { + return internalGetMutableValues().getMutableMap(); + } + /** + * map<string, .WorkInfo> values = 1; + */ + public Builder putValues( + java.lang.String key, + com.dfire.protocol.RpcWorkInfo.WorkInfo value) { + if (key == null) { throw new java.lang.NullPointerException(); } + if (value == null) { throw new java.lang.NullPointerException(); } + internalGetMutableValues().getMutableMap() + .put(key, value); + return this; + } + /** + * map<string, .WorkInfo> values = 1; + */ + + public Builder putAllValues( + java.util.Map values) { + internalGetMutableValues().getMutableMap() + .putAll(values); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:AllWorkInfo) + } + + // @@protoc_insertion_point(class_scope:AllWorkInfo) + private static final com.dfire.protocol.RpcWorkInfo.AllWorkInfo DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcWorkInfo.AllWorkInfo(); + } + + public static com.dfire.protocol.RpcWorkInfo.AllWorkInfo getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public AllWorkInfo parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AllWorkInfo(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcWorkInfo.AllWorkInfo getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface WorkInfoOrBuilder extends + // @@protoc_insertion_point(interface_extends:WorkInfo) + com.google.protobuf.MessageOrBuilder { + + /** + * .OSInfo oSInfo = 1; + */ + boolean hasOSInfo(); + /** + * .OSInfo oSInfo = 1; + */ + com.dfire.protocol.RpcWorkInfo.OSInfo getOSInfo(); + /** + * .OSInfo oSInfo = 1; + */ + com.dfire.protocol.RpcWorkInfo.OSInfoOrBuilder getOSInfoOrBuilder(); + + /** + * repeated .MachineInfo machineInfo = 2; + */ + java.util.List + getMachineInfoList(); + /** + * repeated .MachineInfo machineInfo = 2; + */ + com.dfire.protocol.RpcWorkInfo.MachineInfo getMachineInfo(int index); + /** + * repeated .MachineInfo machineInfo = 2; + */ + int getMachineInfoCount(); + /** + * repeated .MachineInfo machineInfo = 2; + */ + java.util.List + getMachineInfoOrBuilderList(); + /** + * repeated .MachineInfo machineInfo = 2; + */ + com.dfire.protocol.RpcWorkInfo.MachineInfoOrBuilder getMachineInfoOrBuilder( + int index); + + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + java.util.List + getProcessMonitorList(); + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + com.dfire.protocol.RpcWorkInfo.ProcessMonitor getProcessMonitor(int index); + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + int getProcessMonitorCount(); + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + java.util.List + getProcessMonitorOrBuilderList(); + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + com.dfire.protocol.RpcWorkInfo.ProcessMonitorOrBuilder getProcessMonitorOrBuilder( + int index); + } + /** + * Protobuf type {@code WorkInfo} + */ + public static final class WorkInfo extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:WorkInfo) + WorkInfoOrBuilder { + private static final long serialVersionUID = 0L; + // Use WorkInfo.newBuilder() to construct. + private WorkInfo(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private WorkInfo() { + machineInfo_ = java.util.Collections.emptyList(); + processMonitor_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private WorkInfo( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.dfire.protocol.RpcWorkInfo.OSInfo.Builder subBuilder = null; + if (oSInfo_ != null) { + subBuilder = oSInfo_.toBuilder(); + } + oSInfo_ = input.readMessage(com.dfire.protocol.RpcWorkInfo.OSInfo.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(oSInfo_); + oSInfo_ = subBuilder.buildPartial(); + } + + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + machineInfo_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + machineInfo_.add( + input.readMessage(com.dfire.protocol.RpcWorkInfo.MachineInfo.parser(), extensionRegistry)); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + processMonitor_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + processMonitor_.add( + input.readMessage(com.dfire.protocol.RpcWorkInfo.ProcessMonitor.parser(), extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + machineInfo_ = java.util.Collections.unmodifiableList(machineInfo_); + } + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + processMonitor_ = java.util.Collections.unmodifiableList(processMonitor_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_WorkInfo_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_WorkInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.WorkInfo.class, com.dfire.protocol.RpcWorkInfo.WorkInfo.Builder.class); + } + + private int bitField0_; + public static final int OSINFO_FIELD_NUMBER = 1; + private com.dfire.protocol.RpcWorkInfo.OSInfo oSInfo_; + /** + * .OSInfo oSInfo = 1; + */ + public boolean hasOSInfo() { + return oSInfo_ != null; + } + /** + * .OSInfo oSInfo = 1; + */ + public com.dfire.protocol.RpcWorkInfo.OSInfo getOSInfo() { + return oSInfo_ == null ? com.dfire.protocol.RpcWorkInfo.OSInfo.getDefaultInstance() : oSInfo_; + } + /** + * .OSInfo oSInfo = 1; + */ + public com.dfire.protocol.RpcWorkInfo.OSInfoOrBuilder getOSInfoOrBuilder() { + return getOSInfo(); + } + + public static final int MACHINEINFO_FIELD_NUMBER = 2; + private java.util.List machineInfo_; + /** + * repeated .MachineInfo machineInfo = 2; + */ + public java.util.List getMachineInfoList() { + return machineInfo_; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public java.util.List + getMachineInfoOrBuilderList() { + return machineInfo_; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public int getMachineInfoCount() { + return machineInfo_.size(); + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public com.dfire.protocol.RpcWorkInfo.MachineInfo getMachineInfo(int index) { + return machineInfo_.get(index); + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public com.dfire.protocol.RpcWorkInfo.MachineInfoOrBuilder getMachineInfoOrBuilder( + int index) { + return machineInfo_.get(index); + } + + public static final int PROCESSMONITOR_FIELD_NUMBER = 3; + private java.util.List processMonitor_; + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public java.util.List getProcessMonitorList() { + return processMonitor_; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public java.util.List + getProcessMonitorOrBuilderList() { + return processMonitor_; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public int getProcessMonitorCount() { + return processMonitor_.size(); + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor getProcessMonitor(int index) { + return processMonitor_.get(index); + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public com.dfire.protocol.RpcWorkInfo.ProcessMonitorOrBuilder getProcessMonitorOrBuilder( + int index) { + return processMonitor_.get(index); + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (oSInfo_ != null) { + output.writeMessage(1, getOSInfo()); + } + for (int i = 0; i < machineInfo_.size(); i++) { + output.writeMessage(2, machineInfo_.get(i)); + } + for (int i = 0; i < processMonitor_.size(); i++) { + output.writeMessage(3, processMonitor_.get(i)); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (oSInfo_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getOSInfo()); + } + for (int i = 0; i < machineInfo_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, machineInfo_.get(i)); + } + for (int i = 0; i < processMonitor_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, processMonitor_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcWorkInfo.WorkInfo)) { + return super.equals(obj); + } + com.dfire.protocol.RpcWorkInfo.WorkInfo other = (com.dfire.protocol.RpcWorkInfo.WorkInfo) obj; + + boolean result = true; + result = result && (hasOSInfo() == other.hasOSInfo()); + if (hasOSInfo()) { + result = result && getOSInfo() + .equals(other.getOSInfo()); + } + result = result && getMachineInfoList() + .equals(other.getMachineInfoList()); + result = result && getProcessMonitorList() + .equals(other.getProcessMonitorList()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasOSInfo()) { + hash = (37 * hash) + OSINFO_FIELD_NUMBER; + hash = (53 * hash) + getOSInfo().hashCode(); + } + if (getMachineInfoCount() > 0) { + hash = (37 * hash) + MACHINEINFO_FIELD_NUMBER; + hash = (53 * hash) + getMachineInfoList().hashCode(); + } + if (getProcessMonitorCount() > 0) { + hash = (37 * hash) + PROCESSMONITOR_FIELD_NUMBER; + hash = (53 * hash) + getProcessMonitorList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.WorkInfo parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcWorkInfo.WorkInfo prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code WorkInfo} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:WorkInfo) + com.dfire.protocol.RpcWorkInfo.WorkInfoOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_WorkInfo_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_WorkInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.WorkInfo.class, com.dfire.protocol.RpcWorkInfo.WorkInfo.Builder.class); + } + + // Construct using com.dfire.protocol.RpcWorkInfo.WorkInfo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getMachineInfoFieldBuilder(); + getProcessMonitorFieldBuilder(); + } + } + public Builder clear() { + super.clear(); + if (oSInfoBuilder_ == null) { + oSInfo_ = null; + } else { + oSInfo_ = null; + oSInfoBuilder_ = null; + } + if (machineInfoBuilder_ == null) { + machineInfo_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + machineInfoBuilder_.clear(); + } + if (processMonitorBuilder_ == null) { + processMonitor_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + processMonitorBuilder_.clear(); + } + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcWorkInfo.internal_static_WorkInfo_descriptor; + } + + public com.dfire.protocol.RpcWorkInfo.WorkInfo getDefaultInstanceForType() { + return com.dfire.protocol.RpcWorkInfo.WorkInfo.getDefaultInstance(); + } + + public com.dfire.protocol.RpcWorkInfo.WorkInfo build() { + com.dfire.protocol.RpcWorkInfo.WorkInfo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcWorkInfo.WorkInfo buildPartial() { + com.dfire.protocol.RpcWorkInfo.WorkInfo result = new com.dfire.protocol.RpcWorkInfo.WorkInfo(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (oSInfoBuilder_ == null) { + result.oSInfo_ = oSInfo_; + } else { + result.oSInfo_ = oSInfoBuilder_.build(); + } + if (machineInfoBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002)) { + machineInfo_ = java.util.Collections.unmodifiableList(machineInfo_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.machineInfo_ = machineInfo_; + } else { + result.machineInfo_ = machineInfoBuilder_.build(); + } + if (processMonitorBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { + processMonitor_ = java.util.Collections.unmodifiableList(processMonitor_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.processMonitor_ = processMonitor_; + } else { + result.processMonitor_ = processMonitorBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcWorkInfo.WorkInfo) { + return mergeFrom((com.dfire.protocol.RpcWorkInfo.WorkInfo)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcWorkInfo.WorkInfo other) { + if (other == com.dfire.protocol.RpcWorkInfo.WorkInfo.getDefaultInstance()) return this; + if (other.hasOSInfo()) { + mergeOSInfo(other.getOSInfo()); + } + if (machineInfoBuilder_ == null) { + if (!other.machineInfo_.isEmpty()) { + if (machineInfo_.isEmpty()) { + machineInfo_ = other.machineInfo_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureMachineInfoIsMutable(); + machineInfo_.addAll(other.machineInfo_); + } + onChanged(); + } + } else { + if (!other.machineInfo_.isEmpty()) { + if (machineInfoBuilder_.isEmpty()) { + machineInfoBuilder_.dispose(); + machineInfoBuilder_ = null; + machineInfo_ = other.machineInfo_; + bitField0_ = (bitField0_ & ~0x00000002); + machineInfoBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getMachineInfoFieldBuilder() : null; + } else { + machineInfoBuilder_.addAllMessages(other.machineInfo_); + } + } + } + if (processMonitorBuilder_ == null) { + if (!other.processMonitor_.isEmpty()) { + if (processMonitor_.isEmpty()) { + processMonitor_ = other.processMonitor_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureProcessMonitorIsMutable(); + processMonitor_.addAll(other.processMonitor_); + } + onChanged(); + } + } else { + if (!other.processMonitor_.isEmpty()) { + if (processMonitorBuilder_.isEmpty()) { + processMonitorBuilder_.dispose(); + processMonitorBuilder_ = null; + processMonitor_ = other.processMonitor_; + bitField0_ = (bitField0_ & ~0x00000004); + processMonitorBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getProcessMonitorFieldBuilder() : null; + } else { + processMonitorBuilder_.addAllMessages(other.processMonitor_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcWorkInfo.WorkInfo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcWorkInfo.WorkInfo) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.dfire.protocol.RpcWorkInfo.OSInfo oSInfo_ = null; + private com.google.protobuf.SingleFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.OSInfo, com.dfire.protocol.RpcWorkInfo.OSInfo.Builder, com.dfire.protocol.RpcWorkInfo.OSInfoOrBuilder> oSInfoBuilder_; + /** + * .OSInfo oSInfo = 1; + */ + public boolean hasOSInfo() { + return oSInfoBuilder_ != null || oSInfo_ != null; + } + /** + * .OSInfo oSInfo = 1; + */ + public com.dfire.protocol.RpcWorkInfo.OSInfo getOSInfo() { + if (oSInfoBuilder_ == null) { + return oSInfo_ == null ? com.dfire.protocol.RpcWorkInfo.OSInfo.getDefaultInstance() : oSInfo_; + } else { + return oSInfoBuilder_.getMessage(); + } + } + /** + * .OSInfo oSInfo = 1; + */ + public Builder setOSInfo(com.dfire.protocol.RpcWorkInfo.OSInfo value) { + if (oSInfoBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + oSInfo_ = value; + onChanged(); + } else { + oSInfoBuilder_.setMessage(value); + } + + return this; + } + /** + * .OSInfo oSInfo = 1; + */ + public Builder setOSInfo( + com.dfire.protocol.RpcWorkInfo.OSInfo.Builder builderForValue) { + if (oSInfoBuilder_ == null) { + oSInfo_ = builderForValue.build(); + onChanged(); + } else { + oSInfoBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .OSInfo oSInfo = 1; + */ + public Builder mergeOSInfo(com.dfire.protocol.RpcWorkInfo.OSInfo value) { + if (oSInfoBuilder_ == null) { + if (oSInfo_ != null) { + oSInfo_ = + com.dfire.protocol.RpcWorkInfo.OSInfo.newBuilder(oSInfo_).mergeFrom(value).buildPartial(); + } else { + oSInfo_ = value; + } + onChanged(); + } else { + oSInfoBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .OSInfo oSInfo = 1; + */ + public Builder clearOSInfo() { + if (oSInfoBuilder_ == null) { + oSInfo_ = null; + onChanged(); + } else { + oSInfo_ = null; + oSInfoBuilder_ = null; + } + + return this; + } + /** + * .OSInfo oSInfo = 1; + */ + public com.dfire.protocol.RpcWorkInfo.OSInfo.Builder getOSInfoBuilder() { + + onChanged(); + return getOSInfoFieldBuilder().getBuilder(); + } + /** + * .OSInfo oSInfo = 1; + */ + public com.dfire.protocol.RpcWorkInfo.OSInfoOrBuilder getOSInfoOrBuilder() { + if (oSInfoBuilder_ != null) { + return oSInfoBuilder_.getMessageOrBuilder(); + } else { + return oSInfo_ == null ? + com.dfire.protocol.RpcWorkInfo.OSInfo.getDefaultInstance() : oSInfo_; + } + } + /** + * .OSInfo oSInfo = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.OSInfo, com.dfire.protocol.RpcWorkInfo.OSInfo.Builder, com.dfire.protocol.RpcWorkInfo.OSInfoOrBuilder> + getOSInfoFieldBuilder() { + if (oSInfoBuilder_ == null) { + oSInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.OSInfo, com.dfire.protocol.RpcWorkInfo.OSInfo.Builder, com.dfire.protocol.RpcWorkInfo.OSInfoOrBuilder>( + getOSInfo(), + getParentForChildren(), + isClean()); + oSInfo_ = null; + } + return oSInfoBuilder_; + } + + private java.util.List machineInfo_ = + java.util.Collections.emptyList(); + private void ensureMachineInfoIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + machineInfo_ = new java.util.ArrayList(machineInfo_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.MachineInfo, com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder, com.dfire.protocol.RpcWorkInfo.MachineInfoOrBuilder> machineInfoBuilder_; + + /** + * repeated .MachineInfo machineInfo = 2; + */ + public java.util.List getMachineInfoList() { + if (machineInfoBuilder_ == null) { + return java.util.Collections.unmodifiableList(machineInfo_); + } else { + return machineInfoBuilder_.getMessageList(); + } + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public int getMachineInfoCount() { + if (machineInfoBuilder_ == null) { + return machineInfo_.size(); + } else { + return machineInfoBuilder_.getCount(); + } + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public com.dfire.protocol.RpcWorkInfo.MachineInfo getMachineInfo(int index) { + if (machineInfoBuilder_ == null) { + return machineInfo_.get(index); + } else { + return machineInfoBuilder_.getMessage(index); + } + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder setMachineInfo( + int index, com.dfire.protocol.RpcWorkInfo.MachineInfo value) { + if (machineInfoBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMachineInfoIsMutable(); + machineInfo_.set(index, value); + onChanged(); + } else { + machineInfoBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder setMachineInfo( + int index, com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder builderForValue) { + if (machineInfoBuilder_ == null) { + ensureMachineInfoIsMutable(); + machineInfo_.set(index, builderForValue.build()); + onChanged(); + } else { + machineInfoBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder addMachineInfo(com.dfire.protocol.RpcWorkInfo.MachineInfo value) { + if (machineInfoBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMachineInfoIsMutable(); + machineInfo_.add(value); + onChanged(); + } else { + machineInfoBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder addMachineInfo( + int index, com.dfire.protocol.RpcWorkInfo.MachineInfo value) { + if (machineInfoBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMachineInfoIsMutable(); + machineInfo_.add(index, value); + onChanged(); + } else { + machineInfoBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder addMachineInfo( + com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder builderForValue) { + if (machineInfoBuilder_ == null) { + ensureMachineInfoIsMutable(); + machineInfo_.add(builderForValue.build()); + onChanged(); + } else { + machineInfoBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder addMachineInfo( + int index, com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder builderForValue) { + if (machineInfoBuilder_ == null) { + ensureMachineInfoIsMutable(); + machineInfo_.add(index, builderForValue.build()); + onChanged(); + } else { + machineInfoBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder addAllMachineInfo( + java.lang.Iterable values) { + if (machineInfoBuilder_ == null) { + ensureMachineInfoIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, machineInfo_); + onChanged(); + } else { + machineInfoBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder clearMachineInfo() { + if (machineInfoBuilder_ == null) { + machineInfo_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + machineInfoBuilder_.clear(); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public Builder removeMachineInfo(int index) { + if (machineInfoBuilder_ == null) { + ensureMachineInfoIsMutable(); + machineInfo_.remove(index); + onChanged(); + } else { + machineInfoBuilder_.remove(index); + } + return this; + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder getMachineInfoBuilder( + int index) { + return getMachineInfoFieldBuilder().getBuilder(index); + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public com.dfire.protocol.RpcWorkInfo.MachineInfoOrBuilder getMachineInfoOrBuilder( + int index) { + if (machineInfoBuilder_ == null) { + return machineInfo_.get(index); } else { + return machineInfoBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public java.util.List + getMachineInfoOrBuilderList() { + if (machineInfoBuilder_ != null) { + return machineInfoBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(machineInfo_); + } + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder addMachineInfoBuilder() { + return getMachineInfoFieldBuilder().addBuilder( + com.dfire.protocol.RpcWorkInfo.MachineInfo.getDefaultInstance()); + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder addMachineInfoBuilder( + int index) { + return getMachineInfoFieldBuilder().addBuilder( + index, com.dfire.protocol.RpcWorkInfo.MachineInfo.getDefaultInstance()); + } + /** + * repeated .MachineInfo machineInfo = 2; + */ + public java.util.List + getMachineInfoBuilderList() { + return getMachineInfoFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.MachineInfo, com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder, com.dfire.protocol.RpcWorkInfo.MachineInfoOrBuilder> + getMachineInfoFieldBuilder() { + if (machineInfoBuilder_ == null) { + machineInfoBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.MachineInfo, com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder, com.dfire.protocol.RpcWorkInfo.MachineInfoOrBuilder>( + machineInfo_, + ((bitField0_ & 0x00000002) == 0x00000002), + getParentForChildren(), + isClean()); + machineInfo_ = null; + } + return machineInfoBuilder_; + } + + private java.util.List processMonitor_ = + java.util.Collections.emptyList(); + private void ensureProcessMonitorIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + processMonitor_ = new java.util.ArrayList(processMonitor_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.ProcessMonitor, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder, com.dfire.protocol.RpcWorkInfo.ProcessMonitorOrBuilder> processMonitorBuilder_; + + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public java.util.List getProcessMonitorList() { + if (processMonitorBuilder_ == null) { + return java.util.Collections.unmodifiableList(processMonitor_); + } else { + return processMonitorBuilder_.getMessageList(); + } + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public int getProcessMonitorCount() { + if (processMonitorBuilder_ == null) { + return processMonitor_.size(); + } else { + return processMonitorBuilder_.getCount(); + } + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor getProcessMonitor(int index) { + if (processMonitorBuilder_ == null) { + return processMonitor_.get(index); + } else { + return processMonitorBuilder_.getMessage(index); + } + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder setProcessMonitor( + int index, com.dfire.protocol.RpcWorkInfo.ProcessMonitor value) { + if (processMonitorBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProcessMonitorIsMutable(); + processMonitor_.set(index, value); + onChanged(); + } else { + processMonitorBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder setProcessMonitor( + int index, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder builderForValue) { + if (processMonitorBuilder_ == null) { + ensureProcessMonitorIsMutable(); + processMonitor_.set(index, builderForValue.build()); + onChanged(); + } else { + processMonitorBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder addProcessMonitor(com.dfire.protocol.RpcWorkInfo.ProcessMonitor value) { + if (processMonitorBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProcessMonitorIsMutable(); + processMonitor_.add(value); + onChanged(); + } else { + processMonitorBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder addProcessMonitor( + int index, com.dfire.protocol.RpcWorkInfo.ProcessMonitor value) { + if (processMonitorBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProcessMonitorIsMutable(); + processMonitor_.add(index, value); + onChanged(); + } else { + processMonitorBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder addProcessMonitor( + com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder builderForValue) { + if (processMonitorBuilder_ == null) { + ensureProcessMonitorIsMutable(); + processMonitor_.add(builderForValue.build()); + onChanged(); + } else { + processMonitorBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder addProcessMonitor( + int index, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder builderForValue) { + if (processMonitorBuilder_ == null) { + ensureProcessMonitorIsMutable(); + processMonitor_.add(index, builderForValue.build()); + onChanged(); + } else { + processMonitorBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder addAllProcessMonitor( + java.lang.Iterable values) { + if (processMonitorBuilder_ == null) { + ensureProcessMonitorIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, processMonitor_); + onChanged(); + } else { + processMonitorBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder clearProcessMonitor() { + if (processMonitorBuilder_ == null) { + processMonitor_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + processMonitorBuilder_.clear(); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public Builder removeProcessMonitor(int index) { + if (processMonitorBuilder_ == null) { + ensureProcessMonitorIsMutable(); + processMonitor_.remove(index); + onChanged(); + } else { + processMonitorBuilder_.remove(index); + } + return this; + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder getProcessMonitorBuilder( + int index) { + return getProcessMonitorFieldBuilder().getBuilder(index); + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public com.dfire.protocol.RpcWorkInfo.ProcessMonitorOrBuilder getProcessMonitorOrBuilder( + int index) { + if (processMonitorBuilder_ == null) { + return processMonitor_.get(index); } else { + return processMonitorBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public java.util.List + getProcessMonitorOrBuilderList() { + if (processMonitorBuilder_ != null) { + return processMonitorBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(processMonitor_); + } + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder addProcessMonitorBuilder() { + return getProcessMonitorFieldBuilder().addBuilder( + com.dfire.protocol.RpcWorkInfo.ProcessMonitor.getDefaultInstance()); + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder addProcessMonitorBuilder( + int index) { + return getProcessMonitorFieldBuilder().addBuilder( + index, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.getDefaultInstance()); + } + /** + * repeated .ProcessMonitor processMonitor = 3; + */ + public java.util.List + getProcessMonitorBuilderList() { + return getProcessMonitorFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.ProcessMonitor, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder, com.dfire.protocol.RpcWorkInfo.ProcessMonitorOrBuilder> + getProcessMonitorFieldBuilder() { + if (processMonitorBuilder_ == null) { + processMonitorBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.dfire.protocol.RpcWorkInfo.ProcessMonitor, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder, com.dfire.protocol.RpcWorkInfo.ProcessMonitorOrBuilder>( + processMonitor_, + ((bitField0_ & 0x00000004) == 0x00000004), + getParentForChildren(), + isClean()); + processMonitor_ = null; + } + return processMonitorBuilder_; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:WorkInfo) + } + + // @@protoc_insertion_point(class_scope:WorkInfo) + private static final com.dfire.protocol.RpcWorkInfo.WorkInfo DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcWorkInfo.WorkInfo(); + } + + public static com.dfire.protocol.RpcWorkInfo.WorkInfo getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public WorkInfo parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new WorkInfo(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcWorkInfo.WorkInfo getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface OSInfoOrBuilder extends + // @@protoc_insertion_point(interface_extends:OSInfo) + com.google.protobuf.MessageOrBuilder { + + /** + * float user = 1; + */ + float getUser(); + + /** + * float system = 2; + */ + float getSystem(); + + /** + * float mem = 3; + */ + float getMem(); + + /** + * float cpu = 4; + */ + float getCpu(); + + /** + * float swap = 5; + */ + float getSwap(); + } + /** + * Protobuf type {@code OSInfo} + */ + public static final class OSInfo extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:OSInfo) + OSInfoOrBuilder { + private static final long serialVersionUID = 0L; + // Use OSInfo.newBuilder() to construct. + private OSInfo(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private OSInfo() { + user_ = 0F; + system_ = 0F; + mem_ = 0F; + cpu_ = 0F; + swap_ = 0F; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private OSInfo( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 13: { + + user_ = input.readFloat(); + break; + } + case 21: { + + system_ = input.readFloat(); + break; + } + case 29: { + + mem_ = input.readFloat(); + break; + } + case 37: { + + cpu_ = input.readFloat(); + break; + } + case 45: { + + swap_ = input.readFloat(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_OSInfo_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_OSInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.OSInfo.class, com.dfire.protocol.RpcWorkInfo.OSInfo.Builder.class); + } + + public static final int USER_FIELD_NUMBER = 1; + private float user_; + /** + * float user = 1; + */ + public float getUser() { + return user_; + } + + public static final int SYSTEM_FIELD_NUMBER = 2; + private float system_; + /** + * float system = 2; + */ + public float getSystem() { + return system_; + } + + public static final int MEM_FIELD_NUMBER = 3; + private float mem_; + /** + * float mem = 3; + */ + public float getMem() { + return mem_; + } + + public static final int CPU_FIELD_NUMBER = 4; + private float cpu_; + /** + * float cpu = 4; + */ + public float getCpu() { + return cpu_; + } + + public static final int SWAP_FIELD_NUMBER = 5; + private float swap_; + /** + * float swap = 5; + */ + public float getSwap() { + return swap_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (user_ != 0F) { + output.writeFloat(1, user_); + } + if (system_ != 0F) { + output.writeFloat(2, system_); + } + if (mem_ != 0F) { + output.writeFloat(3, mem_); + } + if (cpu_ != 0F) { + output.writeFloat(4, cpu_); + } + if (swap_ != 0F) { + output.writeFloat(5, swap_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (user_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(1, user_); + } + if (system_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(2, system_); + } + if (mem_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(3, mem_); + } + if (cpu_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(4, cpu_); + } + if (swap_ != 0F) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(5, swap_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcWorkInfo.OSInfo)) { + return super.equals(obj); + } + com.dfire.protocol.RpcWorkInfo.OSInfo other = (com.dfire.protocol.RpcWorkInfo.OSInfo) obj; + + boolean result = true; + result = result && ( + java.lang.Float.floatToIntBits(getUser()) + == java.lang.Float.floatToIntBits( + other.getUser())); + result = result && ( + java.lang.Float.floatToIntBits(getSystem()) + == java.lang.Float.floatToIntBits( + other.getSystem())); + result = result && ( + java.lang.Float.floatToIntBits(getMem()) + == java.lang.Float.floatToIntBits( + other.getMem())); + result = result && ( + java.lang.Float.floatToIntBits(getCpu()) + == java.lang.Float.floatToIntBits( + other.getCpu())); + result = result && ( + java.lang.Float.floatToIntBits(getSwap()) + == java.lang.Float.floatToIntBits( + other.getSwap())); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + USER_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getUser()); + hash = (37 * hash) + SYSTEM_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getSystem()); + hash = (37 * hash) + MEM_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getMem()); + hash = (37 * hash) + CPU_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getCpu()); + hash = (37 * hash) + SWAP_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getSwap()); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.OSInfo parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcWorkInfo.OSInfo prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code OSInfo} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:OSInfo) + com.dfire.protocol.RpcWorkInfo.OSInfoOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_OSInfo_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_OSInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.OSInfo.class, com.dfire.protocol.RpcWorkInfo.OSInfo.Builder.class); + } + + // Construct using com.dfire.protocol.RpcWorkInfo.OSInfo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + user_ = 0F; + + system_ = 0F; + + mem_ = 0F; + + cpu_ = 0F; + + swap_ = 0F; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcWorkInfo.internal_static_OSInfo_descriptor; + } + + public com.dfire.protocol.RpcWorkInfo.OSInfo getDefaultInstanceForType() { + return com.dfire.protocol.RpcWorkInfo.OSInfo.getDefaultInstance(); + } + + public com.dfire.protocol.RpcWorkInfo.OSInfo build() { + com.dfire.protocol.RpcWorkInfo.OSInfo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcWorkInfo.OSInfo buildPartial() { + com.dfire.protocol.RpcWorkInfo.OSInfo result = new com.dfire.protocol.RpcWorkInfo.OSInfo(this); + result.user_ = user_; + result.system_ = system_; + result.mem_ = mem_; + result.cpu_ = cpu_; + result.swap_ = swap_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcWorkInfo.OSInfo) { + return mergeFrom((com.dfire.protocol.RpcWorkInfo.OSInfo)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcWorkInfo.OSInfo other) { + if (other == com.dfire.protocol.RpcWorkInfo.OSInfo.getDefaultInstance()) return this; + if (other.getUser() != 0F) { + setUser(other.getUser()); + } + if (other.getSystem() != 0F) { + setSystem(other.getSystem()); + } + if (other.getMem() != 0F) { + setMem(other.getMem()); + } + if (other.getCpu() != 0F) { + setCpu(other.getCpu()); + } + if (other.getSwap() != 0F) { + setSwap(other.getSwap()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcWorkInfo.OSInfo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcWorkInfo.OSInfo) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private float user_ ; + /** + * float user = 1; + */ + public float getUser() { + return user_; + } + /** + * float user = 1; + */ + public Builder setUser(float value) { + + user_ = value; + onChanged(); + return this; + } + /** + * float user = 1; + */ + public Builder clearUser() { + + user_ = 0F; + onChanged(); + return this; + } + + private float system_ ; + /** + * float system = 2; + */ + public float getSystem() { + return system_; + } + /** + * float system = 2; + */ + public Builder setSystem(float value) { + + system_ = value; + onChanged(); + return this; + } + /** + * float system = 2; + */ + public Builder clearSystem() { + + system_ = 0F; + onChanged(); + return this; + } + + private float mem_ ; + /** + * float mem = 3; + */ + public float getMem() { + return mem_; + } + /** + * float mem = 3; + */ + public Builder setMem(float value) { + + mem_ = value; + onChanged(); + return this; + } + /** + * float mem = 3; + */ + public Builder clearMem() { + + mem_ = 0F; + onChanged(); + return this; + } + + private float cpu_ ; + /** + * float cpu = 4; + */ + public float getCpu() { + return cpu_; + } + /** + * float cpu = 4; + */ + public Builder setCpu(float value) { + + cpu_ = value; + onChanged(); + return this; + } + /** + * float cpu = 4; + */ + public Builder clearCpu() { + + cpu_ = 0F; + onChanged(); + return this; + } + + private float swap_ ; + /** + * float swap = 5; + */ + public float getSwap() { + return swap_; + } + /** + * float swap = 5; + */ + public Builder setSwap(float value) { + + swap_ = value; + onChanged(); + return this; + } + /** + * float swap = 5; + */ + public Builder clearSwap() { + + swap_ = 0F; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:OSInfo) + } + + // @@protoc_insertion_point(class_scope:OSInfo) + private static final com.dfire.protocol.RpcWorkInfo.OSInfo DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcWorkInfo.OSInfo(); + } + + public static com.dfire.protocol.RpcWorkInfo.OSInfo getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public OSInfo parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new OSInfo(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcWorkInfo.OSInfo getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface MachineInfoOrBuilder extends + // @@protoc_insertion_point(interface_extends:MachineInfo) + com.google.protobuf.MessageOrBuilder { + + /** + *
                              +     *文件系统分区
                              +     * 
                              + * + * string filesystem = 1; + */ + java.lang.String getFilesystem(); + /** + *
                              +     *文件系统分区
                              +     * 
                              + * + * string filesystem = 1; + */ + com.google.protobuf.ByteString + getFilesystemBytes(); + + /** + *
                              +     *文件类型
                              +     * 
                              + * + * string type = 2; + */ + java.lang.String getType(); + /** + *
                              +     *文件类型
                              +     * 
                              + * + * string type = 2; + */ + com.google.protobuf.ByteString + getTypeBytes(); + + /** + *
                              +     *分区大小
                              +     * 
                              + * + * string size = 3; + */ + java.lang.String getSize(); + /** + *
                              +     *分区大小
                              +     * 
                              + * + * string size = 3; + */ + com.google.protobuf.ByteString + getSizeBytes(); + + /** + *
                              +     *分区已经使用大小
                              +     * 
                              + * + * string used = 4; + */ + java.lang.String getUsed(); + /** + *
                              +     *分区已经使用大小
                              +     * 
                              + * + * string used = 4; + */ + com.google.protobuf.ByteString + getUsedBytes(); + + /** + *
                              +     *分区可用大小
                              +     * 
                              + * + * string avail = 5; + */ + java.lang.String getAvail(); + /** + *
                              +     *分区可用大小
                              +     * 
                              + * + * string avail = 5; + */ + com.google.protobuf.ByteString + getAvailBytes(); + + /** + *
                              +     *分区使用的比例
                              +     * 
                              + * + * string use = 6; + */ + java.lang.String getUse(); + /** + *
                              +     *分区使用的比例
                              +     * 
                              + * + * string use = 6; + */ + com.google.protobuf.ByteString + getUseBytes(); + + /** + *
                              +     *磁盘分区挂载的目录 即挂载点
                              +     * 
                              + * + * string mountedOn = 7; + */ + java.lang.String getMountedOn(); + /** + *
                              +     *磁盘分区挂载的目录 即挂载点
                              +     * 
                              + * + * string mountedOn = 7; + */ + com.google.protobuf.ByteString + getMountedOnBytes(); + } + /** + * Protobuf type {@code MachineInfo} + */ + public static final class MachineInfo extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:MachineInfo) + MachineInfoOrBuilder { + private static final long serialVersionUID = 0L; + // Use MachineInfo.newBuilder() to construct. + private MachineInfo(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private MachineInfo() { + filesystem_ = ""; + type_ = ""; + size_ = ""; + used_ = ""; + avail_ = ""; + use_ = ""; + mountedOn_ = ""; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private MachineInfo( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + filesystem_ = s; + break; + } + case 18: { + java.lang.String s = input.readStringRequireUtf8(); + + type_ = s; + break; + } + case 26: { + java.lang.String s = input.readStringRequireUtf8(); + + size_ = s; + break; + } + case 34: { + java.lang.String s = input.readStringRequireUtf8(); + + used_ = s; + break; + } + case 42: { + java.lang.String s = input.readStringRequireUtf8(); + + avail_ = s; + break; + } + case 50: { + java.lang.String s = input.readStringRequireUtf8(); + + use_ = s; + break; + } + case 58: { + java.lang.String s = input.readStringRequireUtf8(); + + mountedOn_ = s; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_MachineInfo_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_MachineInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.MachineInfo.class, com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder.class); + } + + public static final int FILESYSTEM_FIELD_NUMBER = 1; + private volatile java.lang.Object filesystem_; + /** + *
                              +     *文件系统分区
                              +     * 
                              + * + * string filesystem = 1; + */ + public java.lang.String getFilesystem() { + java.lang.Object ref = filesystem_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + filesystem_ = s; + return s; + } + } + /** + *
                              +     *文件系统分区
                              +     * 
                              + * + * string filesystem = 1; + */ + public com.google.protobuf.ByteString + getFilesystemBytes() { + java.lang.Object ref = filesystem_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + filesystem_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TYPE_FIELD_NUMBER = 2; + private volatile java.lang.Object type_; + /** + *
                              +     *文件类型
                              +     * 
                              + * + * string type = 2; + */ + public java.lang.String getType() { + java.lang.Object ref = type_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + type_ = s; + return s; + } + } + /** + *
                              +     *文件类型
                              +     * 
                              + * + * string type = 2; + */ + public com.google.protobuf.ByteString + getTypeBytes() { + java.lang.Object ref = type_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + type_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SIZE_FIELD_NUMBER = 3; + private volatile java.lang.Object size_; + /** + *
                              +     *分区大小
                              +     * 
                              + * + * string size = 3; + */ + public java.lang.String getSize() { + java.lang.Object ref = size_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + size_ = s; + return s; + } + } + /** + *
                              +     *分区大小
                              +     * 
                              + * + * string size = 3; + */ + public com.google.protobuf.ByteString + getSizeBytes() { + java.lang.Object ref = size_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + size_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int USED_FIELD_NUMBER = 4; + private volatile java.lang.Object used_; + /** + *
                              +     *分区已经使用大小
                              +     * 
                              + * + * string used = 4; + */ + public java.lang.String getUsed() { + java.lang.Object ref = used_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + used_ = s; + return s; + } + } + /** + *
                              +     *分区已经使用大小
                              +     * 
                              + * + * string used = 4; + */ + public com.google.protobuf.ByteString + getUsedBytes() { + java.lang.Object ref = used_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + used_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int AVAIL_FIELD_NUMBER = 5; + private volatile java.lang.Object avail_; + /** + *
                              +     *分区可用大小
                              +     * 
                              + * + * string avail = 5; + */ + public java.lang.String getAvail() { + java.lang.Object ref = avail_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + avail_ = s; + return s; + } + } + /** + *
                              +     *分区可用大小
                              +     * 
                              + * + * string avail = 5; + */ + public com.google.protobuf.ByteString + getAvailBytes() { + java.lang.Object ref = avail_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + avail_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int USE_FIELD_NUMBER = 6; + private volatile java.lang.Object use_; + /** + *
                              +     *分区使用的比例
                              +     * 
                              + * + * string use = 6; + */ + public java.lang.String getUse() { + java.lang.Object ref = use_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + use_ = s; + return s; + } + } + /** + *
                              +     *分区使用的比例
                              +     * 
                              + * + * string use = 6; + */ + public com.google.protobuf.ByteString + getUseBytes() { + java.lang.Object ref = use_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + use_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int MOUNTEDON_FIELD_NUMBER = 7; + private volatile java.lang.Object mountedOn_; + /** + *
                              +     *磁盘分区挂载的目录 即挂载点
                              +     * 
                              + * + * string mountedOn = 7; + */ + public java.lang.String getMountedOn() { + java.lang.Object ref = mountedOn_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + mountedOn_ = s; + return s; + } + } + /** + *
                              +     *磁盘分区挂载的目录 即挂载点
                              +     * 
                              + * + * string mountedOn = 7; + */ + public com.google.protobuf.ByteString + getMountedOnBytes() { + java.lang.Object ref = mountedOn_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + mountedOn_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getFilesystemBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, filesystem_); + } + if (!getTypeBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, type_); + } + if (!getSizeBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, size_); + } + if (!getUsedBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, used_); + } + if (!getAvailBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, avail_); + } + if (!getUseBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, use_); + } + if (!getMountedOnBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, mountedOn_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getFilesystemBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, filesystem_); + } + if (!getTypeBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, type_); + } + if (!getSizeBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, size_); + } + if (!getUsedBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, used_); + } + if (!getAvailBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, avail_); + } + if (!getUseBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, use_); + } + if (!getMountedOnBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, mountedOn_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcWorkInfo.MachineInfo)) { + return super.equals(obj); + } + com.dfire.protocol.RpcWorkInfo.MachineInfo other = (com.dfire.protocol.RpcWorkInfo.MachineInfo) obj; + + boolean result = true; + result = result && getFilesystem() + .equals(other.getFilesystem()); + result = result && getType() + .equals(other.getType()); + result = result && getSize() + .equals(other.getSize()); + result = result && getUsed() + .equals(other.getUsed()); + result = result && getAvail() + .equals(other.getAvail()); + result = result && getUse() + .equals(other.getUse()); + result = result && getMountedOn() + .equals(other.getMountedOn()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + FILESYSTEM_FIELD_NUMBER; + hash = (53 * hash) + getFilesystem().hashCode(); + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + getType().hashCode(); + hash = (37 * hash) + SIZE_FIELD_NUMBER; + hash = (53 * hash) + getSize().hashCode(); + hash = (37 * hash) + USED_FIELD_NUMBER; + hash = (53 * hash) + getUsed().hashCode(); + hash = (37 * hash) + AVAIL_FIELD_NUMBER; + hash = (53 * hash) + getAvail().hashCode(); + hash = (37 * hash) + USE_FIELD_NUMBER; + hash = (53 * hash) + getUse().hashCode(); + hash = (37 * hash) + MOUNTEDON_FIELD_NUMBER; + hash = (53 * hash) + getMountedOn().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.MachineInfo parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcWorkInfo.MachineInfo prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code MachineInfo} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:MachineInfo) + com.dfire.protocol.RpcWorkInfo.MachineInfoOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_MachineInfo_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_MachineInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.MachineInfo.class, com.dfire.protocol.RpcWorkInfo.MachineInfo.Builder.class); + } + + // Construct using com.dfire.protocol.RpcWorkInfo.MachineInfo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + filesystem_ = ""; + + type_ = ""; + + size_ = ""; + + used_ = ""; + + avail_ = ""; + + use_ = ""; + + mountedOn_ = ""; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcWorkInfo.internal_static_MachineInfo_descriptor; + } + + public com.dfire.protocol.RpcWorkInfo.MachineInfo getDefaultInstanceForType() { + return com.dfire.protocol.RpcWorkInfo.MachineInfo.getDefaultInstance(); + } + + public com.dfire.protocol.RpcWorkInfo.MachineInfo build() { + com.dfire.protocol.RpcWorkInfo.MachineInfo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcWorkInfo.MachineInfo buildPartial() { + com.dfire.protocol.RpcWorkInfo.MachineInfo result = new com.dfire.protocol.RpcWorkInfo.MachineInfo(this); + result.filesystem_ = filesystem_; + result.type_ = type_; + result.size_ = size_; + result.used_ = used_; + result.avail_ = avail_; + result.use_ = use_; + result.mountedOn_ = mountedOn_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcWorkInfo.MachineInfo) { + return mergeFrom((com.dfire.protocol.RpcWorkInfo.MachineInfo)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcWorkInfo.MachineInfo other) { + if (other == com.dfire.protocol.RpcWorkInfo.MachineInfo.getDefaultInstance()) return this; + if (!other.getFilesystem().isEmpty()) { + filesystem_ = other.filesystem_; + onChanged(); + } + if (!other.getType().isEmpty()) { + type_ = other.type_; + onChanged(); + } + if (!other.getSize().isEmpty()) { + size_ = other.size_; + onChanged(); + } + if (!other.getUsed().isEmpty()) { + used_ = other.used_; + onChanged(); + } + if (!other.getAvail().isEmpty()) { + avail_ = other.avail_; + onChanged(); + } + if (!other.getUse().isEmpty()) { + use_ = other.use_; + onChanged(); + } + if (!other.getMountedOn().isEmpty()) { + mountedOn_ = other.mountedOn_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcWorkInfo.MachineInfo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcWorkInfo.MachineInfo) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object filesystem_ = ""; + /** + *
                              +       *文件系统分区
                              +       * 
                              + * + * string filesystem = 1; + */ + public java.lang.String getFilesystem() { + java.lang.Object ref = filesystem_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + filesystem_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *文件系统分区
                              +       * 
                              + * + * string filesystem = 1; + */ + public com.google.protobuf.ByteString + getFilesystemBytes() { + java.lang.Object ref = filesystem_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + filesystem_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *文件系统分区
                              +       * 
                              + * + * string filesystem = 1; + */ + public Builder setFilesystem( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + filesystem_ = value; + onChanged(); + return this; + } + /** + *
                              +       *文件系统分区
                              +       * 
                              + * + * string filesystem = 1; + */ + public Builder clearFilesystem() { + + filesystem_ = getDefaultInstance().getFilesystem(); + onChanged(); + return this; + } + /** + *
                              +       *文件系统分区
                              +       * 
                              + * + * string filesystem = 1; + */ + public Builder setFilesystemBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + filesystem_ = value; + onChanged(); + return this; + } + + private java.lang.Object type_ = ""; + /** + *
                              +       *文件类型
                              +       * 
                              + * + * string type = 2; + */ + public java.lang.String getType() { + java.lang.Object ref = type_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + type_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *文件类型
                              +       * 
                              + * + * string type = 2; + */ + public com.google.protobuf.ByteString + getTypeBytes() { + java.lang.Object ref = type_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + type_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *文件类型
                              +       * 
                              + * + * string type = 2; + */ + public Builder setType( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + type_ = value; + onChanged(); + return this; + } + /** + *
                              +       *文件类型
                              +       * 
                              + * + * string type = 2; + */ + public Builder clearType() { + + type_ = getDefaultInstance().getType(); + onChanged(); + return this; + } + /** + *
                              +       *文件类型
                              +       * 
                              + * + * string type = 2; + */ + public Builder setTypeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + type_ = value; + onChanged(); + return this; + } + + private java.lang.Object size_ = ""; + /** + *
                              +       *分区大小
                              +       * 
                              + * + * string size = 3; + */ + public java.lang.String getSize() { + java.lang.Object ref = size_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + size_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *分区大小
                              +       * 
                              + * + * string size = 3; + */ + public com.google.protobuf.ByteString + getSizeBytes() { + java.lang.Object ref = size_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + size_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *分区大小
                              +       * 
                              + * + * string size = 3; + */ + public Builder setSize( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + size_ = value; + onChanged(); + return this; + } + /** + *
                              +       *分区大小
                              +       * 
                              + * + * string size = 3; + */ + public Builder clearSize() { + + size_ = getDefaultInstance().getSize(); + onChanged(); + return this; + } + /** + *
                              +       *分区大小
                              +       * 
                              + * + * string size = 3; + */ + public Builder setSizeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + size_ = value; + onChanged(); + return this; + } + + private java.lang.Object used_ = ""; + /** + *
                              +       *分区已经使用大小
                              +       * 
                              + * + * string used = 4; + */ + public java.lang.String getUsed() { + java.lang.Object ref = used_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + used_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *分区已经使用大小
                              +       * 
                              + * + * string used = 4; + */ + public com.google.protobuf.ByteString + getUsedBytes() { + java.lang.Object ref = used_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + used_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *分区已经使用大小
                              +       * 
                              + * + * string used = 4; + */ + public Builder setUsed( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + used_ = value; + onChanged(); + return this; + } + /** + *
                              +       *分区已经使用大小
                              +       * 
                              + * + * string used = 4; + */ + public Builder clearUsed() { + + used_ = getDefaultInstance().getUsed(); + onChanged(); + return this; + } + /** + *
                              +       *分区已经使用大小
                              +       * 
                              + * + * string used = 4; + */ + public Builder setUsedBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + used_ = value; + onChanged(); + return this; + } + + private java.lang.Object avail_ = ""; + /** + *
                              +       *分区可用大小
                              +       * 
                              + * + * string avail = 5; + */ + public java.lang.String getAvail() { + java.lang.Object ref = avail_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + avail_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *分区可用大小
                              +       * 
                              + * + * string avail = 5; + */ + public com.google.protobuf.ByteString + getAvailBytes() { + java.lang.Object ref = avail_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + avail_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *分区可用大小
                              +       * 
                              + * + * string avail = 5; + */ + public Builder setAvail( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + avail_ = value; + onChanged(); + return this; + } + /** + *
                              +       *分区可用大小
                              +       * 
                              + * + * string avail = 5; + */ + public Builder clearAvail() { + + avail_ = getDefaultInstance().getAvail(); + onChanged(); + return this; + } + /** + *
                              +       *分区可用大小
                              +       * 
                              + * + * string avail = 5; + */ + public Builder setAvailBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + avail_ = value; + onChanged(); + return this; + } + + private java.lang.Object use_ = ""; + /** + *
                              +       *分区使用的比例
                              +       * 
                              + * + * string use = 6; + */ + public java.lang.String getUse() { + java.lang.Object ref = use_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + use_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *分区使用的比例
                              +       * 
                              + * + * string use = 6; + */ + public com.google.protobuf.ByteString + getUseBytes() { + java.lang.Object ref = use_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + use_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *分区使用的比例
                              +       * 
                              + * + * string use = 6; + */ + public Builder setUse( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + use_ = value; + onChanged(); + return this; + } + /** + *
                              +       *分区使用的比例
                              +       * 
                              + * + * string use = 6; + */ + public Builder clearUse() { + + use_ = getDefaultInstance().getUse(); + onChanged(); + return this; + } + /** + *
                              +       *分区使用的比例
                              +       * 
                              + * + * string use = 6; + */ + public Builder setUseBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + use_ = value; + onChanged(); + return this; + } + + private java.lang.Object mountedOn_ = ""; + /** + *
                              +       *磁盘分区挂载的目录 即挂载点
                              +       * 
                              + * + * string mountedOn = 7; + */ + public java.lang.String getMountedOn() { + java.lang.Object ref = mountedOn_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + mountedOn_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
                              +       *磁盘分区挂载的目录 即挂载点
                              +       * 
                              + * + * string mountedOn = 7; + */ + public com.google.protobuf.ByteString + getMountedOnBytes() { + java.lang.Object ref = mountedOn_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + mountedOn_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
                              +       *磁盘分区挂载的目录 即挂载点
                              +       * 
                              + * + * string mountedOn = 7; + */ + public Builder setMountedOn( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + mountedOn_ = value; + onChanged(); + return this; + } + /** + *
                              +       *磁盘分区挂载的目录 即挂载点
                              +       * 
                              + * + * string mountedOn = 7; + */ + public Builder clearMountedOn() { + + mountedOn_ = getDefaultInstance().getMountedOn(); + onChanged(); + return this; + } + /** + *
                              +       *磁盘分区挂载的目录 即挂载点
                              +       * 
                              + * + * string mountedOn = 7; + */ + public Builder setMountedOnBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + mountedOn_ = value; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:MachineInfo) + } + + // @@protoc_insertion_point(class_scope:MachineInfo) + private static final com.dfire.protocol.RpcWorkInfo.MachineInfo DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcWorkInfo.MachineInfo(); + } + + public static com.dfire.protocol.RpcWorkInfo.MachineInfo getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public MachineInfo parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new MachineInfo(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcWorkInfo.MachineInfo getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ProcessMonitorOrBuilder extends + // @@protoc_insertion_point(interface_extends:ProcessMonitor) + com.google.protobuf.MessageOrBuilder { + + /** + * string pid = 1; + */ + java.lang.String getPid(); + /** + * string pid = 1; + */ + com.google.protobuf.ByteString + getPidBytes(); + + /** + * string user = 2; + */ + java.lang.String getUser(); + /** + * string user = 2; + */ + com.google.protobuf.ByteString + getUserBytes(); + + /** + * string viri = 3; + */ + java.lang.String getViri(); + /** + * string viri = 3; + */ + com.google.protobuf.ByteString + getViriBytes(); + + /** + * string res = 4; + */ + java.lang.String getRes(); + /** + * string res = 4; + */ + com.google.protobuf.ByteString + getResBytes(); + + /** + * string cpu = 5; + */ + java.lang.String getCpu(); + /** + * string cpu = 5; + */ + com.google.protobuf.ByteString + getCpuBytes(); + + /** + * string mem = 6; + */ + java.lang.String getMem(); + /** + * string mem = 6; + */ + com.google.protobuf.ByteString + getMemBytes(); + + /** + * string time = 7; + */ + java.lang.String getTime(); + /** + * string time = 7; + */ + com.google.protobuf.ByteString + getTimeBytes(); + + /** + * string command = 8; + */ + java.lang.String getCommand(); + /** + * string command = 8; + */ + com.google.protobuf.ByteString + getCommandBytes(); + } + /** + * Protobuf type {@code ProcessMonitor} + */ + public static final class ProcessMonitor extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:ProcessMonitor) + ProcessMonitorOrBuilder { + private static final long serialVersionUID = 0L; + // Use ProcessMonitor.newBuilder() to construct. + private ProcessMonitor(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ProcessMonitor() { + pid_ = ""; + user_ = ""; + viri_ = ""; + res_ = ""; + cpu_ = ""; + mem_ = ""; + time_ = ""; + command_ = ""; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ProcessMonitor( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + pid_ = s; + break; + } + case 18: { + java.lang.String s = input.readStringRequireUtf8(); + + user_ = s; + break; + } + case 26: { + java.lang.String s = input.readStringRequireUtf8(); + + viri_ = s; + break; + } + case 34: { + java.lang.String s = input.readStringRequireUtf8(); + + res_ = s; + break; + } + case 42: { + java.lang.String s = input.readStringRequireUtf8(); + + cpu_ = s; + break; + } + case 50: { + java.lang.String s = input.readStringRequireUtf8(); + + mem_ = s; + break; + } + case 58: { + java.lang.String s = input.readStringRequireUtf8(); + + time_ = s; + break; + } + case 66: { + java.lang.String s = input.readStringRequireUtf8(); + + command_ = s; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_ProcessMonitor_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_ProcessMonitor_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.ProcessMonitor.class, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder.class); + } + + public static final int PID_FIELD_NUMBER = 1; + private volatile java.lang.Object pid_; + /** + * string pid = 1; + */ + public java.lang.String getPid() { + java.lang.Object ref = pid_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pid_ = s; + return s; + } + } + /** + * string pid = 1; + */ + public com.google.protobuf.ByteString + getPidBytes() { + java.lang.Object ref = pid_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + pid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int USER_FIELD_NUMBER = 2; + private volatile java.lang.Object user_; + /** + * string user = 2; + */ + public java.lang.String getUser() { + java.lang.Object ref = user_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + user_ = s; + return s; + } + } + /** + * string user = 2; + */ + public com.google.protobuf.ByteString + getUserBytes() { + java.lang.Object ref = user_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + user_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VIRI_FIELD_NUMBER = 3; + private volatile java.lang.Object viri_; + /** + * string viri = 3; + */ + public java.lang.String getViri() { + java.lang.Object ref = viri_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + viri_ = s; + return s; + } + } + /** + * string viri = 3; + */ + public com.google.protobuf.ByteString + getViriBytes() { + java.lang.Object ref = viri_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + viri_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int RES_FIELD_NUMBER = 4; + private volatile java.lang.Object res_; + /** + * string res = 4; + */ + public java.lang.String getRes() { + java.lang.Object ref = res_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + res_ = s; + return s; + } + } + /** + * string res = 4; + */ + public com.google.protobuf.ByteString + getResBytes() { + java.lang.Object ref = res_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + res_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CPU_FIELD_NUMBER = 5; + private volatile java.lang.Object cpu_; + /** + * string cpu = 5; + */ + public java.lang.String getCpu() { + java.lang.Object ref = cpu_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + cpu_ = s; + return s; + } + } + /** + * string cpu = 5; + */ + public com.google.protobuf.ByteString + getCpuBytes() { + java.lang.Object ref = cpu_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + cpu_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int MEM_FIELD_NUMBER = 6; + private volatile java.lang.Object mem_; + /** + * string mem = 6; + */ + public java.lang.String getMem() { + java.lang.Object ref = mem_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + mem_ = s; + return s; + } + } + /** + * string mem = 6; + */ + public com.google.protobuf.ByteString + getMemBytes() { + java.lang.Object ref = mem_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + mem_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TIME_FIELD_NUMBER = 7; + private volatile java.lang.Object time_; + /** + * string time = 7; + */ + public java.lang.String getTime() { + java.lang.Object ref = time_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + time_ = s; + return s; + } + } + /** + * string time = 7; + */ + public com.google.protobuf.ByteString + getTimeBytes() { + java.lang.Object ref = time_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + time_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int COMMAND_FIELD_NUMBER = 8; + private volatile java.lang.Object command_; + /** + * string command = 8; + */ + public java.lang.String getCommand() { + java.lang.Object ref = command_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + command_ = s; + return s; + } + } + /** + * string command = 8; + */ + public com.google.protobuf.ByteString + getCommandBytes() { + java.lang.Object ref = command_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + command_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getPidBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, pid_); + } + if (!getUserBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, user_); + } + if (!getViriBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, viri_); + } + if (!getResBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, res_); + } + if (!getCpuBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, cpu_); + } + if (!getMemBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, mem_); + } + if (!getTimeBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, time_); + } + if (!getCommandBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 8, command_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getPidBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, pid_); + } + if (!getUserBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, user_); + } + if (!getViriBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, viri_); + } + if (!getResBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, res_); + } + if (!getCpuBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, cpu_); + } + if (!getMemBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, mem_); + } + if (!getTimeBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, time_); + } + if (!getCommandBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, command_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.dfire.protocol.RpcWorkInfo.ProcessMonitor)) { + return super.equals(obj); + } + com.dfire.protocol.RpcWorkInfo.ProcessMonitor other = (com.dfire.protocol.RpcWorkInfo.ProcessMonitor) obj; + + boolean result = true; + result = result && getPid() + .equals(other.getPid()); + result = result && getUser() + .equals(other.getUser()); + result = result && getViri() + .equals(other.getViri()); + result = result && getRes() + .equals(other.getRes()); + result = result && getCpu() + .equals(other.getCpu()); + result = result && getMem() + .equals(other.getMem()); + result = result && getTime() + .equals(other.getTime()); + result = result && getCommand() + .equals(other.getCommand()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PID_FIELD_NUMBER; + hash = (53 * hash) + getPid().hashCode(); + hash = (37 * hash) + USER_FIELD_NUMBER; + hash = (53 * hash) + getUser().hashCode(); + hash = (37 * hash) + VIRI_FIELD_NUMBER; + hash = (53 * hash) + getViri().hashCode(); + hash = (37 * hash) + RES_FIELD_NUMBER; + hash = (53 * hash) + getRes().hashCode(); + hash = (37 * hash) + CPU_FIELD_NUMBER; + hash = (53 * hash) + getCpu().hashCode(); + hash = (37 * hash) + MEM_FIELD_NUMBER; + hash = (53 * hash) + getMem().hashCode(); + hash = (37 * hash) + TIME_FIELD_NUMBER; + hash = (53 * hash) + getTime().hashCode(); + hash = (37 * hash) + COMMAND_FIELD_NUMBER; + hash = (53 * hash) + getCommand().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.dfire.protocol.RpcWorkInfo.ProcessMonitor prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code ProcessMonitor} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:ProcessMonitor) + com.dfire.protocol.RpcWorkInfo.ProcessMonitorOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.dfire.protocol.RpcWorkInfo.internal_static_ProcessMonitor_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.dfire.protocol.RpcWorkInfo.internal_static_ProcessMonitor_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.dfire.protocol.RpcWorkInfo.ProcessMonitor.class, com.dfire.protocol.RpcWorkInfo.ProcessMonitor.Builder.class); + } + + // Construct using com.dfire.protocol.RpcWorkInfo.ProcessMonitor.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + pid_ = ""; + + user_ = ""; + + viri_ = ""; + + res_ = ""; + + cpu_ = ""; + + mem_ = ""; + + time_ = ""; + + command_ = ""; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.dfire.protocol.RpcWorkInfo.internal_static_ProcessMonitor_descriptor; + } + + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor getDefaultInstanceForType() { + return com.dfire.protocol.RpcWorkInfo.ProcessMonitor.getDefaultInstance(); + } + + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor build() { + com.dfire.protocol.RpcWorkInfo.ProcessMonitor result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor buildPartial() { + com.dfire.protocol.RpcWorkInfo.ProcessMonitor result = new com.dfire.protocol.RpcWorkInfo.ProcessMonitor(this); + result.pid_ = pid_; + result.user_ = user_; + result.viri_ = viri_; + result.res_ = res_; + result.cpu_ = cpu_; + result.mem_ = mem_; + result.time_ = time_; + result.command_ = command_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.dfire.protocol.RpcWorkInfo.ProcessMonitor) { + return mergeFrom((com.dfire.protocol.RpcWorkInfo.ProcessMonitor)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.dfire.protocol.RpcWorkInfo.ProcessMonitor other) { + if (other == com.dfire.protocol.RpcWorkInfo.ProcessMonitor.getDefaultInstance()) return this; + if (!other.getPid().isEmpty()) { + pid_ = other.pid_; + onChanged(); + } + if (!other.getUser().isEmpty()) { + user_ = other.user_; + onChanged(); + } + if (!other.getViri().isEmpty()) { + viri_ = other.viri_; + onChanged(); + } + if (!other.getRes().isEmpty()) { + res_ = other.res_; + onChanged(); + } + if (!other.getCpu().isEmpty()) { + cpu_ = other.cpu_; + onChanged(); + } + if (!other.getMem().isEmpty()) { + mem_ = other.mem_; + onChanged(); + } + if (!other.getTime().isEmpty()) { + time_ = other.time_; + onChanged(); + } + if (!other.getCommand().isEmpty()) { + command_ = other.command_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.dfire.protocol.RpcWorkInfo.ProcessMonitor parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.dfire.protocol.RpcWorkInfo.ProcessMonitor) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object pid_ = ""; + /** + * string pid = 1; + */ + public java.lang.String getPid() { + java.lang.Object ref = pid_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pid_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string pid = 1; + */ + public com.google.protobuf.ByteString + getPidBytes() { + java.lang.Object ref = pid_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + pid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string pid = 1; + */ + public Builder setPid( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + pid_ = value; + onChanged(); + return this; + } + /** + * string pid = 1; + */ + public Builder clearPid() { + + pid_ = getDefaultInstance().getPid(); + onChanged(); + return this; + } + /** + * string pid = 1; + */ + public Builder setPidBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + pid_ = value; + onChanged(); + return this; + } + + private java.lang.Object user_ = ""; + /** + * string user = 2; + */ + public java.lang.String getUser() { + java.lang.Object ref = user_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + user_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string user = 2; + */ + public com.google.protobuf.ByteString + getUserBytes() { + java.lang.Object ref = user_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + user_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string user = 2; + */ + public Builder setUser( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + user_ = value; + onChanged(); + return this; + } + /** + * string user = 2; + */ + public Builder clearUser() { + + user_ = getDefaultInstance().getUser(); + onChanged(); + return this; + } + /** + * string user = 2; + */ + public Builder setUserBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + user_ = value; + onChanged(); + return this; + } + + private java.lang.Object viri_ = ""; + /** + * string viri = 3; + */ + public java.lang.String getViri() { + java.lang.Object ref = viri_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + viri_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string viri = 3; + */ + public com.google.protobuf.ByteString + getViriBytes() { + java.lang.Object ref = viri_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + viri_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string viri = 3; + */ + public Builder setViri( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + viri_ = value; + onChanged(); + return this; + } + /** + * string viri = 3; + */ + public Builder clearViri() { + + viri_ = getDefaultInstance().getViri(); + onChanged(); + return this; + } + /** + * string viri = 3; + */ + public Builder setViriBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + viri_ = value; + onChanged(); + return this; + } + + private java.lang.Object res_ = ""; + /** + * string res = 4; + */ + public java.lang.String getRes() { + java.lang.Object ref = res_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + res_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string res = 4; + */ + public com.google.protobuf.ByteString + getResBytes() { + java.lang.Object ref = res_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + res_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string res = 4; + */ + public Builder setRes( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + res_ = value; + onChanged(); + return this; + } + /** + * string res = 4; + */ + public Builder clearRes() { + + res_ = getDefaultInstance().getRes(); + onChanged(); + return this; + } + /** + * string res = 4; + */ + public Builder setResBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + res_ = value; + onChanged(); + return this; + } + + private java.lang.Object cpu_ = ""; + /** + * string cpu = 5; + */ + public java.lang.String getCpu() { + java.lang.Object ref = cpu_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + cpu_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string cpu = 5; + */ + public com.google.protobuf.ByteString + getCpuBytes() { + java.lang.Object ref = cpu_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + cpu_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string cpu = 5; + */ + public Builder setCpu( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + cpu_ = value; + onChanged(); + return this; + } + /** + * string cpu = 5; + */ + public Builder clearCpu() { + + cpu_ = getDefaultInstance().getCpu(); + onChanged(); + return this; + } + /** + * string cpu = 5; + */ + public Builder setCpuBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + cpu_ = value; + onChanged(); + return this; + } + + private java.lang.Object mem_ = ""; + /** + * string mem = 6; + */ + public java.lang.String getMem() { + java.lang.Object ref = mem_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + mem_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string mem = 6; + */ + public com.google.protobuf.ByteString + getMemBytes() { + java.lang.Object ref = mem_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + mem_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string mem = 6; + */ + public Builder setMem( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + mem_ = value; + onChanged(); + return this; + } + /** + * string mem = 6; + */ + public Builder clearMem() { + + mem_ = getDefaultInstance().getMem(); + onChanged(); + return this; + } + /** + * string mem = 6; + */ + public Builder setMemBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + mem_ = value; + onChanged(); + return this; + } + + private java.lang.Object time_ = ""; + /** + * string time = 7; + */ + public java.lang.String getTime() { + java.lang.Object ref = time_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + time_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string time = 7; + */ + public com.google.protobuf.ByteString + getTimeBytes() { + java.lang.Object ref = time_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + time_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string time = 7; + */ + public Builder setTime( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + time_ = value; + onChanged(); + return this; + } + /** + * string time = 7; + */ + public Builder clearTime() { + + time_ = getDefaultInstance().getTime(); + onChanged(); + return this; + } + /** + * string time = 7; + */ + public Builder setTimeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + time_ = value; + onChanged(); + return this; + } + + private java.lang.Object command_ = ""; + /** + * string command = 8; + */ + public java.lang.String getCommand() { + java.lang.Object ref = command_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + command_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string command = 8; + */ + public com.google.protobuf.ByteString + getCommandBytes() { + java.lang.Object ref = command_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + command_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string command = 8; + */ + public Builder setCommand( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + command_ = value; + onChanged(); + return this; + } + /** + * string command = 8; + */ + public Builder clearCommand() { + + command_ = getDefaultInstance().getCommand(); + onChanged(); + return this; + } + /** + * string command = 8; + */ + public Builder setCommandBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + command_ = value; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:ProcessMonitor) + } + + // @@protoc_insertion_point(class_scope:ProcessMonitor) + private static final com.dfire.protocol.RpcWorkInfo.ProcessMonitor DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.dfire.protocol.RpcWorkInfo.ProcessMonitor(); + } + + public static com.dfire.protocol.RpcWorkInfo.ProcessMonitor getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public ProcessMonitor parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ProcessMonitor(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public com.dfire.protocol.RpcWorkInfo.ProcessMonitor getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AllWorkInfo_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AllWorkInfo_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AllWorkInfo_ValuesEntry_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AllWorkInfo_ValuesEntry_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_WorkInfo_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_WorkInfo_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_OSInfo_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_OSInfo_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_MachineInfo_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_MachineInfo_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_ProcessMonitor_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_ProcessMonitor_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\017work_info.proto\"q\n\013AllWorkInfo\022(\n\006valu" + + "es\030\001 \003(\0132\030.AllWorkInfo.ValuesEntry\0328\n\013Va" + + "luesEntry\022\013\n\003key\030\001 \001(\t\022\030\n\005value\030\002 \001(\0132\t." + + "WorkInfo:\0028\001\"o\n\010WorkInfo\022\027\n\006oSInfo\030\001 \001(\013" + + "2\007.OSInfo\022!\n\013machineInfo\030\002 \003(\0132\014.Machine" + + "Info\022\'\n\016processMonitor\030\003 \003(\0132\017.ProcessMo" + + "nitor\"N\n\006OSInfo\022\014\n\004user\030\001 \001(\002\022\016\n\006system\030" + + "\002 \001(\002\022\013\n\003mem\030\003 \001(\002\022\013\n\003cpu\030\004 \001(\002\022\014\n\004swap\030" + + "\005 \001(\002\"z\n\013MachineInfo\022\022\n\nfilesystem\030\001 \001(\t" + + "\022\014\n\004type\030\002 \001(\t\022\014\n\004size\030\003 \001(\t\022\014\n\004used\030\004 \001" + + "(\t\022\r\n\005avail\030\005 \001(\t\022\013\n\003use\030\006 \001(\t\022\021\n\tmounte" + + "dOn\030\007 \001(\t\"\177\n\016ProcessMonitor\022\013\n\003pid\030\001 \001(\t" + + "\022\014\n\004user\030\002 \001(\t\022\014\n\004viri\030\003 \001(\t\022\013\n\003res\030\004 \001(" + + "\t\022\013\n\003cpu\030\005 \001(\t\022\013\n\003mem\030\006 \001(\t\022\014\n\004time\030\007 \001(" + + "\t\022\017\n\007command\030\010 \001(\tB#\n\022com.dfire.protocol" + + "B\013RpcWorkInfoH\001b\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_AllWorkInfo_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_AllWorkInfo_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AllWorkInfo_descriptor, + new java.lang.String[] { "Values", }); + internal_static_AllWorkInfo_ValuesEntry_descriptor = + internal_static_AllWorkInfo_descriptor.getNestedTypes().get(0); + internal_static_AllWorkInfo_ValuesEntry_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AllWorkInfo_ValuesEntry_descriptor, + new java.lang.String[] { "Key", "Value", }); + internal_static_WorkInfo_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_WorkInfo_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_WorkInfo_descriptor, + new java.lang.String[] { "OSInfo", "MachineInfo", "ProcessMonitor", }); + internal_static_OSInfo_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_OSInfo_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_OSInfo_descriptor, + new java.lang.String[] { "User", "System", "Mem", "Cpu", "Swap", }); + internal_static_MachineInfo_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_MachineInfo_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_MachineInfo_descriptor, + new java.lang.String[] { "Filesystem", "Type", "Size", "Used", "Avail", "Use", "MountedOn", }); + internal_static_ProcessMonitor_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_ProcessMonitor_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_ProcessMonitor_descriptor, + new java.lang.String[] { "Pid", "User", "Viri", "Res", "Cpu", "Mem", "Time", "Command", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/hera-protocol/src/main/resources/protos/cancel_message.proto b/hera-protocol/src/main/resources/protos/cancel_message.proto new file mode 100755 index 00000000..d238480b --- /dev/null +++ b/hera-protocol/src/main/resources/protos/cancel_message.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +import "execute_kind.proto"; + + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcCancelMessage"; + +message CancelMessage { + ExecuteKind ek = 1; + string id = 2; +} + diff --git a/hera-protocol/src/main/resources/protos/debug_message.proto b/hera-protocol/src/main/resources/protos/debug_message.proto new file mode 100755 index 00000000..3bbe9eac --- /dev/null +++ b/hera-protocol/src/main/resources/protos/debug_message.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcDebugMessage"; + +message DebugMessage { + string debugId = 1; + sint32 exitCode = 2; +} \ No newline at end of file diff --git a/hera-protocol/src/main/resources/protos/execute_kind.proto b/hera-protocol/src/main/resources/protos/execute_kind.proto new file mode 100755 index 00000000..e075c8d6 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/execute_kind.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "JobExecuteKind"; + +//任务执行类型 + +enum ExecuteKind { + ScheduleKind = 0; + ManualKind = 1; + DebugKind = 2; + AutoRerunKind = 3; + SuperRecoveryKind = 4; +} diff --git a/hera-protocol/src/main/resources/protos/execute_message.proto b/hera-protocol/src/main/resources/protos/execute_message.proto new file mode 100755 index 00000000..7c6fd117 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/execute_message.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcExecuteMessage"; + +message ExecuteMessage { + + string actionId = 1; + sint32 exitCode = 2; +} \ No newline at end of file diff --git a/hera-protocol/src/main/resources/protos/heart_beat_message.proto b/hera-protocol/src/main/resources/protos/heart_beat_message.proto new file mode 100755 index 00000000..388df0ad --- /dev/null +++ b/hera-protocol/src/main/resources/protos/heart_beat_message.proto @@ -0,0 +1,44 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcHeartBeatMessage"; + + +message AllHeartBeatInfoMessage { + map values = 1; +} + + +message HeartBeatMessage { + + //正在运行的自动调度job列表 + repeated string running = 1; + + //正在运行的文件脚本job列表 + repeated string debugRunning = 2; + + //正在运行的手动执行job列表 + repeated string manualRunning = 3; + //正在运行的重跑任务列表 + repeated string rerunRunning = 9; + //正在运行的超级恢复任务列表 + repeated string superRunning = 10; + + //时间戳 + int64 timestamp = 4; + + //内存占用比例 + float mem_rate = 5; + + //发送心跳的主机 + string host = 6; + + //每个核心的cpu负载 + float cpu_load_per_core = 7; + + //总内存大小,默认4096M + float mem_total = 4096; + + int32 cores = 8; +} diff --git a/hera-protocol/src/main/resources/protos/manual_message.proto b/hera-protocol/src/main/resources/protos/manual_message.proto new file mode 100755 index 00000000..808c8b85 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/manual_message.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcManualMessage"; + +message ManualMessage { + string historyId = 1; + sint32 exitCode = 2; +} \ No newline at end of file diff --git a/hera-protocol/src/main/resources/protos/operate.proto b/hera-protocol/src/main/resources/protos/operate.proto new file mode 100755 index 00000000..d4d1cf13 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/operate.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcOperate"; + +enum Operate { + + //心跳 worker->server + HeartBeat = 0; + + //调度执行命令 server->worker + Schedule = 1; + + //取消命令 server->worker + Cancel = 2; + + //调试命令 server->worker + Debug = 3; + + //手动执行命令 + Manual = 4; + + //获得机器信息 + GetWorkInfo = 5; + + //设置机器信息 + SetWorkInfo = 6; + + //执行重跑任务 + Rerun = 7; + //执行超级恢复任务 + SuperRecovery = 8; +} diff --git a/hera-protocol/src/main/resources/protos/pair.proto b/hera-protocol/src/main/resources/protos/pair.proto new file mode 100755 index 00000000..fe713bf1 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/pair.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcPair"; + +message Pair { + string key = 1; + string value = 2; + sint32 type = 3; +} diff --git a/hera-protocol/src/main/resources/protos/request.proto b/hera-protocol/src/main/resources/protos/request.proto new file mode 100755 index 00000000..b7ffbab6 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/request.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +import "operate.proto"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcRequest"; + +//request + +message Request { + + //request id 唯一标识一个请求 + sint32 rid = 1; + + //操作类型 + Operate operate = 2; + + //请求体 + bytes body = 3; +} + diff --git a/hera-protocol/src/main/resources/protos/response.proto b/hera-protocol/src/main/resources/protos/response.proto new file mode 100755 index 00000000..03c3ef22 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/response.proto @@ -0,0 +1,26 @@ +syntax = "proto3"; + +import "status.proto"; +import "operate.proto"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcResponse"; + +//rpc 请求响应体 +message Response { + + //状态码 + Status statusEnum = 1; + + //request id,响应时原封不动返回,提供给client配对. + sint32 rid = 2; + + Operate operate = 3; + + //如果出错,会有出错信息.纯文本形式.client自行包装 + string errorText = 4; + + //响应体 + bytes body = 5; +} diff --git a/hera-protocol/src/main/resources/protos/socket_message.proto b/hera-protocol/src/main/resources/protos/socket_message.proto new file mode 100755 index 00000000..ebf88c45 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/socket_message.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcSocketMessage"; + +//netty rpc通信消息体 +message SocketMessage { + + //rpc通信消息类型 + enum Kind { + REQUEST = 0; + RESPONSE = 1; + WEB_REQUEST = 2; + WEB_RESPONSE = 3; + } + Kind kind = 1; + + //消息体数据,字节码存储 + bytes body = 2; +} \ No newline at end of file diff --git a/hera-protocol/src/main/resources/protos/status.proto b/hera-protocol/src/main/resources/protos/status.proto new file mode 100755 index 00000000..5bae5682 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/status.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "ResponseStatus"; + +//rpc响应状态 +enum Status { + //成功 + OK = 0; + //失败 + ERROR = 1; +} \ No newline at end of file diff --git a/hera-protocol/src/main/resources/protos/web_operate.proto b/hera-protocol/src/main/resources/protos/web_operate.proto new file mode 100755 index 00000000..157683c7 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/web_operate.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcWebOperate"; + +//web界面的worker与server交互 + +enum WebOperate { + + //更新job + UpdateJob = 0; + + //手动执行或者手动恢复job + ExecuteJob = 1; + + //手动取消任务 + CancelJob = 2; + + //调试任务 + ExecuteDebug = 3; + + //生成版本 + GenerateAction = 4; + + //获得心跳信息 + GetAllHeartBeatInfo = 5; + + //获得所有机器信息 + GetAllWorkInfo = 6; + + UpdateConf = 7; + +} diff --git a/hera-protocol/src/main/resources/protos/web_request.proto b/hera-protocol/src/main/resources/protos/web_request.proto new file mode 100755 index 00000000..ece33fa4 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/web_request.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +import "web_operate.proto"; +import "execute_kind.proto"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcWebRequest"; + +message WebRequest { + enum Trigger { + MANUAL = 0; + MANUAL_RECOVER = 1; + } + sint32 rid = 1; + WebOperate operate = 2; + ExecuteKind ek = 3; + // update 时 id=actionId source=ScheduleJob时 id=historyId source=DebugJob时id=debugId + string id = 4; + string executor = 5; + bytes body = 6; +} \ No newline at end of file diff --git a/hera-protocol/src/main/resources/protos/web_response.proto b/hera-protocol/src/main/resources/protos/web_response.proto new file mode 100755 index 00000000..6183a9ea --- /dev/null +++ b/hera-protocol/src/main/resources/protos/web_response.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +import "status.proto"; +import "web_operate.proto"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcWebResponse"; + +//web请求执行任务响应 + +message WebResponse { + Status status = 1; + sint32 rid = 2; + WebOperate operate = 3; + string errorText = 4; + bytes body = 5; +} \ No newline at end of file diff --git a/hera-protocol/src/main/resources/protos/work_info.proto b/hera-protocol/src/main/resources/protos/work_info.proto new file mode 100755 index 00000000..b73031a1 --- /dev/null +++ b/hera-protocol/src/main/resources/protos/work_info.proto @@ -0,0 +1,54 @@ +syntax = "proto3"; + +option optimize_for = SPEED; +option java_package = "com.dfire.protocol"; +option java_outer_classname = "RpcWorkInfo"; + +message AllWorkInfo { + map values= 1; +} + +message WorkInfo { + OSInfo oSInfo = 1; + repeated MachineInfo machineInfo = 2; + repeated ProcessMonitor processMonitor = 3; +} + + +message OSInfo { + float user = 1; + float system = 2; + float mem = 3; + float cpu = 4; + float swap = 5; +} + +message MachineInfo { + //文件系统分区 + string filesystem = 1; + //文件类型 + string type = 2; + //分区大小 + string size = 3; + //分区已经使用大小 + string used = 4; + //分区可用大小 + string avail = 5; + //分区使用的比例 + string use = 6; + //磁盘分区挂载的目录 即挂载点 + string mountedOn = 7; +} + + + +message ProcessMonitor { + string pid = 1; + string user = 2; + string viri = 3; + string res = 4; + string cpu = 5; + string mem = 6; + string time = 7; + string command = 8; +} \ No newline at end of file diff --git a/plugins/dos2unix-6.0.3-7.el7.x86_64.rpm b/plugins/dos2unix-6.0.3-7.el7.x86_64.rpm new file mode 100755 index 00000000..b235ffe7 Binary files /dev/null and b/plugins/dos2unix-6.0.3-7.el7.x86_64.rpm differ diff --git a/plugins/install.txt b/plugins/install.txt new file mode 100755 index 00000000..75bacf57 --- /dev/null +++ b/plugins/install.txt @@ -0,0 +1,12 @@ + +hera系统依赖于dos2unix插件,你可以通过以下几种方式安装 +一、mac os +brew install dos2unix + +二、linux + +yum install dos2unix + +三、离线安装 +plugins目录里有 dos2unix 的离线安装包,你可以通过以下命令离线安装 +sudo rpm -ivh dos2unix-6.0.3-7.el7.x86_64.rpm diff --git a/pom.xml b/pom.xml new file mode 100755 index 00000000..81e43a39 --- /dev/null +++ b/pom.xml @@ -0,0 +1,310 @@ + + + 4.0.0 + + com.dfire.hera + hera + pom + 2.4.2 + + + ${project.artifactId} + A Distributed Job Schedule System + + + hera-common + hera-protocol + hera-monitor + hera-core + hera-admin + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + 4.1.42.Final + 1.1.10 + 8.0.16 + 1.2.61 + 23.0 + 1.18.2 + 4.12 + 1.7.9 + 1.2.17 + 1.7.9 + 1.2.3 + 1.5.9.RELEASE + 3.3.2 + 2.6 + 1.5 + 1.8 + 2.3.2 + 1.1.0 + 1.3.3 + 1.8 + 1.8 + 2.4.1 + 2.4.1 + 2.4.1 + 2.4.1 + 2.4.1 + + + + + + org.springframework.boot + spring-boot-starter + ${springboot.version} + + + + org.springframework.boot + spring-boot-starter-test + ${springboot.version} + test + + + + org.springframework.boot + spring-boot-starter-web + ${springboot.version} + + + + org.springframework.boot + spring-boot-starter-data-redis + ${springboot.version} + + + + org.redisson + redisson + ${redisson.version} + + + + org.springframework.boot + spring-boot-starter-amqp + ${springboot.version} + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.4 + + + org.springframework.boot + spring-boot-starter-aop + ${springboot.version} + + + + org.springframework.boot + spring-boot-starter-batch + ${springboot.version} + + + + + io.netty + netty-all + ${netty.version} + + + junit + junit + ${junit.version} + test + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 + + + com.alibaba + druid + ${druid.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + log4j + log4j + ${log4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + org.slf4j + log4j-over-slf4j + ${log4j.over.slf4j.version} + + + commons-logging + commons-logging-api + ${jcl_version} + + + + + com.google.guava + guava + ${guava.version} + + + + org.projectlombok + lombok + ${projectlombok.version} + + + + + commons-lang + commons-lang + ${commons.lang.version} + + + + org.apache.velocity + velocity + ${velocity.version} + + + + org.quartz-scheduler + quartz + ${quartz.version} + + + + org.jgrapht + jgrapht-core + ${jgrapht-core.version} + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + com.dfire.hera + hera-common + ${hera.common.version} + + + + com.dfire.hera + hera-core + ${hera.core.version} + + + + com.dfire.hera + hera-protocol + ${hera.protocol.version} + + + + com.dfire.hera + hera-monitor + ${hera.monitor.version} + + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + + + + + + dev + + dev + + + true + + + + daily_cn + + daily_cn + + + + pre_cn + + pre_cn + true + + + + public_cn + + public_cn + true + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + false + -Xmx3072m -Xms1024m -XX:MetaspaceSize=256m + + + + + diff --git a/update/sql/2.3升级2.4/update.sql b/update/sql/2.3升级2.4/update.sql new file mode 100755 index 00000000..b5094b06 --- /dev/null +++ b/update/sql/2.3升级2.4/update.sql @@ -0,0 +1,20 @@ +#权限表逻辑移除 +alter table hera_permission add columns `is_valid` tinyint(1) NOT NULL DEFAULT '1'; + +#增加sso用户表 +CREATE TABLE if not exists `hera_sso` +( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(16) NOT NULL DEFAULT '' COMMENT '用户名', + `password` varchar(32) NOT NULL DEFAULT '' COMMENT '密码', + `gid` int(11) NOT NULL DEFAULT '0' COMMENT '组id,对应hera_user的主键', + `phone` char(11) NOT NULL DEFAULT '' COMMENT '手机号', + `email` varchar(52) NOT NULL DEFAULT '' COMMENT '邮箱', + `job_number` char(5) NOT NULL DEFAULT '' COMMENT '工号', + `gmt_modified` bigint(20) NOT NULL DEFAULT '0' COMMENT '编辑时间', + `is_valid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否有效:0:无效:1:有效', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间', + PRIMARY KEY (`id`), + UNIQUE KEY `unq_name` (`name`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='sso用户表'; diff --git a/update/sql/2.4.1升级2.4.2/update.sql b/update/sql/2.4.1升级2.4.2/update.sql new file mode 100755 index 00000000..b20e33dd --- /dev/null +++ b/update/sql/2.4.1升级2.4.2/update.sql @@ -0,0 +1,41 @@ +CREATE TABLE `hera_rerun` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '重跑名称', + `start_millis` bigint(13) NOT NULL DEFAULT '0' COMMENT '其实跑的日期', + `end_millis` bigint(13) NOT NULL COMMENT '结束跑的日期', + `sso_name` varchar(16) NOT NULL COMMENT '创建人', + `extra` varchar(1000) NOT NULL DEFAULT '' COMMENT '其它配置', + `gmt_create` bigint(13) NOT NULL DEFAULT '0' COMMENT '创建时间', + `gmt_modified` bigint(13) NOT NULL DEFAULT '0' COMMENT '更新时间', + `job_id` int(11) NOT NULL DEFAULT '0' COMMENT '任务ID', + `is_end` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否结束', + `action_now` varchar(18) NOT NULL DEFAULT '' COMMENT '当前执行的版本号', + PRIMARY KEY (`id`), + KEY `idx_job_id` (`job_id`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='hera重跑任务表'; + +alter table hera_job + add column cron_period varchar(50) DEFAULT 'other' COMMENT '调度周期(year,month,day,hour,minute,second,other)'; +alter table hera_job + add column cron_interval int DEFAULT 0 COMMENT '调度间隔,业务定义的日期与调度日期的间隔'; +alter table hera_job + add column biz_label varchar(500) not null DEFAULT '' COMMENT '业务标签,逗号分隔'; + +alter table hera_action + add column batch_id varchar(50) DEFAULT NULL COMMENT '批次号'; + +alter table hera_action_history + add column batch_id varchar(50) DEFAULT NULL COMMENT '批次号'; +alter table hera_action_history + add column biz_label varchar(500) DEFAULT NULL COMMENT '标签'; + +alter table hera_job + add column `estimated_end_hour` int(4) NOT NULL DEFAULT '0' COMMENT '预计结束结束时间'; + +alter table hera_file + add column `job_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '关联调度任务id'; + +alter table hera_debug_history + add column `job_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '关联调度任务id'; diff --git a/update/sql/2.4升级2.4.1/update.sql b/update/sql/2.4升级2.4.1/update.sql new file mode 100755 index 00000000..daa3c42f --- /dev/null +++ b/update/sql/2.4升级2.4.1/update.sql @@ -0,0 +1,23 @@ + +#添加记录表 +CREATE TABLE IF NOT EXISTS `hera_record` +( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '日志类型:比如编辑、更新', + `content` mediumtext COMMENT '脚本的变更前的内容', + `log_type` varchar(15) NOT NULL DEFAULT '-1' COMMENT '记录的日志的类型 比如:任务/组', + `log_id` int(11) NOT NULL DEFAULT '-1' COMMENT '任务id/组id', + `gmt_create` bigint(13) NOT NULL DEFAULT '1557814087800' COMMENT '创建时间', + `gmt_modified` bigint(13) NOT NULL DEFAULT '1557814087800' COMMENT '同步专用字段', + `sso` varchar(32) NOT NULL DEFAULT 'hera' COMMENT '用户名称', + `gId` int(11) NOT NULL DEFAULT '-1' COMMENT '组id', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 37 + DEFAULT CHARSET = utf8mb4 COMMENT ='日志记录表'; + +#添加逻辑删除字段 +alter table hera_job add column `is_valid` tinyint(1) DEFAULT '1' COMMENT '任务是否删除'; + + +