[
  {
    "path": ".gitignore",
    "content": "logs\n"
  },
  {
    "path": "README.md",
    "content": "[blog_xtg](https://github.com/xtg20121013/blog_xtg)是我个人写的一个开源分布式博客，其web框架使用的是tornado(一个基于异步IO的python web框架)。同时我把它设计成一个可以多进程多主机部署的分布式架构，如果你对异步IO的web框架感兴趣，或者对高并发分布式的架构感兴趣并处于入门阶段，那么很希望你来尝试blog_xtg，一定会有所收获。\n\n### 一、为什么写blog_xtg\n作为一个码农怎么能没有一个属于自己的个人博客呢？即便没人看，作为日记来记录编码生涯也是很有必要。其实开源的blog有很多，比如WordPress、LifeType等等，但是There are a thousand Hamlets in a thousand people's eyes（一千个读者眼里有一千个哈姆雷特），所以我还是喜欢自己写属于自己的\"哈姆雷特\"。既然要做新项目，那不用点新东西就会觉得没有意义。恰逢当时淘宝双11，双11会场的页面都是由node.js支撑，node.js做web项目最大的特点就是异步IO，我js不怎么熟，我就选择了python的异步IO框架tornado。但是单个tornado实例无法充分利用多核CPU的资源，所以就实现了blog_xtg这样一个简单的基于tornado的分布式架构博客。\n\n### 二、blog_xtg简介\n首先非常感谢开源博客[Blog_mini](https://github.com/xpleaf/Blog_mini)，因为整个blog_xtg是基于[Blog_mini](https://github.com/xpleaf/Blog_mini)重构的。\n\n我不太擅长前端，所以基本照搬[Blog_mini](https://github.com/xpleaf/Blog_mini)的页面，但是整个后端逻辑都是重写的，以下是与[Blog_mini](https://github.com/xpleaf/Blog_mini)的主要区别：\n\n1. 改用tornado框架，是个基于异步IO的web server。\n2. 分布式架构，可以多进程多主机启动server实例，再通过nginx等代理服务器做负载均衡，实现横向扩展提高并发性能。\n3. 提高多数主要页面访问性能。对频繁查询的组件（例如博客标题、菜单、公告、访问统计）进行缓存，优化sql查询（多条sql语句合并一次执行、仅查需要的字段，例如搜索博文列表不查博文的具体内容）以提高首页博文等主要页面访问性能。\n4. 访问统计改为日pv和日uv。\n5. 博文编辑器改为markdown编辑器。\n6. 引入alembic管理数据库版本。\n7. 可使用docker快速部署。\n\n但是，作为一个个人blog，其实并不需要分布式的架构，即便引入了这样的架构，我依然希望其他开发者能够快捷的搭建环境并上手使用，因此blog_xtg只是简单的实现了分布式，并不能保证绝对的高可用，主从需要启动实例时手动指定，存在单点故障的可能，如果有开发者希望以此架构扩展到大型生产环境请自行配合zookeeper等实现动态选主+完整的日志分析、性能监控以及完善报警机制来保证高可用。\n\n**注：** blog_xtg目前架构并不需要考虑线程安全问题，因为tornado是单线程的，仅用到多线程的地方只有通过线程池访问数据库，数据库连接session是线程局部变量，其他并无线程间共享的变量，不会带来线程安全问题。\n\n### 三、blog_xtg部署与开发环境搭建\n#### 1. 如果你熟悉docker，那么可以用docker来快速部署。\n\t\n\t#新建数据库（理论上支持sqlalchemy支持的所有数据库，表会自动创建更新）\n\t#搭建redis\n\t#下载config.py并编辑相关配置（修改数据库、redis、日志等）\n\tcurl -o xxx/config.py https://raw.githubusercontent.com/xtg20121013/blog_xtg/master/config.py\n\t#通过docker启动后即可访问\n\tdocker run -d -p 80:80 --restart=always --name blog_xtg -v xxx/config.py:/home/xtg/blog-xtg/config.py daocloud.io/xtg20121013/blog_xtg:latest\n这个镜像启动时包含两个server实例(一主一从)+nginx(动静分离、负载均衡)+supervisor(进程管理)，当然你也可以根据自己的需求构建镜像，Dockerfile在项目/docker目录下。\n#### 2. 构建运行环境\n###### 需要安装以下组件：\n\n1. python2.7(python3 没试过，不知道行不行)\n2. mysql(或者其他sqlalchemy支持的数据库)\n3. redis\n\n###### clone项目，安装依赖：\n\n\tgit clone https://github.com/xtg20121013/blog_xtg.git\n\t#项目依赖（如果用的不是mysql可以将MySQL-python替换使用的数据库成所对应的依赖包）\n\tpip install -r requirements.txt\n###### 创建数据库(注意使用utf-8编码)\n###### 启动redis\n###### 修改config.py，配置数据库、redis、日志等\n###### 创建数据库或更新表\n\tpython main.py upgradedb\n###### 启动server\n\tpython main.py --master=true --port=8888\n\n###### 初始化管理员账户\n访问http://[host]:[port]/super/init注册管理员账号。\n\n注:仅没有任何管理员时才可以访问到该页面。\n\n### 四、开发注意事项\n#### 1.blog_xtg是个异步IO的架构，相对于常见的同步IO框架，需要注意以下几点：\n\n- IO密集型的操作请务必使用异步的client，否则无法利用到异步的优势\n- 由于多数异步IO的框架都是单线程的，所以对于CPU密集型的操作最好交由外部系统处理，防止阻塞，大型项目可以配合消息队列使用更佳\n- 如果必须用同步的IO组件，可以配合线程池使用（blog_xtg中使用了sqlalchemy就是配合线程池使用的）\n- 如果你是ORM+线程池使用(blog_xtg中就是sqlalchemy+线程池)，一般的ORM都有lazy load的机制，在异步框架中请勿使用，因为lazy load的执行在主线程中，很可能会阻塞主线程，影响别的请求。\n\n#### 2.blog_xtg是分布式的架构，相对于单进程的项目一般需要注意以下几点：\n\n- 多实例间的日志冲突。\n- 多实例间的缓存同步。\n- 多实例间的session同步。\n- 多实例间主从关系，例如一些定时任务可能主需要集群中一个节点处理。\n\n当然以上几点都可以从blog_xtg的源代码中找到至少一种解决方案。\n\n如果你对异步IO的web框架、分布式的架构感兴趣，或者想对blog_xtg做二次开发，那么你可以阅读以下blog_xtg的其他相关博文，并配合源代码学习，一定会很快掌握。\n\n1. [开源博客blog_xtg技术架构-非阻塞IO web框架tornado](http://blog.52xtg.com/article/10)\n\n\n#### 3.对于博文编辑的markdown的问题：\n\n我用的是[Bootstrap Markdown](http://www.codingdrama.com/bootstrap-markdown)，好像只支持标准的markdown语法，可能大家对代码段的标注语法只知道```的形式，而真正的标准语法是代码段的每一行开头添加4个空格，如果大家不喜欢的话可以尝试更换为[marked](https://github.com/chjj/marked)，参见：[修复markdown编辑器无法编写多行code的问题 #2](https://github.com/xtg20121013/blog_xtg/pull/2)\n\n### 五、技术支持\n如果你有任何疑问，可以给我留言:\n\n附：\t\n\n- 个人博客：[http://blog.52xtg.com](http://blog.52xtg.com)\n\n- 简书博客：[http://www.jianshu.com/u/dfb6bf87c35e](http://www.jianshu.com/u/dfb6bf87c35e)\n\n- 试用博客：[http://blogdemo.52xtg.com](http://blogdemo.52xtg.com)\n\n- blog_xtg的github地址：[https://github.com/xtg20121013/blog_xtg](https://github.com/xtg20121013/blog_xtg)\n"
  },
  {
    "path": "alembic/README",
    "content": "Generic single-database configuration."
  },
  {
    "path": "alembic/env.py",
    "content": "from __future__ import with_statement\nfrom alembic import context\nfrom sqlalchemy import engine_from_config, pool\nfrom config import database_config\nfrom model.models import DbBase\n\n# this is the Alembic Config object, which provides\n# access to the values within the .ini file in use.\nconfig = context.config\n\n# add your model's MetaData object here\n# for 'autogenerate' support\n# from myapp import mymodel\n# target_metadata = mymodel.Base.metadata\ntarget_metadata = DbBase.metadata\n\n# other values from the config, defined by the needs of env.py,\n# can be acquired:\n# my_important_option = config.get_main_option(\"my_important_option\")\n# ... etc.\n\n\ndef run_migrations_offline():\n    \"\"\"Run migrations in 'offline' mode.\n\n    This configures the context with just a URL\n    and not an Engine, though an Engine is acceptable\n    here as well.  By skipping the Engine creation\n    we don't even need a DBAPI to be available.\n\n    Calls to context.execute() here emit the given string to the\n    script output.\n\n    \"\"\"\n    url = config.get_main_option(\"sqlalchemy.url\")\n    context.configure(\n        url=url, target_metadata=target_metadata, literal_binds=True)\n\n    with context.begin_transaction():\n        context.run_migrations()\n\n\ndef run_migrations_online():\n    \"\"\"Run migrations in 'online' mode.\n\n    In this scenario we need to create an Engine\n    and associate a connection with the context.\n\n    \"\"\"\n    connectable = engine_from_config(\n        {'sqlalchemy.url': database_config['engine_url']},\n        prefix='sqlalchemy.',\n        poolclass=pool.NullPool)\n\n    with connectable.connect() as connection:\n        context.configure(\n            connection=connection,\n            target_metadata=target_metadata\n        )\n\n        with context.begin_transaction():\n            context.run_migrations()\n\nif context.is_offline_mode():\n    run_migrations_offline()\nelse:\n    run_migrations_online()\n"
  },
  {
    "path": "alembic/script.py.mako",
    "content": "\"\"\"${message}\n\nRevision ID: ${up_revision}\nRevises: ${down_revision | comma,n}\nCreate Date: ${create_date}\n\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\n${imports if imports else \"\"}\n\n# revision identifiers, used by Alembic.\nrevision = ${repr(up_revision)}\ndown_revision = ${repr(down_revision)}\nbranch_labels = ${repr(branch_labels)}\ndepends_on = ${repr(depends_on)}\n\n\ndef upgrade():\n    ${upgrades if upgrades else \"pass\"}\n\n\ndef downgrade():\n    ${downgrades if downgrades else \"pass\"}\n"
  },
  {
    "path": "alembic/versions/753ec9bc0d27_init_v1_0.py",
    "content": "# coding=utf-8\n\"\"\"init_v1_0\n\nRevision ID: 753ec9bc0d27\nRevises: \nCreate Date: 2017-03-12 20:17:20.958379\n\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\nfrom model.constants import Constants\n\n# revision identifiers, used by Alembic.\nrevision = '753ec9bc0d27'\ndown_revision = None\nbranch_labels = None\ndepends_on = None\n\n\ndef upgrade():\n    # ### commands auto generated by Alembic - please adjust! ###\n    ats = op.create_table('articleTypeSettings',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('name', sa.String(length=64), nullable=True),\n    sa.Column('protected', sa.Boolean(), nullable=True),\n    sa.Column('hide', sa.Boolean(), nullable=True),\n    sa.PrimaryKeyConstraint('id'),\n    sa.UniqueConstraint('name')\n    )\n    blog_info = op.create_table('blog_info',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('title', sa.String(length=64), nullable=True),\n    sa.Column('signature', sa.Text(), nullable=True),\n    sa.Column('navbar', sa.String(length=64), nullable=True),\n    sa.PrimaryKeyConstraint('id')\n    )\n    op.create_table('blog_view',\n    sa.Column('date', sa.DATE(), nullable=False),\n    sa.Column('pv', sa.BigInteger(), nullable=True),\n    sa.Column('uv', sa.BigInteger(), nullable=True),\n    sa.PrimaryKeyConstraint('date')\n    )\n    op.create_table('menus',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('name', sa.String(length=64), nullable=True),\n    sa.Column('order', sa.Integer(), nullable=False),\n    sa.PrimaryKeyConstraint('id'),\n    sa.UniqueConstraint('name')\n    )\n    plugins = op.create_table('plugins',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('title', sa.String(length=64), nullable=True),\n    sa.Column('note', sa.Text(), nullable=True),\n    sa.Column('content', sa.Text(), nullable=True),\n    sa.Column('order', sa.Integer(), nullable=True),\n    sa.Column('disabled', sa.Boolean(), nullable=True),\n    sa.PrimaryKeyConstraint('id'),\n    sa.UniqueConstraint('title')\n    )\n    op.create_index(op.f('ix_plugins_order'), 'plugins', ['order'], unique=False)\n    sources = op.create_table('sources',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('name', sa.String(length=64), nullable=True),\n    sa.PrimaryKeyConstraint('id'),\n    sa.UniqueConstraint('name')\n    )\n    op.create_table('users',\n    sa.Column('created_at', sa.DateTime(), nullable=True),\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('email', sa.String(length=64), nullable=True),\n    sa.Column('username', sa.String(length=64), nullable=True),\n    sa.Column('password', sa.String(length=128), nullable=True),\n    sa.PrimaryKeyConstraint('id')\n    )\n    op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True)\n    op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True)\n    articleTypes = op.create_table('articleTypes',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('name', sa.String(length=64), nullable=True),\n    sa.Column('introduction', sa.Text(), nullable=True),\n    sa.Column('menu_id', sa.Integer(), nullable=True),\n    sa.Column('setting_id', sa.Integer(), nullable=True),\n    sa.ForeignKeyConstraint(['menu_id'], ['menus.id'], ),\n    sa.ForeignKeyConstraint(['setting_id'], ['articleTypeSettings.id'], ),\n    sa.PrimaryKeyConstraint('id'),\n    sa.UniqueConstraint('name')\n    )\n    op.create_table('articles',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('title', sa.String(length=64), nullable=True),\n    sa.Column('content', sa.Text(), nullable=True),\n    sa.Column('summary', sa.Text(), nullable=True),\n    sa.Column('create_time', sa.DateTime(), nullable=True),\n    sa.Column('update_time', sa.DateTime(), nullable=True),\n    sa.Column('num_of_view', sa.Integer(), nullable=True),\n    sa.Column('articleType_id', sa.Integer(), nullable=True),\n    sa.Column('source_id', sa.Integer(), nullable=True),\n    sa.ForeignKeyConstraint(['articleType_id'], ['articleTypes.id'], ),\n    sa.ForeignKeyConstraint(['source_id'], ['sources.id'], ),\n    sa.PrimaryKeyConstraint('id')\n    )\n    op.create_index(op.f('ix_articles_create_time'), 'articles', ['create_time'], unique=False)\n    op.create_index(op.f('ix_articles_update_time'), 'articles', ['update_time'], unique=False)\n    op.create_table('comments',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('content', sa.Text(), nullable=True),\n    sa.Column('create_time', sa.DateTime(), nullable=True),\n    sa.Column('author_name', sa.String(length=64), nullable=True),\n    sa.Column('author_email', sa.String(length=64), nullable=True),\n    sa.Column('article_id', sa.Integer(), nullable=True),\n    sa.Column('disabled', sa.Boolean(), nullable=True),\n    sa.Column('comment_type', sa.String(length=64), nullable=True),\n    sa.Column('rk', sa.String(length=64), nullable=True),\n    sa.Column('floor', sa.Integer(), nullable=False),\n    sa.Column('reply_to_id', sa.Integer(), nullable=True),\n    sa.Column('reply_to_floor', sa.String(length=64), nullable=True),\n    sa.ForeignKeyConstraint(['article_id'], ['articles.id'], ),\n    sa.PrimaryKeyConstraint('id')\n    )\n    # ### end Alembic commands ###\n    # insert default data\n    op.bulk_insert(ats, [\n        dict(id=1, name='system', protected=True, hide=True)\n    ])\n    op.bulk_insert(blog_info,[\n        dict(id=1,\n             title=u'开源分布式博客系统blog_xtg',\n             signature=u'基于tornado的分布式博客！— by xtg',\n             navbar='inverse')\n    ])\n    op.bulk_insert(plugins, [\n        dict(id=1,\n             title=u'博客统计',\n             note=u'系统插件',\n             content='system_plugin',\n             order=1,\n             disabled=False)\n    ])\n    op.bulk_insert(sources, [\n        dict(id=1, name=u'原创', ),\n        dict(id=2, name=u'转载', ),\n        dict(id=3, name=u'翻译', ),\n    ])\n    op.bulk_insert(articleTypes, [\n        dict(id=Constants.ARTICLE_TYPE_DEFAULT_ID,\n             name=u'未分类',\n             introduction=u'系统默认分类，不可删除。',\n             setting_id=1,\n        ),\n    ])\n\n\ndef downgrade():\n    # ### commands auto generated by Alembic - please adjust! ###\n    op.drop_table('comments')\n    op.drop_index(op.f('ix_articles_update_time'), table_name='articles')\n    op.drop_index(op.f('ix_articles_create_time'), table_name='articles')\n    op.drop_table('articles')\n    op.drop_table('articleTypes')\n    op.drop_index(op.f('ix_users_username'), table_name='users')\n    op.drop_index(op.f('ix_users_email'), table_name='users')\n    op.drop_table('users')\n    op.drop_table('sources')\n    op.drop_index(op.f('ix_plugins_order'), table_name='plugins')\n    op.drop_table('plugins')\n    op.drop_table('menus')\n    op.drop_table('blog_view')\n    op.drop_table('blog_info')\n    op.drop_table('articleTypeSettings')\n    # ### end Alembic commands ###\n"
  },
  {
    "path": "alembic.ini",
    "content": "# A generic, single database configuration.\n\n[alembic]\n# path to migration scripts\nscript_location = alembic\n\n# template used to generate migration files\n# file_template = %%(rev)s_%%(slug)s\n\n# max length of characters to apply to the\n# \"slug\" field\n#truncate_slug_length = 40\n\n# set to 'true' to run the environment during\n# the 'revision' command, regardless of autogenerate\n# revision_environment = false\n\n# set to 'true' to allow .pyc and .pyo files without\n# a source .py file to be detected as revisions in the\n# versions/ directory\n# sourceless = false\n\n# version location specification; this defaults\n# to alembic/versions.  When using multiple version\n# directories, initial revisions must be specified with --version-path\n# version_locations = %(here)s/bar %(here)s/bat alembic/versions\n\n# the output encoding used when revision files\n# are written from script.py.mako\n# output_encoding = utf-8\n\nsqlalchemy.url = driver://user:pass@localhost/dbname\n\n\n# Logging configuration\n[loggers]\nkeys = root,sqlalchemy,alembic\n\n[handlers]\nkeys = console\n\n[formatters]\nkeys = generic\n\n[logger_root]\nlevel = WARN\nhandlers = console\nqualname =\n\n[logger_sqlalchemy]\nlevel = WARN\nhandlers =\nqualname = sqlalchemy.engine\n\n[logger_alembic]\nlevel = INFO\nhandlers =\nqualname = alembic\n\n[handler_console]\nclass = StreamHandler\nargs = (sys.stderr,)\nlevel = NOTSET\nformatter = generic\n\n[formatter_generic]\nformat = %(levelname)-5.5s [%(name)s] %(message)s\ndatefmt = %H:%M:%S\n"
  },
  {
    "path": "config.py",
    "content": "# coding=utf-8\nfrom urllib import quote_plus as urlquote\n\ncookie_keys = dict(\n    session_key_name=\"TR_SESSION_ID\",\n    uv_key_name=\"uv_tag\",\n)\n\n# session相关配置（redis实现）\nredis_session_config = dict(\n    db_no=0,\n    host=\"127.0.0.1\",\n    port=6379,\n    password=None,\n    max_connections=10,\n    session_key_name=cookie_keys['session_key_name'],\n    session_expires_days=7,\n)\n\n# 站点缓存(redis)\nsite_cache_config = dict(\n    db_no=1,\n    host=\"127.0.0.1\",\n    port=6379,\n    password=None,\n    max_connections=10,\n)\n\n# 基于redis的消息订阅（发布接收缓存更新消息）\nredis_pub_sub_channels = dict(\n    cache_message_channel=\"site_cache_message_channel\",\n)\n\n# 消息订阅(基于redis)配置\nredis_pub_sub_config = dict(\n    host=\"127.0.0.1\",\n    port=6379,\n    password=None,\n    autoconnect=True,\n    channels=[redis_pub_sub_channels['cache_message_channel'],],\n)\n\n# 数据库配置\ndatabase_config = dict(\n    engine=None,\n    # engine_url='postgresql+psycopg2://mhq:1qaz2wsx@localhost:5432/blog',\n    # 如果是使用mysql+mysqldb，在确认所有的库表列都是uft8编码后，依然有字符编码报错，\n    # 可以尝试在该url末尾加上queryString charset=utf8\n    engine_url='mysql+mysqlconnector://root:%s@localhost:3306/blog_xtg?charset=utf8' % urlquote('MyPass@123'),\n    engine_setting=dict(\n        echo=False,  # print sql\n        echo_pool=False,\n        # 设置7*60*60秒后回收连接池，默认-1，从不重置\n        # 该参数会在每个session调用执行sql前校验当前时间与上一次连接时间间隔是否超过pool_recycle，如果超过就会重置。\n        # 这里设置7小时是为了避免mysql默认会断开超过8小时未活跃过的连接，避免\"MySQL server has gone away”错误\n        # 如果mysql重启或断开过连接，那么依然会在第一次时报\"MySQL server has gone away\"，\n        # 假如需要非常严格的mysql断线重连策略，可以设置心跳。\n        # 心跳设置参考https://stackoverflow.com/questions/18054224/python-sqlalchemy-mysql-server-has-gone-away\n        pool_recycle=25200,\n        pool_size=20,\n        max_overflow=20,\n    ),\n)\n\nsession_keys = dict(\n    login_user=\"login_user\",\n    messages=\"messages\",\n    article_draft=\"article_draft\",\n)\n\n# 关联model.site_info中的字段\nsite_cache_keys = dict(\n    title=\"title\",\n    signature=\"signature\",\n    navbar=\"navbar\",\n    menus=\"menus\",\n    article_types_not_under_menu=\"article_types_not_under_menu\",\n    plugins=\"plugins\",\n    pv=\"pv\",\n    uv=\"uv\",\n    article_count=\"article_count\",\n    comment_count=\"comment_count\",\n    article_sources=\"article_sources\",\n    source_articles_count=\"source_{}_articles_count\",\n)\n\n# 站点相关配置以及tornado的相关参数\nconfig = dict(\n    debug=False,\n    log_level=\"INFO\",\n    log_console=True,\n    log_file=False,\n    log_file_path=\"logs/log\",  # 末尾自动添加 @端口号.txt_日期\n    compress_response=True,\n    xsrf_cookies=True,\n    cookie_secret=\"kjsdhfweiofjhewnfiwehfneiwuhniu\",\n    login_url=\"/auth/login\",\n    port=8888,\n    max_threads_num=500,\n    database=database_config,\n    redis_session=redis_session_config,\n    session_keys=session_keys,\n    master=True,  # 是否为主从节点中的master节点, 整个集群有且仅有一个,(要提高可用性的话可以用zookeeper来选主,该项目就暂时不做了)\n    navbar_styles={\"inverse\": \"魅力黑\", \"default\": \"优雅白\"},  # 导航栏样式\n    default_avatar_url=\"identicon\",\n    application=None,  # 项目启动后会在这里注册整个server，以便在需要的地方调用，勿修改\n)"
  },
  {
    "path": "controller/__init__.py",
    "content": "# coding=utf-8\n"
  },
  {
    "path": "controller/admin.py",
    "content": "# coding=utf-8\nfrom base import BaseHandler\nfrom tornado.gen import coroutine\nfrom tornado.web import authenticated\nfrom service.user_service import UserService\n\n\nclass AdminAccountHandler(BaseHandler):\n\n    @authenticated\n    def get(self):\n        self.render(\"admin/admin_account.html\")\n\n    @coroutine\n    def post(self, require):\n        if require == \"edit-user-info\":\n            yield self.edit_user_info()\n        elif require == \"change-password\":\n            yield self.change_password()\n\n    @authenticated\n    @coroutine\n    def edit_user_info(self):\n        user_info = {\"username\": self.get_argument(\"username\"), \"email\": self.get_argument(\"email\")}\n        user = yield self.async_do(UserService.update_user_info, self.db, self.current_user.name,\n                                   self.get_argument(\"password\"), user_info)\n        if user:\n            self.save_login_user(user)\n            self.add_message('success', u'修改用户信息成功!')\n        else:\n            self.add_message('danger', u'修改用户信息失败！密码不正确!')\n        self.redirect(self.reverse_url(\"admin.account\"))\n\n    @authenticated\n    @coroutine\n    def change_password(self):\n        old_password = self.get_argument(\"old_password\")\n        new_password = self.get_argument(\"password\")\n        count = yield self.async_do(UserService.update_password, self.db, self.current_user.name,\n                                    old_password, new_password)\n        if count > 0:\n            self.add_message('success', u'修改密码成功!')\n        else:\n            self.add_message('danger', u'修改密码失败！')\n        self.redirect(self.reverse_url(\"admin.account\"))\n\n\nclass AdminHelpHandler(BaseHandler):\n\n    @authenticated\n    def get(self):\n        self.render('admin/help_page.html')"
  },
  {
    "path": "controller/admin_article.py",
    "content": "# coding=utf-8\nfrom tornado.gen import coroutine\nfrom tornado.web import authenticated\n\nfrom base import BaseHandler\nfrom config import session_keys\nfrom model.models import Article\nfrom model.constants import Constants\nfrom service.article_service import ArticleService\nfrom service.article_type_service import ArticleTypeService\nfrom service.init_service import SiteCacheService\nfrom service.comment_service import CommentService\nfrom model.search_params.article_params import ArticleSearchParams\nfrom model.search_params.comment_params import CommentSearchParams\nfrom model.pager import Pager\n\n\nclass ArticleAndCommentsFlush(object):\n    @coroutine\n    def flush_article_cache(self, action, article):\n        yield SiteCacheService.update_article_action(self.cache_manager, action, article,\n                                                     is_pub_all=True, pubsub_manager=self.pubsub_manager)\n\n    @coroutine\n    def flush_comments_cache(self, action, comments):\n        yield SiteCacheService.update_comment_action(self.cache_manager, action, comments,\n                                                     is_pub_all=True, pubsub_manager=self.pubsub_manager)\n\n\nclass AdminArticleHandler(BaseHandler, ArticleAndCommentsFlush):\n\n    @coroutine\n    def get(self, *require):\n        if require:\n            if len(require) == 1:\n                action = require[0]\n                if action == 'submit':\n                    yield self.submit_get()\n                elif action.isdigit():\n                    article_id = int(action)\n                    yield self.article_get(article_id)\n        else:\n            yield self.page_get()\n\n    @coroutine\n    def post(self, *require):\n        if require:\n            if len(require) == 1:\n                if require[0] == 'submit':\n                    yield self.submit_post()\n                elif require[0].isdigit():\n                    article_id = int(require[0])\n                    yield self.update_post(article_id)\n            elif len(require) == 2:\n                article_id = require[0]\n                action = require[1]\n                if action == 'delete':\n                    yield self.delete_post(article_id)\n\n    @coroutine\n    @authenticated\n    def page_get(self):\n        pager = Pager(self)\n        article_search_params = ArticleSearchParams(self)\n        article_types = yield self.async_do(ArticleTypeService.list_simple, self.db)\n        pager = yield self.async_do(ArticleService.page_articles, self.db, pager, article_search_params)\n        self.render(\"admin/manage_articles.html\", article_types=article_types, pager=pager,\n                    article_search_params=article_search_params)\n\n    @coroutine\n    @authenticated\n    def article_get(self, article_id):\n        article_types = yield self.async_do(ArticleTypeService.list_simple, self.db)\n        article = yield self.async_do(ArticleService.get_article_all, self.db, article_id, True)\n        self.render(\"admin/submit_articles.html\", article_types=article_types, article=article)\n\n    @coroutine\n    @authenticated\n    def submit_get(self):\n        article_draft = self.session.pop(session_keys['article_draft'], None)\n        article = None\n        if article_draft:\n            source_id = article_draft.get(\"source_id\")\n            type_id = article_draft.get(\"articleType_id\")\n            article = Article(source_id=int(source_id) if source_id else None,\n                              title=article_draft.get(\"title\"),\n                              articleType_id=int(type_id) if type_id else None,\n                              content=article_draft.get(\"content\"),\n                              summary=article_draft.get(\"summary\"))\n        article_types = yield self.async_do(ArticleTypeService.list_simple, self.db)\n        self.render(\"admin/submit_articles.html\", article_types=article_types, article=article)\n\n    @coroutine\n    @authenticated\n    def submit_post(self):\n        article = dict(\n            source_id=self.get_argument(\"source_id\"),\n            title=self.get_argument(\"title\"),\n            articleType_id=self.get_argument(\"articleType_id\"),\n            content=self.get_argument(\"content\"),\n            summary=self.get_argument(\"summary\"),\n        )\n        article_saved = yield self.async_do(ArticleService.add_article, self.db, article)\n        if article_saved and article_saved.id:\n            yield self.flush_article_cache(Constants.FLUSH_ARTICLE_ACTION_ADD, article_saved)\n            self.add_message('success', u'保存成功!')\n            self.redirect(self.reverse_url('article', article_saved.id))\n        else:\n            self.add_message('danger', u'保存失败！')\n            self.session[session_keys['article_draft']] = article\n            self.redirect(self.reverse_url('admin.article.action', 'submit'))\n\n    @coroutine\n    @authenticated\n    def update_post(self, article_id):\n        article = dict(\n            id=article_id,\n            source_id=self.get_argument(\"source_id\"),\n            title=self.get_argument(\"title\"),\n            articleType_id=self.get_argument(\"articleType_id\"),\n            content=self.get_argument(\"content\"),\n            summary=self.get_argument(\"summary\"),\n        )\n        article_updateds = yield self.async_do(ArticleService.update_article, self.db, article)\n        if article_updateds:\n            yield self.flush_article_cache(Constants.FLUSH_ARTICLE_ACTION_UPDATE, article=article_updateds)\n            article_updated = article_updateds[0]\n            self.add_message('success', u'修改成功!')\n            self.redirect(self.reverse_url('article', article_updated.id))\n        else:\n            self.add_message('danger', u'修改失败！')\n            self.redirect(self.reverse_url('admin.article', article_id))\n\n    @coroutine\n    @authenticated\n    def delete_post(self, article_id):\n        article_deleted, comments_deleted = yield self.async_do(ArticleService.delete_article, self.db, article_id)\n        if article_deleted:\n            yield self.flush_article_cache(Constants.FLUSH_ARTICLE_ACTION_REMOVE, article_deleted)\n            yield self.flush_comments_cache(Constants.FLUSH_COMMENT_ACTION_REMOVE, comments_deleted)\n            self.add_message('success', u'删除成功,并删除{}条评论!'.format(len(comments_deleted)))\n            self.write(\"success\")\n        else:\n            self.add_message('danger', u'删除失败！')\n            self.write(\"error\")\n\n\nclass AdminArticleCommentHandler(BaseHandler, ArticleAndCommentsFlush):\n    @coroutine\n    def get(self, *require):\n        yield self.page_get()\n\n    @coroutine\n    def post(self, *require):\n        if require:\n            if len(require) == 3:\n                article_id = require[0]\n                comment_id = require[1]\n                action = require[2]\n                if action == 'disable':\n                    yield self.disable_post(article_id, comment_id, True)\n                elif action == 'enable':\n                    yield self.disable_post(article_id, comment_id, False)\n                elif action == 'delete':\n                    yield self.delete_post(article_id, comment_id)\n\n    @coroutine\n    @authenticated\n    def page_get(self):\n        pager = Pager(self)\n        comment_search_params = CommentSearchParams(self)\n        comment_search_params.show_article_id_title = True\n        comment_search_params.order_mode = CommentSearchParams.ORDER_MODE_CREATE_TIME_DESC\n        comments_pager = yield self.async_do(CommentService.page_comments, self.db, pager, comment_search_params)\n        self.render(\"admin/manage_comments.html\", pager=comments_pager)\n\n    @coroutine\n    @authenticated\n    def disable_post(self, article_id, comment_id, disabled):\n        updated = yield self.async_do(CommentService.update_comment_disabled, self.db, article_id, comment_id, disabled)\n        if updated:\n            self.add_message('success', u'修改成功')\n            self.write(\"success\")\n        else:\n            self.add_message('danger', u'修改失败！')\n            self.write(\"error\")\n\n    @coroutine\n    @authenticated\n    def delete_post(self, article_id, comment_id):\n        comment_deleted = yield self.async_do(CommentService.delete_comment, self.db, article_id, comment_id)\n        if comment_deleted:\n            yield self.flush_comments_cache(Constants.FLUSH_COMMENT_ACTION_REMOVE, comment_deleted)\n            self.add_message('success', u'删除成功')\n            self.write(\"success\")\n        else:\n            self.add_message('danger', u'删除失败！')\n            self.write(\"error\")"
  },
  {
    "path": "controller/admin_article_type.py",
    "content": "# coding=utf-8\nfrom tornado.web import authenticated\nfrom tornado.gen import coroutine\nfrom base import BaseHandler\nfrom model.pager import Pager\nfrom model.search_params.menu_params import MenuSearchParams\nfrom model.search_params.article_type_params import ArticleTypeSearchParams\nfrom service.menu_service import MenuService\nfrom service.init_service import SiteCacheService\nfrom service.article_type_service import ArticleTypeService\n\n\nclass AdminArticleTypeBaseHandler(BaseHandler):\n    @coroutine\n    def flush_menus(self, menus=None, article_types_not_under_menu=None):\n        if menus is None:\n            menus = yield self.async_do(MenuService.list_menus, self.db, show_types=True)\n        if article_types_not_under_menu is None:\n            article_types_not_under_menu = yield \\\n                self.async_do(ArticleTypeService.list_article_types_not_under_menu, self.db)\n        yield SiteCacheService.update_menus(self.cache_manager, menus, article_types_not_under_menu,\n                                            is_pub_all=True, pubsub_manager=self.pubsub_manager)\n\n\nclass AdminArticleTypeHandler(AdminArticleTypeBaseHandler):\n\n    @coroutine\n    def get(self, *require):\n        if require:\n            if len(require) == 2:\n                article_type_id = require[0]\n                action = require[1]\n                if action == 'delete':\n                    yield self.delete_get(article_type_id)\n        else:\n            yield self.page_get()\n\n    @coroutine\n    def post(self, *require):\n        if require:\n            if len(require) == 1:\n                if require[0] == 'add':\n                    yield self.add_post()\n            elif len(require) == 2:\n                article_type_id = require[0]\n                action = require[1]\n                if action == 'update':\n                    yield self.update_post(article_type_id)\n\n    @coroutine\n    @authenticated\n    def page_get(self):\n        pager = Pager(self)\n        search_param = ArticleTypeSearchParams(self)\n        search_param.show_setting = True\n        search_param.show_articles_count = True\n        pager = yield self.async_do(ArticleTypeService.page_article_types, self.db, pager, search_param)\n        menus = yield self.async_do(MenuService.list_menus, self.db)\n        self.render(\"admin/manage_articleTypes.html\", pager=pager, menus=menus)\n\n    @coroutine\n    @authenticated\n    def delete_get(self, article_type_id):\n        update_count = yield self.async_do(ArticleTypeService.delete, self.db, article_type_id)\n        if update_count:\n            yield self.flush_menus()\n            self.add_message('success', u'删除成功!')\n        else:\n            self.add_message('danger', u'删除失败！')\n        redirect_url = self.reverse_url('admin.articleTypes')\n        if self.request.query:\n            redirect_url += \"?\" + self.request.query\n        self.redirect(redirect_url)\n\n    @coroutine\n    @authenticated\n    def add_post(self):\n        menu_id = int(self.get_argument(\"menu_id\")) \\\n            if self.get_argument(\"menu_id\") and self.get_argument(\"menu_id\").isdigit() else None\n        article_type = dict(\n            name=self.get_argument(\"name\"),\n            setting_hide=self.get_argument(\"setting_hide\") == 'true',\n            introduction=self.get_argument(\"introduction\"),\n            menu_id=menu_id if menu_id > 0 else None,\n        )\n        added = yield self.async_do(ArticleTypeService.add_article_type, self.db, article_type)\n        if added:\n            yield self.flush_menus()\n            self.add_message('success', u'保存成功!')\n        else:\n            self.add_message('danger', u'保存失败！')\n        redirect_url = self.reverse_url('admin.articleTypes')\n        if self.request.query:\n            redirect_url += \"?\" + self.request.query\n        self.redirect(redirect_url)\n\n    @coroutine\n    @authenticated\n    def update_post(self, article_type_id):\n        menu_id = int(self.get_argument(\"menu_id\")) \\\n            if self.get_argument(\"menu_id\") and self.get_argument(\"menu_id\").isdigit() else None\n        article_type = dict(\n            id=article_type_id,\n            name=self.get_argument(\"name\"),\n            setting_hide=self.get_argument(\"setting_hide\") == 'true',\n            introduction=self.get_argument(\"introduction\"),\n            menu_id=menu_id if menu_id > 0 else None,\n        )\n        updated = yield self.async_do(ArticleTypeService.update_article_type, self.db, article_type_id, article_type)\n        if updated:\n            yield self.flush_menus()\n            self.add_message('success', u'修改成功!')\n        else:\n            self.add_message('danger', u'修改失败！')\n        redirect_url = self.reverse_url('admin.articleTypes')\n        if self.request.query:\n            redirect_url += \"?\" + self.request.query\n        self.redirect(redirect_url)\n\n\nclass AdminArticleTypeNavHandler(AdminArticleTypeBaseHandler):\n\n    @coroutine\n    def get(self, *require):\n        if require:\n            if len(require) == 2:\n                menu_id = require[0]\n                action = require[1]\n                if action == 'sort-up':\n                    yield self.sort_up_get(menu_id)\n                elif action == 'sort-down':\n                    yield self.sort_down_get(menu_id)\n                elif action == 'delete':\n                    yield self.delete_get(menu_id)\n        else:\n            yield self.page_get()\n\n    @coroutine\n    def post(self, *require):\n        if require:\n            if len(require) == 1:\n                if require[0] == 'add':\n                    yield self.add_post()\n            elif len(require) == 2:\n                menu_id = require[0]\n                action = require[1]\n                if action == 'update':\n                    yield self.update_post(menu_id)\n\n    @coroutine\n    @authenticated\n    def add_post(self):\n        menu = dict(name=self.get_argument('name'),)\n        added = yield self.async_do(MenuService.add_menu, self.db, menu)\n        if added:\n            yield self.flush_menus()\n            self.add_message('success', u'保存成功!')\n        else:\n            self.add_message('danger', u'保存失败！')\n        redirect_url = self.reverse_url('admin.articleTypeNavs')\n        if self.request.query:\n            redirect_url += \"?\"+self.request.query\n        self.redirect(redirect_url)\n\n    @coroutine\n    @authenticated\n    def update_post(self, menu_id):\n        menu = dict(name=self.get_argument('name'),)\n        update_count = yield self.async_do(MenuService.update, self.db, menu_id, menu)\n        if update_count:\n            yield self.flush_menus()\n            self.add_message('success', u'修改成功!')\n        else:\n            self.add_message('danger', u'保存失败！')\n        redirect_url = self.reverse_url('admin.articleTypeNavs')\n        if self.request.query:\n            redirect_url += \"?\"+self.request.query\n        self.redirect(redirect_url)\n\n    @coroutine\n    @authenticated\n    def page_get(self):\n        pager = Pager(self)\n        menu_search_params = MenuSearchParams(self)\n        pager = yield self.async_do(MenuService.page_menus, self.db, pager, menu_search_params)\n        self.render(\"admin/manage_articleTypes_nav.html\", pager=pager)\n\n    @coroutine\n    @authenticated\n    def sort_up_get(self, menu_id):\n        updated = yield self.async_do(MenuService.sort_up, self.db, menu_id)\n        if updated:\n            yield self.flush_menus()\n            self.add_message('success', u'导航升序成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        redirect_url = self.reverse_url('admin.articleTypeNavs')\n        if self.request.query:\n            redirect_url += \"?\"+self.request.query\n        self.redirect(redirect_url)\n\n    @coroutine\n    @authenticated\n    def sort_down_get(self, menu_id):\n        updated = yield self.async_do(MenuService.sort_down, self.db, menu_id)\n        if updated:\n            yield self.flush_menus()\n            self.add_message('success', u'导航降序成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        redirect_url = self.reverse_url('admin.articleTypeNavs')\n        if self.request.query:\n            redirect_url += \"?\"+self.request.query\n        self.redirect(redirect_url)\n\n    @coroutine\n    @authenticated\n    def sort_up_get(self, menu_id):\n        updated = yield self.async_do(MenuService.sort_up, self.db, menu_id)\n        if updated:\n            yield self.flush_menus()\n            self.add_message('success', u'导航升序成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        redirect_url = self.reverse_url('admin.articleTypeNavs')\n        if self.request.query:\n            redirect_url += \"?\"+self.request.query\n        self.redirect(redirect_url)\n\n    @coroutine\n    @authenticated\n    def delete_get(self, menu_id):\n        update_count = yield self.async_do(MenuService.delete, self.db, menu_id)\n        if update_count:\n            yield self.flush_menus()\n            self.add_message('success', u'删除成功!')\n        else:\n            self.add_message('danger', u'保存失败！')\n        redirect_url = self.reverse_url('admin.articleTypeNavs')\n        if self.request.query:\n            redirect_url += \"?\"+self.request.query\n        self.redirect(redirect_url)\n"
  },
  {
    "path": "controller/admin_custom.py",
    "content": "# coding=utf-8\nfrom base import BaseHandler\nfrom tornado.gen import coroutine\nfrom tornado.web import authenticated\nfrom config import config\nfrom model.pager import Pager\nfrom model.search_params.plugin_params import PluginSearchParams\nfrom service.custom_service import BlogInfoService\nfrom service.init_service import SiteCacheService\nfrom service.plugin_service import PluginService\n\n\nclass AdminCustomBlogInfoHandler(BaseHandler):\n\n    @authenticated\n    def get(self):\n        self.render(\"admin/custom_blog_info.html\", navbar_styles=config['navbar_styles'])\n\n    @coroutine\n    @authenticated\n    def post(self):\n        info = dict(title=self.get_argument(\"title\"), signature=self.get_argument(\"signature\"),\n                    navbar=self.get_argument(\"navbar\"),)\n        blog_info = yield self.async_do(BlogInfoService.update_blog_info, self.db, info)\n        if blog_info:\n            #  更新本地及redis缓存，并发布消息通知其他节点更新\n            yield self.flush_blog_info(blog_info)\n            self.add_message('success', u'修改博客信息成功!')\n        else:\n            self.add_message('danger', u'修改失败！')\n        self.redirect(self.reverse_url(\"admin.custom.blog_info\"))\n\n    @coroutine\n    def flush_blog_info(self, blog_info):\n        #  更新本地及redis缓存，并发布消息通知其他节点更新\n        yield SiteCacheService.update_blog_info(self.cache_manager, blog_info,\n                                                is_pub_all=True, pubsub_manager=self.pubsub_manager)\n\n\nclass AdminCustomBlogPluginHandler(BaseHandler):\n\n    @coroutine\n    def get(self, *require):\n        if require:\n            if len(require) == 1:\n                if require[0] == 'add':\n                    self.add_get()\n            elif len(require) == 2:\n                plugin_id = require[0]\n                action = require[1]\n                if action == 'sort-up':\n                    yield self.sort_up_get(plugin_id)\n                elif action == 'sort-down':\n                    yield self.sort_down_get(plugin_id)\n                elif action == 'disable':\n                    yield self.set_disabled_get(plugin_id, True)\n                elif action == 'enable':\n                    yield self.set_disabled_get(plugin_id, False)\n                elif action == 'delete':\n                    yield self.delete_get(plugin_id)\n                elif action == 'edit':\n                    yield self.edit_get(plugin_id)\n        else:\n            yield self.index_get()\n\n    @coroutine\n    def post(self, *require):\n        if require:\n            if len(require) == 1:\n                if require[0] == 'add':\n                    yield self.add_post()\n            elif len(require) == 2:\n                plugin_id = require[0]\n                action = require[1]\n                if action == 'edit':\n                    yield self.edit_post(plugin_id)\n\n    @coroutine\n    @authenticated\n    def index_get(self):\n        pager = Pager(self)\n        plugin_search_params = PluginSearchParams(self)\n        pager = yield self.async_do(PluginService.page_plugins, self.db, pager, plugin_search_params)\n        self.render(\"admin/custom_blog_plugin.html\", pager=pager)\n\n    @authenticated\n    def add_get(self):\n        self.render(\"admin/blog_plugin_add.html\")\n\n    @coroutine\n    @authenticated\n    def edit_get(self, plugin_id):\n        plugin = yield self.async_do(PluginService.get, self.db, plugin_id)\n        self.render(\"admin/blog_plugin_edit.html\", plugin=plugin)\n\n    @coroutine\n    @authenticated\n    def sort_up_get(self, plugin_id):\n        updated = yield self.async_do(PluginService.sort_up, self.db, plugin_id)\n        if updated:\n            yield self.flush_plugins()\n            self.add_message('success', u'插件升序成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        self.redirect(self.reverse_url('admin.custom.blog_plugin')+\"?\"+self.request.query)\n\n    @coroutine\n    @authenticated\n    def sort_down_get(self, plugin_id):\n        updated = yield self.async_do(PluginService.sort_down, self.db, plugin_id)\n        if updated:\n            yield self.flush_plugins()\n            self.add_message('success', u'插件降序成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        self.redirect(self.reverse_url('admin.custom.blog_plugin')+\"?\"+self.request.query)\n\n    @coroutine\n    @authenticated\n    def set_disabled_get(self, plugin_id, disabled):\n        updated_count = yield self.async_do(PluginService.update_disabled, self.db, plugin_id, disabled)\n        if updated_count:\n            yield self.flush_plugins()\n            self.add_message('success', u'插件禁用成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        self.redirect(self.reverse_url('admin.custom.blog_plugin')+\"?\"+self.request.query)\n\n    @coroutine\n    @authenticated\n    def delete_get(self, plugin_id):\n        updated = yield self.async_do(PluginService.delete, self.db, plugin_id)\n        if updated:\n            yield self.flush_plugins()\n            self.add_message('success', u'插件删除成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        self.redirect(self.reverse_url('admin.custom.blog_plugin')+\"?\"+self.request.query)\n\n    @coroutine\n    @authenticated\n    def add_post(self):\n        plugin = dict(title=self.get_argument('title'),note=self.get_argument('note'),\n                      content=self.get_argument('content'),)\n        plugin_saved = yield self.async_do(PluginService.save, self.db, plugin)\n        if plugin_saved and plugin_saved.id:\n            yield self.flush_plugins()\n            self.add_message('success', u'保存成功!')\n        else:\n            self.add_message('danger', u'保存失败！')\n        self.redirect(self.reverse_url('admin.custom.plugin.action', 'add'))\n\n    @coroutine\n    @authenticated\n    def edit_post(self, plugin_id):\n        plugin = dict(\n            id=plugin_id,\n            title=self.get_argument(\"title\", None),\n            note=self.get_argument(\"note\", None),\n            content=self.get_argument(\"content\", None),\n        )\n        updated = yield self.async_do(PluginService.update, self.db, plugin_id, plugin)\n        if updated:\n            yield self.flush_plugins()\n            self.add_message('success', u'插件修改成功!')\n        else:\n            self.add_message('danger', u'操作失败！')\n        self.redirect(self.reverse_url('admin.custom.blog_plugin')+\"?\"+self.request.query)\n\n\n    @coroutine\n    def flush_plugins(self, plugins=None):\n        if plugins is None:\n            plugins = yield self.async_do(PluginService.list_plugins, self.db)\n        yield SiteCacheService.update_plugins(self.cache_manager, plugins,\n                                              is_pub_all=True, pubsub_manager=self.pubsub_manager)"
  },
  {
    "path": "controller/base.py",
    "content": "# coding=utf-8\nimport hashlib\nimport urllib\n\nimport datetime\nimport tornado.web\nfrom tornado import gen\nfrom tornado.escape import url_escape\n\nfrom config import session_keys, config, cookie_keys\nfrom extends.session_tornadis import Session\nfrom model.logined_user import LoginUser\nfrom service.init_service import SiteCacheService\nfrom service.blog_view_service import BlogViewService\n\n\nclass BaseHandler(tornado.web.RequestHandler):\n\n    def initialize(self):\n        self.session = None\n        self.db_session = None\n        self.session_save_tag = False\n        self.session_expire_time = 604800  # 7*24*60*60秒\n        self.thread_executor = self.application.thread_executor\n        self.cache_manager = self.application.cache_manager\n        self.async_do = self.thread_executor.submit\n\n    def login_url(self):\n        return self.get_login_url()+\"?next=\"+url_escape(self.request.uri)\n\n    @gen.coroutine\n    def prepare(self):\n        yield self.init_session()\n        if session_keys['login_user'] in self.session:\n            self.current_user = LoginUser(self.session[session_keys['login_user']])\n        self.add_pv_uv() # 与主代码异步执行，所以不用yield阻塞\n\n    #  增加pv，uv, 调用该方法可以不用yield阻塞以达到与主代码异步执行\n    #  每次调用pv+1, uv根据cookie每24小时只+1\n    #  因为要与主代码异步执行，所以要使用独立的db连接\n    @gen.coroutine\n    def add_pv_uv(self):\n        add_pv = 1\n        add_uv = 0\n        date = datetime.date.today()\n        last_view_day = self.get_secure_cookie(cookie_keys['uv_key_name'], None)\n        if not last_view_day or int(last_view_day) != date.day:\n            add_uv = 1\n            self.set_secure_cookie(cookie_keys['uv_key_name'], str(date.day), 1)\n        yield SiteCacheService.add_pv_uv(self.cache_manager, add_pv, add_uv,\n                                         is_pub_all=True, pubsub_manager=self.pubsub_manager)\n        yield self.async_do(BlogViewService.add_blog_view, self.application.db_pool(), add_pv, add_uv, date)\n\n    @gen.coroutine\n    def init_session(self):\n        if not self.session:\n            self.session = Session(self)\n            yield self.session.init_fetch()\n\n    def save_session(self):\n        self.session_save_tag = True\n        self.session.generate_session_id()\n\n    @property\n    def db(self):\n        if not self.db_session:\n            self.db_session = self.application.db_pool()\n        return self.db_session\n\n    @property\n    def pubsub_manager(self):\n        return self.application.pubsub_manager\n\n    def save_login_user(self, user):\n        login_user = LoginUser(None)\n        login_user['id'] = user.id\n        login_user['name'] = user.username\n        login_user['avatar'] = self.get_gravatar_url(user.email)\n        login_user['email'] = user.email\n        self.session[session_keys['login_user']] = login_user\n        self.current_user = login_user\n        self.save_session()\n\n    def logout(self):\n        if session_keys['login_user'] in self.session:\n            del self.session[session_keys['login_user']]\n            self.save_session()\n        self.current_user = None\n\n    def has_message(self):\n        if self.session and session_keys['messages'] in self.session:\n            return bool(self.session[session_keys['messages']])\n        else:\n            return False\n\n    # category:['success','info', 'warning', 'danger']\n    def add_message(self, category, message):\n        item = {'category': category, 'message': message}\n        if session_keys['messages'] in self.session and \\\n                isinstance(self.session[session_keys['messages']], dict):\n            self.session[session_keys['messages']].append(item)\n        else:\n            self.session[session_keys['messages']] = [item]\n        self.save_session()\n\n    def read_messages(self):\n        if session_keys['messages'] in self.session:\n            all_messages = self.session.pop(session_keys['messages'], None)\n            self.save_session()\n            return all_messages\n        return None\n\n    def write_json(self, json):\n        self.set_header(\"Content-Type\", \"application/json; charset=UTF-8\")\n        self.write(json)\n\n    def write_error(self, status_code, **kwargs):\n        if not config['debug']:\n            if status_code == 403:\n                self.render(\"403.html\")\n            elif status_code == 404 or 405:\n                self.render(\"404.html\")\n            elif status_code == 500:\n                self.render(\"500.html\")\n        if not self._finished:\n            super(BaseHandler, self).write_error(status_code, **kwargs)\n\n    def get_gravatar_url(self, email, default=None, size=40):\n        body = {'s': str(size)}\n        if default:\n            body[\"d\"] = default;\n        elif config['default_avatar_url']:\n            body[\"d\"] = config['default_avatar_url']\n        gravatar_url = \"https://www.gravatar.com/avatar/\" + hashlib.md5(email.lower()).hexdigest() + \"?\"\n        gravatar_url += urllib.urlencode(body)\n        return gravatar_url\n\n    @gen.coroutine\n    def on_finish(self):\n        if self.db_session:\n            self.db_session.close()\n            # print \"db_info:\", self.application.db_pool.kw['bind'].pool.status()\n        if self.session is not None and self.session_save_tag:\n            yield self.session.save(self.session_expire_time)\n\n"
  },
  {
    "path": "controller/home.py",
    "content": "# coding=utf-8\nfrom tornado import gen\n\nfrom base import BaseHandler\nfrom admin_article import ArticleAndCommentsFlush\nfrom model.pager import Pager\nfrom model.constants import Constants\nfrom model.search_params.article_params import ArticleSearchParams\nfrom model.search_params.comment_params import CommentSearchParams\nfrom service.user_service import UserService\nfrom service.article_service import ArticleService\nfrom service.comment_service import CommentService\n\n\nclass HomeHandler(BaseHandler):\n    @gen.coroutine\n    def get(self):\n        pager = Pager(self)\n        article_search_params = ArticleSearchParams(self)\n        article_search_params.show_article_type = True\n        article_search_params.show_source = True\n        article_search_params.show_summary = True\n        article_search_params.show_comments_count = True\n        pager = yield self.async_do(ArticleService.page_articles, self.db, pager, article_search_params)\n        self.render(\"index.html\", base_url=self.reverse_url('index'),\n                    pager=pager, article_search_params=article_search_params)\n\n\nclass ArticleHandler(BaseHandler):\n    @gen.coroutine\n    def get(self, article_id):\n        article = yield self.async_do(ArticleService.get_article_all, self.db, article_id, True, add_view_count=1)\n        if article:\n            comments_pager = Pager(self)\n            comment_search_params = CommentSearchParams(self)\n            comment_search_params.article_id = article_id\n            comments_pager = yield self.async_do(CommentService.page_comments, self.db, comments_pager, comment_search_params)\n            self.render(\"article_detials.html\", article=article, comments_pager=comments_pager)\n        else:\n            self.write_error(404)\n\n\nclass ArticleCommentHandler(BaseHandler, ArticleAndCommentsFlush):\n    @gen.coroutine\n    def post(self, article_id):\n        comment = dict(\n            content=self.get_argument('content'),\n            author_name=self.get_argument('author_name'),\n            author_email=self.get_argument('author_email'),\n            article_id=article_id,\n            comment_type=self.get_argument('comment_type', None),\n            rank=Constants.COMMENT_RANK_ADMIN if self.current_user else Constants.COMMENT_RANK_NORMAL,\n            reply_to_id=self.get_argument('reply_to_id', None),\n            reply_to_floor=self.get_argument('reply_to_floor', None),\n        )\n        comment_saved = yield self.async_do(CommentService.add_comment, self.db, article_id, comment)\n        if comment_saved:\n            yield self.flush_comments_cache(Constants.FLUSH_COMMENT_ACTION_ADD, comment_saved)\n            self.add_message('success', u'评论成功')\n        else:\n            self.add_message('danger', u'评论失败')\n        next_url = self.get_argument('next', None)\n        if next_url:\n            self.redirect(next_url)\n        else:\n            self.redirect(self.reverse_url('article', article_id)+\"?pageNo=-1#comments\")\n\n\nclass ArticleTypeHandler(BaseHandler):\n    @gen.coroutine\n    def get(self, type_id):\n        pager = Pager(self)\n        article_search_params = ArticleSearchParams(self)\n        article_search_params.show_article_type=True\n        article_search_params.show_source=True\n        article_search_params.show_summary=True\n        article_search_params.show_comments_count = True\n        article_search_params.articleType_id = type_id\n        pager = yield self.async_do(ArticleService.page_articles, self.db, pager, article_search_params)\n        self.render(\"index.html\", base_url=self.reverse_url('articleType', type_id),\n                    pager=pager, article_search_params=article_search_params)\n\n\nclass articleSourceHandler(BaseHandler):\n    @gen.coroutine\n    def get(self, source_id):\n        pager = Pager(self)\n        article_search_params = ArticleSearchParams(self)\n        article_search_params.show_article_type=True\n        article_search_params.show_source=True\n        article_search_params.show_summary=True\n        article_search_params.show_comments_count = True\n        article_search_params.source_id = source_id\n        pager = yield self.async_do(ArticleService.page_articles, self.db, pager, article_search_params)\n        self.render(\"index.html\", base_url=self.reverse_url('articleSource', source_id),\n                    pager=pager, article_search_params=article_search_params)\n\n\nclass LoginHandler(BaseHandler):\n\n    def get(self):\n        next_url = self.get_argument('next', '/')\n        self.render(\"auth/login.html\", next_url=next_url)\n\n    @gen.coroutine\n    def post(self):\n        username = self.get_argument('username')\n        password = self.get_argument('password')\n        next_url = self.get_argument('next', '/')\n        user = yield self.async_do(UserService.get_user, self.db, username)\n        if user is not None and user.password == password:\n            self.save_login_user(user)\n            self.add_message('success', u'登陆成功！欢迎回来，{0}!'.format(username))\n            self.redirect(next_url)\n        else:\n            self.add_message('danger', u'登陆失败！用户名或密码错误，请重新登陆。')\n            self.get()\n\n\nclass LogoutHandler(BaseHandler):\n\n    def get(self):\n        self.logout()\n        self.add_message('success', u'您已退出登陆。')\n        self.redirect(\"/\")\n\n\n"
  },
  {
    "path": "controller/super.py",
    "content": "# coding=utf-8\nfrom tornado import gen\n\nfrom base import BaseHandler\nfrom service.user_service import UserService\n\n\nclass SuperHandler(BaseHandler):\n    @gen.coroutine\n    def get(self):\n        user_count = yield self.async_do(UserService.get_count, self.db)\n        if not user_count:\n            self.render(\"super/init.html\")\n        else:\n            self.write_error(404)\n\n    @gen.coroutine\n    def post(self):\n        user = dict(\n            email=self.get_argument('email'),\n            username=self.get_argument('username'),\n            password=self.get_argument('password'),\n        )\n        user_saved = yield self.async_do(UserService.save_user, self.db, user)\n        if user_saved and user_saved.id:\n            self.add_message('success', u'创建成功!')\n            self.redirect(self.reverse_url('login'))\n        else:\n            self.add_message('danger', u'创建失败！')\n            self.redirect(self.reverse_url('super.init'))\n"
  },
  {
    "path": "docker/Dockerfile",
    "content": "FROM python:2.7.13-alpine\nMAINTAINER xtg <imgamermhq@gmail.com>\n\n#时区问题（alpine解决方案）\nRUN apk update && apk add ca-certificates && \\\n    apk add tzdata && \\\n    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \\\n    echo \"Asia/Shanghai\" > /etc/timezone\n\nENV SUPERVISOR_VERSION 3.3.1\nENV NGINX_VERSION 1.10.3\n\n#安装nginx\nRUN GPG_KEYS=B0F4253373F8F6F510D42178520A9993A1C052F8 \\\n  && CONFIG=\"\\\n    --prefix=/etc/nginx \\\n    --sbin-path=/usr/sbin/nginx \\\n    --modules-path=/usr/lib/nginx/modules \\\n    --conf-path=/etc/nginx/nginx.conf \\\n    --error-log-path=/var/log/nginx/error.log \\\n    --http-log-path=/var/log/nginx/access.log \\\n    --pid-path=/var/run/nginx.pid \\\n    --lock-path=/var/run/nginx.lock \\\n    --http-client-body-temp-path=/var/cache/nginx/client_temp \\\n    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \\\n    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \\\n    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \\\n    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \\\n    --user=nginx \\\n    --group=nginx \\\n    --with-http_ssl_module \\\n    --with-http_realip_module \\\n    --with-http_addition_module \\\n    --with-http_sub_module \\\n    --with-http_dav_module \\\n    --with-http_flv_module \\\n    --with-http_mp4_module \\\n    --with-http_gunzip_module \\\n    --with-http_gzip_static_module \\\n    --with-http_random_index_module \\\n    --with-http_secure_link_module \\\n    --with-http_stub_status_module \\\n    --with-http_auth_request_module \\\n    --with-http_xslt_module=dynamic \\\n    --with-http_image_filter_module=dynamic \\\n    --with-http_geoip_module=dynamic \\\n    --with-http_perl_module=dynamic \\\n    --with-threads \\\n    --with-stream \\\n    --with-stream_ssl_module \\\n    --with-http_slice_module \\\n    --with-mail \\\n    --with-mail_ssl_module \\\n    --with-file-aio \\\n    --with-http_v2_module \\\n    --with-ipv6 \\\n  \" \\\n  && addgroup -S nginx \\\n  && adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx \\\n  && apk add --no-cache --virtual .build-deps \\\n    gcc \\\n    libc-dev \\\n    make \\\n    openssl-dev \\\n    pcre-dev \\\n    zlib-dev \\\n    linux-headers \\\n    curl \\\n    gnupg \\\n    libxslt-dev \\\n    gd-dev \\\n    geoip-dev \\\n    perl-dev \\\n  && curl -fSL http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o nginx.tar.gz \\\n  && curl -fSL http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz.asc  -o nginx.tar.gz.asc \\\n  && export GNUPGHOME=\"$(mktemp -d)\" \\\n  && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys \"$GPG_KEYS\" \\\n  && gpg --batch --verify nginx.tar.gz.asc nginx.tar.gz \\\n  && rm -r \"$GNUPGHOME\" nginx.tar.gz.asc \\\n  && mkdir -p /usr/src \\\n  && tar -zxC /usr/src -f nginx.tar.gz \\\n  && rm nginx.tar.gz \\\n  && cd /usr/src/nginx-$NGINX_VERSION \\\n  && ./configure $CONFIG --with-debug \\\n  && make -j$(getconf _NPROCESSORS_ONLN) \\\n  && mv objs/nginx objs/nginx-debug \\\n  && mv objs/ngx_http_xslt_filter_module.so objs/ngx_http_xslt_filter_module-debug.so \\\n  && mv objs/ngx_http_image_filter_module.so objs/ngx_http_image_filter_module-debug.so \\\n  && mv objs/ngx_http_geoip_module.so objs/ngx_http_geoip_module-debug.so \\\n  && mv objs/ngx_http_perl_module.so objs/ngx_http_perl_module-debug.so \\\n  && ./configure $CONFIG \\\n  && make -j$(getconf _NPROCESSORS_ONLN) \\\n  && make install \\\n  && rm -rf /etc/nginx/html/ \\\n  && mkdir /etc/nginx/conf.d/ \\\n  && mkdir -p /usr/share/nginx/html/ \\\n  && install -m644 html/index.html /usr/share/nginx/html/ \\\n  && install -m644 html/50x.html /usr/share/nginx/html/ \\\n  && install -m755 objs/nginx-debug /usr/sbin/nginx-debug \\\n  && install -m755 objs/ngx_http_xslt_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_xslt_filter_module-debug.so \\\n  && install -m755 objs/ngx_http_image_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_image_filter_module-debug.so \\\n  && install -m755 objs/ngx_http_geoip_module-debug.so /usr/lib/nginx/modules/ngx_http_geoip_module-debug.so \\\n  && install -m755 objs/ngx_http_perl_module-debug.so /usr/lib/nginx/modules/ngx_http_perl_module-debug.so \\\n  && ln -s ../../usr/lib/nginx/modules /etc/nginx/modules \\\n  && strip /usr/sbin/nginx* \\\n  && strip /usr/lib/nginx/modules/*.so \\\n  && rm -rf /usr/src/nginx-$NGINX_VERSION \\\n  \\\n  # Bring in gettext so we can get `envsubst`, then throw\n  # the rest away. To do this, we need to install `gettext`\n  # then move `envsubst` out of the way so `gettext` can\n  # be deleted completely, then move `envsubst` back.\n  && apk add --no-cache --virtual .gettext gettext \\\n  && mv /usr/bin/envsubst /tmp/ \\\n  \\\n  && runDeps=\"$( \\\n    scanelf --needed --nobanner /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst \\\n      | awk '{ gsub(/,/, \"\\nso:\", $2); print \"so:\" $2 }' \\\n      | sort -u \\\n      | xargs -r apk info --installed \\\n      | sort -u \\\n  )\" \\\n  && apk add --no-cache --virtual .nginx-rundeps $runDeps \\\n  && apk del .build-deps \\\n  && apk del .gettext \\\n  && mv /tmp/envsubst /usr/local/bin/ \\\n  \\\n  # forward request and error logs to docker log collector\n  && ln -sf /dev/stdout /var/log/nginx/access.log \\\n  && ln -sf /dev/stderr /var/log/nginx/error.log\n\n#安装\nRUN pip install supervisor==${SUPERVISOR_VERSION}\n\n#导入相关配置\nCOPY docker/nginx.conf /etc/nginx/nginx.conf\nCOPY docker/supervisord.conf /etc/supervisord.conf\n#copy项目代码\nCOPY . /home/xtg/blog-xtg\n\nWORKDIR /home/xtg/blog-xtg\n#安装项目依赖\nRUN apk add --update --no-cache mariadb-client-libs \\\n\t&& apk add --no-cahe --virtual .build-deps \\\n\t\tmariadb-dev \\\n\t\tgcc \\\n\t\tmusl-dev \\\n\t&& pip install -r requirements.txt \\\n\t&& apk del .build-deps\n\nEXPOSE 80\nVOLUME /home/xtg/blog-xtg/logs\n\nCOPY docker/entrypoint.sh /usr/local/bin/\nRUN chmod +x /usr/local/bin/entrypoint.sh\nENTRYPOINT [\"entrypoint.sh\"]\nCMD [\"upgradedb\"]"
  },
  {
    "path": "docker/entrypoint.sh",
    "content": "#!/bin/sh\nset -e\n\nif [ \"$1\" == \"upgradedb\" ]\nthen\n    python main.py upgradedb\nfi\nexec supervisord -n\n"
  },
  {
    "path": "docker/nginx.conf",
    "content": "#user  xtg;\nworker_processes  2;\n\nerror_log  /var/log/nginx/error.log warn;\npid        /var/run/nginx.pid;\n\n\nevents {\n    use epoll;  \n    worker_connections  1024;\n}\n\n\nhttp {\n    include       /etc/nginx/mime.types;\n    default_type  application/octet-stream;\n\n    log_format  main  '$remote_addr - $remote_user [$time_local] \"$request\" '\n                      '$status $body_bytes_sent \"$http_referer\" '\n                      '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\n    access_log  /var/log/nginx/access.log  main;\n\n    sendfile        on;\n    #tcp_nopush     on;\n\n    keepalive_timeout  65;\n\n    #gzip  on;\n\n    upstream backend {\n        server 127.0.0.1:8001;\n        server 127.0.0.1:8002;\n    }\n\n    server {\n        listen       80;\n\n        location /static/ {\n            root      /home/xtg/blog-xtg;\n            expires    1d;\n        }\n\n        location / {\n            proxy_pass http://backend;    \n            proxy_redirect off;    \n            proxy_set_header Host $host;    \n            proxy_set_header X-Real-IP $remote_addr;    \n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    \n            client_max_body_size 10m;    \n            client_body_buffer_size 128k;    \n            proxy_connect_timeout 90;    \n            proxy_send_timeout 90;    \n            proxy_read_timeout 90;    \n            proxy_buffer_size 64k;    \n            proxy_buffers 32 32k;    \n            proxy_busy_buffers_size 128k;    \n            proxy_temp_file_write_size 128k;   \n        }\n    }\n\n\n}\n"
  },
  {
    "path": "docker/supervisord.conf",
    "content": "; Sample supervisor config file.\n;\n; For more information on the config file, please see:\n; http://supervisord.org/configuration.html\n;\n; Note: shell expansion (\"~\" or \"$HOME\") is not supported.  Environment\n; variables can be expanded using this syntax: \"%(ENV_HOME)s\".\n\n[unix_http_server]\nfile=/tmp/supervisor.sock   ; (the path to the socket file)\n;chmod=0700                 ; socket file mode (default 0700)\n;chown=nobody:nogroup       ; socket file uid:gid owner\n;username=user              ; (default is no username (open server))\n;password=123               ; (default is no password (open server))\n\n;[inet_http_server]         ; inet (TCP) server disabled by default\n;port=cma01:9001            ; (ip_address:port specifier, *:port for all iface)\n;username=user              ; (default is no username (open server))\n;password=123               ; (default is no password (open server))\n\n[supervisord]\nlogfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)\nlogfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)\nlogfile_backups=10           ; (num of main logfile rotation backups;default 10)\nloglevel=info                ; (log level;default info; others: debug,warn,trace)\npidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)\nnodaemon=false               ; (start in foreground if true;default false)\nminfds=1024                  ; (min. avail startup file descriptors;default 1024)\nminprocs=200                 ; (min. avail process descriptors;default 200)\n;umask=022                   ; (process file creation umask;default 022)\n;user=chrism                 ; (default is current user, required if root)\n;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')\n;directory=/tmp              ; (default is not to cd during start)\n;nocleanup=true              ; (don't clean up tempfiles at start;default false)\n;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)\n;environment=KEY=\"value\"     ; (key value pairs to add to environment)\n;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)\n\n; the below section must remain in the config file for RPC\n; (supervisorctl/web interface) to work, additional interfaces may be\n; added by defining them in separate rpcinterface: sections\n[rpcinterface:supervisor]\nsupervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface\n\n[supervisorctl]\nserverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket\n;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket\n;username=chris              ; should be same as http_username if set\n;password=123                ; should be same as http_password if set\n;prompt=mysupervisor         ; cmd line prompt (default \"supervisor\")\n;history_file=~/.sc_history  ; use readline history if available\n\n; The below sample program section shows all possible program subsection values,\n; create one or more 'real' program: sections to be able to control them under\n; supervisor.\n\n;[program:theprogramname]\n;command=/bin/cat              ; the program (relative uses PATH, can take args)\n;process_name=%(program_name)s ; process_name expr (default %(program_name)s)\n;numprocs=1                    ; number of processes copies to start (def 1)\n;directory=/tmp                ; directory to cwd to before exec (def no cwd)\n;umask=022                     ; umask for process (default None)\n;priority=999                  ; the relative start priority (default 999)\n;autostart=true                ; start at supervisord start (default: true)\n;autorestart=unexpected        ; whether/when to restart (default: unexpected)\n;startsecs=1                   ; number of secs prog must stay running (def. 1)\n;startretries=3                ; max ; of serial start failures (default 3)\n;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)\n;stopsignal=QUIT               ; signal used to kill process (default TERM)\n;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)\n;stopasgroup=false             ; send stop signal to the UNIX process group (default false)\n;killasgroup=false             ; SIGKILL the UNIX process group (def false)\n;user=chrism                   ; setuid to this UNIX account to run the program\n;redirect_stderr=true          ; redirect proc stderr to stdout (default false)\n;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO\n;stdout_logfile_maxbytes=1MB   ; max ; logfile bytes b4 rotation (default 50MB)\n;stdout_logfile_backups=10     ; ; of stdout logfile backups (default 10)\n;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)\n;stdout_events_enabled=false   ; emit events on stdout writes (default false)\n;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO\n;stderr_logfile_maxbytes=1MB   ; max ; logfile bytes b4 rotation (default 50MB)\n;stderr_logfile_backups=10     ; ; of stderr logfile backups (default 10)\n;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)\n;stderr_events_enabled=false   ; emit events on stderr writes (default false)\n;environment=A=\"1\",B=\"2\"       ; process environment additions (def no adds)\n;serverurl=AUTO                ; override serverurl computation (childutils)\n\n[program:blog-master]\ncommand=python /home/xtg/blog-xtg/main.py --master=true --port=8001\nprocess_name=%(program_name)s\nnumprocs=1\nuser=root\nautostart=true\nautorestart=true\nstartsecs=5\nstartretries=3\npriority=10\nredirect_stderr=true\nstdout_logfile=/home/xtg/blog-master.log\nstdout_logfile_maxbytes=20MB\nstdout_logfile_backups=10\nstopasgroup=false\n\n\n[program:blog-slave]\ncommand=python /home/xtg/blog-xtg/main.py --master=false --port=8002\nprocess_name=%(program_name)s\nnumprocs=1\nuser=root\nautostart=true\nautorestart=true\nstartsecs=5\nstartretries=3\npriority=20\nredirect_stderr=true\nstdout_logfile=/home/xtg/blog-slave.log\nstdout_logfile_maxbytes=20MB\nstdout_logfile_backups=10\nstopasgroup=false\n\n[program:nginx]\ncommand=nginx -g 'daemon off;'\nprocess_name=%(program_name)s\nnumprocs=1\nuser=root\nautostart=true\nautorestart=true\nstartsecs=1\nstartretries=3\npriority=50\nredirect_stderr=true\nstdout_logfile=/home/xtg/nginx.log\nstdout_logfile_maxbytes=20MB\nstdout_logfile_backups=10\nstopasgroup=false\n\n; The below sample eventlistener section shows all possible\n; eventlistener subsection values, create one or more 'real'\n; eventlistener: sections to be able to handle event notifications\n; sent by supervisor.\n\n;[eventlistener:theeventlistenername]\n;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)\n;process_name=%(program_name)s ; process_name expr (default %(program_name)s)\n;numprocs=1                    ; number of processes copies to start (def 1)\n;events=EVENT                  ; event notif. types to subscribe to (req'd)\n;buffer_size=10                ; event buffer queue size (default 10)\n;directory=/tmp                ; directory to cwd to before exec (def no cwd)\n;umask=022                     ; umask for process (default None)\n;priority=-1                   ; the relative start priority (default -1)\n;autostart=true                ; start at supervisord start (default: true)\n;autorestart=unexpected        ; whether/when to restart (default: unexpected)\n;startsecs=1                   ; number of secs prog must stay running (def. 1)\n;startretries=3                ; max ; of serial start failures (default 3)\n;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)\n;stopsignal=QUIT               ; signal used to kill process (default TERM)\n;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)\n;stopasgroup=false             ; send stop signal to the UNIX process group (default false)\n;killasgroup=false             ; SIGKILL the UNIX process group (def false)\n;user=chrism                   ; setuid to this UNIX account to run the program\n;redirect_stderr=true          ; redirect proc stderr to stdout (default false)\n;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO\n;stdout_logfile_maxbytes=1MB   ; max ; logfile bytes b4 rotation (default 50MB)\n;stdout_logfile_backups=10     ; ; of stdout logfile backups (default 10)\n;stdout_events_enabled=false   ; emit events on stdout writes (default false)\n;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO\n;stderr_logfile_maxbytes=1MB   ; max ; logfile bytes b4 rotation (default 50MB)\n;stderr_logfile_backups        ; ; of stderr logfile backups (default 10)\n;stderr_events_enabled=false   ; emit events on stderr writes (default false)\n;environment=A=\"1\",B=\"2\"       ; process environment additions\n;serverurl=AUTO                ; override serverurl computation (childutils)\n\n; The below sample group section shows all possible group values,\n; create one or more 'real' group: sections to create \"heterogeneous\"\n; process groups.\n\n;[group:thegroupname]\n;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions\n;priority=999                  ; the relative start priority (default 999)\n\n; The [include] section can just contain the \"files\" setting.  This\n; setting can list multiple files (separated by whitespace or\n; newlines).  It can also contain wildcards.  The filenames are\n; interpreted as relative to this file.  Included files *cannot*\n; include files themselves.\n\n;[include]\n;files = relative/directory/*.ini\n"
  },
  {
    "path": "extends/__init__.py",
    "content": "# coding=utf-8\n"
  },
  {
    "path": "extends/cache_tornadis.py",
    "content": "# coding: utf-8\nimport logging\n\nimport tornadis\nimport tornado.gen\n\nlogger = logging.getLogger(__name__)\n\n\nclass CacheManager(object):\n    def __init__(self, options):\n        self.connection_pool = None\n        self.options = options\n        self.client = None\n\n    def get_connection_pool(self):\n        if not self.connection_pool:\n            self.connection_pool = tornadis.ClientPool(host=self.options['host'],port=self.options['port'],\n                                                       password=self.options['password'], db=self.options['db_no'],\n                                                       max_size=self.options['max_connections'])\n        return self.connection_pool\n\n    @tornado.gen.coroutine\n    def get_redis_client(self):\n        connection_pool = self.get_connection_pool()\n        with (yield connection_pool.connected_client()) as client:\n            if isinstance(client, tornadis.TornadisException):\n                logger.error(client.message)\n            else:\n                raise tornado.gen.Return(client)\n\n    @tornado.gen.coroutine\n    def fetch_client(self):\n        self.client = yield self.get_redis_client()\n\n    @tornado.gen.coroutine\n    def call(self, *args, **kwargs):\n        yield self.fetch_client()\n        if self.client:\n            reply = yield self.client.call(*args, **kwargs)\n            if isinstance(reply, tornadis.TornadisException):\n                logger.error(reply.message)\n            else:\n                raise tornado.gen.Return(reply)\n\n    @tornado.gen.coroutine\n    def call(self, *args, **kwargs):\n        yield self.fetch_client()\n        if self.client:\n            reply = yield self.client.call(*args, **kwargs)\n            if isinstance(reply, tornadis.TornadisException):\n                logger.error(reply.message)\n            else:\n                raise tornado.gen.Return(reply)\n\n    @tornado.gen.coroutine\n    def call_watch_transaction(self, watch_key, *args, **kwargs):\n        yield self.fetch_client()\n        if self.client:\n            while True:\n                yield self.client.call(\"WATCH\", watch_key)\n                yield self.client.call(\"MULTI\")\n                yield self.client.call(*args, **kwargs)\n                result = yield self.client.call(\"EXEC\")\n                if isinstance(result, tornadis.TornadisException):\n                    logger.error(result.message)\n                else:\n                    raise tornado.gen.Return(result)\n\n"
  },
  {
    "path": "extends/pub_sub_tornadis.py",
    "content": "# coding=utf-8\nimport tornado.ioloop\nimport tornado.gen\nimport tornadis\nimport logging\n\nlogger = logging.getLogger(__name__)\n\n\nclass PubSubTornadis(object):\n\n    def __init__(self, redis_pub_sub_config, loop=None):\n        self.redis_pub_sub_config = redis_pub_sub_config\n        if not loop:\n            loop = tornado.ioloop.IOLoop.current()\n        self.loop = loop\n        self.autoconnect = self.redis_pub_sub_config['autoconnect']\n        self.client = self.get_client()\n        self.pub_client = None\n        self.connect_times = 0\n        self.max_connect_wait_time = 10\n\n    def get_client(self):\n        client = tornadis.PubSubClient(host=self.redis_pub_sub_config['host'], port=self.redis_pub_sub_config['port'],\n                                       password=self.redis_pub_sub_config['password'],\n                                       autoconnect=self.autoconnect)\n        return client\n\n    def get_pub_client(self):\n        if not self.pub_client:\n            self.pub_client = tornadis.Client(host=self.redis_pub_sub_config['host'],\n                                              port=self.redis_pub_sub_config['port'],\n                                              password=self.redis_pub_sub_config['password'],\n                                              autoconnect=self.autoconnect)\n        return self.pub_client\n\n    @tornado.gen.coroutine\n    def pub_call(self, msg, *channels):\n        pub_client = self.get_pub_client()\n        if not pub_client.is_connected():\n            yield pub_client.connect()\n        if not channels:\n            channels = self.redis_pub_sub_config['channels']\n        for channel in channels:\n            yield pub_client.call(\"PUBLISH\", channel, msg)\n\n    def long_listen(self):\n        self.loop.add_callback(self.connect_and_listen, self.redis_pub_sub_config['channels'])\n\n    @tornado.gen.coroutine\n    def connect_and_listen(self, channels):\n        connected = yield self.client.connect()\n        if connected:\n            subscribed = yield self.client.pubsub_subscribe(*channels)\n            if subscribed:\n                self.connect_times = 0\n                yield self.first_do_after_subscribed()\n                while True:\n                    msgs = yield self.client.pubsub_pop_message()\n                    try:\n                        yield self.do_msg(msgs)\n                        if isinstance(msgs, tornadis.TornadisException):\n                            # closed connection by the server\n                            break\n                    except Exception, e:\n                        logger.exception(e)\n            self.client.disconnect()\n        if self.autoconnect:\n            wait_time = self.connect_times \\\n                if self.connect_times < self.max_connect_wait_time else self.max_connect_wait_time\n            logger.warn(\"等待{}s，重新连接redis消息订阅服务\".format(wait_time))\n            yield tornado.gen.sleep(wait_time)\n            self.long_listen()\n            self.connect_times += 1\n\n    # override\n    @tornado.gen.coroutine\n    def first_do_after_subscribed(self):\n        logger.info(\"订阅成功\")\n\n    # override\n    @tornado.gen.coroutine\n    def do_msg(self, msgs):\n        logger.info(\"收到订阅消息\"+ str(msgs))\n"
  },
  {
    "path": "extends/session_redis.py",
    "content": "# coding: utf-8\nimport uuid\nimport json\nimport redis\n\n\n# 同步的redis客户端实现，不适用tornado，暂时弃用.\nclass Session(dict):\n    def __init__(self, request_handler):\n        super(Session, self).__init__()\n        self.session_id = None\n        self.session_manager = request_handler.application.session_manager\n        self.request_handler = request_handler\n        self.client = self.session_manager.get_redis_client()\n        self.fetch_client()\n\n    def get_session_id(self):\n        if not self.session_id:\n            self.session_id = self.request_handler.get_secure_cookie(self.session_manager.session_key_name)\n        return self.session_id\n\n    def generate_session_id(self):\n        if not self.get_session_id():\n            self.session_id = str(uuid.uuid1())\n        return self.session_id\n\n    def fetch_client(self):\n        if self.get_session_id():\n            data = self.client.get(self.session_id)\n            if data:\n                self.update(json.loads(data))\n\n    def save(self):\n        session_id = self.generate_session_id()\n        data_json = json.dumps(self)\n        self.client.set(session_id, data_json)\n        self.request_handler.set_secure_cookie(self.session_manager.session_key_name, session_id,\n                                               expires_days=self.session_manager.session_expires_days)\n\n\nclass SessionManager(object):\n    def __init__(self, options):\n        self.connection_pool = None\n        self.options = options\n        self.session_key_name = options['session_key_name']\n        self.session_expires_days = options['session_expires_days']\n\n    def get_connection_pool(self):\n        if not self.connection_pool:\n            self.connection_pool = redis.ConnectionPool(host=self.options['host'],port=self.options['port'],\n                                                        db=self.options['db_no'],password=self.options['password'],\n                                                        max_connections=self.options['max_connections'])\n        return self.connection_pool\n\n    def get_redis_client(self):\n        connection_pool = self.get_connection_pool()\n        return redis.Redis(connection_pool=connection_pool)"
  },
  {
    "path": "extends/session_tornadis.py",
    "content": "# coding: utf-8\nimport uuid\nimport json\nimport tornadis\nimport tornado.gen\nimport logging\n\nlogger = logging.getLogger(__name__)\n\n\nclass Session(dict):\n    def __init__(self, request_handler):\n        super(Session, self).__init__()\n        self.session_id = None\n        self.session_manager = request_handler.application.session_manager\n        self.request_handler = request_handler\n        self.client = None\n\n    @tornado.gen.coroutine\n    def init_fetch(self):\n        self.client = yield self.session_manager.get_redis_client()\n        yield self.fetch_client()\n\n    def get_session_id(self):\n        if not self.session_id:\n            self.session_id = self.request_handler.get_secure_cookie(self.session_manager.session_key_name)\n        return self.session_id\n\n    def generate_session_id(self):\n        if not self.get_session_id():\n            self.session_id = str(uuid.uuid1())\n            self.request_handler.set_secure_cookie(self.session_manager.session_key_name, self.session_id,\n                                                   expires_days=self.session_manager.session_expires_days)\n        return self.session_id\n\n    @tornado.gen.coroutine\n    def fetch_client(self):\n        if self.get_session_id():\n            data = yield self.call_client(\"GET\", self.session_id)\n            if data:\n                self.update(json.loads(data))\n\n    @tornado.gen.coroutine\n    def save(self, expire_time=None):\n        session_id = self.generate_session_id()\n        data_json = json.dumps(self)\n        yield self.call_client(\"SET\", session_id, data_json)\n        if expire_time:\n            yield self.call_client(\"EXPIRE\", session_id, expire_time)\n\n    @tornado.gen.coroutine\n    def call_client(self, *args, **kwargs):\n        if self.client:\n            reply = yield self.client.call(*args, **kwargs)\n            if isinstance(reply, tornadis.TornadisException):\n                logger.error(reply.message)\n            else:\n                raise tornado.gen.Return(reply)\n\n\nclass SessionManager(object):\n    def __init__(self, options):\n        self.connection_pool = None\n        self.options = options\n        self.session_key_name = options['session_key_name']\n        self.session_expires_days = options['session_expires_days']\n\n    def get_connection_pool(self):\n        if not self.connection_pool:\n            self.connection_pool = tornadis.ClientPool(host=self.options['host'],port=self.options['port'],\n                                                       password=self.options['password'], db=self.options['db_no'],\n                                                       max_size=self.options['max_connections'])\n        return self.connection_pool\n\n    @tornado.gen.coroutine\n    def get_redis_client(self):\n        connection_pool = self.get_connection_pool()\n        with (yield connection_pool.connected_client()) as client:\n            if isinstance(client, tornadis.TornadisException):\n                logger.error(client.message)\n            else:\n                raise tornado.gen.Return(client)\n"
  },
  {
    "path": "extends/time_task.py",
    "content": "# coding=utf-8\nimport logging\nfrom apscheduler.schedulers.tornado import TornadoScheduler\n\nlogger = logging.getLogger(__name__)\n\n\nclass TimeTask(object):\n    def __init__(self, sqlalchemy_engine):\n        self.scheduler = TornadoScheduler()\n        self.scheduler.add_jobstore(\"sqlalchemy\", engine=sqlalchemy_engine)\n\n    def add_cache_flush_task(self, func, *args, **kwargs):\n        self.scheduler.add_job(func, 'cron', args=args, kwargs=kwargs,\n                               id=\"cache_flush\", replace_existing=True, hour=0, day='*')\n        return self\n\n    def start_tasks(self):\n        self.scheduler.start()\n"
  },
  {
    "path": "extends/utils.py",
    "content": "# coding=utf-8\nimport json\nimport logging\nfrom sqlalchemy.ext.declarative import DeclarativeMeta\n\nlogger = logging.getLogger(__name__)\n\n\ndef singleton(cls, *args, **kw):\n    instances = {}\n\n    def _singleton():\n        if cls not in instances:\n            instances[cls] = cls(*args, **kw)\n        return instances[cls]\n    return _singleton\n\n\nclass AlchemyEncoder(json.JSONEncoder):\n\n    def __init__(self, dumps_objs=None, *w, **kw):\n        super(AlchemyEncoder, self).__init__(*w, **kw)\n        if dumps_objs is None:\n            dumps_objs = []\n        self.dumps_objs = dumps_objs\n\n    def default(self, o):\n        if isinstance(o.__class__, DeclarativeMeta):\n            self.dumps_objs.append(o)\n            data = {}\n            fields = o.__json__() if hasattr(o, '__json__') else dir(o)\n            fields = [f for f in fields if not f.startswith('_') and f not in ['metadata', 'query', 'query_class']]\n            for field in fields:\n                value = o.__getattribute__(field)\n                if value and self.dumps_objs and value in self.dumps_objs:\n                    continue\n                try:\n                    json.dumps(value, cls=AlchemyEncoder, dumps_objs=self.dumps_objs)\n                    data[field] = value\n                except TypeError:\n                    pass\n            return data\n        return json.JSONEncoder.default(self, o)\n\n\n#  可通过 .attr 访问的dict\nclass Dict(dict):\n    def __getattr__(self, key):\n        try:\n            if isinstance(self[key], dict):\n                return Dict(self[key])\n            return self[key]\n        except KeyError:\n            logger.warning(key+\" not in \"+str(self))\n            return None;\n\n    def __setattr__(self, key, value):\n        self[key] = value\n"
  },
  {
    "path": "log_config.py",
    "content": "# coding=utf-8\nimport logging\nimport logging.handlers\nimport tornado.log\n\nFILE = dict(\n    log_path=\"logs/log\", # 末尾自动添加 @端口号.txt_日期\n    when=\"D\", # 以什么单位分割文件\n    interval=1, # 以上面的时间单位，隔几个单位分割文件\n    backupCount=30, # 保留多少历史记录文件\n    fmt=\"%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s\",\n)\n\n\ndef init(port, console_handler=False, file_handler=True, log_path=FILE['log_path'], base_level=\"INFO\"):\n    logger = logging.getLogger()\n    logger.setLevel(base_level)\n    # 配置控制台输出\n    if console_handler:\n        channel_console = logging.StreamHandler()\n        channel_console.setFormatter(tornado.log.LogFormatter())\n        logger.addHandler(channel_console)\n    # 配置文件输出\n    if file_handler:\n        if not log_path:\n            log_path = FILE['log_path']\n        log_path = log_path+\"@\"+str(port)+\".txt\"\n        formatter = logging.Formatter(FILE['fmt']);\n        channel_file = logging.handlers.TimedRotatingFileHandler(\n            filename=log_path,\n            when=FILE['when'],\n            interval=FILE['interval'],\n            backupCount=FILE['backupCount'])\n        channel_file.setFormatter(formatter)\n        logger.addHandler(channel_file)"
  },
  {
    "path": "main.py",
    "content": "# coding=utf-8\nimport os, sys\n\nimport concurrent.futures\nimport tornado.ioloop\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.orm import sessionmaker\nfrom tornado.options import options\n\nimport log_config\nfrom config import config, redis_pub_sub_config, site_cache_config, redis_session_config\nfrom controller.base import BaseHandler\nfrom extends.cache_tornadis import CacheManager\nfrom extends.session_tornadis import SessionManager\nfrom service.init_service import flush_all_cache\nfrom service.pubsub_service import PubSubService\nfrom url_mapping import handlers\n\n# tornado server相关参数\nsettings = dict(\n    template_path=os.path.join(os.path.dirname(__file__), \"template\"),\n    static_path=os.path.join(os.path.dirname(__file__), \"static\"),\n    compress_response=config['compress_response'],\n    xsrf_cookies=config['xsrf_cookies'],\n    cookie_secret=config['cookie_secret'],\n    login_url=config['login_url'],\n    debug=config['debug'],\n    default_handler_class=BaseHandler,\n)\n\n\n# sqlalchemy连接池配置以及生成链接池工厂实例\ndef db_poll_init():\n    engine_config = config['database']['engine_url']\n    engine = create_engine(engine_config, **config['database'][\"engine_setting\"])\n    config['database']['engine'] = engine\n    db_poll = sessionmaker(bind=engine)\n    return db_poll\n\n\ndef cache_manager_init():\n    cache_manager = CacheManager(site_cache_config)\n    return cache_manager\n\n\n# 继承tornado.web.Application类，可以在构造函数里做站点初始化（初始数据库连接池，初始站点配置，初始异步线程池，加载站点缓存等）\nclass Application(tornado.web.Application):\n    def __init__(self):\n        super(Application, self).__init__(handlers, **settings)\n        self.session_manager = SessionManager(config['redis_session'])\n        self.thread_executor = concurrent.futures.ThreadPoolExecutor(config['max_threads_num'])\n        self.db_pool = db_poll_init()\n        self.cache_manager = cache_manager_init()\n        self.pubsub_manager = None\n\n\n#  从命令行读取配置，如果这些参数不传，默认使用config.py的配置项\ndef parse_command_line():\n    options.define(\"port\", help=\"run server on a specific port\", type=int)\n    options.define(\"log_console\", help=\"print log to console\", type=bool)\n    options.define(\"log_file\", help=\"print log to file\", type=bool)\n    options.define(\"log_file_path\", help=\"path of log_file\", type=str)\n    options.define(\"log_level\", help=\"level of logging\", type=str)\n    # 集群中最好有且仅有一个实例为master，一般用于执行全局的定时任务\n    options.define(\"master\", help=\"is master node? (true:master / false:slave)\", type=bool)\n    # sqlalchemy engine_url, 例如pgsql 'postgresql+psycopg2://mhq:1qaz2wsx@localhost:5432/blog'\n    options.define(\"engine_url\", help=\"engine_url for sqlalchemy\", type=str)\n    # redis相关配置, 覆盖所有用到redis位置的配置\n    options.define(\"redis_host\", help=\"redis host e.g 127.0.0.1\", type=str)\n    options.define(\"redis_port\", help=\"redis port e.g 6379\", type=int)\n    options.define(\"redis_password\", help=\"redis password set this option if has pwd \", type=str)\n    options.define(\"redis_db\", help=\"redis db e.g 0\", type=int)\n\n    # 读取 项目启动时，命令行上添加的参数项\n    options.logging = None  # 不用tornado自带的logging配置\n    options.parse_command_line()\n    # 覆盖默认的config配置\n    if options.port is not None:\n        config['port'] = options.port\n    if options.log_console is not None:\n        config['log_console'] = options.log_console\n    if options.log_file is not None:\n        config['log_file'] = options.log_file\n    if options.log_file_path is not None:\n        config['log_file_path'] = options.log_file_path\n    if options.log_level is not None:\n        config['log_level'] = options.log_level\n    if options.master is not None:\n        config['master'] = options.master\n    if options.engine_url is not None:\n        config['database']['engine_url'] = options.engine_url\n    if options.redis_host is not None:\n        redis_session_config['host'] = options.redis_host\n        site_cache_config['host'] = options.redis_host\n        redis_pub_sub_config['host'] = options.redis_host\n    if options.redis_port is not None:\n        redis_session_config['port'] = options.redis_port\n        site_cache_config['port'] = options.redis_port\n        redis_pub_sub_config['port'] = options.redis_port\n    if options.redis_password is not None:\n        redis_session_config['password'] = options.redis_password\n        site_cache_config['password'] = options.redis_password\n        redis_pub_sub_config['password'] = options.redis_password\n    if options.redis_db is not None:\n        redis_session_config['db_no'] = options.redis_db\n        site_cache_config['db_no'] = options.redis_db\n\n\nif __name__ == '__main__':\n    if len(sys.argv) >= 2:\n        if sys.argv[1] == 'upgradedb':\n            # 更新数据库结构，初次获取或更新版本后调用一次python main.py upgradedb即可\n            from alembic.config import main\n            main(\"upgrade head\".split(' '), 'alembic')\n            exit(0)\n    # 加载命令行配置\n    parse_command_line()\n    # 加载日志管理\n    log_config.init(config['port'], config['log_console'],\n                    config['log_file'], config['log_file_path'], config['log_level'])\n    # 创建application\n    application = Application()\n    application.listen(config['port'])\n    # 全局注册application\n    config['application'] = application\n    loop = tornado.ioloop.IOLoop.current()\n    # 加载redis消息监听客户端\n    pubsub_manager = PubSubService(redis_pub_sub_config, application, loop)\n    pubsub_manager.long_listen()\n    application.pubsub_manager = pubsub_manager\n    # 为master节点注册定时任务\n    if config['master']:\n        from extends.time_task import TimeTask\n        TimeTask(config['database']['engine']).add_cache_flush_task(flush_all_cache).start_tasks()\n    loop.start()\n"
  },
  {
    "path": "model/__init__.py",
    "content": "# coding=utf-8\n"
  },
  {
    "path": "model/constants.py",
    "content": "# coding=utf-8\n\n\nclass Constants(object):\n    SYSTEM_PLUGIN = \"system_plugin\"\n\n    COMMENT_RANK_ADMIN = \"admin\"\n    COMMENT_RANK_NORMAL = \"normal\"\n    COMMENT_TYPE_COMMENT = \"comment\"\n    COMMENT_TYPE_REPLY = \"reply\"\n\n    FLUSH_ARTICLE_ACTION_ADD = \"add\"\n    FLUSH_ARTICLE_ACTION_UPDATE = \"update\"\n    FLUSH_ARTICLE_ACTION_REMOVE = \"remove\"\n\n    FLUSH_COMMENT_ACTION_ADD = \"add\"\n    FLUSH_COMMENT_ACTION_UPDATE = \"update\"\n    FLUSH_COMMENT_ACTION_REMOVE = \"remove\"\n\n    ARTICLE_TYPE_DEFAULT_ID = 1\n"
  },
  {
    "path": "model/logined_user.py",
    "content": "# coding=utf-8\nfrom extends.utils import Dict\n\n\nclass LoginUser(Dict):\n        # self['id'] = None\n        # self['name'] = None\n        # self['avatar'] = None\n        # self['email'] = None\n\n    def __init__(self, user):\n        super(LoginUser, self).__init__()\n        if isinstance(user, dict):\n            self.update(user)\n\n    # def add_message(self, message):\n    #     if 'messages' not in self:\n    #         self['messages'] = [message]\n    #     else:\n    #         self['messages'].append(message)\n    #\n    # def read_messages(self):\n    #     all_messages = self['messages']\n    #     self['messages'] = None\n    #     return all_messages\n"
  },
  {
    "path": "model/models.py",
    "content": "# coding: utf-8\nfrom datetime import datetime\nfrom model.constants import Constants\nfrom sqlalchemy.orm import contains_eager, deferred\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy import Column, DateTime, Integer, String, Boolean, Text, ForeignKey, BigInteger, DATE\nfrom sqlalchemy.orm import relationship, backref\nDbBase = declarative_base()\n\n\nclass DbInit(object):\n    created_at = Column(DateTime, default=datetime.now)\n\n\nclass User(DbBase,DbInit):\n    __tablename__ = 'users'\n    id = Column(Integer, primary_key=True)\n    email = Column(String(64), unique=True, index=True)\n    username = Column(String(64), unique=True, index=True)\n    password = Column(String(128))\n\n    def verify_password(self, password):\n        return self.password == password\n\n\nclass Menu(DbBase):\n    __tablename__ = 'menus'\n    id = Column(Integer, primary_key=True)\n    name = Column(String(64), unique=True)\n    types = relationship('ArticleType', backref='menu', lazy='dynamic')\n    order = Column(Integer, default=0, nullable=False)\n\n    def fetch_all_types(self, only_show_not_hide=False):\n        query = self.types\n        if only_show_not_hide:\n            query = query.join(ArticleType.setting). \\\n                filter(ArticleTypeSetting.hide.isnot(True)). \\\n                options(contains_eager(ArticleType.setting))\n        self.all_types = query.all()\n\n    def __repr__(self):\n        return '<Menu %r>' % self.name\n\n\nclass ArticleTypeSetting(DbBase):\n    __tablename__ = 'articleTypeSettings'\n    id = Column(Integer, primary_key=True)\n    name = Column(String(64), unique=True)\n    protected = Column(Boolean, default=False)\n    hide = Column(Boolean, default=False)\n    types = relationship('ArticleType', backref='setting', lazy='dynamic')\n\n    @staticmethod\n    def return_setting_hide():\n        return [(2, u'公开'), (1, u'隐藏')]\n\n    def __repr__(self):\n        return '<ArticleTypeSetting %r>' % self.name\n\n\nclass ArticleType(DbBase):\n    __tablename__ = 'articleTypes'\n    id = Column(Integer, primary_key=True)\n    name = Column(String(64), unique=True)\n    introduction = Column(Text, default=None)\n    articles = relationship('Article', backref='articleType', lazy='dynamic')\n    menu_id = Column(Integer, ForeignKey('menus.id'), default=None)\n    setting_id = Column(Integer, ForeignKey('articleTypeSettings.id'))\n\n    @property\n    def is_protected(self):\n        if self.setting:\n            return self.setting.protected\n        else:\n            return False\n\n    @property\n    def is_hide(self):\n        if self.setting:\n            return self.setting.hide\n        else:\n            return False\n\n    def fetch_articles_count(self):\n        self.articles_count = self.articles.count()\n    # if the articleType does not have setting,\n    # its is_hie and is_protected property will be False.\n\n    def __repr__(self):\n        return '<Type %r>' % self.name\n\n\nclass Source(DbBase):\n    __tablename__ = 'sources'\n    id = Column(Integer, primary_key=True)\n    name = Column(String(64), unique=True)\n    articles = relationship('Article', backref='source', lazy='dynamic')\n\n    def fetch_articles_count(self):\n        self.articles_count = self.articles.count()\n\n    def __repr__(self):\n        return '<Source %r>' % self.name\n\n\nclass Comment(DbBase):\n    __tablename__ = 'comments'\n    id = Column(Integer, primary_key=True)\n    content = Column(Text)\n    create_time = Column(DateTime, default=datetime.now)\n    author_name = Column(String(64))\n    author_email = Column(String(64))\n    article_id = Column(Integer, ForeignKey('articles.id'))\n    disabled = Column(Boolean, default=False)\n    comment_type = Column(String(64), default=Constants.COMMENT_TYPE_COMMENT)\n    rank = Column(String(64), name='rk', default=Constants.COMMENT_RANK_NORMAL)\n    floor = Column(Integer, nullable=False)\n    reply_to_id = Column(Integer)\n    reply_to_floor = Column(String(64))\n\n\nclass Article(DbBase):\n    __tablename__ = 'articles'\n    id = Column(Integer, primary_key=True)\n    title = Column(String(64))\n    content = deferred(Column(Text))  # 延迟加载,避免在列表查询时查询该字段\n    summary = deferred(Column(Text))  # 延迟加载,避免在列表查询时查询该字段\n    create_time = Column(DateTime, index=True, default=datetime.now)\n    update_time = deferred(Column(DateTime, index=True, default=datetime.now, onupdate=datetime.now))\n    num_of_view = Column(Integer, default=0)\n    articleType_id = Column(Integer, ForeignKey('articleTypes.id'))\n    source_id = Column(Integer, ForeignKey('sources.id'))\n    comments = relationship('Comment', backref='article', lazy='dynamic')\n\n    def fetch_comments_count(self, count=None):\n        self.comments_count = count if count is not None else self.comments.count()\n\n    def __repr__(self):\n        return '<Article %r>' % self.title\n\n\nclass BlogInfo(DbBase):\n    __tablename__ = 'blog_info'\n    id = Column(Integer, primary_key=True)\n    title = Column(String(64))\n    signature = Column(Text)\n    navbar = Column(String(64))\n\n\nclass Plugin(DbBase):\n    __tablename__ = 'plugins'\n    id = Column(Integer, primary_key=True)\n    title = Column(String(64), unique=True)\n    note = Column(Text, default='')\n    content = Column(Text, default='')\n    order = Column(Integer, index=True, default=0)\n    disabled = Column(Boolean, default=False)\n\n    def __repr__(self):\n        return '<Plugin %r>' % self.title\n\n\nclass BlogView(DbBase):\n    __tablename__ = 'blog_view'\n    date = Column(DATE, primary_key=True)\n    pv = Column(BigInteger, default=0)\n    uv = Column(BigInteger, default=0)\n"
  },
  {
    "path": "model/pager.py",
    "content": "# coding=utf-8\nfrom extends.utils import Dict\n\n\nclass Pager(Dict):\n\n    DEFAULT_PAGE_SIZE = 10\n\n    def __init__(self, request):\n        self.pageNo = int(request.get_argument(\"pageNo\", 1))\n        self.pageSize = int(request.get_argument(\"pageSize\", Pager.DEFAULT_PAGE_SIZE))\n        self.totalPage = 1\n        self.totalCount = 0\n        self.result = []\n\n    def build_query(self, query):\n        limit = self.pageSize\n        if self.pageNo < 0:\n            self.pageNo = self.pageNo + self.totalPage + 1\n        offset = (self.pageNo-1)*self.pageSize if self.pageNo > 0 else 0\n        query = query.limit(limit).offset(offset)\n        return query\n\n    def set_total_count(self, count):\n        self.totalCount = count\n        if count > 0:\n            self.totalPage = (count+self.pageSize-1) / self.pageSize\n\n    def set_result(self, result):\n        if result:\n            self.result = result\n\n    def has_prev(self):\n        return self.pageNo > 1\n\n    def has_next(self):\n        return self.pageNo < self.totalPage\n\n    def build_url(self, url, page_no, params):\n        if '?' in url:\n            parts = url.split('?', 1)\n            url = parts[0]\n            params = parts[1]+\"&\"+params\n        if page_no < 1:\n            page_no = 0\n        if page_no > self.totalPage:\n            page_no = self.totalPage\n        url = \"{0}?pageNo={1}\".format(url, page_no)\n        if self.pageSize != Pager.DEFAULT_PAGE_SIZE:\n            url += \"&pageSize={0}\".format(self.pageSize)\n        if params:\n            if params.startswith(\"#\"):\n                url += params\n            else:\n                url += \"&{0}\".format(params)\n        return url\n"
  },
  {
    "path": "model/search_params/__init__.py",
    "content": "# coding=utf-8\n"
  },
  {
    "path": "model/search_params/article_params.py",
    "content": "# coding=utf-8\nclass ArticleSearchParams(object):\n\n    ORDER_MODE_CREATE_TIME_DESC = 1\n\n    def __init__(self, request):\n        self.order_mode = request.get_argument(\"order_mode\", ArticleSearchParams.ORDER_MODE_CREATE_TIME_DESC)\n        self.source_id = request.get_argument(\"source_id\", None)\n        self.articleType_id = request.get_argument(\"articleType_id\", None)\n        self.show_source = True\n        self.show_article_type = True\n        self.show_summary = False\n        self.show_content = False\n        self.show_comments_count = False\n\n    def to_url_params(self):\n        s = \"\"\n        if self.source_id:\n            s = \"source_id={0}\".format(self.source_id)\n        if self.articleType_id:\n            if s:\n                s += \"&\"\n            s += \"articleType_id={0}\".format(self.articleType_id)\n        return s"
  },
  {
    "path": "model/search_params/article_type_params.py",
    "content": "# coding=utf-8\nclass ArticleTypeSearchParams(object):\n\n    ORDER_MODE_ID_DESC = 1\n\n    def __init__(self, request):\n        self.order_mode = request.get_argument(\"order_mode\", ArticleTypeSearchParams.ORDER_MODE_ID_DESC)\n        self.show_setting = False\n        self.show_articles_count = False\n"
  },
  {
    "path": "model/search_params/comment_params.py",
    "content": "# coding=utf-8\nclass CommentSearchParams(object):\n\n    ORDER_MODE_CREATE_TIME_ASC = 1\n    ORDER_MODE_CREATE_TIME_DESC = 2\n\n    def __init__(self, request):\n        self.order_mode = request.get_argument(\"order_mode\", CommentSearchParams.ORDER_MODE_CREATE_TIME_ASC)\n        self.article_id = request.get_argument(\"article_id\", None)\n        self.show_article_id_title = False\n"
  },
  {
    "path": "model/search_params/menu_params.py",
    "content": "# coding=utf-8\nclass MenuSearchParams(object):\n\n    ORDER_MODE_ORDER_ASC = 1\n\n    def __init__(self, request):\n        self.order_mode = request.get_argument(\"order_mode\", MenuSearchParams.ORDER_MODE_ORDER_ASC)\n"
  },
  {
    "path": "model/search_params/plugin_params.py",
    "content": "# coding=utf-8\n\n\nclass PluginSearchParams(object):\n\n    ORDER_MODE_ORDER_ASC = 1\n\n    def __init__(self, request):\n        self.order_mode = request.get_argument(\"order_mode\", PluginSearchParams.ORDER_MODE_ORDER_ASC)\n"
  },
  {
    "path": "model/site_info.py",
    "content": "# coding=utf-8\n\n\nclass SiteCollection(object):\n    title = None                # string\n    signature = None            # string\n    navbar = None               # string\n    menus = None                # json(list)\n    article_types_not_under_menu = None # 不在menu下的article_types     #json(list)\n    plugins = None              # JSON(list)\n    pv = None                   # int\n    uv = None                   # int\n    article_count = None        # int\n    comment_count = None        # int\n    article_sources = None      # JSON(list)\n"
  },
  {
    "path": "requirements.txt",
    "content": "tornado==4.4.2\nsqlalchemy==1.0.15\ntornadis==0.8.0\nfutures==3.0.5\nalembic==0.9.1\napscheduler==3.3.1\nmysql-connector-python==8.0.23"
  },
  {
    "path": "service/__init__.py",
    "content": "# coding=utf-8\n\n\nclass BaseService(object):\n    @staticmethod\n    def query_pager(query, pager, count=None):\n        if count:\n            pager.set_total_count(count)\n        else:\n            pager.set_total_count(query.count())\n        query_result = pager.build_query(query)\n        pager.set_result(query_result.all())\n        return pager\n"
  },
  {
    "path": "service/article_service.py",
    "content": "# coding=utf-8\nimport logging\nimport re\n\nfrom model.site_info import SiteCollection\nfrom sqlalchemy.orm import joinedload, undefer\nfrom model.models import Article, Source\nfrom model.constants import Constants\nfrom model.search_params.article_params import ArticleSearchParams\nfrom . import BaseService\nfrom comment_service import CommentService\n\nlogger = logging.getLogger(__name__)\n\n\nclass ArticleService(object):\n    MARKDOWN_REG = \"[\\\\\\`\\*\\_\\[\\]\\#\\+\\-\\!\\>\\s]\";\n    SUMMARY_LIMIT = 120;\n\n    @staticmethod\n    def get_article_all(db_session, article_id, show_source_type=False, add_view_count=None):\n        query = db_session.query(Article);\n        if show_source_type:\n            query = query.options(joinedload(Article.source)).\\\n                options(joinedload(Article.articleType).load_only(\"id\", \"name\"))\n        article = query.options(undefer(Article.summary), undefer(Article.content), undefer(Article.update_time)).\\\n            get(article_id)\n        if article and add_view_count:\n            article.num_of_view = Article.num_of_view + add_view_count\n            db_session.commit()\n        return article\n\n    @staticmethod\n    def page_articles(db_session, pager, search_params):\n        query = db_session.query(Article)\n        count = SiteCollection.article_count\n        if search_params:\n            if search_params.show_comments_count:\n                stmt = CommentService.get_comments_count_subquery(db_session)\n                query = db_session.query(Article, stmt.c.comments_count).\\\n                    outerjoin(stmt, Article.id == stmt.c.article_id)\n            if search_params.show_summary:\n                query = query.options(undefer(Article.summary))\n            if search_params.show_content:\n                query = query.options(undefer(Article.content))\n            if search_params.show_source:\n                query = query.options(joinedload(Article.source))\n            if search_params.show_article_type:\n                query = query.options(joinedload(Article.articleType).load_only(\"id\", \"name\"))\n            if search_params.order_mode == ArticleSearchParams.ORDER_MODE_CREATE_TIME_DESC:\n                query = query.order_by(Article.create_time.desc())\n            if search_params.source_id:\n                count = None\n                query = query.filter(Article.source_id == search_params.source_id)\n            if search_params.articleType_id:\n                count = None\n                query = query.filter(Article.articleType_id == search_params.articleType_id)\n        pager = BaseService.query_pager(query, pager, count)\n        if pager.result:\n            if search_params.show_comments_count:\n                result = []\n                for article, comments_count in pager.result:\n                    article.fetch_comments_count(comments_count if comments_count else 0)\n                    result.append(article)\n                pager.result = result\n        return pager\n\n    @staticmethod\n    def add_article(db_session, article):\n        try:\n            summary = article[\"summary\"].strip() if article[\"summary\"] else None\n            if not summary:\n                summary = ArticleService.get_core_content(article[\"content\"], ArticleService.SUMMARY_LIMIT)\n            article_to_add = Article(title=article[\"title\"], content=article[\"content\"],\n                                     summary=summary, articleType_id=article[\"articleType_id\"],\n                                     source_id=article[\"source_id\"])\n            db_session.add(article_to_add)\n            db_session.commit()\n            return article_to_add\n        except Exception, e:\n            logger.exception(e)\n        return None\n\n    @staticmethod\n    def update_article(db_session, article):\n        try:\n            summary = article[\"summary\"].strip() if article[\"summary\"] else None\n            if not summary:\n                summary = ArticleService.get_core_content(article[\"content\"], ArticleService.SUMMARY_LIMIT)\n            article_to_update = ArticleService.get_article_all(db_session, article[\"id\"])\n            article_old = Article(title=article_to_update.title, content=article_to_update.content,\n                                  summary=article_to_update.summary, articleType_id=article_to_update.articleType_id,\n                                  source_id=article_to_update.source_id)\n            article_to_update.title = article[\"title\"]\n            article_to_update.content = article[\"content\"]\n            article_to_update.summary = summary\n            article_to_update.articleType_id = int(article[\"articleType_id\"]) if article[\"articleType_id\"] else None\n            article_to_update.source_id = int(article[\"source_id\"]) if article[\"source_id\"] else None\n            db_session.commit()\n            return article_to_update, article_old\n        except Exception, e:\n            logger.exception(e)\n        return None\n\n    @staticmethod\n    def delete_article(db_session, article_id):\n        try:\n            article = db_session.query(Article).get(article_id)\n            if article:\n                comments_deleted = CommentService.remove_by_article_id(db_session, article_id, False)\n                db_session.delete(article)\n                db_session.commit()\n            return article, comments_deleted;\n        except Exception, e:\n            logger.exception(e)\n        return None\n\n    @staticmethod\n    def get_core_content(content, limit=0):\n        core_content = re.sub(ArticleService.MARKDOWN_REG, '', content)\n        if limit > 0:\n            return core_content[:limit]\n        return core_content\n\n    @staticmethod\n    def get_count(db_session):\n        article_count = db_session.query(Article).count()\n        return article_count\n\n    # article_sources\n    @staticmethod\n    def get_article_sources(db_session):\n        article_sources = db_session.query(Source).all()\n        if article_sources:\n            for source in article_sources:\n                source.fetch_articles_count()\n        return article_sources\n\n    @staticmethod\n    def set_article_type_default_by_article_type_id(db_session, article_type_id, auto_commit=True):\n        try:\n            db_session.query(Article).filter(Article.articleType_id == article_type_id).\\\n                update({Article.articleType_id: Constants.ARTICLE_TYPE_DEFAULT_ID})\n            if auto_commit:\n                db_session.commit()\n        except Exception, e:\n            logger.exception(e)\n"
  },
  {
    "path": "service/article_type_service.py",
    "content": "# coding=utf-8\nimport logging\nfrom sqlalchemy.orm import contains_eager, joinedload\nfrom model.models import ArticleType, ArticleTypeSetting\nfrom model.search_params.article_type_params import ArticleTypeSearchParams\nfrom . import BaseService\nfrom article_service import ArticleService\n\nlogger = logging.getLogger(__name__)\n\n\nclass ArticleTypeService(object):\n    @staticmethod\n    def page_article_types(db_session, pager, search_params):\n        query = db_session.query(ArticleType)\n        if search_params:\n            if search_params.order_mode == ArticleTypeSearchParams.ORDER_MODE_ID_DESC:\n                query = query.order_by(ArticleType.id.desc())\n            if search_params.show_setting:\n                query = query.options(joinedload(ArticleType.setting))\n        pager = BaseService.query_pager(query, pager)\n        if pager.result:\n            if search_params.show_articles_count:\n                for article_type in pager.result:\n                    article_type.fetch_articles_count()\n        return pager\n\n    @staticmethod\n    def list_article_types_not_under_menu(db_session):\n        article_types_not_under_menu = db_session.query(ArticleType).join(ArticleType.setting).\\\n            filter(ArticleType.menu_id.is_(None), ArticleTypeSetting.hide.isnot(True)).\\\n            options(contains_eager(ArticleType.setting)).all()\n        return article_types_not_under_menu\n\n    @staticmethod\n    def add_article_type(db_session, article_type):\n        try:\n            article_type_to_add = ArticleType(name=article_type[\"name\"], introduction=article_type[\"introduction\"],\n                                              menu_id=article_type[\"menu_id\"],\n                                              setting=ArticleTypeSetting(name=article_type[\"name\"],\n                                                                         hide=article_type[\"setting_hide\"],),)\n            db_session.add(article_type_to_add)\n            db_session.commit()\n            return article_type_to_add\n        except Exception, e:\n            logger.exception(e)\n        return None\n\n    @staticmethod\n    def update_article_type(db_session, article_type_id, article_type):\n        try:\n            article_type_to_update=db_session.query(ArticleType).get(article_type_id)\n            if article_type_to_update and not article_type_to_update.is_protected:\n                article_type_to_update.name=article_type['name']\n                article_type_to_update.introduction = article_type['introduction']\n                article_type_to_update.menu_id = article_type['menu_id']\n                if not article_type_to_update.setting:\n                    article_type_to_update.setting = ArticleTypeSetting(name=article_type[\"name\"],\n                                                                        hide=article_type[\"setting_hide\"],)\n                else:\n                    article_type_to_update.setting.hide = article_type['setting_hide']\n                db_session.commit()\n                return True\n        except Exception, e:\n            logger.exception(e)\n        return False\n\n    @staticmethod\n    def delete(db_session, article_type_id):\n        article_type_to_delete = db_session.query(ArticleType).get(article_type_id)\n        if article_type_to_delete and not article_type_to_delete.is_protected:\n            # 未将文章分类移除到未分类\n            ArticleService.set_article_type_default_by_article_type_id(db_session, article_type_id, False)\n            db_session.delete(article_type_to_delete.setting)\n            db_session.delete(article_type_to_delete)\n            db_session.commit()\n            return 1\n        return 0\n\n    @staticmethod\n    def set_article_type_menu_id_none(db_session, menu_id, auto_commit=True):\n        db_session.query(ArticleType).filter(ArticleType.menu_id == menu_id).update({\"menu_id\": None})\n        if auto_commit:\n            db_session.commit()\n\n    @staticmethod\n    def list_simple(db_session):\n        article_types = db_session.query(ArticleType.id, ArticleType.name).all()\n        return article_types\n"
  },
  {
    "path": "service/blog_view_service.py",
    "content": "# coding=utf-8\nimport logging\nimport datetime\nfrom model.models import BlogView\n\nlogger = logging.getLogger(__name__)\n\n\nclass BlogViewService(object):\n    @staticmethod\n    def get_blog_view(db_session, date=None):\n        if not date:\n            date = datetime.date.today()\n        blog_view = db_session.query(BlogView).get(date)\n        return blog_view\n\n    @staticmethod\n    def add_blog_view(db_session, add_pv, add_uv, date=None):\n        if not date:\n            date = datetime.date.today()\n        blog_view = BlogViewService.get_blog_view(db_session, date)\n        if blog_view:\n            blog_view.pv = BlogView.pv + add_pv\n            blog_view.uv = BlogView.uv + add_uv\n        else:\n            blog_view = BlogView(date=date, pv=add_pv, uv=add_uv)\n            db_session.add(blog_view)\n        db_session.commit()\n        return blog_view\n"
  },
  {
    "path": "service/comment_service.py",
    "content": "# coding=utf-8\nimport logging\n\nfrom model.models import Comment\nfrom sqlalchemy.sql import func\nfrom sqlalchemy.orm import joinedload\nfrom model.search_params.comment_params import CommentSearchParams\nfrom . import BaseService\n\nlogger = logging.getLogger(__name__)\n\n\nclass CommentService(object):\n    @staticmethod\n    def get_comment(db_session, comment_id):\n        return db_session.query(Comment).get(comment_id)\n\n    @staticmethod\n    def get_max_floor(db_session, article_id):\n        max_floor = db_session.query(func.max(Comment.floor)).filter(Comment.article_id == article_id).scalar()\n        return max_floor if max_floor else 0;\n\n    @staticmethod\n    def add_comment(db_session, article_id, comment):\n        max_floor = CommentService.get_max_floor(db_session, article_id)\n        floor = max_floor + 1\n        comment_to_add = Comment(content=comment['content'], author_name=comment['author_name'],\n                                 author_email=comment['author_email'], article_id=article_id,\n                                 comment_type=comment['comment_type'], rank=comment['rank'], floor=floor,\n                                 reply_to_id=comment['reply_to_id'], reply_to_floor=comment['reply_to_floor'])\n        db_session.add(comment_to_add)\n        db_session.commit()\n        return comment_to_add\n\n    @staticmethod\n    def update_comment_disabled(db_session, article_id, comment_id, disabled):\n        updated = db_session.query(Comment).filter(Comment.article_id == article_id, Comment.id == comment_id).\\\n            update({Comment.disabled: disabled})\n        db_session.commit()\n        return updated\n\n    @staticmethod\n    def delete_comment(db_session, article_id, comment_id):\n        comment = CommentService.get_comment(db_session, comment_id);\n        if comment and comment.article_id == int(article_id):\n            db_session.delete(comment)\n            db_session.commit()\n            return comment\n        return None\n\n    @staticmethod\n    def page_comments(db_session, pager, params):\n        query = db_session.query(Comment)\n        if params:\n            if params.article_id:\n                query = query.filter(Comment.article_id == params.article_id)\n            if params.show_article_id_title:\n                query = query.options(joinedload(Comment.article).load_only(\"id\", \"title\"))\n            if params.order_mode == CommentSearchParams.ORDER_MODE_CREATE_TIME_ASC:\n                query = query.order_by(Comment.create_time.asc())\n            elif params.order_mode == CommentSearchParams.ORDER_MODE_CREATE_TIME_DESC:\n                query = query.order_by(Comment.create_time.desc())\n        pager = BaseService.query_pager(query, pager)\n        return pager\n\n    @staticmethod\n    def remove_by_article_id(db_session, article_id, commit=True):\n        try:\n            comments = db_session.query(Comment).filter(Comment.article_id == article_id).all()\n            db_session.query(Comment).filter(Comment.article_id == article_id).delete()\n            if commit:\n                db_session.commit()\n            return comments\n        except Exception, e:\n            logger.exception(e)\n        return None\n\n    @staticmethod\n    def get_comment_count(db_session):\n        comment_count = db_session.query(Comment).count()\n        return comment_count\n\n    @staticmethod\n    def get_comments_count_subquery(db_session):\n        stmt = db_session.query(Comment.article_id, func.count('*').label('comments_count')). \\\n            group_by(Comment.article_id).subquery()\n        return stmt"
  },
  {
    "path": "service/custom_service.py",
    "content": "# coding=utf-8\nfrom model.models import BlogInfo\n\n\"\"\"\n博客定制相关服务\n\"\"\"\n\n\nclass BlogInfoService(object):\n\n    @staticmethod\n    def get_blog_info(db_session):\n        blog = db_session.query(BlogInfo).first()\n        return blog\n\n    @staticmethod\n    def update_blog_info(db_session, blog_info):\n        blog_info_old = BlogInfoService.get_blog_info(db_session)\n        if blog_info_old is not None:\n            if \"title\" in blog_info and blog_info['title'] is not None:\n                blog_info_old.title = blog_info['title']\n            if \"signature\" in blog_info and blog_info['signature'] is not None:\n                blog_info_old.signature = blog_info['signature']\n            if \"navbar\" in blog_info and blog_info['navbar'] is not None:\n                blog_info_old.navbar = blog_info['navbar']\n            db_session.commit()\n        return blog_info_old\n"
  },
  {
    "path": "service/init_service.py",
    "content": "# coding=utf-8\nimport json\nimport logging\n\nimport tornado.gen\n\nfrom article_service import ArticleService\nfrom article_type_service import ArticleTypeService\nfrom config import site_cache_keys\nfrom custom_service import BlogInfoService\nfrom extends.utils import AlchemyEncoder, Dict\nfrom menu_service import MenuService\nfrom model.site_info import SiteCollection\nfrom model.constants import Constants\nfrom plugin_service import PluginService\nfrom comment_service import CommentService\nfrom blog_view_service import BlogViewService\nfrom config import config\n\nlogger = logging.getLogger(__name__)\n\n\"\"\"\n初始化相关，包括缓存管理\n\"\"\"\n\n\nclass SiteCacheService(object):\n    \"\"\"SiteCache缓存策略\n    站点缓存，加快访问速度，尤其是首页显示的相关数据,该类字段做二级缓存，本地缓存-redis缓存\n    查询策略:先查本地缓存，未命中查询redis缓存，还未命中查询数据库，并将结果逐级更新\n    更新策略:数据写入数据库后，更新redis缓存，并通过发布对应字段的更新消息通知所有节点更新本地缓存\n    缓存校准:mater节点，设置定时任务，在访问较少的时间段校准redis缓存,并通知所有节点更新\n    \"\"\"\n    PUB_SUB_MSGS = dict(\n        blog_info_updated=\"blog_info_updated\",  # blog_info更新消息\n        plugins_updated=\"plugins_updated\",  # plugins更新消息\n        menus_updated=\"menus_updated\",  # menus更新消息(包括query_article_types_not_under_menu)\n        article_count_updated=\"article_count_updated\",  # article_count更新消息\n        article_sources_updated=\"article_sources_updated\",  # article_sources更新消息\n        source_articles_count_updated=\"source_articles_count_updated\",  # 某source下的source_articles_count更新消息\n        comment_count_updated='comment_count_updated',  # comment_count更新消息\n        blog_view_count_updated='blog_view_count_updated',  # blog_view_count更新消息\n    )\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_all(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        yield SiteCacheService.query_blog_info(cache_manager, thread_do, db, is_pub_all, pubsub_manager)\n        yield SiteCacheService.query_menus(cache_manager, thread_do, db, is_pub_all, pubsub_manager)\n        yield SiteCacheService.query_plugins(cache_manager, thread_do, db, is_pub_all, pubsub_manager)\n        yield SiteCacheService.query_blog_view_count(cache_manager, thread_do, db, is_pub_all, pubsub_manager)\n        yield SiteCacheService.query_article_count(cache_manager, thread_do, db, is_pub_all, pubsub_manager)\n        yield SiteCacheService.query_comment_count(cache_manager, thread_do, db, is_pub_all, pubsub_manager)\n        yield SiteCacheService.query_article_sources(cache_manager, thread_do, db, is_pub_all, pubsub_manager)\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_blog_info(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        title = yield cache_manager.call(\"GET\", site_cache_keys['title'])\n        signature = yield cache_manager.call(\"GET\", site_cache_keys['signature'])\n        navbar = yield cache_manager.call(\"GET\", site_cache_keys['navbar'])\n        if title is None or signature is None or navbar is None:\n            blog_info = yield thread_do(BlogInfoService.get_blog_info, db)\n            yield SiteCacheService.update_blog_info(cache_manager, blog_info, is_pub_all, pubsub_manager)\n        else:\n            SiteCollection.title = title\n            SiteCollection.signature = signature\n            SiteCollection.navbar = navbar\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_menus(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        menus_json = yield cache_manager.call(\"GET\", site_cache_keys['menus'])\n        menus = json.loads(menus_json, object_hook=Dict) if menus_json else None\n        ats_json = yield cache_manager.call(\"GET\", site_cache_keys['article_types_not_under_menu'])\n        ats = json.loads(ats_json, object_hook=Dict) if ats_json else None\n        if menus is None or ats is None:\n            menus = yield thread_do(MenuService.list_menus, db, show_types=True)\n            ats = yield thread_do(ArticleTypeService.list_article_types_not_under_menu, db)\n            yield SiteCacheService.update_menus(cache_manager, menus, ats, is_pub_all, pubsub_manager)\n        else:\n            SiteCollection.menus = menus\n            SiteCollection.article_types_not_under_menu = ats\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_plugins(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        plugins_json = yield cache_manager.call(\"GET\", site_cache_keys['plugins'])\n        plugins = json.loads(plugins_json, object_hook=Dict) if plugins_json else None\n        if plugins is None:\n            plugins = yield thread_do(PluginService.list_plugins, db)\n            yield SiteCacheService.update_plugins(cache_manager, plugins, is_pub_all, pubsub_manager)\n        else:\n            SiteCollection.plugins = plugins\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_article_count(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        article_count = yield cache_manager.call(\"GET\", site_cache_keys['article_count'])\n        if article_count is None:\n            article_count = yield thread_do(ArticleService.get_count, db)\n            if article_count is not None:\n                yield SiteCacheService.update_article_count(cache_manager, article_count, is_pub_all, pubsub_manager)\n        else:\n            SiteCollection.article_count = int(article_count)\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_article_sources(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        article_sources_json = yield cache_manager.call(\"GET\", site_cache_keys['article_sources'])\n        article_sources = json.loads(article_sources_json, object_hook=Dict) if article_sources_json else None\n        if article_sources is None:\n            article_sources = yield thread_do(ArticleService.get_article_sources, db)\n            if article_sources is not None:\n                yield SiteCacheService.update_article_sources(\n                    cache_manager, article_sources, is_pub_all, pubsub_manager)\n        else:\n            SiteCollection.article_sources = article_sources\n            yield SiteCacheService.query_source_articles_count(cache_manager)\n\n    # 仅从cache中查询source下的source_articles_count\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_source_articles_count(cache_manager, source_id=None):\n        flush_all_source_count = False if source_id else True\n        if SiteCollection.article_sources:\n            for source in SiteCollection.article_sources:\n                if not flush_all_source_count and source.id != int(source_id):\n                    continue\n                count = yield cache_manager.call(\"GET\", site_cache_keys['source_articles_count'].format(source.id))\n                source.articles_count = int(count) if count else None\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_comment_count(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        comment_count = yield cache_manager.call(\"GET\", site_cache_keys['comment_count'])\n        if comment_count is None:\n            comment_count = yield thread_do(CommentService.get_comment_count, db)\n            if comment_count is not None:\n                yield SiteCacheService.update_comment_count(cache_manager, comment_count, is_pub_all, pubsub_manager)\n        else:\n            SiteCollection.comment_count = int(comment_count)\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def query_blog_view_count(cache_manager, thread_do, db, is_pub_all=False, pubsub_manager=None):\n        pv = yield cache_manager.call(\"GET\", site_cache_keys['pv'])\n        uv = yield cache_manager.call(\"GET\", site_cache_keys['uv'])\n        if pv is None or uv is None:\n            blog_view = yield thread_do(BlogViewService.get_blog_view, db)\n            pv = blog_view.pv if blog_view else 0\n            uv = blog_view.uv if blog_view else 0\n            yield SiteCacheService.update_blog_view_count(cache_manager, pv, uv, is_pub_all, pubsub_manager)\n        else:\n            SiteCollection.pv = pv\n            SiteCollection.uv = uv\n\n# 下面是缓存更新\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_by_sub_msg(msgs, cache_manager, thread_do, db):\n        if not msgs:\n            pass\n        msg = msgs[0]\n        if msg == SiteCacheService.PUB_SUB_MSGS['blog_info_updated']:\n            yield SiteCacheService.query_blog_info(cache_manager, thread_do, db)\n        elif msg == SiteCacheService.PUB_SUB_MSGS['plugins_updated']:\n            yield SiteCacheService.query_plugins(cache_manager, thread_do, db)\n        elif msg == SiteCacheService.PUB_SUB_MSGS['menus_updated']:\n            yield SiteCacheService.query_menus(cache_manager, thread_do, db)\n        elif msg == SiteCacheService.PUB_SUB_MSGS['article_count_updated']:\n            yield SiteCacheService.query_article_count(cache_manager, thread_do, db)\n        elif msg == SiteCacheService.PUB_SUB_MSGS['article_sources_updated']:\n            yield SiteCacheService.query_article_sources(cache_manager, thread_do, db)\n        elif msg == SiteCacheService.PUB_SUB_MSGS['comment_count_updated']:\n            yield SiteCacheService.query_comment_count(cache_manager, thread_do, db)\n        elif msg == SiteCacheService.PUB_SUB_MSGS['blog_view_count_updated']:\n            yield SiteCacheService.query_blog_view_count(cache_manager, thread_do, db)\n        else:\n            try:\n                ms = json.loads(msg)\n                if ms[0] == SiteCacheService.PUB_SUB_MSGS['source_articles_count_updated']:\n                    yield SiteCacheService.query_source_articles_count(cache_manager, ms[1])\n            except Exception, e:\n                logger.exception(e)\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_blog_info(cache_manager, blog_info, is_pub_all=False, pubsub_manager=None):\n        SiteCollection.title = blog_info.title\n        SiteCollection.signature = blog_info.signature\n        SiteCollection.navbar = blog_info.navbar\n        yield cache_manager.call(\"SET\", site_cache_keys['title'], blog_info.title)\n        yield cache_manager.call(\"SET\", site_cache_keys['signature'], blog_info.signature)\n        yield cache_manager.call(\"SET\", site_cache_keys['navbar'], blog_info.navbar)\n        if is_pub_all:\n            yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['blog_info_updated'])\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_plugins(cache_manager, plugins, is_pub_all=False, pubsub_manager=None):\n        if plugins is not None:\n            SiteCollection.plugins = plugins\n            plugins_json = json.dumps(plugins, cls=AlchemyEncoder)\n            yield cache_manager.call(\"SET\", site_cache_keys['plugins'], plugins_json)\n            if is_pub_all:\n                yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['plugins_updated'])\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_menus(cache_manager, menus, article_types_not_under_menu, is_pub_all=False, pubsub_manager=None):\n        if menus is not None:\n            SiteCollection.menus = menus\n            menus_json = json.dumps(menus, cls=AlchemyEncoder)\n            yield cache_manager.call(\"SET\", site_cache_keys['menus'], menus_json)\n        if article_types_not_under_menu is not None:\n            SiteCollection.article_types_not_under_menu = article_types_not_under_menu\n            ats_json = json.dumps(article_types_not_under_menu, cls=AlchemyEncoder)\n            yield cache_manager.call(\"SET\", site_cache_keys['article_types_not_under_menu'], ats_json)\n        if is_pub_all:\n            yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['menus_updated'])\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_article_count(cache_manager, article_count, is_pub_all=False, pubsub_manager=None):\n        if article_count is not None:\n            SiteCollection.article_count = article_count\n            yield cache_manager.call(\"SET\", site_cache_keys['article_count'], article_count)\n            if is_pub_all:\n                yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['article_count_updated'])\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_comment_count(cache_manager, comment_count, is_pub_all=False, pubsub_manager=None):\n        if comment_count is not None:\n            SiteCollection.comment_count = comment_count\n            yield cache_manager.call(\"SET\", site_cache_keys['comment_count'], comment_count)\n            if is_pub_all:\n                yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['comment_count_updated'])\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_blog_view_count(cache_manager, pv, uv, is_pub_all=False, pubsub_manager=None):\n        if pv is not None and uv is not None:\n            SiteCollection.pv = pv\n            SiteCollection.uv = uv\n            yield cache_manager.call(\"SET\", site_cache_keys['pv'], pv)\n            yield cache_manager.call(\"SET\", site_cache_keys['uv'], uv)\n            if is_pub_all:\n                yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['blog_view_count_updated'])\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_article_sources(cache_manager, article_sources, is_pub_all=False, pubsub_manager=None):\n        if article_sources is not None:\n            SiteCollection.article_sources = article_sources\n            article_sources_json = json.dumps(article_sources, cls=AlchemyEncoder)\n            yield cache_manager.call(\"SET\", site_cache_keys['article_sources'], article_sources_json)\n            #  记录对应source下的article_count\n            for source in SiteCollection.article_sources:\n                yield cache_manager.call(\"SET\", site_cache_keys['source_articles_count'].format(source.id),\n                                         source.articles_count)\n            if is_pub_all:\n                yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['article_sources_updated'])\n\n    # article增删改后的操作article_count以及对应的source_count\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_article_action(cache_manager, action, article, is_pub_all=False, pubsub_manager=None):\n        if action == Constants.FLUSH_ARTICLE_ACTION_ADD:\n            article_count = yield cache_manager.call(\"INCR\", site_cache_keys['article_count'])\n            if article_count:\n                SiteCollection.article_count = article_count\n                if is_pub_all:\n                    yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['article_count_updated'])\n            #  注意: 上面的article_count在并发环境下是可以保证安全的，\n            #  如果用GET SET会比较难实现。具体该并发问题可以参考：http://www.cnblogs.com/iforever/p/5796902.html\n            article_source_id = int(article.source_id)\n            source_article_count = \\\n                yield cache_manager.call(\"INCR\", site_cache_keys['source_articles_count'].format(article_source_id))\n            for article_source in SiteCollection.article_sources:\n                if int(article_source.id) == article_source_id:\n                    article_source.articles_count = source_article_count\n                    break\n            if is_pub_all:\n                yield pubsub_manager.pub_call(json.dumps(\n                        [SiteCacheService.PUB_SUB_MSGS['source_articles_count_updated'], article_source_id]))\n        if action == Constants.FLUSH_ARTICLE_ACTION_REMOVE:\n            article_count = yield cache_manager.call(\"DECR\", site_cache_keys['article_count'])\n            if article_count:\n                SiteCollection.article_count = article_count\n                if is_pub_all:\n                    yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['article_count_updated'])\n                #  注意: 上面的article_count在并发环境下是可以保证安全的，\n                #  如果用GET SET会比较难实现。具体该并发问题可以参考：http://www.cnblogs.com/iforever/p/5796902.html\n                article_source_id = int(article.source_id)\n                source_article_count = \\\n                    yield cache_manager.call(\"DECR\",\n                                             site_cache_keys['source_articles_count'].format(article_source_id))\n                for article_source in SiteCollection.article_sources:\n                    if int(article_source.id) == article_source_id:\n                        article_source.articles_count = source_article_count\n                        break\n                if is_pub_all:\n                    yield pubsub_manager.pub_call(json.dumps(\n                        [SiteCacheService.PUB_SUB_MSGS['source_articles_count_updated'], article_source_id]))\n        if action == Constants.FLUSH_ARTICLE_ACTION_UPDATE:\n            article_new = article[0]\n            article_old = article[1]\n            source_id_old = int(article_old.source_id)\n            source_id_new = int(article_new.source_id)\n            if source_id_old != source_id_new:\n                source_old_article_count = \\\n                    yield cache_manager.call(\"DECR\",site_cache_keys['source_articles_count'].format(source_id_old))\n                source_new_article_count = \\\n                    yield cache_manager.call(\"INCR\",site_cache_keys['source_articles_count'].format(source_id_new))\n                for article_source in SiteCollection.article_sources:\n                    if int(article_source.id) == source_id_old:\n                        article_source.articles_count = source_old_article_count\n                    if int(article_source.id) == source_id_new:\n                        article_source.articles_count = source_new_article_count\n                if is_pub_all:\n                    yield pubsub_manager.pub_call(json.dumps(\n                        [SiteCacheService.PUB_SUB_MSGS['source_articles_count_updated'], source_id_old]))\n                    yield pubsub_manager.pub_call(json.dumps(\n                        [SiteCacheService.PUB_SUB_MSGS['source_articles_count_updated'], source_id_new]))\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def update_comment_action(cache_manager, action, comments, is_pub_all=False, pubsub_manager=None):\n        if comments:\n            comment_count = 1\n            if isinstance(comments, list):\n                comment_count = len(comments)\n            if action == Constants.FLUSH_COMMENT_ACTION_ADD:\n                SiteCollection.comment_count = yield cache_manager.\\\n                    call(\"INCRBY\", site_cache_keys['comment_count'], comment_count)\n                if is_pub_all:\n                    yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['comment_count_updated'])\n            elif action == Constants.FLUSH_COMMENT_ACTION_REMOVE:\n                SiteCollection.comment_count = yield cache_manager.\\\n                    call(\"DECRBY\", site_cache_keys['comment_count'], comment_count)\n                if is_pub_all:\n                    yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['comment_count_updated'])\n\n    @staticmethod\n    @tornado.gen.coroutine\n    def add_pv_uv(cache_manager, add_pv, add_uv, is_pub_all=False, pubsub_manager=None):\n        if add_pv or add_uv:\n            if add_pv:\n                SiteCollection.pv = yield cache_manager.\\\n                    call(\"INCRBY\", site_cache_keys['pv'], add_pv)\n            if add_uv:\n                SiteCollection.uv = yield cache_manager. \\\n                    call(\"INCRBY\", site_cache_keys['uv'], add_uv)\n            if is_pub_all:\n                yield pubsub_manager.pub_call(SiteCacheService.PUB_SUB_MSGS['blog_view_count_updated'])\n\n\n\"\"\"\n刷新所有缓存，从数据库重建缓存并通知其他节点，用于定时任务校准缓存\n\"\"\"\n@tornado.gen.coroutine\ndef flush_all_cache():\n    application = config['application']\n    thread_do = application.thread_executor.submit\n    db = application.db_pool()\n    cache_manager = application.cache_manager\n    pubsub_manager = application.pubsub_manager\n    yield cache_manager.call(\"DEL\", *get_all_site_cache_keys())\n    yield SiteCacheService.query_all(cache_manager, thread_do, db, True, pubsub_manager)\n\n\ndef get_all_site_cache_keys():\n    keys = site_cache_keys.values()\n    keys.remove(site_cache_keys['source_articles_count'])\n    if SiteCollection.article_sources:\n        for source in SiteCollection.article_sources:\n            keys.append(site_cache_keys['source_articles_count'].format(source.id))\n    return keys\n"
  },
  {
    "path": "service/menu_service.py",
    "content": "# coding=utf-8\nimport logging\n\nfrom sqlalchemy import func\n\nfrom article_type_service import ArticleTypeService\nfrom model.models import Menu\nfrom model.search_params.menu_params import MenuSearchParams\nfrom . import BaseService\n\nlogger = logging.getLogger(__name__)\n\n\nclass MenuService(object):\n    @staticmethod\n    def page_menus(db_session, pager, search_params):\n        query = db_session.query(Menu)\n        if search_params:\n            if search_params.order_mode == MenuSearchParams.ORDER_MODE_ORDER_ASC:\n                query = query.order_by(Menu.order.asc())\n        pager = BaseService.query_pager(query, pager)\n        if pager.result:\n            for menu in pager.result:\n                menu.fetch_all_types()\n        return pager\n\n    @staticmethod\n    def add_menu(db_session, menu):\n        try:\n            menu_to_save = Menu(**menu)\n            menu_to_save.order = MenuService.get_max_order(db_session) + 1\n            db_session.add(menu_to_save)\n            db_session.commit()\n            return menu_to_save\n        except Exception, e:\n            logger.exception(e)\n        return None\n\n    @staticmethod\n    def get_max_order(db_session):\n        max_order = db_session.query(func.max(Menu.order)).scalar()\n        if max_order is None:\n            max_order = 0\n        return max_order\n\n    @staticmethod\n    def list_menus(db_session, show_types=False):\n        menus = db_session.query(Menu).order_by(Menu.order.asc()).all()\n        if not menus:\n            menus = []\n        else:\n            if show_types:\n                for menu in menus:\n                    menu.fetch_all_types(only_show_not_hide=True)\n        return menus\n\n    @staticmethod\n    def sort_up(db_session, menu_id):\n        menu = db_session.query(Menu).get(menu_id)\n        if menu:\n            menu_up = db_session.query(Menu). \\\n                filter(Menu.order < menu.order).order_by(Menu.order.desc()).first()\n            if menu_up:\n                order_tmp = menu.order\n                menu.order = menu_up.order\n                menu_up.order = order_tmp\n                db_session.commit()\n                return True\n        return False\n\n    @staticmethod\n    def sort_down(db_session, menu_id):\n        menu = db_session.query(Menu).get(menu_id)\n        if menu:\n            menu_up = db_session.query(Menu). \\\n                filter(Menu.order > menu.order).order_by(Menu.order.asc()).first()\n            if menu_up:\n                order_tmp = menu.order\n                menu.order = menu_up.order\n                menu_up.order = order_tmp\n                db_session.commit()\n                return True\n        return False\n\n    @staticmethod\n    def update(db_session, menu_id, menu_to_update):\n        count = 0\n        if menu_to_update:\n            if \"id\" in menu_to_update:\n                menu_to_update.remove(\"id\")\n            count = db_session.query(Menu).filter(Menu.id == menu_id).update(menu_to_update)\n            if count:\n                db_session.commit()\n        return count\n\n    @staticmethod\n    def delete(db_session, menu_id):\n        ArticleTypeService.set_article_type_menu_id_none(db_session, menu_id, auto_commit=False)\n        count = db_session.query(Menu).filter(Menu.id == menu_id).delete()\n        if count:\n            db_session.commit()\n        return count\n"
  },
  {
    "path": "service/plugin_service.py",
    "content": "# coding=utf-8\nimport logging\nfrom sqlalchemy import func\nfrom model.models import Plugin\nfrom model.search_params.plugin_params import PluginSearchParams\nfrom . import BaseService\n\nlogger = logging.getLogger(__name__)\n\n\nclass PluginService(object):\n\n    @staticmethod\n    def get(db_session, plugin_id):\n        plugin = db_session.query(Plugin).get(plugin_id)\n        return plugin\n\n    @staticmethod\n    def get_editable(db_session, plugin_id):\n        plugin = db_session.query(Plugin).get(plugin_id)\n        if plugin:\n            plugin = plugin if plugin.content != 'system_plugin' else None\n        return plugin\n\n    @staticmethod\n    def list_plugins(db_session):\n        plugins = db_session.query(Plugin).order_by(Plugin.order.asc()).all()\n        return plugins\n\n    @staticmethod\n    def page_plugins(db_session, pager, search_params):\n        query = db_session.query(Plugin)\n        if search_params:\n            if search_params.order_mode == PluginSearchParams.ORDER_MODE_ORDER_ASC:\n                query = query.order_by(Plugin.order.asc())\n        pager = BaseService.query_pager(query, pager)\n        return pager\n\n    @staticmethod\n    def save(db_session, plugin):\n        try:\n            plugin_to_save = Plugin(**plugin)\n            plugin_to_save.order = PluginService.get_max_order(db_session) + 1\n            db_session.add(plugin_to_save)\n            db_session.commit()\n            return plugin_to_save\n        except Exception, e:\n            logger.exception(e)\n        return None\n\n    @staticmethod\n    def get_max_order(db_session):\n        max_order = db_session.query(func.max(Plugin.order)).scalar()\n        if max_order is None:\n            max_order = 0\n        return max_order\n\n    @staticmethod\n    def sort_up(db_session, plugin_id):\n        plugin = db_session.query(Plugin).get(plugin_id)\n        if plugin:\n            plugin_up = db_session.query(Plugin).\\\n                filter(Plugin.order < plugin.order).order_by(Plugin.order.desc()).first()\n            if plugin_up:\n                order_tmp = plugin.order\n                plugin.order = plugin_up.order\n                plugin_up.order = order_tmp\n                db_session.commit()\n                return True\n        return False\n\n    @staticmethod\n    def sort_down(db_session, plugin_id):\n        plugin = db_session.query(Plugin).get(plugin_id)\n        if plugin:\n            plugin_up = db_session.query(Plugin).\\\n                filter(Plugin.order > plugin.order).order_by(Plugin.order.asc()).first()\n            if plugin_up:\n                order_tmp = plugin.order\n                plugin.order = plugin_up.order\n                plugin_up.order = order_tmp\n                db_session.commit()\n                return True\n        return False\n\n    @staticmethod\n    def update_disabled(db_session, plugin_id, disabled):\n        update_count = db_session.query(Plugin).filter(Plugin.id == plugin_id).update({Plugin.disabled:disabled})\n        if update_count:\n            db_session.commit()\n        return update_count\n\n    @staticmethod\n    def delete(db_session, plugin_id):\n        plugin = PluginService.get_editable(db_session, plugin_id)\n        if plugin:\n            db_session.delete(plugin)\n            db_session.commit()\n            return True\n        return False\n\n    @staticmethod\n    def update(db_session, plugin_id, plugin_to_update):\n        plugin = PluginService.get_editable(db_session, plugin_id)\n        if plugin:\n            plugin.title = plugin_to_update['title']\n            plugin.note = plugin_to_update['note']\n            plugin.content = plugin_to_update['content']\n            db_session.commit()\n            return True\n        return False\n\n"
  },
  {
    "path": "service/pubsub_service.py",
    "content": "# coding=utf-8\nimport logging\nimport tornado.gen\nfrom extends.pub_sub_tornadis import PubSubTornadis\nfrom init_service import SiteCacheService\nfrom config import redis_pub_sub_channels\n\nlogger = logging.getLogger(__name__)\n\n\nclass PubSubService(PubSubTornadis):\n\n    def __init__(self, redis_pub_sub_config, application, loop=None):\n        super(PubSubService, self).__init__(redis_pub_sub_config, loop)\n        self.application = application\n        self.db_pool = self.application.db_pool\n        self.cache_manager = self.application.cache_manager\n        self.thread_executor = self.application.thread_executor\n        self.thread_do = self.thread_executor.submit\n        self._db_session = None\n\n    @property\n    def db(self):\n        if not self._db_session:\n            self._db_session = self.application.db_pool()\n        return self._db_session\n\n    @tornado.gen.coroutine\n    def first_do_after_subscribed(self):\n        yield SiteCacheService.query_all(self.cache_manager, self.thread_do, self.db)\n\n    @tornado.gen.coroutine\n    def do_msg(self, msgs):\n        logger.info(\"收到redis消息: \" + str(msgs))\n        if len(msgs) >= 3:\n            channel = msgs[1]\n            core_msgs = msgs[2:]\n            if channel == redis_pub_sub_channels['cache_message_channel']:\n                yield SiteCacheService.update_by_sub_msg(core_msgs, self.cache_manager, self.thread_do, self.db)"
  },
  {
    "path": "service/user_service.py",
    "content": "# coding=utf-8\nfrom model.models import User\n\n\nclass UserService(object):\n\n    @staticmethod\n    def get_user(db_session, username):\n        return db_session.query(User).filter(User.username == username).first()\n\n    @staticmethod\n    def update_user_info(db_session, username, password, user):\n        current_user = UserService.get_user(db_session, username)\n        if current_user and current_user.password == password:\n            if \"username\" in user:\n                current_user.username = user['username']\n            if \"email\" in user:\n                current_user.email = user['email']\n            db_session.commit()\n            return current_user\n        else:\n            return None\n\n    @staticmethod\n    def update_password(db_session, username, old_password, new_password):\n        count = db_session.query(User).filter(User.username == username, User.password == old_password)\\\n            .update({\"password\":new_password})\n        db_session.commit()\n        return count\n\n    @staticmethod\n    def get_count(db_session):\n        return db_session.query(User).count()\n\n    @staticmethod\n    def save_user(db_session, user):\n        user_to_save = User(\n            email=user['email'],\n            username=user['username'],\n            password=user['password'],\n        )\n        db_session.add(user_to_save)\n        db_session.commit()\n        return user_to_save"
  },
  {
    "path": "static/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 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, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(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, .125);\n          box-shadow: inset 0 3px 5px rgba(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  text-shadow: 0 1px 0 #fff;\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: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\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  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: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\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: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\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: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\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: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\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: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\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, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\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: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #2e6da4;\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: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(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: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .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: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(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, .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: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n    background-repeat: repeat-x;\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(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: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\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}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\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 #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: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  background-repeat: repeat-x;\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, .05);\n          box-shadow: 0 1px 2px rgba(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: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\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: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "static/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 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: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\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: thin dotted;\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: thin dotted;\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[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: 14.333333px;\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: thin dotted;\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,\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: #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,\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: #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,\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: #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,\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: #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,\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: #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,\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: #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-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-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-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: 3;\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: 2;\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  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  min-height: 16.42857143px;\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  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: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\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-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-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"
  },
  {
    "path": "static/css/common.css",
    "content": "/*CSS For common appearance*/\nbody {\n    /*background: #F0F0F0;*/\n    background: url('../images/background.jpg');\n}\n#fix-alert{\n    position: fixed;\n    left: 50%;\n    top:30%;\n    z-index: 1;\n}\n.blog-title a:link {\n    text-decoration: none;\n}\n.signature {\n    padding-left: 0px;\n}\n.content {\n    min-height: 800px;\n}\n.article-entry-sum {\n    margin-top: 5px;\n}\n.article-entry-sum p{\n    font-size: 15px;\n    color: #666;\n}\n.entry-box {\n    background: #fff;\n    padding: 15px;\n    margin-bottom: 20px;\n    border: 1px solid #e6e6e6;\n    border-radius: 4px;\n}\n.entry-box:hover {\n    box-shadow: 2px 2px 8px rgba(0,0,0,.2);\n    border-color: #d6d6d6;\n}\n.article-entry-header {\n    margin: 0;\n    padding: 0;\n    border: 0;\n    font: inherit;\n    vertical-align: baseline;\n}\n.article-entry-title {\n    text-align: center;\n    margin-bottom: 10px;\n}\n.article-entry-title a {\n    text-decoration: none;\n}\n.article-entry-info {\n    height: 35px;\n}\n.article-entry-info .base-info {\n    float: left;\n}\n.article-entry-info .main-info {\n    float: right;\n}\n.footer {\n\tbackground: #474E5D;\n\tpadding: 15px 0 5px;\n\tfont-size: 13px;\n}\n.footer-content {\n    text-align: center;\n    color: #8a6d3b;\n}\ndiv.pagination {\n    width: 100%;\n    text-align: center;\n    padding: 0px;\n    margin: 0px;\n}\n.footer-content a {\n    text-decoration: none;\n}\n\n/*CSS For Comments(Article details page)*/\nul.comments {\n    list-style-type: none;\n    padding: 0px;\n    margin: 16px 0px 0px 0px;\n}\nul.comments li.comment:nth-child(1) {\n    border-top: 1px solid #e0e0e0;\n}\nul.comments li.comment {\n    margin-left: 32px;\n    padding: 8px;\n    border-bottom: 1px solid #e0e0e0;\n}\ndiv.comment-thumbnail {\n    position: absolute;\n}\n.comment-floor {\n    position: absolute;\n    margin-top: 44px;\n    width: 40px;\n    text-align: center;\n}\n.profile-thumbnail {\n    position: absolute;\n}\nul.comments div.comment-info {\n    margin-left: 48px;\n    min-height: 48px;\n}\nul.comments li.comment:hover {\n    background-color: #f0f0f0;\n}\nul.comments .comment-date {\n    float: right;\n    color: #8c8c8c;\n}\nul.comments .comment-author {\n    font-weight: bold;\n    color: #337ab7;\n}\nul.comments .delete-comment{\n    margin: 0px 5px 0px 5px;\n}\n.comment-reply-info {\n    color: #3f42cd;\n}\n\n/*CSS For Comments(admin page), use the same CSS as above*/\nul.comments .comment-handle-admin {\n    float: right;\n}\nul.comments .disabled-comment-admin-info {\n    color: #2c4a35;\n}\nul.comments div.comment-info-admin {\n    margin-left: 68px;\n    min-height: 48px;\n}\ndiv.manage-comments .select-comments-admin {\n    margin-left: 40px;\n}\ndiv.manage-comments .handle-box-admin {\n    margin-bottom: -10px;\n}\ndiv.manage-comments .delComments {\n    float: right;\n}\nul.comments .delete-comment-admin-btn {\n    margin-left: 5px;\n    margin-right: 5px;\n}\nul.comments .disabled-comment-admin-btn {\n    margin-left: 5px;\n}\n\n/*CSS For submit comment*/\n.comment-submit {\n    margin-left: 25px;\n}\n\n/*CSS For floatButton*/\n.floatButton {\n    position: fixed;\n    top: 50%;\n    right: 0;\n    z-index: 9999999;\n}\n\n/*CSS For submit article*/\n.submit-article-title {\n    width: 450px;\n}\n.submit-article-editor {\n    margin: 10px 0px 10px 0px;\n}\n.submit-article-summary {\n    width: 500px;\n}\n.submit-article-button {\n    text-align: center;\n}\n/*.submit-article-button {*/\n    /*margin: auto;*/\n/*}*/\n\n/*CSS For edit article*/\n.article-edit {\n    text-align: right;\n}\n\n/*CSS For manage articles*/\n.articles-list {\n    margin-left: 30px;\n    margin-right: 30px;\n}\n.manage-articles th {\n    text-align: center;\n}\n.manage-articles td {\n    text-align: center;\n}\n.manage-articles .table-header {\n    background-color: #779ecb\n}\n.manage-articles .table-checkbox-or-left {\n    text-align: left;\n}\n.manage-articles .delete-article {\n    color: #c9302c;\n}\n.manage-articles .list-handle {\n    padding-bottom: 25px;\n}\n\n/*CSS For manage articleTypes*/\n.manage-articleTypes .articleTypes-box {\n    margin-left: 30px;\n    margin-right: 30px;\n}\n.manage-articleTypes th {\n    text-align: center;\n}\n.manage-articleTypes td {\n    text-align: center;\n}\n.manage-articleTypes .table-header {\n    background-color: #779ecb;\n    /*background-color: #337ab7;*/\n}\n.manage-articleTypes .table-checkbox-or-left {\n    text-align: left;\n}\n.manage-articleTypes .delete-articleType {\n    color: #c9302c;\n}\n.manage-articleTypes .add-articleType-btn {\n    float: right;\n}\n\n/*CSS For manage articleTypes nav*/\n.manage-articleTypes-nav .articleTypes-nav-box {\n    margin-left: 30px;\n    margin-right: 30px;\n}\n.manage-articleTypes-nav th {\n    text-align: center;\n}\n.manage-articleTypes-nav td {\n    text-align: center;\n}\n.manage-articleTypes-nav .table-header {\n    background-color: #779ecb;\n}\n.manage-articleTypes-nav .delete-articleType-nav {\n    color: #c9302c;\n}\n.manage-articleTypes-nav .add-articleType-nav-btn {\n    float: right;\n}\n.sort-up {\n    color: #449d44;\n}\n.sort-down {\n    color: #337ab7;\n}\n\n/*CSS For custom blog info*/\n/*.custom-blog .blog-info-box {*/\n    /*margin-left: 30px;*/\n/*}*/\n.custom-blog .info-header {\n    color: #337ab7;\n}\n\n\n/*CSS For custom blog plugin*/\n.custom-blog-plugin .blog-plugin-box {\n    margin-left: 30px;\n    margin-right: 30px;\n}\n.custom-blog-plugin th {\n    text-align: center;\n}\n.custom-blog-plugin td {\n    text-align: center;\n}\n.custom-blog-plugin .table-header {\n    background-color: #779ecb;\n}\n.custom-blog-plugin .delete-blog-plugin {\n    color: #c9302c;\n}\n.custom-blog-plugin .add-blog-plugin-btn {\n    float: right;\n}\n\n/*CSS For account*/\n.account {\n    min-height: 250px;\n}\n.account .profile-header {\n    margin-left: 135px;\n}\n.account .username {\n    color: #337ab7;\n}\n.account .email {\n    color: #337ab7;\n}\n\n/*CSS For login page*/\n.login-page {\n    margin-top: 200px;\n}\n.dropdown-menu .divider{\n    margin:0;\n}\n.dropdown-menu{\n    padding:0;\n}\n.dropdown-menu > li > a{\n    padding:8px 20px;\n}\n"
  },
  {
    "path": "static/css/prism.css",
    "content": "/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+abap+actionscript+apacheconf+apl+applescript+asciidoc+aspnet+autoit+autohotkey+bash+basic+batch+c+brainfuck+bison+csharp+cpp+coffeescript+ruby+css-extras+d+dart+diff+docker+eiffel+elixir+erlang+fsharp+fortran+gherkin+git+glsl+go+groovy+haml+handlebars+haskell+haxe+http+icon+inform7+ini+j+jade+java+json+julia+keyman+kotlin+latex+less+lolcode+lua+makefile+markdown+matlab+mel+mizar+monkey+nasm+nginx+nim+nix+nsis+objectivec+ocaml+oz+parigp+parser+pascal+perl+php+php-extras+powershell+processing+prolog+puppet+pure+python+q+qore+r+jsx+rest+rip+roboconf+crystal+rust+sas+sass+scss+scala+scheme+smalltalk+smarty+sql+stylus+swift+tcl+textile+twig+typescript+verilog+vhdl+vim+wiki+yaml */\n/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\ttext-shadow: 0 1px white;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tdirection: ltr;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n\tcolor: #a67f59;\n\tbackground: hsla(0, 0%, 100%, .5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #07a;\n}\n\n.token.function {\n\tcolor: #DD4A68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n"
  },
  {
    "path": "static/js/admin.js",
    "content": "//JS For manage-articles when select articles or select comments\n$(document).ready(function () {\n    $('#select-all').click(function () {\n        if ($(this).prop('checked')) {\n            $('.op_check').prop('checked', true);\n        } else {\n            $('.op_check').prop('checked', false);\n        }\n    });\n});\n\n//JS For submit article id to delete article\nfunction delCfm(delLink) {\n    $('#cfmClick').click(function () {\n        var _xsrf = getCookie(\"_xsrf\");\n        $.post(delLink, {_xsrf:_xsrf}, function () {\n            location.reload();\n        });\n    });\n    $('#delCfmModel').modal();\n}\n\n//JS For select articles to delete\n$(document).ready(function () {\n    $('#delArtsCfm').click(function(){\n        $('#delArticlesForm').submit();\n    });\n\n    $('#delArticles').click(function () {\n        if ($('.op_check').filter(':checked').size() > 0) {\n            var articleIds = [];\n            $('.op_check:checked').each(function(){\n                articleIds.push($(this).val());\n            });\n            var articleIdsJson = JSON.stringify(articleIds);\n            $('#articleIds').val(articleIdsJson);\n            $('#delArtsCfmModel').modal();\n        } else {\n            $('#selArtsCfmModel').modal();\n        }\n    });\n});\n\n//JS For confirm to delete a comment in articleDetails page\nfunction delCommentCfm(url) {\n    $('#delCommentCfmClick').click(function(){\n        window.location.href = url;\n    });\n    $('#delCommentCfmModel').modal();\n}\n\n$(document).ready(function(){\n    $('#delComments').click(function(){\n        if($('.op_check_com').filter(':checked').size() > 0) {\n            var commentIds = [];\n            $('.op_check_com:checked').each(function(){\n                commentIds.push($(this).val());\n            });\n            var commentIdsJson = JSON.stringify(commentIds);\n            $('#commentIds').val(commentIdsJson);\n            $('#delComsCfm').click(function() {\n                $('#delCommentsForm').submit();\n            });\n            $('#delComsCfmModel').modal();\n        } else {\n            $('#selComsCfmModal').modal();\n        }\n    });\n});\n\n//JS For reply to a comment in manage-comments page\nfunction pop_commentForm(followId, articleId) {\n    $('#follow').val(followId);\n    $('#article').val(articleId);\n    $('#commentFormModel').modal();\n}\n\n//JS For add articleType\n$(document).ready(function() {\n    $('.add-articleType-btn').click(function() {\n        $('#addArticleTypeFormModel').modal();\n    });\n});\n\n//JS For confirm to delete an articleType\nfunction delArticleTypeCfm(url) {\n    $('#delArticleTypeCfmClick').click(function(){\n        window.location.href = url;\n    });\n    $('#delArticleTypeCfmModel').modal();\n}\n\n//JS For edit articleType to get its info\nfunction get_articleType_info(url, id, name, is_hide, introduction, menu_id) {\n    $('#editName').val(name);\n    $('#editSetting_hide').val(is_hide?'true':'false');\n    $('#editIntroduction').val(introduction);\n    $('#editMenus').val(menu_id?menu_id:-1);\n    $('#articleType_id').val(id);\n    $('#editArticleTypeForm').attr('action', url)\n    $('#ModalTitle').text('修改博文分类：' + name);\n    if (name == '未分类') {\n        $('#editName').prop('readonly', true);\n        $('#editIntroduction').prop('readonly', true);\n    } else {\n        $('#editName').prop('readonly', false);\n        $('#editIntroduction').prop('readonly', false);\n    }\n    $('#editArticleTypeFormModel').modal();\n}\n\n//JS For add articleType\n$(document).ready(function() {\n    $('.add-articleType-nav-btn').click(function() {\n        $('#addArticleTypeNavFormModel').modal();\n    });\n});\n\n//JS For edit articleTypeNav to get its info\nfunction get_articleTypeNav_info(url, id, name) {\n    $('#editNavName').val(name);\n    $('#nav_id').val(id);\n    $('#editArticleTypeNavForm').attr('action', url)\n    $('#NavModalTitle').text('修改分类导航：' + name);\n    $('#editArticleTypeNavFormModel').modal();\n}\n\n//JS For confirm to delete an articleType nav\nfunction delArticleTypeNavCfm(url) {\n    $('#delArticleTypeNavCfmClick').click(function(){\n        window.location.href = url;\n    });\n    $('#delArticleTypeNavCfmModel').modal();\n}\n\n//JS For editing blog info\nfunction get_blog_info() {\n    $('#editBlogInfoFormModal').modal();\n}\n\n//JS For confirm to delete a plugin\nfunction delPluginCfm(url) {\n    $('#delPluginCfmClick').click(function () {\n        location.href = url\n    });\n    $('#delPluginCfmModal').modal();\n}\n\n//JS For change password\nfunction changePassword() {\n    $('#changePasswordFormModal').modal();\n}\n\n//JS For edit user info\nfunction editUserInfo() {\n    $('#editUserInfoFormModal').modal();\n}\n\n//js for checkDoublePassword\nfunction checkChangePasswordForm() {\n    var password = $('#password').val();\n    var password2 = $('#password2').val();\n    if (password != password2) {\n        $('#group_password2').addClass('has-error');\n        $('#password2_err').show();\n        return false;\n    } else {\n        $('#changePasswordForm').submit();\n        return true;\n    }\n}\n\nfunction update_comment(url) {\n    var _xsrf = getCookie(\"_xsrf\");\n    $.post(url, {_xsrf:_xsrf}, function (data) {\n        location.reload();\n    });\n}\n\nfunction delCommentCfm(url) {\n    $('#delCommentCfmClick').click(function(){\n        update_comment(url);\n    });\n    $('#delCommentCfmModel').modal();\n}\n\nfunction replyComment(action, reply_to_id, reply_to_floor) {\n    $('#commentForm').attr('action', action);\n    $('#commentForm input[name=reply_to_id]').val(reply_to_id);\n    $('#commentForm input[name=reply_to_floor]').val(reply_to_floor);\n    $('#commentFormModel').modal();\n}"
  },
  {
    "path": "static/js/articleDetail.js",
    "content": "function update_disable(url) {\n    var _xsrf = getCookie(\"_xsrf\");\n    $.post(url, {_xsrf:_xsrf}, function (data) {\n        location.reload();\n    });\n}\n\nfunction delete_comment(url) {\n    var _xsrf = getCookie(\"_xsrf\");\n    $.post(url, {_xsrf:_xsrf}, function (data) {\n        location.reload();\n    });\n}\n\nfunction delCommentCfm(url) {\n    $('#delCommentCfmClick').click(function(){\n        delete_comment(url);\n    });\n    $('#delCommentCfmModel').modal();\n}\n\nfunction go_to_reply(comment_type, reply_to_id, reply_to_floor) {\n    $('#reply-dialog-box').remove();\n    $('#submit-comment-form').prepend('<div class=\"alert alert-info alert-dismissable\" id=\"reply-dialog-box\">' +\n            '<input type=\"hidden\" name=\"comment_type\", value=\"'+comment_type+'\">'+\n            '<input type=\"hidden\" name=\"reply_to_id\", value=\"'+reply_to_id+'\">'+\n            '<input type=\"hidden\" name=\"reply_to_floor\", value=\"'+reply_to_floor+'\">'+\n            '<button type=\"button\" class=\"close\" data-dismiss=\"alert\">&times;</button>' +\n            '回复给<strong><i>' + reply_to_floor +'</i></strong> </div>');\n    $('html, body').animate({scrollTop:$('#submit-comment').offset().top});\n}\n\n//Reset the follow value when refresh page\nwindow.onload = function(){\n    var content = $('.article-content').text();\n    $('.article-content').html(markdown.toHTML(content));\n    $('.article-loading').hide();\n    $('.article-content').show();\n    codeHighLight();\n    var scrollName = location.hash;\n    if(scrollName) {\n        $(\"body,html\").animate({scrollTop: $(scrollName).offset().top}, \"fast\");\n    }\n}\n\n\n\n"
  },
  {
    "path": "static/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under the MIT license\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  'use strict';\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.5\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.5\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.5'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.5\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.5'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state += 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked')) changed = false\n        $parent.find('.active').removeClass('active')\n        this.$element.addClass('active')\n      } else if ($input.prop('type') == 'checkbox') {\n        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n        this.$element.toggleClass('active')\n      }\n      $input.prop('checked', this.$element.hasClass('active'))\n      if (changed) $input.trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n      this.$element.toggleClass('active')\n    }\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      Plugin.call($btn, 'toggle')\n      if (!($(e.target).is('input[type=\"radio\"]') || $(e.target).is('input[type=\"checkbox\"]'))) e.preventDefault()\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.5\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      = null\n    this.sliding     = null\n    this.interval    = null\n    this.$active     = null\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.5'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var activeIndex = this.getItemIndex(active)\n    var willWrap = (direction == 'prev' && activeIndex === 0)\n                || (direction == 'next' && activeIndex == (this.$items.length - 1))\n    if (willWrap && !this.options.wrap) return active\n    var delta = direction == 'prev' ? -1 : 1\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var that      = this\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.5\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n                           '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.5'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.5\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.5'\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $(document.createElement('div'))\n          .addClass('dropdown-backdrop')\n          .insertAfter($(this))\n          .on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive && e.which != 27 || isActive && e.which == 27) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.disabled):visible a'\n    var $items = $parent.find('.dropdown-menu' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--         // up\n    if (e.which == 40 && index < $items.length - 1) index++         // down\n    if (!~index)                                    index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.5\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options             = options\n    this.$body               = $(document.body)\n    this.$element            = $(element)\n    this.$dialog             = this.$element.find('.modal-dialog')\n    this.$backdrop           = null\n    this.isShown             = null\n    this.originalBodyPad     = null\n    this.scrollbarWidth      = 0\n    this.ignoreBackdropClick = false\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.5'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n      that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n      })\n    })\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element.addClass('in')\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$dialog // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .off('click.dismiss.bs.modal')\n      .off('mouseup.dismiss.bs.modal')\n\n    this.$dialog.off('mousedown.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $(document.createElement('div'))\n        .addClass('modal-backdrop ' + animate)\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (this.ignoreBackdropClick) {\n          this.ignoreBackdropClick = false\n          return\n        }\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus()\n          : this.hide()\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    var fullWindowWidth = window.innerWidth\n    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n      var documentElementRect = document.documentElement.getBoundingClientRect()\n      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n    }\n    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    this.originalBodyPad = document.body.style.paddingRight || ''\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', this.originalBodyPad)\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.5\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       = null\n    this.options    = null\n    this.enabled    = null\n    this.timeout    = null\n    this.hoverState = null\n    this.$element   = null\n    this.inState    = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.5'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n    this.inState   = { click: false, hover: false, focus: false }\n\n    if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n    }\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n    }\n\n    if (self.tip().hasClass('in') || self.hoverState == 'in') {\n      self.hoverState = 'in'\n      return\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.isInStateTrue = function () {\n    for (var key in this.inState) {\n      if (this.inState[key]) return true\n    }\n\n    return false\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n    }\n\n    if (self.isInStateTrue()) return\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n      this.$element.trigger('inserted.bs.' + this.type)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var viewportDim = this.getPosition(this.$viewport)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  += marginTop\n    offset.left += marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n    this.arrow()\n      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isVertical ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = $(this.$tip)\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element\n        .removeAttr('aria-describedby')\n        .trigger('hidden.bs.' + that.type)\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && $tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    if (!this.$tip) {\n      this.$tip = $(this.options.template)\n      if (this.$tip.length != 1) {\n        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n      }\n    }\n    return this.$tip\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    if (e) {\n      self.inState.click = !self.inState.click\n      if (self.isInStateTrue()) self.enter(self)\n      else self.leave(self)\n    } else {\n      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n    }\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n      if (that.$tip) {\n        that.$tip.detach()\n      }\n      that.$tip = null\n      that.$arrow = null\n      that.$viewport = null\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.5\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.5'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.5\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    this.$body          = $(document.body)\n    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.5'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var that          = this\n    var offsetMethod  = 'offset'\n    var offsetBase    = 0\n\n    this.offsets      = []\n    this.targets      = []\n    this.scrollHeight = this.getScrollHeight()\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        that.offsets.push(this[0])\n        that.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n      '[data-target=\"' + target + '\"],' +\n      this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.5\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    // jscs:disable requireDollarBeforejQueryAssignment\n    this.element = $(element)\n    // jscs:enable requireDollarBeforejQueryAssignment\n  }\n\n  Tab.VERSION = '3.3.5'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu').length) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.5\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      = null\n    this.unpin        = null\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.5'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "static/js/floatButton.js",
    "content": "//JS For FloatButton to goTop, goBottom and refresh\nfunction getCookie(name) {\n    var r = document.cookie.match(\"\\\\b\" + name + \"=([^;]*)\\\\b\");\n    return r ? r[1] : undefined;\n}\n\nfunction getAlertHtml(category, message) {\n    var s = '<div class=\"alert alert-'+category+' alert-dismissable\" id=\"fix-alert\">'+\n            '<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>'+\n            message+'</div>';\n    return s;\n}\n\nfunction alertXtg(category, message, timeout) {\n    s = getAlertHtml(category, message);\n    $('body').append(s);\n    if(timeout) {\n        setTimeout(function () {\n            $('#fix-alert').remove();\n        }, timeout);\n    }\n}\n\nfunction codeHighLight() {\n    if(typeof(hljs) != \"undefined\" ) {\n        $('pre code').each(function (i, block) {\n            hljs.highlightBlock(block);\n        });\n    }\n}\n\n$(document).ready(function(){\n    //$('#goTop').click(function(){\n    //    $(window).scrollTop(0);\n    //});\n    $('#goTop').click(function(){\n        $('html, body').animate({scrollTop: '0px'}, 800);\n    });\n    $('#refresh').click(function(){\n        window.location.reload();\n    });\n    $('#goBottom').click(function(){\n        $('html, body').animate({scrollTop: $('.footer').offset().top}, 800);\n    });\n});\n\n\n"
  },
  {
    "path": "static/js/markdown/bootstrap-markdown.js",
    "content": "/* ===================================================\n * bootstrap-markdown.js v2.10.0\n * http://github.com/toopay/bootstrap-markdown\n * ===================================================\n * Copyright 2013-2016 Taufan Aditya\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n(function(factory) {\n  if (typeof define === \"function\" && define.amd) {\n    //RequireJS\n    define([\"jquery\"], factory);\n  } else if (typeof exports === 'object') {\n    //Backbone.js\n    factory(require('jquery'));\n  } else {\n    //Jquery plugin\n    factory(jQuery);\n  }\n}(function($) {\n  \"use strict\";\n\n  /* MARKDOWN CLASS DEFINITION\n   * ========================== */\n\n  var Markdown = function(element, options) {\n    // @TODO : remove this BC on next major release\n    // @see : https://github.com/toopay/bootstrap-markdown/issues/109\n    var opts = ['autofocus', 'savable', 'hideable', 'width',\n      'height', 'resize', 'iconlibrary', 'language',\n      'footer', 'fullscreen', 'hiddenButtons', 'disabledButtons'\n    ];\n    $.each(opts, function(_, opt) {\n      if (typeof $(element).data(opt) !== 'undefined') {\n        options = typeof options == 'object' ? options : {};\n        options[opt] = $(element).data(opt);\n      }\n    });\n    // End BC\n\n    // Class Properties\n    this.$ns = 'bootstrap-markdown';\n    this.$element = $(element);\n    this.$editable = {\n      el: null,\n      type: null,\n      attrKeys: [],\n      attrValues: [],\n      content: null\n    };\n    this.$options = $.extend(true, {}, $.fn.markdown.defaults, options, this.$element.data('options'));\n    this.$oldContent = null;\n    this.$isPreview = false;\n    this.$isFullscreen = false;\n    this.$editor = null;\n    this.$textarea = null;\n    this.$handler = [];\n    this.$callback = [];\n    this.$nextTab = [];\n\n    this.showEditor();\n  };\n\n  Markdown.prototype = {\n\n    constructor: Markdown,\n    __alterButtons: function(name, alter) {\n      var handler = this.$handler,\n        isAll = (name == 'all'),\n        that = this;\n\n      $.each(handler, function(k, v) {\n        var halt = true;\n        if (isAll) {\n          halt = false;\n        } else {\n          halt = v.indexOf(name) < 0;\n        }\n\n        if (halt === false) {\n          alter(that.$editor.find('button[data-handler=\"' + v + '\"]'));\n        }\n      });\n    },\n    __buildButtons: function(buttonsArray, container) {\n      var i,\n        ns = this.$ns,\n        handler = this.$handler,\n        callback = this.$callback;\n\n      for (i = 0; i < buttonsArray.length; i++) {\n        // Build each group container\n        var y, btnGroups = buttonsArray[i];\n        for (y = 0; y < btnGroups.length; y++) {\n          // Build each button group\n          var z,\n            buttons = btnGroups[y].data,\n            btnGroupContainer = $('<div/>', {\n              'class': 'btn-group'\n            });\n\n          for (z = 0; z < buttons.length; z++) {\n            var button = buttons[z],\n              buttonContainer, buttonIconContainer,\n              buttonHandler = ns + '-' + button.name,\n              buttonIcon = this.__getIcon(button),\n              btnText = button.btnText ? button.btnText : '',\n              btnClass = button.btnClass ? button.btnClass : 'btn',\n              tabIndex = button.tabIndex ? button.tabIndex : '-1',\n              hotkey = typeof button.hotkey !== 'undefined' ? button.hotkey : '',\n              hotkeyCaption = typeof jQuery.hotkeys !== 'undefined' && hotkey !== '' ? ' (' + hotkey + ')' : '';\n\n            // Construct the button object\n            buttonContainer = $('<button></button>');\n            buttonContainer.text(' ' + this.__localize(btnText)).addClass('btn-default btn-sm').addClass(btnClass);\n            if (btnClass.match(/btn\\-(primary|success|info|warning|danger|link)/)) {\n              buttonContainer.removeClass('btn-default');\n            }\n            buttonContainer.attr({\n              'type': 'button',\n              'title': this.__localize(button.title) + hotkeyCaption,\n              'tabindex': tabIndex,\n              'data-provider': ns,\n              'data-handler': buttonHandler,\n              'data-hotkey': hotkey\n            });\n            if (button.toggle === true) {\n              buttonContainer.attr('data-toggle', 'button');\n            }\n            buttonIconContainer = $('<span/>');\n            buttonIconContainer.addClass(buttonIcon);\n            buttonIconContainer.prependTo(buttonContainer);\n\n            // Attach the button object\n            btnGroupContainer.append(buttonContainer);\n\n            // Register handler and callback\n            handler.push(buttonHandler);\n            callback.push(button.callback);\n          }\n\n          // Attach the button group into container dom\n          container.append(btnGroupContainer);\n        }\n      }\n\n      return container;\n    },\n    __setListener: function() {\n      // Set size and resizable Properties\n      var hasRows = typeof this.$textarea.attr('rows') !== 'undefined',\n        maxRows = this.$textarea.val().split(\"\\n\").length > 5 ? this.$textarea.val().split(\"\\n\").length : '5',\n        rowsVal = hasRows ? this.$textarea.attr('rows') : maxRows;\n\n      this.$textarea.attr('rows', rowsVal);\n      if (this.$options.resize) {\n        this.$textarea.css('resize', this.$options.resize);\n      }\n\n      this.$textarea.on({\n        'focus': $.proxy(this.focus, this),\n        'keyup': $.proxy(this.keyup, this),\n        'change': $.proxy(this.change, this),\n        'select': $.proxy(this.select, this)\n      });\n\n      if (this.eventSupported('keydown')) {\n        this.$textarea.on('keydown', $.proxy(this.keydown, this));\n      }\n\n      if (this.eventSupported('keypress')) {\n        this.$textarea.on('keypress', $.proxy(this.keypress, this));\n      }\n\n      // Re-attach markdown data\n      this.$textarea.data('markdown', this);\n    },\n    __handle: function(e) {\n      var target = $(e.currentTarget),\n        handler = this.$handler,\n        callback = this.$callback,\n        handlerName = target.attr('data-handler'),\n        callbackIndex = handler.indexOf(handlerName),\n        callbackHandler = callback[callbackIndex];\n\n      // Trigger the focusin\n      $(e.currentTarget).focus();\n\n      callbackHandler(this);\n\n      // Trigger onChange for each button handle\n      this.change(this);\n\n      // Unless it was the save handler,\n      // focusin the textarea\n      if (handlerName.indexOf('cmdSave') < 0) {\n        this.$textarea.focus();\n      }\n\n      e.preventDefault();\n    },\n    __localize: function(string) {\n      var messages = $.fn.markdown.messages,\n        language = this.$options.language;\n      if (\n        typeof messages !== 'undefined' &&\n        typeof messages[language] !== 'undefined' &&\n        typeof messages[language][string] !== 'undefined'\n      ) {\n        return messages[language][string];\n      }\n      return string;\n    },\n    __getIcon: function(src) {\n      if(typeof src == 'object'){\n        var customIcon = this.$options.customIcons[src.name];\n        return typeof customIcon == 'undefined' ? src.icon[this.$options.iconlibrary] : customIcon;\n      } else {\n        return src;\n      }\n    },\n    setFullscreen: function(mode) {\n      var $editor = this.$editor,\n        $textarea = this.$textarea;\n\n      if (mode === true) {\n        $editor.addClass('md-fullscreen-mode');\n        $('body').addClass('md-nooverflow');\n        this.$options.onFullscreen(this);\n      } else {\n        $editor.removeClass('md-fullscreen-mode');\n        $('body').removeClass('md-nooverflow');\n        this.$options.onFullscreenExit(this);\n\n        if (this.$isPreview === true)\n          this.hidePreview().showPreview();\n      }\n\n      this.$isFullscreen = mode;\n      $textarea.focus();\n    },\n    showEditor: function() {\n      var instance = this,\n        textarea,\n        ns = this.$ns,\n        container = this.$element,\n        originalHeigth = container.css('height'),\n        originalWidth = container.css('width'),\n        editable = this.$editable,\n        handler = this.$handler,\n        callback = this.$callback,\n        options = this.$options,\n        editor = $('<div/>', {\n          'class': 'md-editor',\n          click: function() {\n            instance.focus();\n          }\n        });\n\n      // Prepare the editor\n      if (this.$editor === null) {\n        // Create the panel\n        var editorHeader = $('<div/>', {\n          'class': 'md-header btn-toolbar'\n        });\n\n        // Merge the main & additional button groups together\n        var allBtnGroups = [];\n        if (options.buttons.length > 0) allBtnGroups = allBtnGroups.concat(options.buttons[0]);\n        if (options.additionalButtons.length > 0) {\n          // iterate the additional button groups\n          $.each(options.additionalButtons[0], function(idx, buttonGroup) {\n\n            // see if the group name of the addional group matches an existing group\n            var matchingGroups = $.grep(allBtnGroups, function(allButtonGroup, allIdx) {\n              return allButtonGroup.name === buttonGroup.name;\n            });\n\n            // if it matches add the addional buttons to that group, if not just add it to the all buttons group\n            if (matchingGroups.length > 0) {\n              matchingGroups[0].data = matchingGroups[0].data.concat(buttonGroup.data);\n            } else {\n              allBtnGroups.push(options.additionalButtons[0][idx]);\n            }\n\n          });\n        }\n\n        // Reduce and/or reorder the button groups\n        if (options.reorderButtonGroups.length > 0) {\n          allBtnGroups = allBtnGroups\n            .filter(function(btnGroup) {\n              return options.reorderButtonGroups.indexOf(btnGroup.name) > -1;\n            })\n            .sort(function(a, b) {\n              if (options.reorderButtonGroups.indexOf(a.name) < options.reorderButtonGroups.indexOf(b.name)) return -1;\n              if (options.reorderButtonGroups.indexOf(a.name) > options.reorderButtonGroups.indexOf(b.name)) return 1;\n              return 0;\n            });\n        }\n\n        // Build the buttons\n        if (allBtnGroups.length > 0) {\n          editorHeader = this.__buildButtons([allBtnGroups], editorHeader);\n        }\n\n        if (options.fullscreen.enable) {\n          editorHeader.append('<div class=\"md-controls\"><a class=\"md-control md-control-fullscreen\" href=\"#\"><span class=\"' + this.__getIcon(options.fullscreen.icons.fullscreenOn) + '\"></span></a></div>').on('click', '.md-control-fullscreen', function(e) {\n            e.preventDefault();\n            instance.setFullscreen(true);\n          });\n        }\n\n        editor.append(editorHeader);\n\n        // Wrap the textarea\n        if (container.is('textarea')) {\n          container.before(editor);\n          textarea = container;\n          textarea.addClass('md-input');\n          editor.append(textarea);\n        } else {\n          var rawContent = (typeof toMarkdown == 'function') ? toMarkdown(container.html()) : container.html(),\n            currentContent = $.trim(rawContent);\n\n          // This is some arbitrary content that could be edited\n          textarea = $('<textarea/>', {\n            'class': 'md-input',\n            'val': currentContent\n          });\n\n          editor.append(textarea);\n\n          // Save the editable\n          editable.el = container;\n          editable.type = container.prop('tagName').toLowerCase();\n          editable.content = container.html();\n\n          $(container[0].attributes).each(function() {\n            editable.attrKeys.push(this.nodeName);\n            editable.attrValues.push(this.nodeValue);\n          });\n\n          // Set editor to blocked the original container\n          container.replaceWith(editor);\n        }\n\n        var editorFooter = $('<div/>', {\n            'class': 'md-footer'\n          }),\n          createFooter = false,\n          footer = '';\n        // Create the footer if savable\n        if (options.savable) {\n          createFooter = true;\n          var saveHandler = 'cmdSave';\n\n          // Register handler and callback\n          handler.push(saveHandler);\n          callback.push(options.onSave);\n\n          editorFooter.append('<button class=\"btn btn-success\" data-provider=\"' +\n            ns +\n            '\" data-handler=\"' +\n            saveHandler +\n            '\"><i class=\"icon icon-white icon-ok\"></i> ' +\n            this.__localize('Save') +\n            '</button>');\n\n\n        }\n\n        footer = typeof options.footer === 'function' ? options.footer(this) : options.footer;\n\n        if ($.trim(footer) !== '') {\n          createFooter = true;\n          editorFooter.append(footer);\n        }\n\n        if (createFooter) editor.append(editorFooter);\n\n        // Set width\n        if (options.width && options.width !== 'inherit') {\n          if (jQuery.isNumeric(options.width)) {\n            editor.css('display', 'table');\n            textarea.css('width', options.width + 'px');\n          } else {\n            editor.addClass(options.width);\n          }\n        }\n\n        // Set height\n        if (options.height && options.height !== 'inherit') {\n          if (jQuery.isNumeric(options.height)) {\n            var height = options.height;\n            if (editorHeader) height = Math.max(0, height - editorHeader.outerHeight());\n            if (editorFooter) height = Math.max(0, height - editorFooter.outerHeight());\n            textarea.css('height', height + 'px');\n          } else {\n            editor.addClass(options.height);\n          }\n        }\n\n        // Reference\n        this.$editor = editor;\n        this.$textarea = textarea;\n        this.$editable = editable;\n        this.$oldContent = this.getContent();\n\n        this.__setListener();\n\n        // Set editor attributes, data short-hand API and listener\n        this.$editor.attr('id', (new Date()).getTime());\n        this.$editor.on('click', '[data-provider=\"bootstrap-markdown\"]', $.proxy(this.__handle, this));\n\n        if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n          this.$editor.addClass('md-editor-disabled');\n          this.disableButtons('all');\n        }\n\n        if (this.eventSupported('keydown') && typeof jQuery.hotkeys === 'object') {\n          editorHeader.find('[data-provider=\"bootstrap-markdown\"]').each(function() {\n            var $button = $(this),\n              hotkey = $button.attr('data-hotkey');\n            if (hotkey.toLowerCase() !== '') {\n              textarea.bind('keydown', hotkey, function() {\n                $button.trigger('click');\n                return false;\n              });\n            }\n          });\n        }\n\n        if (options.initialstate === 'preview') {\n          this.showPreview();\n        } else if (options.initialstate === 'fullscreen' && options.fullscreen.enable) {\n          this.setFullscreen(true);\n        }\n\n      } else {\n        this.$editor.show();\n      }\n\n      if (options.autofocus) {\n        this.$textarea.focus();\n        this.$editor.addClass('active');\n      }\n\n      if (options.fullscreen.enable && options.fullscreen !== false) {\n        this.$editor.append('<div class=\"md-fullscreen-controls\">' +\n          '<a href=\"#\" class=\"exit-fullscreen\" title=\"Exit fullscreen\"><span class=\"' + this.__getIcon(options.fullscreen.icons.fullscreenOff) + '\">' +\n          '</span></a>' +\n          '</div>');\n        this.$editor.on('click', '.exit-fullscreen', function(e) {\n          e.preventDefault();\n          instance.setFullscreen(false);\n        });\n      }\n\n      // hide hidden buttons from options\n      this.hideButtons(options.hiddenButtons);\n\n      // disable disabled buttons from options\n      this.disableButtons(options.disabledButtons);\n\n      // enable dropZone if available and configured\n      if (options.dropZoneOptions) {\n        if (this.$editor.dropzone) {\n          if(!options.dropZoneOptions.init) {\n            options.dropZoneOptions.init = function() {\n              var caretPos = 0;\n              this.on('drop', function(e) {\n                  caretPos = textarea.prop('selectionStart');\n                  });\n              this.on('success', function(file, path) {\n                  var text = textarea.val();\n                  textarea.val(text.substring(0, caretPos) + '\\n![description](' + path + ')\\n' + text.substring(caretPos));\n                  });\n              this.on('error', function(file, error, xhr) {\n                  console.log('Error:', error);\n                  });\n            };\n          }\n          this.$textarea.addClass('dropzone');\n          this.$editor.dropzone(options.dropZoneOptions);\n        } else {\n          console.log('dropZoneOptions was configured, but DropZone was not detected.');\n        }\n      }\n\n      // enable data-uris via drag and drop\n      if (options.enableDropDataUri === true) {\n        this.$editor.on('drop', function(e) {\n          var caretPos = textarea.prop('selectionStart');\n          e.stopPropagation();\n          e.preventDefault();\n          $.each(e.originalEvent.dataTransfer.files, function(index, file){\n            var fileReader = new FileReader();\n              fileReader.onload = (function(file) {\n                 return function(e) {\n                    var text = textarea.val();\n                    textarea.val(text.substring(0, caretPos) + '\\n<img src=\"'+ e.target.result  +'\" />\\n' + text.substring(caretPos) );\n                 };\n              })(file);\n            fileReader.readAsDataURL(file);\n          });\n        });\n      }\n\n      // Trigger the onShow hook\n      options.onShow(this);\n\n      return this;\n    },\n    parseContent: function(val) {\n      var content;\n\n      // parse with supported markdown parser\n      val = val || this.$textarea.val();\n\n      if (this.$options.parser) {\n        content = this.$options.parser(val);\n      } else if (typeof markdown == 'object') {\n        content = markdown.toHTML(val);\n      } else if (typeof marked == 'function') {\n        content = marked(val);\n      } else {\n        content = val;\n      }\n\n      return content;\n    },\n    showPreview: function() {\n      var options = this.$options,\n        container = this.$textarea,\n        afterContainer = container.next(),\n        replacementContainer = $('<div/>', {\n          'class': 'md-preview',\n          'data-provider': 'markdown-preview'\n        }),\n        content,\n        callbackContent;\n\n      if (this.$isPreview === true) {\n        // Avoid sequenced element creation on missused scenario\n        // @see https://github.com/toopay/bootstrap-markdown/issues/170\n        return this;\n      }\n\n      // Give flag that tell the editor enter preview mode\n      this.$isPreview = true;\n      // Disable all buttons\n      this.disableButtons('all').enableButtons('cmdPreview');\n\n      // Try to get the content from callback\n      callbackContent = options.onPreview(this);\n      // Set the content based from the callback content if string otherwise parse value from textarea\n      content = typeof callbackContent == 'string' ? callbackContent : this.parseContent();\n\n      // Build preview element\n      replacementContainer.html(content);\n\n      if (afterContainer && afterContainer.attr('class') == 'md-footer') {\n        // If there is footer element, insert the preview container before it\n        replacementContainer.insertBefore(afterContainer);\n      } else {\n        // Otherwise, just append it after textarea\n        container.parent().append(replacementContainer);\n      }\n\n      // Set the preview element dimensions\n      replacementContainer.css({\n        \"width\": container.outerWidth() + 'px',\n        \"min-height\": container.outerHeight() + 'px',\n        \"height\": \"auto\"\n      });\n\n      if (this.$options.resize) {\n        replacementContainer.css('resize', this.$options.resize);\n      }\n\n      // Hide the last-active textarea\n      container.hide();\n\n      // Attach the editor instances\n      replacementContainer.data('markdown', this);\n\n      if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n        this.$editor.addClass('md-editor-disabled');\n        this.disableButtons('all');\n      }\n      //\n      options.afterShowPreview(this);\n      return this;\n    },\n    hidePreview: function() {\n      // Give flag that tell the editor quit preview mode\n      this.$isPreview = false;\n\n      // Obtain the preview container\n      var container = this.$editor.find('div[data-provider=\"markdown-preview\"]');\n\n      // Remove the preview container\n      container.remove();\n\n      // Enable all buttons\n      this.enableButtons('all');\n      // Disable configured disabled buttons\n      this.disableButtons(this.$options.disabledButtons);\n\n      // Perform any callback\n      this.$options.onPreviewEnd(this);\n\n      // Back to the editor\n      this.$textarea.show();\n      this.__setListener();\n\n      return this;\n    },\n    isDirty: function() {\n      return this.$oldContent != this.getContent();\n    },\n    getContent: function() {\n      return this.$textarea.val();\n    },\n    setContent: function(content) {\n      this.$textarea.val(content);\n\n      return this;\n    },\n    findSelection: function(chunk) {\n      var content = this.getContent(),\n        startChunkPosition;\n\n      if (startChunkPosition = content.indexOf(chunk), startChunkPosition >= 0 && chunk.length > 0) {\n        var oldSelection = this.getSelection(),\n          selection;\n\n        this.setSelection(startChunkPosition, startChunkPosition + chunk.length);\n        selection = this.getSelection();\n\n        this.setSelection(oldSelection.start, oldSelection.end);\n\n        return selection;\n      } else {\n        return null;\n      }\n    },\n    getSelection: function() {\n\n      var e = this.$textarea[0];\n\n      return (\n\n        ('selectionStart' in e && function() {\n          var l = e.selectionEnd - e.selectionStart;\n          return {\n            start: e.selectionStart,\n            end: e.selectionEnd,\n            length: l,\n            text: e.value.substr(e.selectionStart, l)\n          };\n        }) ||\n\n        /* browser not supported */\n        function() {\n          return null;\n        }\n\n      )();\n\n    },\n    setSelection: function(start, end) {\n\n      var e = this.$textarea[0];\n\n      return (\n\n        ('selectionStart' in e && function() {\n          e.selectionStart = start;\n          e.selectionEnd = end;\n          return;\n        }) ||\n\n        /* browser not supported */\n        function() {\n          return null;\n        }\n\n      )();\n\n    },\n    replaceSelection: function(text) {\n\n      var e = this.$textarea[0];\n\n      return (\n\n        ('selectionStart' in e && function() {\n          e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length);\n          // Set cursor to the last replacement end\n          e.selectionStart = e.value.length;\n          return this;\n        }) ||\n\n        /* browser not supported */\n        function() {\n          e.value += text;\n          return jQuery(e);\n        }\n\n      )();\n    },\n    getNextTab: function() {\n      // Shift the nextTab\n      if (this.$nextTab.length === 0) {\n        return null;\n      } else {\n        var nextTab, tab = this.$nextTab.shift();\n\n        if (typeof tab == 'function') {\n          nextTab = tab();\n        } else if (typeof tab == 'object' && tab.length > 0) {\n          nextTab = tab;\n        }\n\n        return nextTab;\n      }\n    },\n    setNextTab: function(start, end) {\n      // Push new selection into nextTab collections\n      if (typeof start == 'string') {\n        var that = this;\n        this.$nextTab.push(function() {\n          return that.findSelection(start);\n        });\n      } else if (typeof start == 'number' && typeof end == 'number') {\n        var oldSelection = this.getSelection();\n\n        this.setSelection(start, end);\n        this.$nextTab.push(this.getSelection());\n\n        this.setSelection(oldSelection.start, oldSelection.end);\n      }\n\n      return;\n    },\n    __parseButtonNameParam: function(names) {\n      return typeof names == 'string' ?\n        names.split(' ') :\n        names;\n\n    },\n    enableButtons: function(name) {\n      var buttons = this.__parseButtonNameParam(name),\n        that = this;\n\n      $.each(buttons, function(i, v) {\n        that.__alterButtons(buttons[i], function(el) {\n          el.removeAttr('disabled');\n        });\n      });\n\n      return this;\n    },\n    disableButtons: function(name) {\n      var buttons = this.__parseButtonNameParam(name),\n        that = this;\n\n      $.each(buttons, function(i, v) {\n        that.__alterButtons(buttons[i], function(el) {\n          el.attr('disabled', 'disabled');\n        });\n      });\n\n      return this;\n    },\n    hideButtons: function(name) {\n      var buttons = this.__parseButtonNameParam(name),\n        that = this;\n\n      $.each(buttons, function(i, v) {\n        that.__alterButtons(buttons[i], function(el) {\n          el.addClass('hidden');\n        });\n      });\n\n      return this;\n    },\n    showButtons: function(name) {\n      var buttons = this.__parseButtonNameParam(name),\n        that = this;\n\n      $.each(buttons, function(i, v) {\n        that.__alterButtons(buttons[i], function(el) {\n          el.removeClass('hidden');\n        });\n      });\n\n      return this;\n    },\n    eventSupported: function(eventName) {\n      var isSupported = eventName in this.$element;\n      if (!isSupported) {\n        this.$element.setAttribute(eventName, 'return;');\n        isSupported = typeof this.$element[eventName] === 'function';\n      }\n      return isSupported;\n    },\n    keyup: function(e) {\n      var blocked = false;\n      switch (e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n        case 16: // shift\n        case 17: // ctrl\n        case 18: // alt\n          break;\n\n        case 9: // tab\n          var nextTab;\n          if (nextTab = this.getNextTab(), nextTab !== null) {\n            // Get the nextTab if exists\n            var that = this;\n            setTimeout(function() {\n              that.setSelection(nextTab.start, nextTab.end);\n            }, 500);\n\n            blocked = true;\n          } else {\n            // The next tab memory contains nothing...\n            // check the cursor position to determine tab action\n            var cursor = this.getSelection();\n\n            if (cursor.start == cursor.end && cursor.end == this.getContent().length) {\n              // The cursor already reach the end of the content\n              blocked = false;\n            } else {\n              // Put the cursor to the end\n              this.setSelection(this.getContent().length, this.getContent().length);\n\n              blocked = true;\n            }\n          }\n\n          break;\n\n        case 13: // enter\n          blocked = false;\n          break;\n        case 27: // escape\n          if (this.$isFullscreen) this.setFullscreen(false);\n          blocked = false;\n          break;\n\n        default:\n          blocked = false;\n      }\n\n      if (blocked) {\n        e.stopPropagation();\n        e.preventDefault();\n      }\n\n      this.$options.onChange(this);\n    },\n    change: function(e) {\n      this.$options.onChange(this);\n      return this;\n    },\n    select: function(e) {\n      this.$options.onSelect(this);\n      return this;\n    },\n    focus: function(e) {\n      var options = this.$options,\n        isHideable = options.hideable,\n        editor = this.$editor;\n\n      editor.addClass('active');\n\n      // Blur other markdown(s)\n      $(document).find('.md-editor').each(function() {\n        if ($(this).attr('id') !== editor.attr('id')) {\n          var attachedMarkdown;\n\n          if (attachedMarkdown = $(this).find('textarea').data('markdown'),\n            attachedMarkdown === null) {\n            attachedMarkdown = $(this).find('div[data-provider=\"markdown-preview\"]').data('markdown');\n          }\n\n          if (attachedMarkdown) {\n            attachedMarkdown.blur();\n          }\n        }\n      });\n\n      // Trigger the onFocus hook\n      options.onFocus(this);\n\n      return this;\n    },\n    blur: function(e) {\n      var options = this.$options,\n        isHideable = options.hideable,\n        editor = this.$editor,\n        editable = this.$editable;\n\n      if (editor.hasClass('active') || this.$element.parent().length === 0) {\n        editor.removeClass('active');\n\n        if (isHideable) {\n          // Check for editable elements\n          if (editable.el !== null) {\n            // Build the original element\n            var oldElement = $('<' + editable.type + '/>'),\n              content = this.getContent(),\n              currentContent = this.parseContent(content);\n\n            $(editable.attrKeys).each(function(k, v) {\n              oldElement.attr(editable.attrKeys[k], editable.attrValues[k]);\n            });\n\n            // Get the editor content\n            oldElement.html(currentContent);\n\n            editor.replaceWith(oldElement);\n          } else {\n            editor.hide();\n          }\n        }\n\n        // Trigger the onBlur hook\n        options.onBlur(this);\n      }\n\n      return this;\n    }\n\n  };\n\n  /* MARKDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.markdown;\n\n  $.fn.markdown = function(option) {\n    return this.each(function() {\n      var $this = $(this),\n        data = $this.data('markdown'),\n        options = typeof option == 'object' && option;\n      if (!data)\n        $this.data('markdown', (data = new Markdown(this, options)));\n    });\n  };\n\n  $.fn.markdown.messages = {};\n\n  $.fn.markdown.defaults = {\n    /* Editor Properties */\n    autofocus: false,\n    hideable: false,\n    savable: false,\n    width: 'inherit',\n    height: 'inherit',\n    resize: 'none',\n    iconlibrary: 'glyph',\n    language: 'en',\n    initialstate: 'editor',\n    parser: null,\n    dropZoneOptions: null,\n    enableDropDataUri: false,\n\n    /* Buttons Properties */\n    buttons: [\n      [{\n        name: 'groupFont',\n        data: [{\n          name: 'cmdBold',\n          hotkey: 'Ctrl+B',\n          title: 'Bold',\n          icon: {\n            glyph: 'glyphicon glyphicon-bold',\n            fa: 'fa fa-bold',\n            'fa-3': 'icon-bold',\n            octicons: 'octicon octicon-bold'\n          },\n          callback: function(e) {\n            // Give/remove ** surround the selection\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent();\n\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('strong text');\n            } else {\n              chunk = selected.text;\n            }\n\n            // transform selection and set the cursor into chunked text\n            if (content.substr(selected.start - 2, 2) === '**' &&\n              content.substr(selected.end, 2) === '**') {\n              e.setSelection(selected.start - 2, selected.end + 2);\n              e.replaceSelection(chunk);\n              cursor = selected.start - 2;\n            } else {\n              e.replaceSelection('**' + chunk + '**');\n              cursor = selected.start + 2;\n            }\n\n            // Set the cursor\n            e.setSelection(cursor, cursor + chunk.length);\n          }\n        }, {\n          name: 'cmdItalic',\n          title: 'Italic',\n          hotkey: 'Ctrl+I',\n          icon: {\n            glyph: 'glyphicon glyphicon-italic',\n            fa: 'fa fa-italic',\n            'fa-3': 'icon-italic',\n            octicons: 'octicon octicon-italic'\n          },\n          callback: function(e) {\n            // Give/remove * surround the selection\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent();\n\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('emphasized text');\n            } else {\n              chunk = selected.text;\n            }\n\n            // transform selection and set the cursor into chunked text\n            if (content.substr(selected.start - 1, 1) === '_' &&\n              content.substr(selected.end, 1) === '_') {\n              e.setSelection(selected.start - 1, selected.end + 1);\n              e.replaceSelection(chunk);\n              cursor = selected.start - 1;\n            } else {\n              e.replaceSelection('_' + chunk + '_');\n              cursor = selected.start + 1;\n            }\n\n            // Set the cursor\n            e.setSelection(cursor, cursor + chunk.length);\n          }\n        }, {\n          name: 'cmdHeading',\n          title: 'Heading',\n          hotkey: 'Ctrl+H',\n          icon: {\n            glyph: 'glyphicon glyphicon-header',\n            fa: 'fa fa-header',\n            'fa-3': 'icon-font',\n            octicons: 'octicon octicon-text-size'\n          },\n          callback: function(e) {\n            // Append/remove ### surround the selection\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent(),\n              pointer, prevChar;\n\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('heading text');\n            } else {\n              chunk = selected.text + '\\n';\n            }\n\n            // transform selection and set the cursor into chunked text\n            if ((pointer = 4, content.substr(selected.start - pointer, pointer) === '### ') ||\n              (pointer = 3, content.substr(selected.start - pointer, pointer) === '###')) {\n              e.setSelection(selected.start - pointer, selected.end);\n              e.replaceSelection(chunk);\n              cursor = selected.start - pointer;\n            } else if (selected.start > 0 && (prevChar = content.substr(selected.start - 1, 1), !!prevChar && prevChar != '\\n')) {\n              e.replaceSelection('\\n\\n### ' + chunk);\n              cursor = selected.start + 6;\n            } else {\n              // Empty string before element\n              e.replaceSelection('### ' + chunk);\n              cursor = selected.start + 4;\n            }\n\n            // Set the cursor\n            e.setSelection(cursor, cursor + chunk.length);\n          }\n        }]\n      }, {\n        name: 'groupLink',\n        data: [{\n          name: 'cmdUrl',\n          title: 'URL/Link',\n          hotkey: 'Ctrl+L',\n          icon: {\n            glyph: 'glyphicon glyphicon-link',\n            fa: 'fa fa-link',\n            'fa-3': 'icon-link',\n            octicons: 'octicon octicon-link'\n          },\n          callback: function(e) {\n            // Give [] surround the selection and prepend the link\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent(),\n              link;\n\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('enter link description here');\n            } else {\n              chunk = selected.text;\n            }\n\n            link = prompt(e.__localize('Insert Hyperlink'), 'http://');\n\n            var urlRegex = new RegExp('^((http|https)://|(mailto:)|(//))[a-z0-9]', 'i');\n            if (link !== null && link !== '' && link !== 'http://' && urlRegex.test(link)) {\n              var sanitizedLink = $('<div>' + link + '</div>').text();\n\n              // transform selection and set the cursor into chunked text\n              e.replaceSelection('[' + chunk + '](' + sanitizedLink + ')');\n              cursor = selected.start + 1;\n\n              // Set the cursor\n              e.setSelection(cursor, cursor + chunk.length);\n            }\n          }\n        }, {\n          name: 'cmdImage',\n          title: 'Image',\n          hotkey: 'Ctrl+G',\n          icon: {\n            glyph: 'glyphicon glyphicon-picture',\n            fa: 'fa fa-picture-o',\n            'fa-3': 'icon-picture',\n            octicons: 'octicon octicon-file-media'\n          },\n          callback: function(e) {\n            // Give ![] surround the selection and prepend the image link\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent(),\n              link;\n\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('enter image description here');\n            } else {\n              chunk = selected.text;\n            }\n\n            link = prompt(e.__localize('Insert Image Hyperlink'), 'http://');\n\n            var urlRegex = new RegExp('^((http|https)://|(//))[a-z0-9]', 'i');\n            if (link !== null && link !== '' && link !== 'http://' && urlRegex.test(link)) {\n              var sanitizedLink = $('<div>' + link + '</div>').text();\n\n              // transform selection and set the cursor into chunked text\n              e.replaceSelection('![' + chunk + '](' + sanitizedLink + ' \"' + e.__localize('enter image title here') + '\")');\n              cursor = selected.start + 2;\n\n              // Set the next tab\n              e.setNextTab(e.__localize('enter image title here'));\n\n              // Set the cursor\n              e.setSelection(cursor, cursor + chunk.length);\n            }\n          }\n        }]\n      }, {\n        name: 'groupMisc',\n        data: [{\n          name: 'cmdList',\n          hotkey: 'Ctrl+U',\n          title: 'Unordered List',\n          icon: {\n            glyph: 'glyphicon glyphicon-list',\n            fa: 'fa fa-list',\n            'fa-3': 'icon-list-ul',\n            octicons: 'octicon octicon-list-unordered'\n          },\n          callback: function(e) {\n            // Prepend/Give - surround the selection\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent();\n\n            // transform selection and set the cursor into chunked text\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('list text here');\n\n              e.replaceSelection('- ' + chunk);\n              // Set the cursor\n              cursor = selected.start + 2;\n            } else {\n              if (selected.text.indexOf('\\n') < 0) {\n                chunk = selected.text;\n\n                e.replaceSelection('- ' + chunk);\n\n                // Set the cursor\n                cursor = selected.start + 2;\n              } else {\n                var list = [];\n\n                list = selected.text.split('\\n');\n                chunk = list[0];\n\n                $.each(list, function(k, v) {\n                  list[k] = '- ' + v;\n                });\n\n                e.replaceSelection('\\n\\n' + list.join('\\n'));\n\n                // Set the cursor\n                cursor = selected.start + 4;\n              }\n            }\n\n            // Set the cursor\n            e.setSelection(cursor, cursor + chunk.length);\n          }\n        }, {\n          name: 'cmdListO',\n          hotkey: 'Ctrl+O',\n          title: 'Ordered List',\n          icon: {\n            glyph: 'glyphicon glyphicon-th-list',\n            fa: 'fa fa-list-ol',\n            'fa-3': 'icon-list-ol',\n            octicons: 'octicon octicon-list-ordered'\n          },\n          callback: function(e) {\n\n            // Prepend/Give - surround the selection\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent();\n\n            // transform selection and set the cursor into chunked text\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('list text here');\n              e.replaceSelection('1. ' + chunk);\n              // Set the cursor\n              cursor = selected.start + 3;\n            } else {\n              if (selected.text.indexOf('\\n') < 0) {\n                chunk = selected.text;\n\n                e.replaceSelection('1. ' + chunk);\n\n                // Set the cursor\n                cursor = selected.start + 3;\n              } else {\n                var i = 1;\n                var list = [];\n\n                list = selected.text.split('\\n');\n                chunk = list[0];\n\n                $.each(list, function(k, v) {\n                  list[k] = i + '. ' + v;\n                  i++;\n                });\n\n                e.replaceSelection('\\n\\n' + list.join('\\n'));\n\n                // Set the cursor\n                cursor = selected.start + 5;\n              }\n            }\n\n            // Set the cursor\n            e.setSelection(cursor, cursor + chunk.length);\n          }\n        }, {\n          name: 'cmdCode',\n          hotkey: 'Ctrl+K',\n          title: 'Code',\n          icon: {\n            glyph: 'glyphicon glyphicon-console',\n            fa: 'fa fa-code',\n            'fa-3': 'icon-code',\n            octicons: 'octicon octicon-code'\n          },\n          callback: function(e) {\n            // Give/remove ** surround the selection\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent();\n\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('code text here');\n            } else {\n              chunk = selected.text;\n            }\n\n            // transform selection and set the cursor into chunked text\n            if (content.substr(selected.start - 4, 4) === '```\\n' &&\n              content.substr(selected.end, 4) === '\\n```') {\n              e.setSelection(selected.start - 4, selected.end + 4);\n              e.replaceSelection(chunk);\n              cursor = selected.start - 4;\n            } else if (content.substr(selected.start - 1, 1) === '`' &&\n              content.substr(selected.end, 1) === '`') {\n              e.setSelection(selected.start - 1, selected.end + 1);\n              e.replaceSelection(chunk);\n              cursor = selected.start - 1;\n            } else if (content.indexOf('\\n') > -1) {\n              e.replaceSelection('```\\n' + chunk + '\\n```');\n              cursor = selected.start + 4;\n            } else {\n              e.replaceSelection('`' + chunk + '`');\n              cursor = selected.start + 1;\n            }\n\n            // Set the cursor\n            e.setSelection(cursor, cursor + chunk.length);\n          }\n        }, {\n          name: 'cmdQuote',\n          hotkey: 'Ctrl+Q',\n          title: 'Quote',\n          icon: {\n            glyph: 'glyphicon glyphicon-comment',\n            fa: 'fa fa-quote-left',\n            'fa-3': 'icon-quote-left',\n            octicons: 'octicon octicon-quote'\n          },\n          callback: function(e) {\n            // Prepend/Give - surround the selection\n            var chunk, cursor, selected = e.getSelection(),\n              content = e.getContent();\n\n            // transform selection and set the cursor into chunked text\n            if (selected.length === 0) {\n              // Give extra word\n              chunk = e.__localize('quote here');\n\n              e.replaceSelection('> ' + chunk);\n\n              // Set the cursor\n              cursor = selected.start + 2;\n            } else {\n              if (selected.text.indexOf('\\n') < 0) {\n                chunk = selected.text;\n\n                e.replaceSelection('> ' + chunk);\n\n                // Set the cursor\n                cursor = selected.start + 2;\n              } else {\n                var list = [];\n\n                list = selected.text.split('\\n');\n                chunk = list[0];\n\n                $.each(list, function(k, v) {\n                  list[k] = '> ' + v;\n                });\n\n                e.replaceSelection('\\n\\n' + list.join('\\n'));\n\n                // Set the cursor\n                cursor = selected.start + 4;\n              }\n            }\n\n            // Set the cursor\n            e.setSelection(cursor, cursor + chunk.length);\n          }\n        }]\n      }, {\n        name: 'groupUtil',\n        data: [{\n          name: 'cmdPreview',\n          toggle: true,\n          hotkey: 'Ctrl+P',\n          title: 'Preview',\n          btnText: 'Preview',\n          btnClass: 'btn btn-primary btn-sm',\n          icon: {\n            glyph: 'glyphicon glyphicon-search',\n            fa: 'fa fa-search',\n            'fa-3': 'icon-search',\n            octicons: 'octicon octicon-search'\n          },\n          callback: function(e) {\n            // Check the preview mode and toggle based on this flag\n            var isPreview = e.$isPreview,\n              content;\n\n            if (isPreview === false) {\n              // Give flag that tell the editor enter preview mode\n              e.showPreview();\n            } else {\n              e.hidePreview();\n            }\n          }\n        }]\n      }]\n    ],\n    customIcons: {},\n    additionalButtons: [], // Place to hook more buttons by code\n    reorderButtonGroups: [],\n    hiddenButtons: [], // Default hidden buttons\n    disabledButtons: [], // Default disabled buttons\n    footer: '',\n    fullscreen: {\n      enable: true,\n      icons: {\n        fullscreenOn: {\n          name: \"fullscreenOn\",\n          icon: {\n            fa: 'fa fa-expand',\n            glyph: 'glyphicon glyphicon-fullscreen',\n            'fa-3': 'icon-resize-full',\n            octicons: 'octicon octicon-link-external'\n          }\n        },\n        fullscreenOff: {\n          name: \"fullscreenOff\",\n          icon: {\n            fa: 'fa fa-compress',\n            glyph: 'glyphicon glyphicon-fullscreen',\n            'fa-3': 'icon-resize-small',\n            octicons: 'octicon octicon-browser'\n          }\n        }\n      }\n    },\n\n    /* Events hook */\n    onShow: function(e) {},\n    onPreview: function(e) {},\n    afterShowPreview: function(e) {},\n    onPreviewEnd: function(e) {},\n    onSave: function(e) {},\n    onBlur: function(e) {},\n    onFocus: function(e) {},\n    onChange: function(e) {},\n    onFullscreen: function(e) {},\n    onFullscreenExit: function(e) {},\n    onSelect: function(e) {}\n  };\n\n  $.fn.markdown.Constructor = Markdown;\n\n\n  /* MARKDOWN NO CONFLICT\n   * ==================== */\n\n  $.fn.markdown.noConflict = function() {\n    $.fn.markdown = old;\n    return this;\n  };\n\n  /* MARKDOWN GLOBAL FUNCTION & DATA-API\n   * ==================================== */\n  var initMarkdown = function(el) {\n    var $this = el;\n\n    if ($this.data('markdown')) {\n      $this.data('markdown').showEditor();\n      return;\n    }\n\n    $this.markdown();\n  };\n\n  var blurNonFocused = function(e) {\n    var $activeElement = $(document.activeElement);\n\n    // Blur event\n    $(document).find('.md-editor').each(function() {\n      var $this = $(this),\n        focused = $activeElement.closest('.md-editor')[0] === this,\n        attachedMarkdown = $this.find('textarea').data('markdown') ||\n        $this.find('div[data-provider=\"markdown-preview\"]').data('markdown');\n\n      if (attachedMarkdown && !focused) {\n        attachedMarkdown.blur();\n      }\n    });\n  };\n\n  $(document)\n    .on('click.markdown.data-api', '[data-provide=\"markdown-editable\"]', function(e) {\n      initMarkdown($(this));\n      e.preventDefault();\n    })\n    .on('click focusin', function(e) {\n      blurNonFocused(e);\n    })\n    .ready(function() {\n      $('textarea[data-provide=\"markdown\"]').each(function() {\n        initMarkdown($(this));\n      });\n    });\n\n}));\n"
  },
  {
    "path": "static/js/markdown/locale/bootstrap-markdown.zh.js",
    "content": "/**\n * Chinese translation for bootstrap-markdown\n * benhaile <denghaier@163.com>\n */\n(function ($) {\n  $.fn.markdown.messages.zh = {\n    'Bold': \"粗体\",\n    'Italic': \"斜体\",\n    'Heading': \"标题\",\n    'URL/Link': \"链接\",\n    'Image': \"图片\",\n    'List': \"列表\",\n    'Unordered List': \"无序列表\",\n    'Ordered List': \"有序列表\",\n    'Code': \"代码\",\n    'Quote': \"引用\",\n    'Preview': \"预览\",\n    'strong text': \"粗体\",\n    'emphasized text': \"强调\",\n    'heading text': \"标题\",\n    'enter link description here': \"输入链接说明\",\n    'Insert Hyperlink': \"URL地址\",\n    'enter image description here': \"输入图片说明\",\n    'Insert Image Hyperlink': \"图片URL地址\",\n    'enter image title here': \"在这里输入图片标题\",\n    'list text here': \"这里是列表文本\",\n    'code text here': \"这里输入代码\",\n    'quote here': \"这里输入引用文本\"\n  };\n}(jQuery));\n"
  },
  {
    "path": "static/js/markdown/markdown.js",
    "content": "// Released under MIT license\n// Copyright (c) 2009-2010 Dominic Baggott\n// Copyright (c) 2009-2010 Ash Berlin\n// Copyright (c) 2011 Christoph Dorn <christoph@christophdorn.com> (http://www.christophdorn.com)\n\n/*jshint browser:true, devel:true */\n\n(function( expose ) {\n\n/**\n *  class Markdown\n *\n *  Markdown processing in Javascript done right. We have very particular views\n *  on what constitutes 'right' which include:\n *\n *  - produces well-formed HTML (this means that em and strong nesting is\n *    important)\n *\n *  - has an intermediate representation to allow processing of parsed data (We\n *    in fact have two, both as [JsonML]: a markdown tree and an HTML tree).\n *\n *  - is easily extensible to add new dialects without having to rewrite the\n *    entire parsing mechanics\n *\n *  - has a good test suite\n *\n *  This implementation fulfills all of these (except that the test suite could\n *  do with expanding to automatically run all the fixtures from other Markdown\n *  implementations.)\n *\n *  ##### Intermediate Representation\n *\n *  *TODO* Talk about this :) Its JsonML, but document the node names we use.\n *\n *  [JsonML]: http://jsonml.org/ \"JSON Markup Language\"\n **/\nvar Markdown = expose.Markdown = function(dialect) {\n  switch (typeof dialect) {\n    case \"undefined\":\n      this.dialect = Markdown.dialects.Gruber;\n      break;\n    case \"object\":\n      this.dialect = dialect;\n      break;\n    default:\n      if ( dialect in Markdown.dialects ) {\n        this.dialect = Markdown.dialects[dialect];\n      }\n      else {\n        throw new Error(\"Unknown Markdown dialect '\" + String(dialect) + \"'\");\n      }\n      break;\n  }\n  this.em_state = [];\n  this.strong_state = [];\n  this.debug_indent = \"\";\n};\n\n/**\n *  parse( markdown, [dialect] ) -> JsonML\n *  - markdown (String): markdown string to parse\n *  - dialect (String | Dialect): the dialect to use, defaults to gruber\n *\n *  Parse `markdown` and return a markdown document as a Markdown.JsonML tree.\n **/\nexpose.parse = function( source, dialect ) {\n  // dialect will default if undefined\n  var md = new Markdown( dialect );\n  return md.toTree( source );\n};\n\n/**\n *  toHTML( markdown, [dialect]  ) -> String\n *  toHTML( md_tree ) -> String\n *  - markdown (String): markdown string to parse\n *  - md_tree (Markdown.JsonML): parsed markdown tree\n *\n *  Take markdown (either as a string or as a JsonML tree) and run it through\n *  [[toHTMLTree]] then turn it into a well-formated HTML fragment.\n **/\nexpose.toHTML = function toHTML( source , dialect , options ) {\n  var input = expose.toHTMLTree( source , dialect , options );\n\n  return expose.renderJsonML( input );\n};\n\n/**\n *  toHTMLTree( markdown, [dialect] ) -> JsonML\n *  toHTMLTree( md_tree ) -> JsonML\n *  - markdown (String): markdown string to parse\n *  - dialect (String | Dialect): the dialect to use, defaults to gruber\n *  - md_tree (Markdown.JsonML): parsed markdown tree\n *\n *  Turn markdown into HTML, represented as a JsonML tree. If a string is given\n *  to this function, it is first parsed into a markdown tree by calling\n *  [[parse]].\n **/\nexpose.toHTMLTree = function toHTMLTree( input, dialect , options ) {\n  // convert string input to an MD tree\n  if ( typeof input ===\"string\" ) input = this.parse( input, dialect );\n\n  // Now convert the MD tree to an HTML tree\n\n  // remove references from the tree\n  var attrs = extract_attr( input ),\n      refs = {};\n\n  if ( attrs && attrs.references ) {\n    refs = attrs.references;\n  }\n\n  var html = convert_tree_to_html( input, refs , options );\n  merge_text_nodes( html );\n  return html;\n};\n\n// For Spidermonkey based engines\nfunction mk_block_toSource() {\n  return \"Markdown.mk_block( \" +\n          uneval(this.toString()) +\n          \", \" +\n          uneval(this.trailing) +\n          \", \" +\n          uneval(this.lineNumber) +\n          \" )\";\n}\n\n// node\nfunction mk_block_inspect() {\n  var util = require(\"util\");\n  return \"Markdown.mk_block( \" +\n          util.inspect(this.toString()) +\n          \", \" +\n          util.inspect(this.trailing) +\n          \", \" +\n          util.inspect(this.lineNumber) +\n          \" )\";\n\n}\n\nvar mk_block = Markdown.mk_block = function(block, trail, line) {\n  // Be helpful for default case in tests.\n  if ( arguments.length == 1 ) trail = \"\\n\\n\";\n\n  var s = new String(block);\n  s.trailing = trail;\n  // To make it clear its not just a string\n  s.inspect = mk_block_inspect;\n  s.toSource = mk_block_toSource;\n\n  if ( line != undefined )\n    s.lineNumber = line;\n\n  return s;\n};\n\nfunction count_lines( str ) {\n  var n = 0, i = -1;\n  while ( ( i = str.indexOf(\"\\n\", i + 1) ) !== -1 ) n++;\n  return n;\n}\n\n// Internal - split source into rough blocks\nMarkdown.prototype.split_blocks = function splitBlocks( input, startLine ) {\n  input = input.replace(/(\\r\\n|\\n|\\r)/g, \"\\n\");\n  // [\\s\\S] matches _anything_ (newline or space)\n  // [^] is equivalent but doesn't work in IEs.\n  var re = /([\\s\\S]+?)($|\\n#|\\n(?:\\s*\\n|$)+)/g,\n      blocks = [],\n      m;\n\n  var line_no = 1;\n\n  if ( ( m = /^(\\s*\\n)/.exec(input) ) != null ) {\n    // skip (but count) leading blank lines\n    line_no += count_lines( m[0] );\n    re.lastIndex = m[0].length;\n  }\n\n  while ( ( m = re.exec(input) ) !== null ) {\n    if (m[2] == \"\\n#\") {\n      m[2] = \"\\n\";\n      re.lastIndex--;\n    }\n    blocks.push( mk_block( m[1], m[2], line_no ) );\n    line_no += count_lines( m[0] );\n  }\n\n  return blocks;\n};\n\n/**\n *  Markdown#processBlock( block, next ) -> undefined | [ JsonML, ... ]\n *  - block (String): the block to process\n *  - next (Array): the following blocks\n *\n * Process `block` and return an array of JsonML nodes representing `block`.\n *\n * It does this by asking each block level function in the dialect to process\n * the block until one can. Succesful handling is indicated by returning an\n * array (with zero or more JsonML nodes), failure by a false value.\n *\n * Blocks handlers are responsible for calling [[Markdown#processInline]]\n * themselves as appropriate.\n *\n * If the blocks were split incorrectly or adjacent blocks need collapsing you\n * can adjust `next` in place using shift/splice etc.\n *\n * If any of this default behaviour is not right for the dialect, you can\n * define a `__call__` method on the dialect that will get invoked to handle\n * the block processing.\n */\nMarkdown.prototype.processBlock = function processBlock( block, next ) {\n  var cbs = this.dialect.block,\n      ord = cbs.__order__;\n\n  if ( \"__call__\" in cbs ) {\n    return cbs.__call__.call(this, block, next);\n  }\n\n  for ( var i = 0; i < ord.length; i++ ) {\n    //D:this.debug( \"Testing\", ord[i] );\n    var res = cbs[ ord[i] ].call( this, block, next );\n    if ( res ) {\n      //D:this.debug(\"  matched\");\n      if ( !isArray(res) || ( res.length > 0 && !( isArray(res[0]) ) ) )\n        this.debug(ord[i], \"didn't return a proper array\");\n      //D:this.debug( \"\" );\n      return res;\n    }\n  }\n\n  // Uhoh! no match! Should we throw an error?\n  return [];\n};\n\nMarkdown.prototype.processInline = function processInline( block ) {\n  return this.dialect.inline.__call__.call( this, String( block ) );\n};\n\n/**\n *  Markdown#toTree( source ) -> JsonML\n *  - source (String): markdown source to parse\n *\n *  Parse `source` into a JsonML tree representing the markdown document.\n **/\n// custom_tree means set this.tree to `custom_tree` and restore old value on return\nMarkdown.prototype.toTree = function toTree( source, custom_root ) {\n  var blocks = source instanceof Array ? source : this.split_blocks( source );\n\n  // Make tree a member variable so its easier to mess with in extensions\n  var old_tree = this.tree;\n  try {\n    this.tree = custom_root || this.tree || [ \"markdown\" ];\n\n    blocks:\n    while ( blocks.length ) {\n      var b = this.processBlock( blocks.shift(), blocks );\n\n      // Reference blocks and the like won't return any content\n      if ( !b.length ) continue blocks;\n\n      this.tree.push.apply( this.tree, b );\n    }\n    return this.tree;\n  }\n  finally {\n    if ( custom_root ) {\n      this.tree = old_tree;\n    }\n  }\n};\n\n// Noop by default\nMarkdown.prototype.debug = function () {\n  var args = Array.prototype.slice.call( arguments);\n  args.unshift(this.debug_indent);\n  if ( typeof print !== \"undefined\" )\n      print.apply( print, args );\n  if ( typeof console !== \"undefined\" && typeof console.log !== \"undefined\" )\n      console.log.apply( null, args );\n}\n\nMarkdown.prototype.loop_re_over_block = function( re, block, cb ) {\n  // Dont use /g regexps with this\n  var m,\n      b = block.valueOf();\n\n  while ( b.length && (m = re.exec(b) ) != null ) {\n    b = b.substr( m[0].length );\n    cb.call(this, m);\n  }\n  return b;\n};\n\n/**\n * Markdown.dialects\n *\n * Namespace of built-in dialects.\n **/\nMarkdown.dialects = {};\n\n/**\n * Markdown.dialects.Gruber\n *\n * The default dialect that follows the rules set out by John Gruber's\n * markdown.pl as closely as possible. Well actually we follow the behaviour of\n * that script which in some places is not exactly what the syntax web page\n * says.\n **/\nMarkdown.dialects.Gruber = {\n  block: {\n    atxHeader: function atxHeader( block, next ) {\n      var m = block.match( /^(#{1,6})\\s*(.*?)\\s*#*\\s*(?:\\n|$)/ );\n\n      if ( !m ) return undefined;\n\n      var header = [ \"header\", { level: m[ 1 ].length } ];\n      Array.prototype.push.apply(header, this.processInline(m[ 2 ]));\n\n      if ( m[0].length < block.length )\n        next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) );\n\n      return [ header ];\n    },\n\n    setextHeader: function setextHeader( block, next ) {\n      var m = block.match( /^(.*)\\n([-=])\\2\\2+(?:\\n|$)/ );\n\n      if ( !m ) return undefined;\n\n      var level = ( m[ 2 ] === \"=\" ) ? 1 : 2;\n      var header = [ \"header\", { level : level }, m[ 1 ] ];\n\n      if ( m[0].length < block.length )\n        next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) );\n\n      return [ header ];\n    },\n\n    code: function code( block, next ) {\n      // |    Foo\n      // |bar\n      // should be a code block followed by a paragraph. Fun\n      //\n      // There might also be adjacent code block to merge.\n\n      var ret = [],\n          re = /^(?: {0,3}\\t| {4})(.*)\\n?/,\n          lines;\n\n      // 4 spaces + content\n      if ( !block.match( re ) ) return undefined;\n\n      block_search:\n      do {\n        // Now pull out the rest of the lines\n        var b = this.loop_re_over_block(\n                  re, block.valueOf(), function( m ) { ret.push( m[1] ); } );\n\n        if ( b.length ) {\n          // Case alluded to in first comment. push it back on as a new block\n          next.unshift( mk_block(b, block.trailing) );\n          break block_search;\n        }\n        else if ( next.length ) {\n          // Check the next block - it might be code too\n          if ( !next[0].match( re ) ) break block_search;\n\n          // Pull how how many blanks lines follow - minus two to account for .join\n          ret.push ( block.trailing.replace(/[^\\n]/g, \"\").substring(2) );\n\n          block = next.shift();\n        }\n        else {\n          break block_search;\n        }\n      } while ( true );\n\n      return [ [ \"code_block\", ret.join(\"\\n\") ] ];\n    },\n\n    horizRule: function horizRule( block, next ) {\n      // this needs to find any hr in the block to handle abutting blocks\n      var m = block.match( /^(?:([\\s\\S]*?)\\n)?[ \\t]*([-_*])(?:[ \\t]*\\2){2,}[ \\t]*(?:\\n([\\s\\S]*))?$/ );\n\n      if ( !m ) {\n        return undefined;\n      }\n\n      var jsonml = [ [ \"hr\" ] ];\n\n      // if there's a leading abutting block, process it\n      if ( m[ 1 ] ) {\n        jsonml.unshift.apply( jsonml, this.processBlock( m[ 1 ], [] ) );\n      }\n\n      // if there's a trailing abutting block, stick it into next\n      if ( m[ 3 ] ) {\n        next.unshift( mk_block( m[ 3 ] ) );\n      }\n\n      return jsonml;\n    },\n\n    // There are two types of lists. Tight and loose. Tight lists have no whitespace\n    // between the items (and result in text just in the <li>) and loose lists,\n    // which have an empty line between list items, resulting in (one or more)\n    // paragraphs inside the <li>.\n    //\n    // There are all sorts weird edge cases about the original markdown.pl's\n    // handling of lists:\n    //\n    // * Nested lists are supposed to be indented by four chars per level. But\n    //   if they aren't, you can get a nested list by indenting by less than\n    //   four so long as the indent doesn't match an indent of an existing list\n    //   item in the 'nest stack'.\n    //\n    // * The type of the list (bullet or number) is controlled just by the\n    //    first item at the indent. Subsequent changes are ignored unless they\n    //    are for nested lists\n    //\n    lists: (function( ) {\n      // Use a closure to hide a few variables.\n      var any_list = \"[*+-]|\\\\d+\\\\.\",\n          bullet_list = /[*+-]/,\n          number_list = /\\d+\\./,\n          // Capture leading indent as it matters for determining nested lists.\n          is_list_re = new RegExp( \"^( {0,3})(\" + any_list + \")[ \\t]+\" ),\n          indent_re = \"(?: {0,3}\\\\t| {4})\";\n\n      // TODO: Cache this regexp for certain depths.\n      // Create a regexp suitable for matching an li for a given stack depth\n      function regex_for_depth( depth ) {\n\n        return new RegExp(\n          // m[1] = indent, m[2] = list_type\n          \"(?:^(\" + indent_re + \"{0,\" + depth + \"} {0,3})(\" + any_list + \")\\\\s+)|\" +\n          // m[3] = cont\n          \"(^\" + indent_re + \"{0,\" + (depth-1) + \"}[ ]{0,4})\"\n        );\n      }\n      function expand_tab( input ) {\n        return input.replace( / {0,3}\\t/g, \"    \" );\n      }\n\n      // Add inline content `inline` to `li`. inline comes from processInline\n      // so is an array of content\n      function add(li, loose, inline, nl) {\n        if ( loose ) {\n          li.push( [ \"para\" ].concat(inline) );\n          return;\n        }\n        // Hmmm, should this be any block level element or just paras?\n        var add_to = li[li.length -1] instanceof Array && li[li.length - 1][0] == \"para\"\n                   ? li[li.length -1]\n                   : li;\n\n        // If there is already some content in this list, add the new line in\n        if ( nl && li.length > 1 ) inline.unshift(nl);\n\n        for ( var i = 0; i < inline.length; i++ ) {\n          var what = inline[i],\n              is_str = typeof what == \"string\";\n          if ( is_str && add_to.length > 1 && typeof add_to[add_to.length-1] == \"string\" ) {\n            add_to[ add_to.length-1 ] += what;\n          }\n          else {\n            add_to.push( what );\n          }\n        }\n      }\n\n      // contained means have an indent greater than the current one. On\n      // *every* line in the block\n      function get_contained_blocks( depth, blocks ) {\n\n        var re = new RegExp( \"^(\" + indent_re + \"{\" + depth + \"}.*?\\\\n?)*$\" ),\n            replace = new RegExp(\"^\" + indent_re + \"{\" + depth + \"}\", \"gm\"),\n            ret = [];\n\n        while ( blocks.length > 0 ) {\n          if ( re.exec( blocks[0] ) ) {\n            var b = blocks.shift(),\n                // Now remove that indent\n                x = b.replace( replace, \"\");\n\n            ret.push( mk_block( x, b.trailing, b.lineNumber ) );\n          }\n          else {\n            break;\n          }\n        }\n        return ret;\n      }\n\n      // passed to stack.forEach to turn list items up the stack into paras\n      function paragraphify(s, i, stack) {\n        var list = s.list;\n        var last_li = list[list.length-1];\n\n        if ( last_li[1] instanceof Array && last_li[1][0] == \"para\" ) {\n          return;\n        }\n        if ( i + 1 == stack.length ) {\n          // Last stack frame\n          // Keep the same array, but replace the contents\n          last_li.push( [\"para\"].concat( last_li.splice(1, last_li.length - 1) ) );\n        }\n        else {\n          var sublist = last_li.pop();\n          last_li.push( [\"para\"].concat( last_li.splice(1, last_li.length - 1) ), sublist );\n        }\n      }\n\n      // The matcher function\n      return function( block, next ) {\n        var m = block.match( is_list_re );\n        if ( !m ) return undefined;\n\n        function make_list( m ) {\n          var list = bullet_list.exec( m[2] )\n                   ? [\"bulletlist\"]\n                   : [\"numberlist\"];\n\n          stack.push( { list: list, indent: m[1] } );\n          return list;\n        }\n\n\n        var stack = [], // Stack of lists for nesting.\n            list = make_list( m ),\n            last_li,\n            loose = false,\n            ret = [ stack[0].list ],\n            i;\n\n        // Loop to search over block looking for inner block elements and loose lists\n        loose_search:\n        while ( true ) {\n          // Split into lines preserving new lines at end of line\n          var lines = block.split( /(?=\\n)/ );\n\n          // We have to grab all lines for a li and call processInline on them\n          // once as there are some inline things that can span lines.\n          var li_accumulate = \"\";\n\n          // Loop over the lines in this block looking for tight lists.\n          tight_search:\n          for ( var line_no = 0; line_no < lines.length; line_no++ ) {\n            var nl = \"\",\n                l = lines[line_no].replace(/^\\n/, function(n) { nl = n; return \"\"; });\n\n            // TODO: really should cache this\n            var line_re = regex_for_depth( stack.length );\n\n            m = l.match( line_re );\n            //print( \"line:\", uneval(l), \"\\nline match:\", uneval(m) );\n\n            // We have a list item\n            if ( m[1] !== undefined ) {\n              // Process the previous list item, if any\n              if ( li_accumulate.length ) {\n                add( last_li, loose, this.processInline( li_accumulate ), nl );\n                // Loose mode will have been dealt with. Reset it\n                loose = false;\n                li_accumulate = \"\";\n              }\n\n              m[1] = expand_tab( m[1] );\n              var wanted_depth = Math.floor(m[1].length/4)+1;\n              //print( \"want:\", wanted_depth, \"stack:\", stack.length);\n              if ( wanted_depth > stack.length ) {\n                // Deep enough for a nested list outright\n                //print ( \"new nested list\" );\n                list = make_list( m );\n                last_li.push( list );\n                last_li = list[1] = [ \"listitem\" ];\n              }\n              else {\n                // We aren't deep enough to be strictly a new level. This is\n                // where Md.pl goes nuts. If the indent matches a level in the\n                // stack, put it there, else put it one deeper then the\n                // wanted_depth deserves.\n                var found = false;\n                for ( i = 0; i < stack.length; i++ ) {\n                  if ( stack[ i ].indent != m[1] ) continue;\n                  list = stack[ i ].list;\n                  stack.splice( i+1, stack.length - (i+1) );\n                  found = true;\n                  break;\n                }\n\n                if (!found) {\n                  //print(\"not found. l:\", uneval(l));\n                  wanted_depth++;\n                  if ( wanted_depth <= stack.length ) {\n                    stack.splice(wanted_depth, stack.length - wanted_depth);\n                    //print(\"Desired depth now\", wanted_depth, \"stack:\", stack.length);\n                    list = stack[wanted_depth-1].list;\n                    //print(\"list:\", uneval(list) );\n                  }\n                  else {\n                    //print (\"made new stack for messy indent\");\n                    list = make_list(m);\n                    last_li.push(list);\n                  }\n                }\n\n                //print( uneval(list), \"last\", list === stack[stack.length-1].list );\n                last_li = [ \"listitem\" ];\n                list.push(last_li);\n              } // end depth of shenegains\n              nl = \"\";\n            }\n\n            // Add content\n            if ( l.length > m[0].length ) {\n              li_accumulate += nl + l.substr( m[0].length );\n            }\n          } // tight_search\n\n          if ( li_accumulate.length ) {\n            add( last_li, loose, this.processInline( li_accumulate ), nl );\n            // Loose mode will have been dealt with. Reset it\n            loose = false;\n            li_accumulate = \"\";\n          }\n\n          // Look at the next block - we might have a loose list. Or an extra\n          // paragraph for the current li\n          var contained = get_contained_blocks( stack.length, next );\n\n          // Deal with code blocks or properly nested lists\n          if ( contained.length > 0 ) {\n            // Make sure all listitems up the stack are paragraphs\n            forEach( stack, paragraphify, this);\n\n            last_li.push.apply( last_li, this.toTree( contained, [] ) );\n          }\n\n          var next_block = next[0] && next[0].valueOf() || \"\";\n\n          if ( next_block.match(is_list_re) || next_block.match( /^ / ) ) {\n            block = next.shift();\n\n            // Check for an HR following a list: features/lists/hr_abutting\n            var hr = this.dialect.block.horizRule( block, next );\n\n            if ( hr ) {\n              ret.push.apply(ret, hr);\n              break;\n            }\n\n            // Make sure all listitems up the stack are paragraphs\n            forEach( stack, paragraphify, this);\n\n            loose = true;\n            continue loose_search;\n          }\n          break;\n        } // loose_search\n\n        return ret;\n      };\n    })(),\n\n    blockquote: function blockquote( block, next ) {\n      if ( !block.match( /^>/m ) )\n        return undefined;\n\n      var jsonml = [];\n\n      // separate out the leading abutting block, if any. I.e. in this case:\n      //\n      //  a\n      //  > b\n      //\n      if ( block[ 0 ] != \">\" ) {\n        var lines = block.split( /\\n/ ),\n            prev = [],\n            line_no = block.lineNumber;\n\n        // keep shifting lines until you find a crotchet\n        while ( lines.length && lines[ 0 ][ 0 ] != \">\" ) {\n            prev.push( lines.shift() );\n            line_no++;\n        }\n\n        var abutting = mk_block( prev.join( \"\\n\" ), \"\\n\", block.lineNumber );\n        jsonml.push.apply( jsonml, this.processBlock( abutting, [] ) );\n        // reassemble new block of just block quotes!\n        block = mk_block( lines.join( \"\\n\" ), block.trailing, line_no );\n      }\n\n\n      // if the next block is also a blockquote merge it in\n      while ( next.length && next[ 0 ][ 0 ] == \">\" ) {\n        var b = next.shift();\n        block = mk_block( block + block.trailing + b, b.trailing, block.lineNumber );\n      }\n\n      // Strip off the leading \"> \" and re-process as a block.\n      var input = block.replace( /^> ?/gm, \"\" ),\n          old_tree = this.tree,\n          processedBlock = this.toTree( input, [ \"blockquote\" ] ),\n          attr = extract_attr( processedBlock );\n\n      // If any link references were found get rid of them\n      if ( attr && attr.references ) {\n        delete attr.references;\n        // And then remove the attribute object if it's empty\n        if ( isEmpty( attr ) ) {\n          processedBlock.splice( 1, 1 );\n        }\n      }\n\n      jsonml.push( processedBlock );\n      return jsonml;\n    },\n\n    referenceDefn: function referenceDefn( block, next) {\n      var re = /^\\s*\\[(.*?)\\]:\\s*(\\S+)(?:\\s+(?:(['\"])(.*?)\\3|\\((.*?)\\)))?\\n?/;\n      // interesting matches are [ , ref_id, url, , title, title ]\n\n      if ( !block.match(re) )\n        return undefined;\n\n      // make an attribute node if it doesn't exist\n      if ( !extract_attr( this.tree ) ) {\n        this.tree.splice( 1, 0, {} );\n      }\n\n      var attrs = extract_attr( this.tree );\n\n      // make a references hash if it doesn't exist\n      if ( attrs.references === undefined ) {\n        attrs.references = {};\n      }\n\n      var b = this.loop_re_over_block(re, block, function( m ) {\n\n        if ( m[2] && m[2][0] == \"<\" && m[2][m[2].length-1] == \">\" )\n          m[2] = m[2].substring( 1, m[2].length - 1 );\n\n        var ref = attrs.references[ m[1].toLowerCase() ] = {\n          href: m[2]\n        };\n\n        if ( m[4] !== undefined )\n          ref.title = m[4];\n        else if ( m[5] !== undefined )\n          ref.title = m[5];\n\n      } );\n\n      if ( b.length )\n        next.unshift( mk_block( b, block.trailing ) );\n\n      return [];\n    },\n\n    para: function para( block, next ) {\n      // everything's a para!\n      return [ [\"para\"].concat( this.processInline( block ) ) ];\n    }\n  }\n};\n\nMarkdown.dialects.Gruber.inline = {\n\n    __oneElement__: function oneElement( text, patterns_or_re, previous_nodes ) {\n      var m,\n          res,\n          lastIndex = 0;\n\n      patterns_or_re = patterns_or_re || this.dialect.inline.__patterns__;\n      var re = new RegExp( \"([\\\\s\\\\S]*?)(\" + (patterns_or_re.source || patterns_or_re) + \")\" );\n\n      m = re.exec( text );\n      if (!m) {\n        // Just boring text\n        return [ text.length, text ];\n      }\n      else if ( m[1] ) {\n        // Some un-interesting text matched. Return that first\n        return [ m[1].length, m[1] ];\n      }\n\n      var res;\n      if ( m[2] in this.dialect.inline ) {\n        res = this.dialect.inline[ m[2] ].call(\n                  this,\n                  text.substr( m.index ), m, previous_nodes || [] );\n      }\n      // Default for now to make dev easier. just slurp special and output it.\n      res = res || [ m[2].length, m[2] ];\n      return res;\n    },\n\n    __call__: function inline( text, patterns ) {\n\n      var out = [],\n          res;\n\n      function add(x) {\n        //D:self.debug(\"  adding output\", uneval(x));\n        if ( typeof x == \"string\" && typeof out[out.length-1] == \"string\" )\n          out[ out.length-1 ] += x;\n        else\n          out.push(x);\n      }\n\n      while ( text.length > 0 ) {\n        res = this.dialect.inline.__oneElement__.call(this, text, patterns, out );\n        text = text.substr( res.shift() );\n        forEach(res, add )\n      }\n\n      return out;\n    },\n\n    // These characters are intersting elsewhere, so have rules for them so that\n    // chunks of plain text blocks don't include them\n    \"]\": function () {},\n    \"}\": function () {},\n\n    __escape__ : /^\\\\[\\\\`\\*_{}\\[\\]()#\\+.!\\-]/,\n\n    \"\\\\\": function escaped( text ) {\n      // [ length of input processed, node/children to add... ]\n      // Only esacape: \\ ` * _ { } [ ] ( ) # * + - . !\n      if ( this.dialect.inline.__escape__.exec( text ) )\n        return [ 2, text.charAt( 1 ) ];\n      else\n        // Not an esacpe\n        return [ 1, \"\\\\\" ];\n    },\n\n    \"![\": function image( text ) {\n\n      // Unlike images, alt text is plain text only. no other elements are\n      // allowed in there\n\n      // ![Alt text](/path/to/img.jpg \"Optional title\")\n      //      1          2            3       4         <--- captures\n      var m = text.match( /^!\\[(.*?)\\][ \\t]*\\([ \\t]*([^\")]*?)(?:[ \\t]+([\"'])(.*?)\\3)?[ \\t]*\\)/ );\n\n      if ( m ) {\n        if ( m[2] && m[2][0] == \"<\" && m[2][m[2].length-1] == \">\" )\n          m[2] = m[2].substring( 1, m[2].length - 1 );\n\n        m[2] = this.dialect.inline.__call__.call( this, m[2], /\\\\/ )[0];\n\n        var attrs = { alt: m[1], href: m[2] || \"\" };\n        if ( m[4] !== undefined)\n          attrs.title = m[4];\n\n        return [ m[0].length, [ \"img\", attrs ] ];\n      }\n\n      // ![Alt text][id]\n      m = text.match( /^!\\[(.*?)\\][ \\t]*\\[(.*?)\\]/ );\n\n      if ( m ) {\n        // We can't check if the reference is known here as it likely wont be\n        // found till after. Check it in md tree->hmtl tree conversion\n        return [ m[0].length, [ \"img_ref\", { alt: m[1], ref: m[2].toLowerCase(), original: m[0] } ] ];\n      }\n\n      // Just consume the '!['\n      return [ 2, \"![\" ];\n    },\n\n    \"[\": function link( text ) {\n\n      var orig = String(text);\n      // Inline content is possible inside `link text`\n      var res = Markdown.DialectHelpers.inline_until_char.call( this, text.substr(1), \"]\" );\n\n      // No closing ']' found. Just consume the [\n      if ( !res ) return [ 1, \"[\" ];\n\n      var consumed = 1 + res[ 0 ],\n          children = res[ 1 ],\n          link,\n          attrs;\n\n      // At this point the first [...] has been parsed. See what follows to find\n      // out which kind of link we are (reference or direct url)\n      text = text.substr( consumed );\n\n      // [link text](/path/to/img.jpg \"Optional title\")\n      //                 1            2       3         <--- captures\n      // This will capture up to the last paren in the block. We then pull\n      // back based on if there a matching ones in the url\n      //    ([here](/url/(test))\n      // The parens have to be balanced\n      var m = text.match( /^\\s*\\([ \\t]*([^\"']*)(?:[ \\t]+([\"'])(.*?)\\2)?[ \\t]*\\)/ );\n      if ( m ) {\n        var url = m[1];\n        consumed += m[0].length;\n\n        if ( url && url[0] == \"<\" && url[url.length-1] == \">\" )\n          url = url.substring( 1, url.length - 1 );\n\n        // If there is a title we don't have to worry about parens in the url\n        if ( !m[3] ) {\n          var open_parens = 1; // One open that isn't in the capture\n          for ( var len = 0; len < url.length; len++ ) {\n            switch ( url[len] ) {\n            case \"(\":\n              open_parens++;\n              break;\n            case \")\":\n              if ( --open_parens == 0) {\n                consumed -= url.length - len;\n                url = url.substring(0, len);\n              }\n              break;\n            }\n          }\n        }\n\n        // Process escapes only\n        url = this.dialect.inline.__call__.call( this, url, /\\\\/ )[0];\n\n        attrs = { href: url || \"\" };\n        if ( m[3] !== undefined)\n          attrs.title = m[3];\n\n        link = [ \"link\", attrs ].concat( children );\n        return [ consumed, link ];\n      }\n\n      // [Alt text][id]\n      // [Alt text] [id]\n      m = text.match( /^\\s*\\[(.*?)\\]/ );\n\n      if ( m ) {\n\n        consumed += m[ 0 ].length;\n\n        // [links][] uses links as its reference\n        attrs = { ref: ( m[ 1 ] || String(children) ).toLowerCase(),  original: orig.substr( 0, consumed ) };\n\n        link = [ \"link_ref\", attrs ].concat( children );\n\n        // We can't check if the reference is known here as it likely wont be\n        // found till after. Check it in md tree->hmtl tree conversion.\n        // Store the original so that conversion can revert if the ref isn't found.\n        return [ consumed, link ];\n      }\n\n      // [id]\n      // Only if id is plain (no formatting.)\n      if ( children.length == 1 && typeof children[0] == \"string\" ) {\n\n        attrs = { ref: children[0].toLowerCase(),  original: orig.substr( 0, consumed ) };\n        link = [ \"link_ref\", attrs, children[0] ];\n        return [ consumed, link ];\n      }\n\n      // Just consume the \"[\"\n      return [ 1, \"[\" ];\n    },\n\n\n    \"<\": function autoLink( text ) {\n      var m;\n\n      if ( ( m = text.match( /^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\\.[a-zA-Z]+))>/ ) ) != null ) {\n        if ( m[3] ) {\n          return [ m[0].length, [ \"link\", { href: \"mailto:\" + m[3] }, m[3] ] ];\n\n        }\n        else if ( m[2] == \"mailto\" ) {\n          return [ m[0].length, [ \"link\", { href: m[1] }, m[1].substr(\"mailto:\".length ) ] ];\n        }\n        else\n          return [ m[0].length, [ \"link\", { href: m[1] }, m[1] ] ];\n      }\n\n      return [ 1, \"<\" ];\n    },\n\n    \"`\": function inlineCode( text ) {\n      // Inline code block. as many backticks as you like to start it\n      // Always skip over the opening ticks.\n      var m = text.match( /(`+)(([\\s\\S]*?)\\1)/ );\n\n      if ( m && m[2] )\n        return [ m[1].length + m[2].length, [ \"inlinecode\", m[3] ] ];\n      else {\n        // TODO: No matching end code found - warn!\n        return [ 1, \"`\" ];\n      }\n    },\n    \"~~\": function del_block( text ) {\n      var m = text.match( /(~~)(([\\s\\S]*?)\\1)/ );\n      if ( m && m[2] )\n        return [ m[1].length + m[2].length, [ \"del_block\", m[3] ] ];\n      else {\n        // TODO: No matching end code found - warn!\n        return [ 2, \"~~\" ];\n      }\n    },\n\n    \"  \\n\": function lineBreak( text ) {\n      return [ 3, [ \"linebreak\" ] ];\n    }\n\n};\n\n// Meta Helper/generator method for em and strong handling\nfunction strong_em( tag, md ) {\n\n  var state_slot = tag + \"_state\",\n      other_slot = tag == \"strong\" ? \"em_state\" : \"strong_state\";\n\n  function CloseTag(len) {\n    this.len_after = len;\n    this.name = \"close_\" + md;\n  }\n\n  return function ( text, orig_match ) {\n\n    if ( this[state_slot][0] == md ) {\n      // Most recent em is of this type\n      //D:this.debug(\"closing\", md);\n      this[state_slot].shift();\n\n      // \"Consume\" everything to go back to the recrusion in the else-block below\n      return[ text.length, new CloseTag(text.length-md.length) ];\n    }\n    else {\n      // Store a clone of the em/strong states\n      var other = this[other_slot].slice(),\n          state = this[state_slot].slice();\n\n      this[state_slot].unshift(md);\n\n      //D:this.debug_indent += \"  \";\n\n      // Recurse\n      var res = this.processInline( text.substr( md.length ) );\n      //D:this.debug_indent = this.debug_indent.substr(2);\n\n      var last = res[res.length - 1];\n\n      //D:this.debug(\"processInline from\", tag + \": \", uneval( res ) );\n\n      var check = this[state_slot].shift();\n      if ( last instanceof CloseTag ) {\n        res.pop();\n        // We matched! Huzzah.\n        var consumed = text.length - last.len_after;\n        return [ consumed, [ tag ].concat(res) ];\n      }\n      else {\n        // Restore the state of the other kind. We might have mistakenly closed it.\n        this[other_slot] = other;\n        this[state_slot] = state;\n\n        // We can't reuse the processed result as it could have wrong parsing contexts in it.\n        return [ md.length, md ];\n      }\n    }\n  }; // End returned function\n}\n\nMarkdown.dialects.Gruber.inline[\"**\"] = strong_em(\"strong\", \"**\");\nMarkdown.dialects.Gruber.inline[\"__\"] = strong_em(\"strong\", \"__\");\nMarkdown.dialects.Gruber.inline[\"*\"]  = strong_em(\"em\", \"*\");\nMarkdown.dialects.Gruber.inline[\"_\"]  = strong_em(\"em\", \"_\");\n\n\n// Build default order from insertion order.\nMarkdown.buildBlockOrder = function(d) {\n  var ord = [];\n  for ( var i in d ) {\n    if ( i == \"__order__\" || i == \"__call__\" ) continue;\n    ord.push( i );\n  }\n  d.__order__ = ord;\n};\n\n// Build patterns for inline matcher\nMarkdown.buildInlinePatterns = function(d) {\n  var patterns = [];\n\n  for ( var i in d ) {\n    // __foo__ is reserved and not a pattern\n    if ( i.match( /^__.*__$/) ) continue;\n    var l = i.replace( /([\\\\.*+?|()\\[\\]{}])/g, \"\\\\$1\" )\n             .replace( /\\n/, \"\\\\n\" );\n    patterns.push( i.length == 1 ? l : \"(?:\" + l + \")\" );\n  }\n\n  patterns = patterns.join(\"|\");\n  d.__patterns__ = patterns;\n  //print(\"patterns:\", uneval( patterns ) );\n\n  var fn = d.__call__;\n  d.__call__ = function(text, pattern) {\n    if ( pattern != undefined ) {\n      return fn.call(this, text, pattern);\n    }\n    else\n    {\n      return fn.call(this, text, patterns);\n    }\n  };\n};\n\nMarkdown.DialectHelpers = {};\nMarkdown.DialectHelpers.inline_until_char = function( text, want ) {\n  var consumed = 0,\n      nodes = [];\n\n  while ( true ) {\n    if ( text.charAt( consumed ) == want ) {\n      // Found the character we were looking for\n      consumed++;\n      return [ consumed, nodes ];\n    }\n\n    if ( consumed >= text.length ) {\n      // No closing char found. Abort.\n      return null;\n    }\n\n    var res = this.dialect.inline.__oneElement__.call(this, text.substr( consumed ) );\n    consumed += res[ 0 ];\n    // Add any returned nodes.\n    nodes.push.apply( nodes, res.slice( 1 ) );\n  }\n}\n\n// Helper function to make sub-classing a dialect easier\nMarkdown.subclassDialect = function( d ) {\n  function Block() {}\n  Block.prototype = d.block;\n  function Inline() {}\n  Inline.prototype = d.inline;\n\n  return { block: new Block(), inline: new Inline() };\n};\n\nMarkdown.buildBlockOrder ( Markdown.dialects.Gruber.block );\nMarkdown.buildInlinePatterns( Markdown.dialects.Gruber.inline );\n\nMarkdown.dialects.Maruku = Markdown.subclassDialect( Markdown.dialects.Gruber );\n\nMarkdown.dialects.Maruku.processMetaHash = function processMetaHash( meta_string ) {\n  var meta = split_meta_hash( meta_string ),\n      attr = {};\n\n  for ( var i = 0; i < meta.length; ++i ) {\n    // id: #foo\n    if ( /^#/.test( meta[ i ] ) ) {\n      attr.id = meta[ i ].substring( 1 );\n    }\n    // class: .foo\n    else if ( /^\\./.test( meta[ i ] ) ) {\n      // if class already exists, append the new one\n      if ( attr[\"class\"] ) {\n        attr[\"class\"] = attr[\"class\"] + meta[ i ].replace( /./, \" \" );\n      }\n      else {\n        attr[\"class\"] = meta[ i ].substring( 1 );\n      }\n    }\n    // attribute: foo=bar\n    else if ( /\\=/.test( meta[ i ] ) ) {\n      var s = meta[ i ].split( /\\=/ );\n      attr[ s[ 0 ] ] = s[ 1 ];\n    }\n  }\n\n  return attr;\n}\n\nfunction split_meta_hash( meta_string ) {\n  var meta = meta_string.split( \"\" ),\n      parts = [ \"\" ],\n      in_quotes = false;\n\n  while ( meta.length ) {\n    var letter = meta.shift();\n    switch ( letter ) {\n      case \" \" :\n        // if we're in a quoted section, keep it\n        if ( in_quotes ) {\n          parts[ parts.length - 1 ] += letter;\n        }\n        // otherwise make a new part\n        else {\n          parts.push( \"\" );\n        }\n        break;\n      case \"'\" :\n      case '\"' :\n        // reverse the quotes and move straight on\n        in_quotes = !in_quotes;\n        break;\n      case \"\\\\\" :\n        // shift off the next letter to be used straight away.\n        // it was escaped so we'll keep it whatever it is\n        letter = meta.shift();\n      default :\n        parts[ parts.length - 1 ] += letter;\n        break;\n    }\n  }\n\n  return parts;\n}\n\nMarkdown.dialects.Maruku.block.document_meta = function document_meta( block, next ) {\n  // we're only interested in the first block\n  if ( block.lineNumber > 1 ) return undefined;\n\n  // document_meta blocks consist of one or more lines of `Key: Value\\n`\n  if ( ! block.match( /^(?:\\w+:.*\\n)*\\w+:.*$/ ) ) return undefined;\n\n  // make an attribute node if it doesn't exist\n  if ( !extract_attr( this.tree ) ) {\n    this.tree.splice( 1, 0, {} );\n  }\n\n  var pairs = block.split( /\\n/ );\n  for ( p in pairs ) {\n    var m = pairs[ p ].match( /(\\w+):\\s*(.*)$/ ),\n        key = m[ 1 ].toLowerCase(),\n        value = m[ 2 ];\n\n    this.tree[ 1 ][ key ] = value;\n  }\n\n  // document_meta produces no content!\n  return [];\n};\n\nMarkdown.dialects.Maruku.block.block_meta = function block_meta( block, next ) {\n  // check if the last line of the block is an meta hash\n  var m = block.match( /(^|\\n) {0,3}\\{:\\s*((?:\\\\\\}|[^\\}])*)\\s*\\}$/ );\n  if ( !m ) return undefined;\n\n  // process the meta hash\n  var attr = this.dialect.processMetaHash( m[ 2 ] );\n\n  var hash;\n\n  // if we matched ^ then we need to apply meta to the previous block\n  if ( m[ 1 ] === \"\" ) {\n    var node = this.tree[ this.tree.length - 1 ];\n    hash = extract_attr( node );\n\n    // if the node is a string (rather than JsonML), bail\n    if ( typeof node === \"string\" ) return undefined;\n\n    // create the attribute hash if it doesn't exist\n    if ( !hash ) {\n      hash = {};\n      node.splice( 1, 0, hash );\n    }\n\n    // add the attributes in\n    for ( a in attr ) {\n      hash[ a ] = attr[ a ];\n    }\n\n    // return nothing so the meta hash is removed\n    return [];\n  }\n\n  // pull the meta hash off the block and process what's left\n  var b = block.replace( /\\n.*$/, \"\" ),\n      result = this.processBlock( b, [] );\n\n  // get or make the attributes hash\n  hash = extract_attr( result[ 0 ] );\n  if ( !hash ) {\n    hash = {};\n    result[ 0 ].splice( 1, 0, hash );\n  }\n\n  // attach the attributes to the block\n  for ( a in attr ) {\n    hash[ a ] = attr[ a ];\n  }\n\n  return result;\n};\n\nMarkdown.dialects.Maruku.block.definition_list = function definition_list( block, next ) {\n  // one or more terms followed by one or more definitions, in a single block\n  var tight = /^((?:[^\\s:].*\\n)+):\\s+([\\s\\S]+)$/,\n      list = [ \"dl\" ],\n      i, m;\n\n  // see if we're dealing with a tight or loose block\n  if ( ( m = block.match( tight ) ) ) {\n    // pull subsequent tight DL blocks out of `next`\n    var blocks = [ block ];\n    while ( next.length && tight.exec( next[ 0 ] ) ) {\n      blocks.push( next.shift() );\n    }\n\n    for ( var b = 0; b < blocks.length; ++b ) {\n      var m = blocks[ b ].match( tight ),\n          terms = m[ 1 ].replace( /\\n$/, \"\" ).split( /\\n/ ),\n          defns = m[ 2 ].split( /\\n:\\s+/ );\n\n      // print( uneval( m ) );\n\n      for ( i = 0; i < terms.length; ++i ) {\n        list.push( [ \"dt\", terms[ i ] ] );\n      }\n\n      for ( i = 0; i < defns.length; ++i ) {\n        // run inline processing over the definition\n        list.push( [ \"dd\" ].concat( this.processInline( defns[ i ].replace( /(\\n)\\s+/, \"$1\" ) ) ) );\n      }\n    }\n  }\n  else {\n    return undefined;\n  }\n\n  return [ list ];\n};\n\n// splits on unescaped instances of @ch. If @ch is not a character the result\n// can be unpredictable\n\nMarkdown.dialects.Maruku.block.table = function table (block, next) {\n\n    var _split_on_unescaped = function(s, ch) {\n        ch = ch || '\\\\s';\n        if (ch.match(/^[\\\\|\\[\\]{}?*.+^$]$/)) { ch = '\\\\' + ch; }\n        var res = [ ],\n            r = new RegExp('^((?:\\\\\\\\.|[^\\\\\\\\' + ch + '])*)' + ch + '(.*)'),\n            m;\n        while(m = s.match(r)) {\n            res.push(m[1]);\n            s = m[2];\n        }\n        res.push(s);\n        return res;\n    }\n\n    var leading_pipe = /^ {0,3}\\|(.+)\\n {0,3}\\|\\s*([\\-:]+[\\-| :]*)\\n((?:\\s*\\|.*(?:\\n|$))*)(?=\\n|$)/,\n        // find at least an unescaped pipe in each line\n        no_leading_pipe = /^ {0,3}(\\S(?:\\\\.|[^\\\\|])*\\|.*)\\n {0,3}([\\-:]+\\s*\\|[\\-| :]*)\\n((?:(?:\\\\.|[^\\\\|])*\\|.*(?:\\n|$))*)(?=\\n|$)/,\n        i, m;\n    if (m = block.match(leading_pipe)) {\n        // remove leading pipes in contents\n        // (header and horizontal rule already have the leading pipe left out)\n        m[3] = m[3].replace(/^\\s*\\|/gm, '');\n    } else if (! ( m = block.match(no_leading_pipe))) {\n        return undefined;\n    }\n\n    var table = [ \"table\", [ \"thead\", [ \"tr\" ] ], [ \"tbody\" ] ];\n\n    // remove trailing pipes, then split on pipes\n    // (no escaped pipes are allowed in horizontal rule)\n    m[2] = m[2].replace(/\\|\\s*$/, '').split('|');\n\n    // process alignment\n    var html_attrs = [ ];\n    forEach (m[2], function (s) {\n        if (s.match(/^\\s*-+:\\s*$/))       html_attrs.push({align: \"right\"});\n        else if (s.match(/^\\s*:-+\\s*$/))  html_attrs.push({align: \"left\"});\n        else if (s.match(/^\\s*:-+:\\s*$/)) html_attrs.push({align: \"center\"});\n        else                              html_attrs.push({});\n    });\n\n    // now for the header, avoid escaped pipes\n    m[1] = _split_on_unescaped(m[1].replace(/\\|\\s*$/, ''), '|');\n    for (i = 0; i < m[1].length; i++) {\n        table[1][1].push(['th', html_attrs[i] || {}].concat(\n            this.processInline(m[1][i].trim())));\n    }\n\n    // now for body contents\n    forEach (m[3].replace(/\\|\\s*$/mg, '').split('\\n'), function (row) {\n        var html_row = ['tr'];\n        row = _split_on_unescaped(row, '|');\n        for (i = 0; i < row.length; i++) {\n            html_row.push(['td', html_attrs[i] || {}].concat(this.processInline(row[i].trim())));\n        }\n        table[2].push(html_row);\n    }, this);\n\n    return [table];\n}\n\nMarkdown.dialects.Maruku.inline[ \"{:\" ] = function inline_meta( text, matches, out ) {\n  if ( !out.length ) {\n    return [ 2, \"{:\" ];\n  }\n\n  // get the preceeding element\n  var before = out[ out.length - 1 ];\n\n  if ( typeof before === \"string\" ) {\n    return [ 2, \"{:\" ];\n  }\n\n  // match a meta hash\n  var m = text.match( /^\\{:\\s*((?:\\\\\\}|[^\\}])*)\\s*\\}/ );\n\n  // no match, false alarm\n  if ( !m ) {\n    return [ 2, \"{:\" ];\n  }\n\n  // attach the attributes to the preceeding element\n  var meta = this.dialect.processMetaHash( m[ 1 ] ),\n      attr = extract_attr( before );\n\n  if ( !attr ) {\n    attr = {};\n    before.splice( 1, 0, attr );\n  }\n\n  for ( var k in meta ) {\n    attr[ k ] = meta[ k ];\n  }\n\n  // cut out the string and replace it with nothing\n  return [ m[ 0 ].length, \"\" ];\n};\n\nMarkdown.dialects.Maruku.inline.__escape__ = /^\\\\[\\\\`\\*_{}\\[\\]()#\\+.!\\-|:]/;\n\nMarkdown.buildBlockOrder ( Markdown.dialects.Maruku.block );\nMarkdown.buildInlinePatterns( Markdown.dialects.Maruku.inline );\n\nvar isArray = Array.isArray || function(obj) {\n  return Object.prototype.toString.call(obj) == \"[object Array]\";\n};\n\nvar forEach;\n// Don't mess with Array.prototype. Its not friendly\nif ( Array.prototype.forEach ) {\n  forEach = function( arr, cb, thisp ) {\n    return arr.forEach( cb, thisp );\n  };\n}\nelse {\n  forEach = function(arr, cb, thisp) {\n    for (var i = 0; i < arr.length; i++) {\n      cb.call(thisp || arr, arr[i], i, arr);\n    }\n  }\n}\n\nvar isEmpty = function( obj ) {\n  for ( var key in obj ) {\n    if ( hasOwnProperty.call( obj, key ) ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction extract_attr( jsonml ) {\n  return isArray(jsonml)\n      && jsonml.length > 1\n      && typeof jsonml[ 1 ] === \"object\"\n      && !( isArray(jsonml[ 1 ]) )\n      ? jsonml[ 1 ]\n      : undefined;\n}\n\n\n\n/**\n *  renderJsonML( jsonml[, options] ) -> String\n *  - jsonml (Array): JsonML array to render to XML\n *  - options (Object): options\n *\n *  Converts the given JsonML into well-formed XML.\n *\n *  The options currently understood are:\n *\n *  - root (Boolean): wether or not the root node should be included in the\n *    output, or just its children. The default `false` is to not include the\n *    root itself.\n */\nexpose.renderJsonML = function( jsonml, options ) {\n  options = options || {};\n  // include the root element in the rendered output?\n  options.root = options.root || false;\n\n  var content = [];\n\n  if ( options.root ) {\n    content.push( render_tree( jsonml ) );\n  }\n  else {\n    jsonml.shift(); // get rid of the tag\n    if ( jsonml.length && typeof jsonml[ 0 ] === \"object\" && !( jsonml[ 0 ] instanceof Array ) ) {\n      jsonml.shift(); // get rid of the attributes\n    }\n\n    while ( jsonml.length ) {\n      content.push( render_tree( jsonml.shift() ) );\n    }\n  }\n\n  return content.join( \"\\n\\n\" );\n};\n\nfunction escapeHTML( text ) {\n  return text.replace( /&/g, \"&amp;\" )\n             .replace( /</g, \"&lt;\" )\n             .replace( />/g, \"&gt;\" )\n             .replace( /\"/g, \"&quot;\" )\n             .replace( /'/g, \"&#39;\" );\n}\n\nfunction render_tree( jsonml ) {\n  // basic case\n  if ( typeof jsonml === \"string\" ) {\n    return escapeHTML( jsonml );\n  }\n\n  var tag = jsonml.shift(),\n      attributes = {},\n      content = [];\n\n  if ( jsonml.length && typeof jsonml[ 0 ] === \"object\" && !( jsonml[ 0 ] instanceof Array ) ) {\n    attributes = jsonml.shift();\n  }\n\n  while ( jsonml.length ) {\n    content.push( render_tree( jsonml.shift() ) );\n  }\n\n  var tag_attrs = \"\";\n  for ( var a in attributes ) {\n    tag_attrs += \" \" + a + '=\"' + escapeHTML( attributes[ a ] ) + '\"';\n  }\n\n  // be careful about adding whitespace here for inline elements\n  if ( tag == \"img\" || tag == \"br\" || tag == \"hr\" ) {\n    return \"<\"+ tag + tag_attrs + \"/>\";\n  }\n  else {\n    return \"<\"+ tag + tag_attrs + \">\" + content.join( \"\" ) + \"</\" + tag + \">\";\n  }\n}\n\nfunction convert_tree_to_html( tree, references, options ) {\n  var i;\n  options = options || {};\n\n  // shallow clone\n  var jsonml = tree.slice( 0 );\n\n  if ( typeof options.preprocessTreeNode === \"function\" ) {\n      jsonml = options.preprocessTreeNode(jsonml, references);\n  }\n\n  // Clone attributes if they exist\n  var attrs = extract_attr( jsonml );\n  if ( attrs ) {\n    jsonml[ 1 ] = {};\n    for ( i in attrs ) {\n      jsonml[ 1 ][ i ] = attrs[ i ];\n    }\n    attrs = jsonml[ 1 ];\n  }\n\n  // basic case\n  if ( typeof jsonml === \"string\" ) {\n    return jsonml;\n  }\n\n  // convert this node\n  switch ( jsonml[ 0 ] ) {\n    case \"header\":\n      jsonml[ 0 ] = \"h\" + jsonml[ 1 ].level;\n      delete jsonml[ 1 ].level;\n      break;\n    case \"bulletlist\":\n      jsonml[ 0 ] = \"ul\";\n      break;\n    case \"numberlist\":\n      jsonml[ 0 ] = \"ol\";\n      break;\n    case \"listitem\":\n      jsonml[ 0 ] = \"li\";\n      break;\n    case \"para\":\n      jsonml[ 0 ] = \"p\";\n      break;\n    case \"markdown\":\n      jsonml[ 0 ] = \"html\";\n      if ( attrs ) delete attrs.references;\n      break;\n    case \"code_block\":\n      jsonml[ 0 ] = \"pre\";\n      i = attrs ? 2 : 1;\n      var code = [ \"code\" ];\n      code.push.apply( code, jsonml.splice( i, jsonml.length - i ) );\n      jsonml[ i ] = code;\n      break;\n    case \"inlinecode\":\n      jsonml[ 0 ] = \"code\";\n      break;\n    case \"del_block\":\n      jsonml[ 0 ] = \"del\";\n      break;\n    case \"img\":\n      jsonml[ 1 ].src = jsonml[ 1 ].href;\n      delete jsonml[ 1 ].href;\n      break;\n    case \"linebreak\":\n      jsonml[ 0 ] = \"br\";\n    break;\n    case \"link\":\n      jsonml[ 0 ] = \"a\";\n      break;\n    case \"link_ref\":\n      jsonml[ 0 ] = \"a\";\n\n      // grab this ref and clean up the attribute node\n      var ref = references[ attrs.ref ];\n\n      // if the reference exists, make the link\n      if ( ref ) {\n        delete attrs.ref;\n\n        // add in the href and title, if present\n        attrs.href = ref.href;\n        if ( ref.title ) {\n          attrs.title = ref.title;\n        }\n\n        // get rid of the unneeded original text\n        delete attrs.original;\n      }\n      // the reference doesn't exist, so revert to plain text\n      else {\n        return attrs.original;\n      }\n      break;\n    case \"img_ref\":\n      jsonml[ 0 ] = \"img\";\n\n      // grab this ref and clean up the attribute node\n      var ref = references[ attrs.ref ];\n\n      // if the reference exists, make the link\n      if ( ref ) {\n        delete attrs.ref;\n\n        // add in the href and title, if present\n        attrs.src = ref.href;\n        if ( ref.title ) {\n          attrs.title = ref.title;\n        }\n\n        // get rid of the unneeded original text\n        delete attrs.original;\n      }\n      // the reference doesn't exist, so revert to plain text\n      else {\n        return attrs.original;\n      }\n      break;\n  }\n\n  // convert all the children\n  i = 1;\n\n  // deal with the attribute node, if it exists\n  if ( attrs ) {\n    // if there are keys, skip over it\n    for ( var key in jsonml[ 1 ] ) {\n        i = 2;\n        break;\n    }\n    // if there aren't, remove it\n    if ( i === 1 ) {\n      jsonml.splice( i, 1 );\n    }\n  }\n\n  for ( ; i < jsonml.length; ++i ) {\n    jsonml[ i ] = convert_tree_to_html( jsonml[ i ], references, options );\n  }\n\n  return jsonml;\n}\n\n\n// merges adjacent text nodes into a single node\nfunction merge_text_nodes( jsonml ) {\n  // skip the tag name and attribute hash\n  var i = extract_attr( jsonml ) ? 2 : 1;\n\n  while ( i < jsonml.length ) {\n    // if it's a string check the next item too\n    if ( typeof jsonml[ i ] === \"string\" ) {\n      if ( i + 1 < jsonml.length && typeof jsonml[ i + 1 ] === \"string\" ) {\n        // merge the second string into the first and remove it\n        jsonml[ i ] += jsonml.splice( i + 1, 1 )[ 0 ];\n      }\n      else {\n        ++i;\n      }\n    }\n    // if it's not a string recurse\n    else {\n      merge_text_nodes( jsonml[ i ] );\n      ++i;\n    }\n  }\n}\n\n} )( (function() {\n  if ( typeof exports === \"undefined\" ) {\n    window.markdown = {};\n    return window.markdown;\n  }\n  else {\n    return exports;\n  }\n} )() );\n"
  },
  {
    "path": "static/js/markdown/to-markdown.js",
    "content": "/*\n * to-markdown - an HTML to Markdown converter\n *\n * Copyright 2011, Dom Christie\n * Licenced under the MIT licence\n *\n */\n\nvar toMarkdown = function(string) {\n  \n  var ELEMENTS = [\n    {\n      patterns: 'p',\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '\\n\\n' + innerHTML + '\\n' : '';\n      }\n    },\n    {\n      patterns: 'br',\n      type: 'void',\n      replacement: '\\n'\n    },\n    {\n      patterns: 'h([1-6])',\n      replacement: function(str, hLevel, attrs, innerHTML) {\n        var hPrefix = '';\n        for(var i = 0; i < hLevel; i++) {\n          hPrefix += '#';\n        }\n        return '\\n\\n' + hPrefix + ' ' + innerHTML + '\\n';\n      }\n    },\n    {\n      patterns: 'hr',\n      type: 'void',\n      replacement: '\\n\\n* * *\\n'\n    },\n    {\n      patterns: 'a',\n      replacement: function(str, attrs, innerHTML) {\n        var href = attrs.match(attrRegExp('href')),\n            title = attrs.match(attrRegExp('title'));\n        return href ? '[' + innerHTML + ']' + '(' + href[1] + (title && title[1] ? ' \"' + title[1] + '\"' : '') + ')' : str;\n      }\n    },\n    {\n      patterns: ['b', 'strong'],\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '**' + innerHTML + '**' : '';\n      }\n    },\n    {\n      patterns: ['i', 'em'],\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '_' + innerHTML + '_' : '';\n      }\n    },\n    {\n      patterns: 'code',\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '`' + innerHTML + '`' : '';\n      }\n    },\n    {\n      patterns: 'img',\n      type: 'void',\n      replacement: function(str, attrs, innerHTML) {\n        var src = attrs.match(attrRegExp('src')),\n            alt = attrs.match(attrRegExp('alt')),\n            title = attrs.match(attrRegExp('title'));\n        return '![' + (alt && alt[1] ? alt[1] : '') + ']' + '(' + src[1] + (title && title[1] ? ' \"' + title[1] + '\"' : '') + ')';\n      }\n    }\n  ];\n  \n  for(var i = 0, len = ELEMENTS.length; i < len; i++) {\n    if(typeof ELEMENTS[i].patterns === 'string') {\n      string = replaceEls(string, { tag: ELEMENTS[i].patterns, replacement: ELEMENTS[i].replacement, type:  ELEMENTS[i].type });\n    }\n    else {\n      for(var j = 0, pLen = ELEMENTS[i].patterns.length; j < pLen; j++) {\n        string = replaceEls(string, { tag: ELEMENTS[i].patterns[j], replacement: ELEMENTS[i].replacement, type:  ELEMENTS[i].type });\n      }\n    }\n  }\n  \n  function replaceEls(html, elProperties) {\n    var pattern = elProperties.type === 'void' ? '<' + elProperties.tag + '\\\\b([^>]*)\\\\/?>' : '<' + elProperties.tag + '\\\\b([^>]*)>([\\\\s\\\\S]*?)<\\\\/' + elProperties.tag + '>',\n        regex = new RegExp(pattern, 'gi'),\n        markdown = '';\n    if(typeof elProperties.replacement === 'string') {\n      markdown = html.replace(regex, elProperties.replacement);\n    }\n    else {\n      markdown = html.replace(regex, function(str, p1, p2, p3) {\n        return elProperties.replacement.call(this, str, p1, p2, p3);\n      });\n    }\n    return markdown;\n  }\n  \n  function attrRegExp(attr) {\n    return new RegExp(attr + '\\\\s*=\\\\s*[\"\\']?([^\"\\']*)[\"\\']?', 'i');\n  }\n  \n  // Pre code blocks\n  \n  string = string.replace(/<pre\\b[^>]*>`([\\s\\S]*)`<\\/pre>/gi, function(str, innerHTML) {\n    innerHTML = innerHTML.replace(/^\\t+/g, '  '); // convert tabs to spaces (you know it makes sense)\n    innerHTML = innerHTML.replace(/\\n/g, '\\n    ');\n    return '\\n\\n    ' + innerHTML + '\\n';\n  });\n  \n  // Lists\n\n  // Escape numbers that could trigger an ol\n  // If there are more than three spaces before the code, it would be in a pre tag\n  // Make sure we are escaping the period not matching any character\n  string = string.replace(/^(\\s{0,3}\\d+)\\. /g, '$1\\\\. ');\n  \n  // Converts lists that have no child lists (of same type) first, then works it's way up\n  var noChildrenRegex = /<(ul|ol)\\b[^>]*>(?:(?!<ul|<ol)[\\s\\S])*?<\\/\\1>/gi;\n  while(string.match(noChildrenRegex)) {\n    string = string.replace(noChildrenRegex, function(str) {\n      return replaceLists(str);\n    });\n  }\n  \n  function replaceLists(html) {\n    \n    html = html.replace(/<(ul|ol)\\b[^>]*>([\\s\\S]*?)<\\/\\1>/gi, function(str, listType, innerHTML) {\n      var lis = innerHTML.split('</li>');\n      lis.splice(lis.length - 1, 1);\n      \n      for(i = 0, len = lis.length; i < len; i++) {\n        if(lis[i]) {\n          var prefix = (listType === 'ol') ? (i + 1) + \".  \" : \"*   \";\n          lis[i] = lis[i].replace(/\\s*<li[^>]*>([\\s\\S]*)/i, function(str, innerHTML) {\n            \n            innerHTML = innerHTML.replace(/^\\s+/, '');\n            innerHTML = innerHTML.replace(/\\n\\n/g, '\\n\\n    ');\n            // indent nested lists\n            innerHTML = innerHTML.replace(/\\n([ ]*)+(\\*|\\d+\\.) /g, '\\n$1    $2 ');\n            return prefix + innerHTML;\n          });\n        }\n      }\n      return lis.join('\\n');\n    });\n    return '\\n\\n' + html.replace(/[ \\t]+\\n|\\s+$/g, '');\n  }\n  \n  // Blockquotes\n  var deepest = /<blockquote\\b[^>]*>((?:(?!<blockquote)[\\s\\S])*?)<\\/blockquote>/gi;\n  while(string.match(deepest)) {\n    string = string.replace(deepest, function(str) {\n      return replaceBlockquotes(str);\n    });\n  }\n  \n  function replaceBlockquotes(html) {\n    html = html.replace(/<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, function(str, inner) {\n      inner = inner.replace(/^\\s+|\\s+$/g, '');\n      inner = cleanUp(inner);\n      inner = inner.replace(/^/gm, '> ');\n      inner = inner.replace(/^(>([ \\t]{2,}>)+)/gm, '> >');\n      return inner;\n    });\n    return html;\n  }\n  \n  function cleanUp(string) {\n    string = string.replace(/^[\\t\\r\\n]+|[\\t\\r\\n]+$/g, ''); // trim leading/trailing whitespace\n    string = string.replace(/\\n\\s+\\n/g, '\\n\\n');\n    string = string.replace(/\\n{3,}/g, '\\n\\n'); // limit consecutive linebreaks to 2\n    return string;\n  }\n  \n  return cleanUp(string);\n};\n\nif (typeof exports === 'object') {\n  exports.toMarkdown = toMarkdown;\n}"
  },
  {
    "path": "static/js/markdownEdit.js",
    "content": "/**\n * Created by mhq on 17/1/8.\n */\nvar markdown_reg = /[\\\\\\`\\*\\_\\[\\]\\#\\+\\-\\!\\>\\s]/g;\n$(function () {\n    $('.markdown-edit').markdown({\n        height:'500',\n        language:'zh',\n        footer:'字数: <small id=\"markdown-counter\" class=\"text-success\">0</small>',\n\t\tonChange:function(e) {\n            var content = e.getContent();\n            content_length = content.replace(markdown_reg, '').length;\n            $('#markdown-counter').html(content_length);\n        },\n        afterShowPreview: function (e) {\n            codeHighLight();\n        }\n    })\n});"
  },
  {
    "path": "static/js/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "static/js/super.js",
    "content": "function checkPasswordForm() {\n    var password = $('#password').val();\n    var password2 = $('#password2').val();\n    if (password != password2) {\n        $('#group_password2').addClass('has-error');\n        $('#password2_err').show();\n        return false;\n    } else {\n        // $('#changePasswordForm').submit();\n        return true;\n    }\n}"
  },
  {
    "path": "static/js/tinymce_setup.js",
    "content": "//For submit articles\ntinymce.init({\n    selector: '#content',\n    directionality:'ltr',\n    language:'zh_CN',\n    height:400,\n    plugins: [\n            'advlist autolink link image lists charmap print preview hr anchor pagebreak spellchecker',\n            'searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking',\n            'save table contextmenu directionality emoticons template paste textcolor',\n            'codesample',\n    ],\n     toolbar: 'insertfile undo redo | \\\n     styleselect | \\\n     bold italic | \\\n     alignleft aligncenter alignright alignjustify | \\\n     bullist numlist outdent indent | \\\n     link image | \\\n     print preview media fullpage | \\\n     forecolor backcolor emoticons |\\\n     codesample fontsizeselect fullscreen',\n    fontsize_formats: '10pt 12pt 14pt 18pt 24pt 36pt',\n    nonbreaking_force_tab: true\n});\n\n//For add plugin\ntinymce.init({\n    selector: '#pluginContent',\n    directionality:'ltr',\n    language:'zh_CN',\n    plugins: [\n            'advlist autolink link image lists charmap print preview hr anchor pagebreak spellchecker',\n            'searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking',\n            'save table contextmenu directionality emoticons template paste textcolor',\n            'codesample',\n    ],\n});\n"
  },
  {
    "path": "static/tinymce/LICENSE.TXT",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "static/tinymce/changelog.txt",
    "content": "Version 4.3.4 (2016-02-11)\n\tAdded new OpenWindow/CloseWindow events that gets fired when windows open/close.\n\tAdded new NewCell/NewRow events that gets fired when table cells/rows are created.\n\tAdded new Promise return value to tinymce.init makes it easier to handle initialization.\n\tRemoved the jQuery version the jQuery plugin is now moved into the main package.\n\tRemoved jscs from build process since eslint can now handle code style checking.\n\tFixed various bugs with drag/drop of contentEditable:false elements.\n\tFixed bug where deleting of very specific nested list items would result in an odd list.\n\tFixed bug where lists would get merged with adjacent lists outside the editable inline root.\n\tFixed bug where MS Edge would crash when closing a dialog then clicking a menu item.\n\tFixed bug where table cell selection would add undo levels.\n\tFixed bug where table cell selection wasn't removed when inline editor where removed.\n\tFixed bug where table cell selection wouldn't work properly on nested tables.\n\tFixed bug where table merge menu would be available when merging between thead and tbody.\n\tFixed bug where table row/column resize wouldn't get properly removed when the editor was removed.\n\tFixed bug where Chrome would scroll to the editor if there where a empty hash value in document url.\n\tFixed bug where the cache suffix wouldn't work correctly with the importcss plugin.\n\tFixed bug where selection wouldn't work properly on MS Edge on Windows Phone 10.\n\tFixed so adjacent pre blocks gets joined into one pre block since that seems like the user intent.\n\tFixed so events gets properly dispatched in shadow dom. Patch provided by Nazar Mokrynskyi.\nVersion 4.3.3 (2016-01-14)\n\tAdded new table_resize_bars configuration setting.  This setting allows you to disable the table resize bars.\n\tAdded new beforeInitialize event to tinymce.util.XHR lets you modify XHR properties before open. Patch contributed by Brent Clintel.\n\tAdded new autolink_pattern setting to autolink plugin. Enables you to override the default autolink formats. Patch contributed by Ben Tiedt.\n\tAdded new charmap option that lets you override the default charmap of the charmap plugin.\n\tAdded new charmap_append option that lets you add new characters to the default charmap of the charmap plugin.\n\tAdded new insertCustomChar event that gets fired when a character is inserted by the charmap plugin.\n\tFixed bug where table cells started with a superfluous &nbsp; in IE10+.\n\tFixed bug where table plugin would retain all BR tags when cells were merged.\n\tFixed bug where media plugin would strip underscores from youtube urls.\n\tFixed bug where IME input would fail on IE 11 if you typed within a table.\n\tFixed bug where double click selection of a word would remove the space before the word on insert contents.\n\tFixed bug where table plugin would produce exceptions when hovering tables with invalid structure.\n\tFixed bug where fullscreen wouldn't scroll back to it's original position when untoggled.\n\tFixed so the template plugins templates setting can be a function that gets a callback that can provide templates.\nVersion 4.3.2 (2015-12-14)\n\tFixed bug where the resize bars for table cells were not affected by the object_resizing property.\n\tFixed bug where the contextual table toolbar would appear incorrectly if TinyMCE was initialized inline inside a table.\n\tFixed bug where resizing table cells did not fire a node change event or add an undo level.\n\tFixed bug where double click selection of text on IE 11 wouldn't work properly.\n\tFixed bug where codesample plugin would incorrectly produce br elements inside code elements.\n\tFixed bug where media plugin would strip dashes from youtube urls.\n\tFixed bug where it was possible to move the caret into the table resize bars.\n\tFixed bug where drag/drop into a cE=false element was possible on IE.\nVersion 4.3.1 (2015-11-30)\n\tFixed so it's possible to disable the table inline toolbar by setting it to false or an empty string.\n\tFixed bug where it wasn't possible to resize some tables using the drag handles.\n\tFixed bug where unique id:s would clash for multiple editor instances and cE=false selections.\n\tFixed bug where the same plugin could be initialized multiple times.\n\tFixed bug where the table inline toolbars would be displayed at the same time as the image toolbars.\n\tFixed bug where the table selection rect wouldn't be removed when selecting another control element.\nVersion 4.3.0 (2015-11-23)\n\tAdded new table column/row resize support. Makes it a lot more easy to resize the columns/rows in a table.\n\tAdded new table inline toolbar. Makes it easier to for example add new rows or columns to a table.\n\tAdded new notification API. Lets you display floating notifications to the end user.\n\tAdded new codesample plugin that lets you insert syntax highlighted pre elements into the editor.\n\tAdded new image_caption to images. Lets you create images with captions using a HTML5 figure/figcaption elements.\n\tAdded new live previews of embeded videos. Lets you play the video right inside the editor.\n\tAdded new setDirty method and \"dirty\" event to the editor. Makes it easier to track the dirty state change.\n\tAdded new setMode method to Editor instances that lets you dynamically switch between design/readonly.\n\tAdded new core support for contentEditable=false elements within the editor overrides the browsers broken behavior.\n\tRewrote the noneditable plugin to use the new contentEditable false core logic.\n\tFixed so the dirty state doesn't set set to false automatically when the undo index is set to 0.\n\tFixed the Selection.placeCaretAt so it works better on IE when the coordinate is between paragraphs.\n\tFixed bug where data-mce-bogus=\"all\" element contents where counted by the word count plugin.\n\tFixed bug where contentEditable=false elements would be indented by the indent buttons.\n\tFixed bug where images within contentEditable=false would be selected in WebKit on mouse click.\n\tFixed bug in DOMUntils split method where the replacement parameter wouldn't work on specific cases.\n\tFixed bug where the importcss plugin would import classes from the skin content css file.\n\tFixed so all button variants have a wrapping span for it's text to make it easier to skin.\n\tFixed so it's easier to exit pre block using the arrow keys.\n\tFixed bug where listboxes with fix widths didn't render correctly.\nVersion 4.2.8 (2015-11-13)\n\tFixed bug where it was possible to delete tables as the inline root element if all columns where selected.\n\tFixed bug where the UI buttons active state wasn't properly updated due to recent refactoring of that logic.\nVersion 4.2.7 (2015-10-27)\n\tFixed bug where backspace/delete would remove all formats on the last paragraph character in WebKit/Blink.\n\tFixed bug where backspace within a inline format element with a bogus caret container would move the caret.\n\tFixed bug where backspace/delete on selected table cells wouldn't add an undo level.\n\tFixed bug where script tags embedded within the editor could sometimes get a mce- prefix prepended to them\n\tFixed bug where validate: false option could produce an error to be thrown from the Serialization step.\n\tFixed bug where inline editing of a table as the root element could let the user delete that table.\n\tFixed bug where inline editing of a table as the root element wouldn't properly handle enter key.\n\tFixed bug where inline editing of a table as the root element would normalize the selection incorrectly.\n\tFixed bug where inline editing of a list as the root element could let the user delete that list.\n\tFixed bug where inline editing of a list as the root element could let the user split that list.\n\tFixed bug where resize handles would be rendered on editable root elements such as table.\nVersion 4.2.6 (2015-09-28)\n\tAdded capability to set request headers when using XHRs.\n\tAdded capability to upload local images automatically default delay is set to 30 seconds after editing images.\n\tAdded commands ids mceEditImage, mceAchor and mceMedia to be avaiable from execCommand.\n\tAdded Edge browser to saucelabs grunt task. Patch contributed by John-David Dalton.\n\tFixed bug where blob uris not produced by tinymce would produce HTML invalid markup.\n\tFixed bug where selection of contents of a nearly empty editor in Edge would sometimes fail.\n\tFixed bug where color styles woudln't be retained on copy/paste in Blink/Webkit.\n\tFixed bug where the table plugin would throw an error when inserting rows after a child table.\n\tFixed bug where the template plugin wouldn't handle functions as variable replacements.\n\tFixed bug where undo/redo sometimes wouldn't work properly when applying formatting collapsed ranges.\n\tFixed bug where shift+delete wouldn't do a cut operation on Blink/WebKit.\n\tFixed bug where cut action wouldn't properly store the before selection bookmark for the undo level.\n\tFixed bug where backspace in side an empty list element on IE would loose editor focus.\n\tFixed bug where the save plugin wouldn't enable the buttons when a change occurred.\n\tFixed bug where Edge wouldn't initialize the editor if a document.domain was specified.\n\tFixed bug where enter key before nested images would sometimes not properly expand the previous block.\n\tFixed bug where the inline toolbars wouldn't get properly hidden when blurring the editor instance.\n\tFixed bug where Edge would paste Chinese characters on some Windows 10 installations.\n\tFixed bug where IME would loose focus on IE 11 due to the double trailing br bug fix.\n\tFixed bug where the proxy url in imagetools was incorrect. Patch contributed by Wong Ho Wang.\nVersion 4.2.5 (2015-08-31)\n\tAdded fullscreen capability to embedded youtube and vimeo videos.\n\tFixed bug where the uploadImages call didn't work on IE 10.\n\tFixed bug where image place holders would be uploaded by uploadImages call.\n\tFixed bug where images marked with bogus would be uploaded by the uploadImages call.\n\tFixed bug where multiple calls to uploadImages would result in decreased performance.\n\tFixed bug where pagebreaks were editable to imagetools patch contributed by Rasmus Wallin.\n\tFixed bug where the element path could cause too much recursion exception.\n\tFixed bug for domains containing \".min\". Patch contributed by Loïc Février.\n\tFixed so validation of external links to accept a number after www. Patch contributed by Victor Carvalho.\n\tFixed so the charmap is exposed though execCommand. Patch contributed by Matthew Will.\n\tFixed so that the image uploads are concurrent for improved performance.\n\tFixed various grammar problems in inline documentation. Patches provided by nikolas.\nVersion 4.2.4 (2015-08-17)\n\tAdded picture as a valid element to the HTML 5 schema. Patch contributed by Adam Taylor.\n\tFixed bug where contents would be duplicated on drag/drop within the same editor.\n\tFixed bug where floating/alignment of images on Edge wouldn't work properly.\n\tFixed bug where it wasn't possible to drag images on IE 11.\n\tFixed bug where image selection on Edge would sometimes fail.\n\tFixed bug where contextual toolbars icons wasn't rendered properly when using the toolbar_items_size.\n\tFixed bug where searchreplace dialog doesn't get prefilled with the selected text.\n\tFixed bug where fragmented matches wouldn't get properly replaced by the searchreplace plugin.\n\tFixed bug where enter key wouldn't place the caret if was after a trailing space within an inline element.\n\tFixed bug where the autolink plugin could produce multiple links for the same text on Gecko.\n\tFixed bug where EditorUpload could sometimes throw an exception if the blob wasn't found.\n\tFixed xss issues with media plugin not properly filtering out some script attributes.\nVersion 4.2.3 (2015-07-30)\n\tFixed bug where image selection wasn't possible on Edge due to incompatible setBaseAndExtend API.\n\tFixed bug where image blobs urls where not properly destroyed by the imagetools plugin.\n\tFixed bug where keyboard shortcuts wasn't working correctly on IE 8.\n\tFixed skin issue where the borders of panels where not visible on IE 8.\nVersion 4.2.2 (2015-07-22)\n\tFixed bug where float panels were not being hidden on inline editor blur when fixed_toolbar_container config option was in use.\n\tFixed bug where combobox states wasn't properly updated if contents where updated without keyboard.\n\tFixed bug where pasting into textbox or combobox would move the caret to the end of text.\n\tFixed bug where removal of bogus span elements before block elements would remove whitespace between nodes.\n\tFixed bug where repositioning of inline toolbars where async and producing errors if the editor was removed from DOM to early. Patch by iseulde.\n\tFixed bug where element path wasn't working correctly. Patch contributed by iseulde.\n\tFixed bug where menus wasn't rendered correctly when custom images where added to a menu. Patch contributed by Naim Hammadi.\nVersion 4.2.1 (2015-06-29)\n\tFixed bug where back/forward buttons in the browser would render blob images as broken images.\n\tFixed bug where Firefox would throw regexp to big error when replacing huge base64 chunks.\n\tFixed bug rendering issues with resize and context toolbars not being placed properly until next animation frame.\n\tFixed bug where the rendering of the image while cropping would some times not be centered correctly.\n\tFixed bug where listbox items with submenus would me selected as active.\n\tFixed bug where context menu where throwing an error when rendering.\n\tFixed bug where resize both option wasn't working due to resent addClass API change. Patch contributed by Jogai.\n\tFixed bug where a hideAll call for container rendered inline toolbars would throw an error.\n\tFixed bug where onclick event handler on combobox could cause issues if element.id was a function by some polluting libraries.\n\tFixed bug where listboxes wouldn't get proper selected sub menu item when using link_list or image_list.\n\tFixed so the UI controls are as wide as 4.1.x to avoid wrapping controls in toolbars.\n\tFixed so the imagetools dialog is adaptive for smaller screen sizes.\nVersion 4.2.0 (2015-06-25)\n\tAdded new flat default skin to make the UI more modern.\n\tAdded new imagetools plugin, lets you crop/resize and apply filters to images.\n\tAdded new contextual toolbars support to the API lets you add floating toolbars for specific CSS selectors.\n\tAdded new promise feature fill as tinymce.util.Promise.\n\tAdded new built in image upload feature lets you upload any base64 encoded image within the editor as files.\n\tFixed bug where resize handles would appear in the right position in the wrong editor when switching between resizable content in different inline editors.\n\tFixed bug where tables would not be inserted in inline mode due to previous float panel fix.\n\tFixed bug where floating panels would remain open when focus was lost on inline editors.\n\tFixed bug where cut command on Chrome would thrown a browser security exception.\n\tFixed bug where IE 11 sometimes would report an incorrect size for images in the image dialog.\n\tFixed bug where it wasn't possible to remove inline formatting at the end of block elements.\n\tFixed bug where it wasn't possible to delete table cell contents when cell selection was vertical.\n\tFixed bug where table cell wasn't emptied from block elements if delete/backspace where pressed in empty cell.\n\tFixed bug where cmd+shift+arrow didn't work correctly on Firefox mac when selecting to start/end of line.\n\tFixed bug where removal of bogus elements would sometimes remove whitespace between nodes.\n\tFixed bug where the resize handles wasn't updated when the main window was resized.\n\tFixed so script elements gets removed by default to prevent possible XSS issues in default config implementations.\n\tFixed so the UI doesn't need manual reflows when using non native layout managers.\n\tFixed so base64 encoded images doesn't slow down the editor on modern browsers while editing.\n\tFixed so all UI elements uses touch events to improve mobile device support.\n\tRemoved the touch click quirks patch for iOS since it did more harm than good.\n\tRemoved the non proportional resize handles since. Unproportional resize can still be done by holding the shift key.\nVersion 4.1.10 (2015-05-05)\n\tFixed bug where plugins loaded with compat3x would sometimes throw errors when loading using the jQuery version.\n\tFixed bug where extra empty paragraphs would get deleted in WebKit/Blink due to recent Quriks fix.\n\tFixed bug where the editor wouldn't work properly on IE 12 due to some required browser sniffing.\n\tFixed bug where formatting shortcut keys where interfering with Mac OS X screenshot keys.\n\tFixed bug where the caret wouldn't move to the next/previous line boundary on Cmd+Left/Right on Gecko.\n\tFixed bug where it wasn't possible to remove formats from very specific nested contents.\n\tFixed bug where undo levels wasn't produced when typing letters using the shift or alt+ctrl modifiers.\n\tFixed bug where the dirty state wasn't properly updated when typing using the shift or alt+ctrl modifiers.\n\tFixed bug where an error would be thrown if an autofocused editor was destroyed quickly after its initialization. Patch provided by thorn0.\n\tFixed issue with dirty state not being properly updated on redo operation.\n\tFixed issue with entity decoder not handling incorrectly written numeric entities.\n\tFixed issue where some PI element values wouldn't be properly encoded.\nVersion 4.1.9 (2015-03-10)\n\tFixed bug where indentation wouldn't work properly for non list elements.\n\tFixed bug with image plugin not pulling the image dimensions out correctly if a custom document_base_url was used.\n\tFixed bug where ctrl+alt+[1-9] would conflict with the AltGr+[1-9] on Windows. New shortcuts is ctrl+shift+[1-9].\n\tFixed bug with removing formatting on nodes in inline mode would sometimes include nodes outside the editor body.\n\tFixed bug where extra nbsp:s would be inserted when you replaced a word surrounded by spaces using insertContent.\n\tFixed bug with pasting from Google Docs would produce extra strong elements and line feeds.\nVersion 4.1.8 (2015-03-05)\n\tAdded new html5 sizes attribute to img elements used together with srcset.\n\tAdded new elementpath option that makes it possible to disable the element path but keep the statusbar.\n\tAdded new option table_style_by_css for the table plugin to set table styling with css rather than table attributes.\n\tAdded new link_assume_external_targets option to prompt the user to prepend http:// prefix if the supplied link does not contain a protocol prefix.\n\tAdded new image_prepend_url option to allow a custom base path/url to be added to images.\n\tAdded new table_appearance_options option to make it possible to disable some options.\n\tAdded new image_title option to make it possible to alter the title of the image, disabled by default.\n\tFixed bug where selection starting from out side of the body wouldn't produce a proper selection range on IE 11.\n\tFixed bug where pressing enter twice before a table moves the cursor in the table and causes a javascript error.\n\tFixed bug where advanced image styles were not respected.\n\tFixed bug where the less common Shift+Delete didn't produce a proper cut operation on WebKit browsers.\n\tFixed bug where image/media size constrain logic would produce NaN when handling non number values.\n\tFixed bug where internal classes where removed by the removeformat command.\n\tFixed bug with creating links table cell contents with a specific selection would throw a exceptions on WebKit/Blink.\n\tFixed bug where valid_classes option didn't work as expected according to docs. Patch provided by thorn0.\n\tFixed bug where jQuery plugin would patch the internal methods multiple times. Patch provided by Drew Martin.\n\tFixed bug where backspace key wouldn't delete the current selection of newly formatted content.\n\tFixed bug where type over of inline formatting elements wouldn't properly keep the format on WebKit/Blink.\n\tFixed bug where selection needed to be properly normalized on modern IE versions.\n\tFixed bug where Command+Backspace didn't properly delete the whole line of text but the previous word.\n\tFixed bug where UI active states wheren't properly updated on IE if you placed caret within the current range.\n\tFixed bug where delete/backspace on WebKit/Blink would remove span elements created by the user.\n\tFixed bug where delete/backspace would produce incorrect results when deleting between two text blocks with br elements.\n\tFixed bug where captions where removed when pasting from MS Office.\n\tFixed bug where lists plugin wouldn't properly remove fully selected nested lists.\n\tFixed bug where the ttf font used for icons would throw an warning message on Gecko on Mac OS X.\n\tFixed a bug where applying a color to text did not update the undo/redo history.\n\tFixed so shy entities gets displayed when using the visualchars plugin.\n\tFixed so removeformat removes ins/del by default since these might be used for strikethough.\n\tFixed so multiple language packs can be loaded and added to the global I18n data structure.\n\tFixed so transparent color selection gets treated as a normal color selection. Patch contributed by Alexander Hofbauer.\n\tFixed so it's possible to disable autoresize_overflow_padding, autoresize_bottom_margin options by setting them to false.\n\tFixed so the charmap plugin shows the description of the character in the dialog. Patch contributed by Jelle Hissink.\n\tRemoved address from the default list of block formats since it tends to be missused.\n\tFixed so the pre block format is called preformatted to make it more verbose.\n\tFixed so it's possible to context scope translation strings this isn't needed most of the time.\n\tFixed so the max length of the width/height input fields of the media dialog is 5 instead of 3.\n\tFixed so drag/dropped contents gets properly processed by paste plugin since it's basically a paste. Patch contributed by Greg Fairbanks.\n\tFixed so shortcut keys for headers is ctrl+alt+[1-9] instead of ctrl+[1-9] since these are for switching tabs in the browsers.\n\tFixed so \"u\" doesn't get converted into a span element by the legacy input filter. Since this is now a valid HTML5 element.\n\tFixed font families in order to provide appropriate web-safe fonts.\nVersion 4.1.7 (2014-11-27)\n\tAdded HTML5 schema support for srcset, source and picture. Patch contributed by mattheu.\n\tAdded new cache_suffix setting to enable cache busting by producing unique urls.\n\tAdded new paste_convert_word_fake_lists option to enable users to disable the fake lists convert logic.\n\tFixed so advlist style changes adds undo levels for each change.\n\tFixed bug where WebKit would sometimes produce an exception when the autolink plugin where looking for URLs.\n\tFixed bug where IE 7 wouldn't be rendered properly due to to aggressive css compression.\n\tFixed bug where DomQuery wouldn't accept window as constructor element.\n\tFixed bug where the color picker in 3.x dialogs wouldn't work properly. Patch contributed by Callidior.\n\tFixed bug where the image plugin wouldn't respect the document_base_url.\n\tFixed bug where the jQuery plugin would fail to append to elements named array prototype names.\nVersion 4.1.6 (2014-10-08)\n\tFixed bug with clicking on the scrollbar of the iframe would cause a JS error to be thrown.\n\tFixed bug where null would produce an exception if you passed it to selection.setRng.\n\tFixed bug where Ctrl/Cmd+Tab would indent the current list item if you switched tabs in the browser.\n\tFixed bug where pasting empty cells from Excel would result in a broken table.\n\tFixed bug where it wasn't possible to switch back to default list style type.\n\tFixed issue where the select all quirk fix would fire for other modifiers than Ctrl/Cmd combinations.\n\tReplaced jake with grunt since it is more mainstream and has better plugin support.\nVersion 4.1.5 (2014-09-09)\n\tFixed bug where sometimes the resize rectangles wouldn't properly render on images on WebKit/Blink.\n\tFixed bug in list plugin where delete/backspace would merge empty LI elements in lists incorrectly.\n\tFixed bug where empty list elements would result in empty LI elements without it's parent container.\n\tFixed bug where backspace in empty caret formatted element could produce an type error exception of Gecko.\n\tFixed bug where lists pasted from word with a custom start index above 9 wouldn't be properly handled.\n\tFixed bug where tabfocus plugin would tab out of the editor instance even if the default action was prevented.\n\tFixed bug where tabfocus wouldn't tab properly to other adjacent editor instances.\n\tFixed bug where the DOMUtils setStyles wouldn't properly removed or update the data-mce-style attribute.\n\tFixed bug where dialog select boxes would be placed incorrectly if document.body wasn't statically positioned.\n\tFixed bug where pasting would sometimes scroll to the top of page if the user was using the autoresize plugin.\n\tFixed bug where caret wouldn't be properly rendered by Chrome when clicking on the iframes documentElement.\n\tFixed so custom images for menubutton/splitbutton can be provided. Patch contributed by Naim Hammadi.\n\tFixed so the default action of windows closing can be prevented by blocking the default action of the close event.\n\tFixed so nodeChange and focus of the editor isn't automatically performed when opening sub dialogs.\nVersion 4.1.4 (2014-08-21)\n\tAdded new media_filter_html option to media plugin that blocks any conditional comments, scripts etc within a video element.\n\tAdded new content_security_policy option allows you to set custom policy for iframe contents. Patch contributed by Francois Chagnon.\n\tFixed bug where activate/deactivate events wasn't firing properly when switching between editors.\n\tFixed bug where placing the caret on iOS was difficult due to a WebKit bug with touch events.\n\tFixed bug where the resize helper wouldn't render properly on older IE versions.\n\tFixed bug where resizing images inside tables on older IE versions would sometimes fail depending mouse position.\n\tFixed bug where editor.insertContent would produce an exception when inserting select/option elements.\n\tFixed bug where extra empty paragraphs would be produced if block elements where inserted inside span elements.\n\tFixed bug where the spellchecker menu item wouldn't be properly checked if spell checking was started before it was rendered.\n\tFixed bug where the DomQuery filter function wouldn't remove non elements from collection.\n\tFixed bug where document with custom document.domain wouldn't properly render the editor.\n\tFixed bug where IE 8 would throw exception when trying to enter invalid color values into colorboxes.\n\tFixed bug where undo manager could incorrectly add an extra undo level when custom resize handles was removed.\n\tFixed bug where it wouldn't be possible to alter cell properties properly on table cells on IE 8.\n\tFixed so the color picker button in table dialog isn't shown unless you include the colorpicker plugin or add your own custom color picker.\n\tFixed so activate/deactivate events fire when windowManager opens a window since.\n\tFixed so the table advtab options isn't separated by an underscore to normalize naming with image_advtab option.\n\tFixed so the table cell dialog has proper padding when the advanced tab in disabled.\nVersion 4.1.3 (2014-07-29)\n\tAdded event binding logic to tinymce.util.XHR making it possible to override headers and settings before any request is made.\n\tFixed bug where drag events wasn't fireing properly on older IE versions since the event handlers where bound to document.\n\tFixed bug where drag/dropping contents within the editor on IE would force the contents into plain text mode even if it was internal content.\n\tFixed bug where IE 7 wouldn't open menus properly due to a resize bug in the browser auto closing them immediately.\n\tFixed bug where the DOMUtils getPos logic wouldn't produce a valid coordinate inside the body if the body was positioned non static.\n\tFixed bug where the element path and format state wasn't properly updated if you had the wordcount plugin enabled.\n\tFixed bug where a comment at the beginning of source would produce an exception in the formatter logic.\n\tFixed bug where setAttrib/getAttrib on null would throw exception together with any hooked attributes like style.\n\tFixed bug where table sizes wasn't properly retained when copy/pasting on WebKit/Blink.\n\tFixed bug where WebKit/Blink would produce colors in RGB format instead of the forced HEX format when deleting contents.\n\tFixed bug where the width attribute wasn't updated on tables if you changed the size inside the table dialog.\n\tFixed bug where control selection wasn't properly handled when the caret was placed directly after an image.\n\tFixed bug where selecting the contents of table cells using the selection.select method wouldn't place the caret properly.\n\tFixed bug where the selection state for images wasn't removed when placing the caret right after an image on WebKit/Blink.\n\tFixed bug where all events wasn't properly unbound when and editor instance was removed or destroyed by some external innerHTML call.\n\tFixed bug where it wasn't possible or very hard to select images on iOS when the onscreen keyboard was visible.\n\tFixed so auto_focus can take a boolean argument this will auto focus the last initialized editor might be useful for single inits.\n\tFixed so word auto detect lists logic works better for faked lists that doesn't have specific markup.\n\tFixed so nodeChange gets fired on mouseup as it used to before 4.1.1 we optimized that event to fire less often.\n\tRemoved the finish menu item from spellchecker menu since it's redundant you can stop spellchecking by toggling menu item or button.\nVersion 4.1.2 (2014-07-15)\n\tAdded offset/grep to DomQuery class works basically the same as it's jQuery equivalent.\n\tFixed bug where backspace/delete or setContent with an empty string would remove header data when using the fullpage plugin.\n\tFixed bug where tinymce.remove with a selector not matching any editors would remove all editors.\n\tFixed bug where resizing of the editor didn't work since the theme was calling setStyles instead of setStyle.\n\tFixed bug where IE 7 would fail to append html fragments to iframe document when using DomQuery.\n\tFixed bug where the getStyle DOMUtils method would produce an exception if it was called with null as it's element.\n\tFixed bug where the paste plugin would remove the element if the none of the paste_webkit_styles rules matched the current style.\n\tFixed bug where contextmenu table items wouldn't work properly on IE since it would some times fire an incorrect selection change.\n\tFixed bug where the padding/border values wasn't used in the size calculation for the body size when using autoresize. Patch contributed by Matt Whelan.\n\tFixed bug where conditional word comments wouldn't be properly removed when pasting plain text.\n\tFixed bug where resizing would sometime fail on IE 11 when the mouseup occurred inside the resizable element.\n\tFixed so the iframe gets initialized without any inline event handlers for better CSP support. Patch contributed by Matt Whelan.\n\tFixed so the tinymce.dom.Sizzle is the latest version of sizzle this resolves the document context bug.\nVersion 4.1.1 (2014-07-08)\n\tFixed bug where pasting plain text on some WebKit versions would result in an empty line.\n\tFixed bug where resizing images inside tables on IE 11 wouldn't work properly.\n\tFixed bug where IE 11 would sometimes throw \"Invalid argument\" exception when editor contents was set to an empty string.\n\tFixed bug where document.activeElement would throw exceptions on IE 9 when that element was hidden or removed from dom.\n\tFixed bug where WebKit/Blink sometimes produced br elements with the Apple-interchange-newline class.\n\tFixed bug where table cell selection wasn't properly removed when copy/pasting table cells.\n\tFixed bug where pasting nested list items from Word wouldn't produce proper semantic nested lists.\n\tFixed bug where right clicking using the contextmenu plugin on WebKit/Blink on Mac OS X would select the target current word or line.\n\tFixed bug where it wasn't possible to alter table cell properties on IE 8 using the context menu.\n\tFixed bug where the resize helper wouldn't be correctly positioned on older IE versions.\n\tFixed bug where fullpage plugin would produce an error if you didn't specify a doctype encoding.\n\tFixed bug where anchor plugin would get the name/id of the current element even if it wasn't anchor element.\n\tFixed bug where visual aids for tables wouldn't be properly disabled when changing the border size.\n\tFixed bug where some control selection events wasn't properly fired on older IE versions.\n\tFixed bug where table cell selection on older IE versions would prevent resizing of images.\n\tFixed bug with paste_data_images paste option not working properly on modern IE versions.\n\tFixed bug where custom elements with underscores in the name wasn't properly parsed/serialized.\n\tFixed bug where applying inline formats to nested list elements would produce an incorrect formatting result.\n\tFixed so it's possible to hide items from elements path by using preventDefault/stopPropagation.\n\tFixed so inline mode toolbar gets rendered right aligned if the editable element positioned to the documents right edge.\n\tFixed so empty inline elements inside empty block elements doesn't get removed if configured to be kept intact.\n\tFixed so DomQuery parentsUntil/prevUntil/nextUntil supports selectors/elements/filters etc.\n\tFixed so legacyoutput plugin overrides fontselect and fontsizeselect controls and handles font elements properly.\nVersion 4.1.0 (2014-06-18)\n\tAdded new file_picker_callback option to replace the old file_browser_callback the latter will still work though.\n\tAdded new custom colors to textcolor plugin will be displayed if a color picker is provided also shows the latest colors.\n\tAdded new color_picker_callback option to enable you to add custom color pickers to the editor.\n\tAdded new advanced tabs to table/cell/row dialogs to enable you to select colors for border/background.\n\tAdded new colorpicker plugin that lets you select colors from a hsv color picker.\n\tAdded new tinymce.util.Color class to handle color parsing and converting.\n\tAdded new colorpicker UI widget element lets you add a hsv color picker to any form/window.\n\tAdded new textpattern plugin that allows you to use markdown like text patterns to format contents.\n\tAdded new resize helper element that shows the current width & height while resizing.\n\tAdded new \"once\" method to Editor and EventDispatcher enables since callback execution events.\n\tAdded new jQuery like class under tinymce.dom.DomQuery it's exposed on editor instances (editor.$) and globally under (tinymce.$).\n\tFixed so the default resize method for images are proportional shift/ctrl can be used to make an unproportional size.\n\tFixed bug where the image_dimensions option of the image plugin would cause exceptions when it tried to update the size.\n\tFixed bug where table cell dialog class field wasn't properly updated when editing an a table cell with an existing class.\n\tFixed bug where Safari on Mac would produce webkit-fake-url for pasted images so these are now removed.\n\tFixed bug where the nodeChange event would get fired before the selection was changed when clicking inside the current selection range.\n\tFixed bug where valid_classes option would cause exception when it removed internal prefixed classes like mce-item-.\n\tFixed bug where backspace would cause navigation in IE 8 on an inline element and after a caret formatting was applied.\n\tFixed so placeholder images produced by the media plugin gets selected when inserted/edited.\n\tFixed so it's possible to drag in images when the paste_data_images option is enabled. Might be useful for mail clients.\n\tFixed so images doesn't get a width/height applied if the image_dimensions option is set to false useful for responsive contents.\n\tFixed so it's possible to pass in an optional arguments object for the nodeChanged function to be passed to all nodechange event listeners.\n\tFixed bug where media plugin embed code didn't update correctly.\nVersion 4.0.28 (2014-05-27)\n\tFixed critical issue with empty urls producing an exception when converted into absolute urls due to resent bug fix in tinymce.util.URI.\nVersion 4.0.27 (2014-05-27)\n\tAdded support for definition lists to lists plugin and enter key logic. This can now created by the format menu.\n\tAdded cmd option for the style_formats menu enables you to toggle commands on/off using the formats menu for example lists.\n\tAdded definition lists to visualblocks plugin so these are properly visualized like other list elements.\n\tAdded new paste_merge_formats option that reduces the number of nested text format elements produced on paste. Enabled by default.\n\tAdded better support for nested link_list/image_list menu items each item can now have a \"menu\" item with subitems.\n\tAdded \"Add to Dictionary\" support to spellchecker plugin when the backend tells that this feature is available.\n\tAdded new table_default_attributes/table_default_styles options patch contributed by Dan Villiom Podlaski Christiansen.\n\tAdded new table_class_list/table_cell_class_list/table_row_class_list options to table plugin.\n\tAdded new invalid_styles/valid_classes options to better control what gets returned for the style/class attribute.\n\tAdded new file_browser_callback_types option that allows you to specify where to display the picker based on dialog type.\n\tFixed so the selected state is properly handled on nested menu items in listboxes patch contributed by Jelle Kralt.\n\tFixed so the invisiblity css value for TinyMCE gets set to inherit instead of visible to better support dialog scripts like reveal.\n\tFixed bug where Gecko would remove anchors when pasting since the their default built in logic removes empty nodes.\n\tFixed bug where it wasn't possible to paste on Chrome Andoid since it doesn't properly support the Clipboard API yet.\n\tFixed bug where user defined type attribute value of text/javascript didn't get properly serialized.\n\tFixed bug where space in span elements would removed when the element was considered empty.\n\tFixed bug where the undo/redo button states didn't change if you removed all undo levels using undoManager.clear.\n\tFixed bug where unencoded links inside query strings or hash values would get processed by the relative urls logic.\n\tFixed bug where contextmenu would automatically close in inline editing mode on Firefox running on Mac.\n\tFixed bug where Gecko/IE would produce multiple BR elements when forced_root_block was set to false and a table was the last child of body.\n\tFixed bug where custom queryCommandState handlers didn't properly handle boolean states.\n\tFixed bug where auto closing float panels link menus wasn't automatically closed when the window was resized.\n\tFixed bug where the image plugin wouldn't update image dimensions when the current image was changed using the image_list select box.\n\tFixed bug with paste plugin not properly removing paste bin on Safari Mac when using the cmd+shift+v keyboard command.\n\tFixed bug where the paste plugin wouln't properly strip trailing br elements under very specific scenarios.\n\tFixed bug where enter key wouldn't properly place the caret on Gecko when pressing enter in a text block with a br ended line inside.\n\tFixed bug where Safari Mac shortcuts like Cmd+Opt+L didn't get passed through to the browser due to a Quirks fix.\n\tFixed so plain text mode works better when it converts rich text to plain text when pasting from for example Word.\n\tFixed so numeric keycodes can be used in the shortcut format enabling support for any key to be specified.\n\tFixed so table cells can be navigated with tab key and new rows gets automatically added when you are at the last cell.\n\tFixed bug where formatting before cursor gets removed when toggled off for continued content.\nVersion 4.0.26 (2014-05-06)\n\tFixed bug in media plugin where changing existing url did not use media regex patterns to create protocol neutral url.\n\tFixed bug where selection wasn't properly restored on IE 11 due to a browser bug with Element.contains.\nVersion 4.0.25 (2014-04-30)\n\tFixed bug where it wasn't possible to submit forms with editor instances on WebKit/Blink.\nVersion 4.0.24 (2014-04-30)\n\tAdded new event_root setting for inline editors. Lets you bind all editor events on a parent container.\n\tFixed bug where show/hide/isHidden didn't work properly for inline editor instances.\n\tFixed bug where preview plugin dialog didn't handle relative urls properly.\n\tFixed bug where the autolink plugin would remove the trailing space after an inserted link.\n\tFixed bug in paste plugin where pasting in a page with scrollbars would scroll to top of page in webkit browsers.\n\tFixed bug where the paste plugin on WebKit would remove styles from pasted source code with style attributes.\n\tFixed so image_list/link_list can be a function that allows custom async calls to populate these lists.\nVersion 4.0.23 (2014-04-24)\n\tAdded isSameOrigin method to tinymce.util.URI it handles default protocol port numbers better. Patch contributed by Matt Whelan.\n\tFixed bug where IE 11 would add br elements to the end of the editor body element each time it was shown/hidden.\n\tFixed bug where the autolink plugin would produce an index out of range exception for some very specific HTML.\n\tFixed bug where the charmap plugin wouldn't properly insert non breaking space characters when selected.\n\tFixed bug where pasting from Excel 2011 on Mac didn't produce a proper table when using the paste plugin.\n\tFixed bug where drag/dropping inside a table wouldn't properly end the table cell selection.\n\tFixed bug where drag/dropping images within tables on Safari on Mac wouldn't work properly.\n\tFixed bug where editors couldn't be re-initialized if they where externally destroyed.\n\tFixed bug where inline editors would produce a range index exception when clicking on buttons like bold.\n\tFixed bug where the preview plugin wouldn't properly handle non encoded upper UTF-8 characters.\n\tFixed so document.currentScript is used when detecting the current script location. Patch contributed by Mickael Desgranges.\n\tFixed issue with the paste_webkit_styles option so is disabled by default since it might produce a lot of extra styles.\nVersion 4.0.22 (2014-04-16)\n\tAdded lastLevel to BeforeAddUndo level event so it's easier to block undo level creation based.\n\tFixed so multiple list elements can be indented properly. Patch contributed by Dan Villiom Podlaski Christiansen.\n\tFixed bug where the selection would be at the wrong location sometimes for inline editor instances.\n\tFixed bug where drag/dropping content into an inline editor would fail on WebKit/Blink.\n\tFixed bug where table grid wouldn't work properly when the UI was rendered in for RTL mode.\n\tFixed bug where range normalization wouldn't handle mixed contentEditable nodes properly.\n\tFixed so the media plugin doesn't override the existing element rules you now need to manually whitelist non standard attributes.\n\tFixed so old language packs get properly loaded when the new longer language code format is used.\n\tFixed so all track changes junk such as comments, deletes etc gets removed when pasting from Word.\n\tFixed so non image data urls is blocked by default since they might contain scripts.\n\tFixed so it's possible to import styles from the current page stylesheets into an inline editor by using the importcss_file_filter.\n\tFixed bug where the spellchecker plugin wouldn't add undo levels for each suggestion replacement.\n\tReworked the default spellchecker RPC API to match the new PHP Spellchecker package. Fallback documented in the TinyMCE docs.\nVersion 4.0.21 (2014-04-01)\n\tAdded new getCssText method to formatter to get the preview css text value for a format to be used in UI.\n\tAdded new table_grid option that allows you to disable the table grid and use a dialog.\n\tAdded new image_description, image_dimensions options to image plugin. Patch contributed by Pat O'Neill.\n\tAdded new media_alt_source, media_poster, media_dimensions options to media plugin. Patch contributed by Pat O'Neill.\n\tAdded new ability to specify high/low dpi versions custom button images for retina displays.\n\tAdded new getWindows method to WindowManager makes it easier to control the currently opened windows.\n\tAdded new paste_webkit_styles option to paste plugin to control the styles that gets retained on WebKit.\n\tAdded preview of classes for the selectboxes used by the link_class_list/image_class_list options.\n\tAdded support for Sauce Labs browser testing using the new saucelabs-tests build target.\n\tAdded title input field to link dialog for a11y reasons can be disabled by using the link_title option.\n\tFixed so the toolbar option handles an array as input for multiple toolbar rows.\n\tFixed so the editor renders in XHTML mode apparently some people still use this rendering mode.\n\tFixed so icons gets rendered better on Firefox on Mac OS X by applying -moz-osx-font-smoothing.\n\tFixed so the auto detected external media sources produced protocol relative urls. Patch contributed by Pat O'Neill.\n\tFixed so it's possible to update the text of a button after it's been rendered to page DOM.\n\tFixed bug where iOS 7.1 Safari would open linked when images where inserted into links.\n\tFixed bug where IE 11 would scroll to the top of inline editable elements when applying formatting.\n\tFixed bug where tabindex on elements within the editor contents would cause issues on some browsers.\n\tFixed bug where link text wouldn't be properly updated in gecko if you changed an existing link.\n\tFixed bug where it wasn't possible to close dialogs with the escape key if the focus was inside a textbox.\n\tFixed bug where Gecko wouldn't paste rich text contents from Word or other similar word processors.\n\tFixed bug where binding events after the control had been rendered could fail to produce a valid delegate.\n\tFixed bug where IE 8 would throw and error when removing editors with a cross domain content_css setting.\n\tFixed bug where IE 9 wouldn't be able to select text after an editor instance with caret focus was removed.\n\tFixed bug where the autoresize plugin wouldn't resize the editor if you inserted huge images.\n\tFixed bug where multiple calls to the same init would produce extra editor instances.\n\tFixed bug where fullscreen toggle while having the autoresize plugin enabled wouldn't produce scrollbars.\n\tFixed so screen readers use a dialog instead of the grid for inserting tables.\n\tFixed so Office 365 Word contents gets filtered the same way as content from desktop Office.\n\tFixed so it's possible to override the root container for UI elements defaults to document.body.\n\tFixed bug where tabIndex is set to -1 on inline editable elements. It now keeps the existing tabIndex intact.\n\tFixed issue where the UndoManager transact method couldn't be nested since it only had one lock.\n\tFixed issue where headings/heading where labeled incorrectly as headers/header.\nVersion 4.0.20 (2014-03-18)\n\tFixed so all unit tests can be executed in a headless phantomjs instance for CI testing.\n\tFixed so directionality setting gets applied to the preview dialog as well as the editor body element.\n\tFixed a performance issue with the \"is\" method in DOMUtils. Patch contributed by Paul Bosselaar.\n\tFixed bug where paste plugin wouldn't paste plain text properly when pasting using browser menus.\n\tFixed bug where focusable SVG elements would throw an error since className isn't a proper string.\n\tFixed bug where the preview plugin didn't properly support the document_base_url setting.\n\tFixed bug where the focusedEditor wouldn't be set to null when that editor was removed.\n\tFixed bug where Gecko would throw an exception when editors where removed.\n\tFixed bug where the FocusManager wouldn't handle selection restoration properly on older IE versions.\n\tFixed bug where the searchreplace plugin would produce an exception on very specific multiple searches.\n\tFixed bug where some events wasn't properly unbound when all editors where removed from page.\n\tFixed bug where tapping links on iOS 7.1 would open the link instead of placing the caret inside.\n\tFixed bug where holding the finger down on iOS 7.1 would open the link/image callout menu.\n\tFixed so the jQuery plugin returns null when getting the tinymce instance of an element before it's initialized.\n\tFixed so selection normalization gets executed more often to reduce incorrect UI states on Gecko.\n\tFixed so the default action of closing the window on a form submission can be prevented using \"preventDefault\".\nVersion 4.0.19 (2014-03-11)\n\tAdded support for CSS selector expressions in object_resizing option. Allows you to control what to resize.\n\tAdded addToTop compatibility to compat3x plugin enables more legacy 3.x plugins to work properly.\n\tFixed bug on IE where it wasn't possible to align images when they where floated left.\n\tFixed bug where the indent/outdent buttons was enabled though readonly mode was enabled.\n\tFixed bug where the nodeChanged event was fired when readonly mode was enabled.\n\tFixed bug where events like blur could be fired to editor instances that where manually removed on IE 11.\n\tFixed bug where IE 11 would move focus to menubar/toolbar when using the tab key in a form with an editor.\n\tFixed bug where drag/drop in Safari on Mac didn't work properly due to lack of support for modern dataTransfer object.\n\tFixed bug where the remove event wasn't properly executed when the editor instances where removed.\n\tFixed bug where the selection change handler on inline editors would fail if the editor instance was removed.\nVersion 4.0.18 (2014-02-27)\n\tFixed bug where images would get class false/undefined when initially created.\nVersion 4.0.17 (2014-02-26)\n\tAdded much better wai-aria accessibility support when it comes to keyboard navigation of complex UI controls.\n\tAdded dfn,code,samp,kbd,var,cite,mark,q elements to the default remove formats list. Patch contributed by Naim Hammadi.\n\tAdded var,cite,dfn,code,mark,q,sup,sub to the list of elements that gets cloned on enter. Patch contributed by Naim Hammadi.\n\tAdded new visual_anchor_class option to specify a custom class for inline anchors. Patch contributed by Naim Hammadi.\n\tAdded support for paste_data_images on WebKit/Blink when the user pastes image data.\n\tAdded support for highlighting the video icon when a video is added that produces an iframe. Patch contributed by monkeydiane.\n\tAdded image_class_list/link_class_list options to image/link dialogs to let the user select classes.\n\tFixed bug where the ObjectResizeStart event didn't get fired properly by the ControlSelection class.\n\tFixed bug where the autolink plugin would steal focus when loaded on IE 9+.\n\tFixed bug where the editor save method would remove the current selection when called on an inline editor.\n\tFixed bug where the formatter would merge span elements with parent bookmarks if an id format was used.\n\tFixed bug where WebKit/Blink browsers would scroll to the top of the editor when pasting into an empty element.\n\tFixed bug where removing the editor would cause an error about wrong document on IE 11 under specific circumstances.\n\tFixed bug where Gecko would place the caret at an incorrect location when using backspace.\n\tFixed bug where Gecko would throw \"Wrong Document Error\" for ranges that pointing to removed nodes.\n\tFixed bug where it wasn't possible to properly update the title and encoding properties in the fullpage plugin.\n\tFixed bug where paste plugin would produce an extra undo level on IE.\n\tFixed bug where the formatter would apply inline formatting outside the current word in if the selection was collapsed.\n\tFixed bug where it wasn't possible to delete tables on Chrome if you placed the selection within all the contents of the table.\n\tFixed bug where older IE versions wouldn't properly insert contents into table cells when editor focus was lost.\n\tFixed bug where older IE versions would fire focus/blur events even though the editor focus didn't change.\n\tFixed bug where IE 11 would add two trailing BR elements to the editor iframe body if the editor was hidden.\n\tFixed bug where the visualchars plugin wouldn't display non breaking spaces if they where inserted while the state was enabled.\n\tFixed bug where the wordcount plugin would be very slow some HTML where to much backtracking occurred.\n\tFixed so pagebreak elements in the editor breaks pages when printing. Patch contributed by penc.\n\tFixed so UndoManager events pass though the original event that created the undo level such as a keydown, blur etc.\n\tFixed so the inserttime button is callsed insertdatetime the same as the menu item and plugin name.\n\tFixed so the word count plugin handles counting properly on most languages on the planet.\n\tFixed bug where the auroreize plugin would throw an error if the editor was manually removed within a few seconds.\n\tFixed bug where the image dialog would get stuck if the src was removed. Patch contribued by monkeydiane.\n\tFixed bug where there is an extra br tag for IE 9/10 that isn't needed. Patch contributed by monkeydiane.\n\tFixed bug where drag/drop in a scrolled editor would fail since it didn't use clientX/clientY cordinates. Patch contributed by annettem.\nVersion 4.0.16 (2014-01-31)\n\tFixed bug where the editor wouldn't be properly rendered on IE 10 depending on the document.readyState.\nVersion 4.0.15 (2014-01-31)\n\tFixed bug where paste in inline mode would produce an exception if the contents was pasted inside non overflow element.\nVersion 4.0.14 (2014-01-30)\n\tFixed a bug in the image plugin where images couldn't be inserted if the image_advtab option wasn't set to true.\nVersion 4.0.13 (2014-01-30)\n\tAdded language selection menu to spellchecker button similar to the 3.x functionality. Patch contributed by threebytesfull.\n\tAdded new style_formats_merge option that enables you to append to the default formats instead of replaceing them. Patch contributed by PacificMorrowind.\n\tFixed bug where the DOMUtils getPos API function didn't properly handle the location of the root element. Patch contributed by Andrew Ozz.\n\tFixed bug where the spellchecker wouldn't properly place the spellchecker suggestions menu. Patch contributed by Andrew Ozz.\n\tFixed bug where the tabfocus plugin would prevent the user from suing Ctrl+Tab, Patch contributed by Andrew Ozz.\n\tFixed bug where table resize handles could sometimes be added to elements out side the editable inline element.\n\tFixed bug where the inline mode editor UI would render incorrectly when the stylesheets didn't finish loading on Chrome.\n\tFixed bug where IE 8 would insert the image outside the editor unless it was focused first.\n\tFixed bug where older IE versions would throw an exception on drag/drop since they don't support modern dataTransfer API.\n\tFixed bug where the blockquote button text wasn't properly translated since it had the wrong English key.\n\tFixed bug where the importcss plugin didn't import a.class rules properly as selector formats.\n\tFixed bug where the combobox control couldn't be disabled or set to a specific character size initially.\n\tFixed bug where the FormItem didn't inherit the disabled state from the control to be wrapped.\n\tFixed bug where adding a TinyMCE instance within a TinyMCE dialog wouldn't properly delegate the events.\n\tFixed bug where any overflow parent containers would automatically scroll to the left when pasting in Chrome.\n\tFixed bug where IE could throw an error when search/replacing contents due to an invalid selection being returned.\n\tFixed bug where WebKit would fire focus/blur events incorrectly if the editor was empty due to a WebKit focus bug.\n\tFixed bug where WebKit/Blink would scroll to the top of editor if the height was more than the viewport height.\n\tFixed bug where blurring and removing the editor could cause an exteption to be thrown by the FocusManager.\n\tFixed bug where the media plugin would override specified dimensions for url pattern matches. Patch contributed by penc.\n\tFixed bug where the autoresize plugin wouldn't take margins into account when calculating the body size. Patch contributed by lepoltj.\n\tFixed bug where the image plugin would throw errors some times on IE 8 when it preloaded the image to get it's dimensions.\n\tFixed bug where the image plugin wouldn't update the style if the user closed the dialog before focusing out. Patch contributed by jonparrott.\n\tFixed bug where bindOnReady in EventUtils wouldn't work properly for some edge cases on older IE versions. Patch contributed by Godefroy.\n\tFixed bug where image selector formats wasn't properly handled by the importcss plugin.\n\tFixed bug where the dirty state of the editor wasn't set when editing an existing link URL.\n\tFixed bug where it wasn't possible to prevent paste from happening by blocking the default behavior when the paste plugin was enabled.\n\tFixed bug where text to display in the insert/edit link dialog wouldn't be properly entity encoded.\n\tFixed bug where Safari 7 on Mac OS X would delete contents if you pressed Cmd+C since it passes out a charCode for the event.\n\tFixed bug where bound drop events inside inline editors would get fired on all editor instances instead of the specific instance.\n\tFixed bug where images outlined selection border would be clipped when the autoresize plugin was enabled.\n\tFixed bug where image dimension constrains proportions wouldn't work properly if you altered a value and immediately clicked the submit button.\n\tFixed so you don't need to set language option to false when specifying a custom language_url.\n\tFixed so the link dialog \"text to display\" field gets automatically hidden if the selection isn't text contents. Patch contributed by Godefroy.\n\tFixed so the none option for the target field in the link dialog gets excluded when specifying the target_list config option.\n\tFixed so outline styles are displayed by default in the formats preview. Patch contributed by nhammadi.\n\tFixed so the max characters for width/height is more than 3 in the media and image dialogs.\n\tFixed so the old mceSpellCheck command toggles the spellchecker on/off.\n\tFixed so the setupeditor event is fired before the setup callback setting to ease up compatibility with 3.x.\n\tFixed so auto url link creation in IE 9+ is disabled by default and re-enabled by the autolink plugin.\n\tRemoved the custom scrollbars for WebKit since the default browser scrollbars looks a lot better now days.\nVersion 4.0.12 (2013-12-18)\n\tAdded new media_scripts option to the media plugin. This makes it possible to embed videos using script elements.\n\tFixed bug where WebKit/Blink would produce random span elements and styles when deleting contents inside the editor.\n\tFixed bug where WebKit/Blink would produce span elements out of link elements when they where removed by the unlink command.\n\tFixed bug where div block formats in inline mode where applied to all paragraphs within the editor.\n\tFixed bug where div blocks where marked as an active format in inline mode when doing non collapsed selections.\n\tFixed bug where the importcss plugin wouldn't append styles if the style_formats option was configured.\n\tFixed bug where the importcss plugin would import styles into groups multiple times for different format menus.\n\tFixed bug where the paste plugin wouldn't properly remove the paste bin element on IE if a tried to paste a file.\n\tFixed bug where selection normalization wouldn't properly handle cases where a range point was after a element node.\n\tFixed bug where the default time format for the inserttime split button wasn't the first item in the list.\n\tFixed bug where the default text for the formatselect control wasn't properly translated by the language pack.\n\tFixed bug where links would be inserted incorrectly when auto detecting absolute urls/emails links in inline mode.\n\tFixed bug where IE 11 would insert contents in the wrong order due to focus/blur async problems.\n\tFixed bug where pasting contents on IE sometimes would place the contents at the end of the editor.\n\tFixed so drag/drop on non IE browsers gets filtered by the paste plugin. IE doesn't have the necessary APIs.\n\tFixed so the paste plugin better detects Word 2007 contents not marked with -mso junk.\n\tFixed so image button isn't set to an active state when selecting control/media placeholder items.\nVersion 4.0.11 (2013-11-20)\n\tAdded the possibility to update button icon after it's been rendered.\n\tAdded new autosave_prefix option allows you to set the prefix for the local storage keys.\n\tAdded new pagebreak_split_block option to make it easier to split block elements with a page break.\n\tFixed bug where IE would some times produce font elements when typing out side the body root blocks.\n\tFixed bug where IE wouldn't properly use the configured root block element but instead use the a paragraph.\n\tFixed bug where IE would throw a stack overflow if control selections non images was made in inline mode.\n\tFixed bug where IE 8 would render an extra enter element if the contents of the editor was empty.\n\tFixed bug where the caret wasn't moved to the first suitable element when updating the source.\n\tFixed bug where protocol relative urls would be forced into http protocol.\n\tFixed bug where internal images with data urls such as video elements would be removed by the paste_data_images option.\n\tFixed bug where the autoresize plugin wouldn't properly resize the editor to initial contents some times.\n\tFixed bug where the templates dialog wouldn't be properly rendered on IE 7.\n\tFixed bug where updating styles in the advanced tab under the image dialog would remove the style attribute on cancel.\n\tFixed bug where tinymce.full.min.js bundle script wasn't detected when looking for the tinymce root path.\n\tFixed bug where the SaxParser would throw a malformed URI sequence for inproperly encoded uris.\n\tFixed bug where enabling table caption wouldn't properly render the caption element on IE 10 and below.\n\tFixed bug where the scrollbar would be placed to the left and on top of the text of menu items in RTL mode.\n\tFixed bug where Firefox on Mac OS X would navigate forward/backward on CMD+Arrow keys.\n\tFixed bug where fullscreen toggle on fixed sized editors wouldn't be properly full screened.\n\tFixed bug where the unlink button would remove all links from the body element in inline mode under running in IE.\n\tFixed bug where iOS wasn't able to place the caret inside an empty editor when clicking below the first line.\n\tFixed so internal document anchors in Word documents are retained when pasting using the paste from word feature.\n\tFixed so menu shortcuts gets rendered with the Apple command icon patch contributed by Andy Keller.\n\tFixed so the CSS compression of styles like \"border\" is a bit better for mixed values.\n\tFixed so the template_popup_width/template_popup_height option works properly in the template plugin.\n\tFixed so the languages parameter for AddOnManager.requireLangPack works the same way as for 3.x.\n\tFixed so the autosave plugin uses the current page path, query string and editor id as it's default prefix.\n\tFixed so the fullpage plugin adds/removes any link style sheets to the current iframe document.\nVersion 4.0.10 (2013-10-28)\n\tAdded new forced_root_block_attrs option that allows you to specify attributes for the root block.\n\tFixed bug where the custom resize handles didn't work properly on IE 11.\n\tFixed bug where the code plugin would select all contents in IE when content was updated.\n\tFixed bug where the scroll position wouldn't get applied to floating toolbars.\n\tFixed bug where focusing in/out of the editor would move the caret to the top of the editor on IE 11.\n\tFixed bug where the listboxes for link and image lists wasn't updated when the url/src was changed.\n\tFixed bug where selection bookmark elements would be visible in the elements path list.\nVersion 4.0.9 (2013-10-24)\n\tAdded support for external template files to template plugin just set the templates option to a URL with JSON data.\n\tAdded new allow_script_urls option. Enabled by default, trims all script urls from attributes.\n\tFixed bug where IE would sometimes throw a \"Permission denied\" error unless the Sizzle doc was properly removed.\n\tFixed bug where lists plugin would remove outer list items if inline editable element was within a LI parent.\n\tFixed bug where insert table grid widget would insert a table on item to large when using a RTL language pack.\n\tFixed bug where fullscreen mode wasn't rendering properly on IE 7.\n\tFixed bug where resize handlers wasn't moved correctly when scrolling inline editable elements.\n\tFixed bug where it wasn't possible to paste from Excel and possible other applications due to Clipboard API bugs in browsers.\n\tFixed bug where Shift+Ctrl+V didn't produce a plain text paste on IE.\n\tFixed bug where IE would sometimes move the selection to the a previous location.\n\tFixed bug where the editor wasn't properly scrolled to the content insert location in inline mode.\n\tFixed bug where some comments would be parsed as HTML by the SaxParser.\n\tFixed bug where WebKit/Blink would render tables incorrectly if unapplying formats when having multiple table cells selected.\n\tFixed bug where the paste_data_images option wouldn't strip all kinds of data images.\n\tFixed bug where the GridLayout didn't render items correctly if the contents overflowed the layout container.\n\tFixed bug where the Window wasn't properly positioned if the size of the button bar or title bar was wider than the contents.\n\tFixed bug where pseudo selectors for finding UI controls didn't work properly.\n\tFixed bug where resized splitbuttons would throw an exception if it didn't contain an icon.\n\tFixed bug where setContent would move focus into the editor even though it wasn't active.\n\tFixed bug where IE 11 would sometimes throw an \"Invalid function\" error when calling setActive on the body element.\n\tFixed bug where the importcss plugin would import styles from CSS files not present in the content_css array.\n\tFixed bug where the jQuery plugin will initialize the editors twice if the core was loaded using the script_url option.\n\tFixed various bugs and issues related to indentation of OL/UL list elements.\n\tFixed so IE 7 renders the classic mode buttons the same size as other browsers.\n\tFixed so document.readyState is checked when loading and initializing TinyMCE manually after page load.\nVersion 4.0.8 (2013-10-10)\n\tAdded RTL support so all of the UI is rendered right to left if a language pack has a _dir property set to rtl.\n\tFixed bug where layout managers wouldn't handle subpixel values properly. When for example the browser was zoomed in.\n\tFixed bug where the importcss plugin wouldn't import classes from local stylesheets with remote @import rules on Gecko.\n\tFixed bug where Arabic characters wouldn't be properly counted in wordcount plugin.\n\tFixed bug where submit event would still fire even if it was unbound on IE 10. Now the event is simply ignored.\n\tFixed bug where IE 11 would return border-image: none when getting style attributes with borders in them.\n\tFixed various UI rendering issues on older IE versions.\n\tFixed so readonly option renderes the editor in inline mode with all UI elements disabled and all events blocked.\nVersion 4.0.7 (2013-10-02)\n\tAdded new importcss_selector_filter option to importcss plugin. Makes it easier to select specific classes to import.\n\tAdded new importcss_groups option to importcss plugin. Enables you separate classes into menu groups based on filters.\n\tAdded new PastePreProcess/PastePostProcess events and reintroduced paste_preprocess/paste_postprocess paste options.\n\tAdded new paste_word_valid_elements option lets you control what elements gets pasted when pasting from Word.\n\tFixed so panelbutton is easier to use. It's now possible to set the panel contents to any container type.\n\tFixed so editor.destroy calls editor.remove so that both destroy and remove can be used to remove an editor instance.\n\tFixed so the searchreplace plugin doesn't move focus into the editor until you close the dialog.\n\tFixed so the searchreplace plugin search for next item if you hit enter inside the dialog.\n\tFixed so importcss_selector_converter callback is executed with the scope set to importcss plugin instance.\n\tFixed so the default selector converter function is exposed in importcss plugin.\n\tFixed issue with the tabpanel not expanding properly when the tabs where wider than the body of the panel.\n\tFixed issue with the menubar option producing a JS exception if set to true.\n\tFixed bug where closing a dialog with an opened listbox would cause errors if new dialogs where opened.\n\tFixed bug where hidden input elements wasn't removed when inline editor instances where removed.\n\tFixed bug where editors wouldn't initialize some times due to event logic not working correctly.\n\tFixed bug where pre elements would cause searchreplace and spellchecker plugins to mark incorrect locations.\n\tFixed bug where embed elements wouldn't be properly resized if they where configured in using the video_template_callback.\n\tFixed bug where paste from word would remove all BR elements since it was missing in the default paste_word_valid_elements.\n\tFixed bug where paste filtering wouldn't work properly on old WebKit installations pre Clipboard API.\n\tFixed bug where linebreaks would be removed by paste plugin on IE since it didn't properly detect Word contents.\n\tFixed bug where paste plugin would convert some Word paragraphs that looked like lists into lists.\n\tFixed bug where editors wasn't properly initialized if the document.domain is set to the same as the current domain on IE.\n\tFixed bug where an exception was thrown when removing an editor after opening the context menu multiple times.\n\tFixed bug where paste as plain text on Gecko would add extra BR elements when pasting paragraphs.\nVersion 4.0.6 (2013-09-12)\n\tAdded new compat3x plugin that makes it possible to load most 3.x plugins. Only available in the development package.\n\tAdded new skin_url option enables you to load local skins when using the CDN version.\n\tAdded new theme_url option enables you to load local themes when using the CDN version.\n\tAdded new importcss_file_filter option to importcss to enable users to specify what files to import from.\n\tAdded new template_preview_replace_values option to template plugin to add example data for variables.\n\tAdded image option support for addMenuItem calls. Enables you to provide a custom image for menu items.\n\tFixed bug where editor.insertContent wouldn't set format and selection type on events.\n\tFixed bug where inserting BR elements on IE 8 would thrown an exception when the range is at a empty text node.\n\tFixed bug where outdent of single LI element within another LI would produce an empty list element OL/UL.\n\tFixed bug where the bullist/numlist buttons wouldn't be deselected when deleting all contents.\n\tFixed bug where toggling an empty list item off wouldn't produce a new empty block element.\n\tFixed bug where it wasn't possible to apply lists to mixed text blocks and br lines.\n\tFixed bug where it wasn't possible to paste contents on iOS when the paste plugin was enabled.\n\tFixed bug where it wasn't possible to delete HR elements on Gecko.\n\tFixed bug where scrolling and refocusing using the mouse would place the caret incorrectly on IE.\n\tFixed bug where you needed to hit the empty paragraph to get editor focus in IE 11.\n\tFixed bug where activeEditor wasn't set to the correct editor when opening windows.\n\tFixed bug where dirty state wasn't set to false when undoing to the first undo level.\n\tFixed bug where pasting in inline mode on Safari on Mac wouldn't work properly.\n\tFixed bug where content_css wasn't loaded into the insert template dialog.\n\tFixed bug where setting the contents of the editor to non text contents would produce an incorrect selection range.\n\tFixed so code dialog height gets smaller that the viewport height if it doesn't fit.\n\tFixed so inline editable regions scroll when pressing enter/return.\n\tFixed so inline toolbar gets positioned correctly when inline element is within a scrollable container.\n\tFixed various memory leaks when removing editor instances dynamically.\n\tRemoved CSS for BR elements in visualblocks due to problems with Chrome and IE.\nVersion 4.0.5 (2013-08-27)\n\tAdded visuals for UL, LI and BR to visualblocks plugin. Patch contributed by Dan Ransom.\n\tAdded new autosave_restore_when_empty option to autosave plugin. Enabled by default.\n\tFixed bug where an exception was thrown when inserting images if valid_elements didn't include an ID for the image.\n\tFixed bug where the advlist plugin wouldn't properly render the splitbutton controls.\n\tFixed bug where visual blocks menu item wouldn't be marked checked when using the visualblocks_default_state option.\n\tFixed bug where save button in save plugin wouldn't get properly enabled when contents was changed.\n\tFixed bug where it was possible to insert images without any value for it's source attribute.\n\tFixed bug where altering image attributes wouldn't add a new undo level.\n\tFixed bug where import rules in CSS files wouldn't be properly imported by the importcss plugin.\n\tFixed bug where selectors could be imported multiple times. Producing duplicate formats.\n\tFixed bug where IE would throw exception if selection was changed while the editor was hidden.\n\tFixed so complex rules like .class:before doesn't get imported by default in the importcss plugin.\n\tFixed so it's possible to remove images by setting the src attribute to a blank value.\n\tFixed so the save_enablewhendirty setting in the save plugin is enabled by default.\n\tFixed so block formats drop down for classic mode can be translated properly using language packs.\n\tFixed so hr menu item and toolbar button gets the same translation string.\n\tFixed so bullet list toolbar button gets the correct translation from language packs.\n\tFixed issue with Chrome logging CSS warning about border styling for combo boxes.\n\tFixed issue with Chrome logging warnings about deprecated keyLocation property.\n\tFixed issue where custom_elements would not remove the some of the default rules when cloning rules from div and span.\nVersion 4.0.4 (2013-08-21)\n\tAdded new importcss plugin. Lets you auto import classes from CSS files similar to the 3.x behavior.\n\tFixed bug where resize handles would be positioned incorrectly when inline element parent was using position: relative.\n\tFixed bug where IE 8 would throw Unknown runtime error if the editor was placed within a P tag.\n\tFixed bug where removing empty lists wouldn't produce blocks or brs where the old list was in the DOM.\n\tFixed bug where IE 10 wouldn't properly initialize template dialog due to async loading issues.\n\tFixed bug where autosave wouldn't properly display the warning about content not being saved due to isDirty changes.\n\tFixed bug where it wouldn't be possible to type if a touchstart event was bound to the parent document.\n\tFixed bug where code dialog in code plugin wouldn't wouldn't add a proper undo level.\n\tFixed issue where resizing the editor in vertical mode would set the iframe width to a pixel value.\n\tFixed issue with naming of insertdatetime settings. All are now prefixed with the plugin name.\n\tFixed so an initial change event is fired when the user types the first character into the editor.\n\tFixed so swf gets mapped to object element in media plugin. Enables embedding of flash with alternative poster.\nVersion 4.0.3 (2013-08-08)\n\tAdded new code_dialog_width/code_dialog_height options to control code dialog size.\n\tAdded missing pastetext button that works the same way as the pastetext menu item.\n\tAdded missing smaller browse button for the classical smaller toolbars.\n\tFixed bug where input method would produce new lines when inserting contents to an empty editor.\n\tFixed bug where pasting single indented list items from Word would cause a JS exception.\n\tFixed bug where applying block formats inside list elements in inline mode would apply them to whole document.\n\tFixed bug where link editing in inline mode would cause exception on IE/WebKit.\n\tFixed bug where IE 10 wouldn't render the last button group properly in inline mode due to wrapping.\n\tFixed bug where localStorage initialization would fail on Firefox/Chrome with disabled support.\n\tFixed bug where image elements would get an __mce id when undo/redo:ing to a level with image changes.\n\tFixed bug where too long template names wouldn't fit the listbox in template plugin.\n\tFixed bug where alignment format options would be marked disabled when forced_root_block was set to false.\n\tFixed bug where UI listboxes such as fontsize, fontfamily wouldn't update properly when switching editors in inline mode.\n\tFixed bug where the formats select box would mark the editable container DIV as a applied format in inline mode.\n\tFixed bug where IE 7/8 would scroll to empty editors when initialized.\n\tFixed bug where IE 7/8 wouldn't display previews of format options.\n\tFixed bug where UI states wasn't properly updated after code was changed in the code dialog.\n\tFixed bug with setting contents in IE would select all contents within the editor.\n\tFixed so the undoManages transact function disables any other undo levels from being added while within the transaction.\n\tFixed so sub/sup elements gets removed when the Clear formatting action is executed.\n\tFixed so text/javascript type value get removed by default from script elements to match the HTML5 spec.\nVersion 4.0.2 (2013-07-18)\n\tFixed bug where formatting using menus or toolbars wasn't possible on Opera 12.15.\n\tFixed bug where IE 8 keyboard input would break after paste using the paste plugin.\n\tFixed bug where IE 8 would throw an error when populating image size in image dialog.\n\tFixed bug where image resizing wouldn't work properly on latest IE 10.0.9 version.\n\tFixed bug where focus wasn't moved to the hovered menu button in a menubar container.\n\tFixed bug where paste would produce an extra uneeded undo level on IE and Gecko.\n\tFixed so anchors gets listed in the link dialog as they where in TinyMCE 3.x.\n\tFixed so sub, sup and strike though gets passed through when pasting from Word.\n\tFixed so Ctrl+P can be used to print the current document. Patch contributed by jashua212.\nVersion 4.0.1 (2013-06-26)\n\tAdded new paste_as_text config option to force paste as plaintext mode.\n\tAdded new pastetext menu item that lets you toggle paste as plain text mode on/off.\n\tAdded new insertdatetime_element option to insertdatetime plugin. Enables HTML5 time element support.\n\tAdded new spellchecker_wordchar_pattern option to allow configuration of language specific characters.\n\tAdded new marker to formats menu displaying the formats used at the current selection/caret location.\n\tFixed bug where the position of the text color picker would be wrong if you switched to fullscreen.\n\tFixed bug where the link plugin would ask to add the mailto: prefix multiple times.\n\tFixed bug where list outdent operation could produce empty list elements on specific selections.\n\tFixed bug where element path wouldn't properly select parent elements on IE.\n\tFixed bug where IE would sometimes throw an exception when extrancting the current selection range.\n\tFixed bug where line feeds wasn't properly rendered in source view on IE.\n\tFixed bug where word count wouldn't be properly rendered on IE 7.\n\tFixed bug where menubuttons/listboxes would have an incorrect height on IE 7.\n\tFixed bug where browser spellchecking was enabled while editing inline on IE 10.\n\tFixed bug where spellchecker wouldn't properly find non English words.\n\tFixed bug where deactivating inline editor instances would force padding-top: 0 on page body.\n\tFixed bug where jQuery would initialize editors multiple times since it didn't check if the editor already existed.\n\tFixed bug where it wasn't possible to paste contents on IE 10 in modern UI mode when paste filtering was enabled.\n\tFixed bug where tabfocus plugin wouldn't work properly on inline editor instances.\n\tFixed bug where fullpage plugin would clear the existing HTML head if contents where inserted into the editor.\n\tFixed bug where deleting all table rows/columns in a table would cause an exception to be thrown on IE.\n\tFixed so color button panels gets toggled on/off when activated/deactivated.\n\tFixed so format menu items that can't be applied to the current selection gets disabled.\n\tFixed so the icon parameter for addButton isn't automatically filled if a button text is provided.\n\tFixed so image size fields gets updated when selecting a new image in the image dialog.\n\tFixed so it doesn't load any language pack if the language option is set to \"en\".\n\tFixed so ctrl+shift+z works as an alternative redo shortcut to match a common Mac OS X shortcut.\n\tFixed so it's not possible to drag/drop in images in Gecko by default when paste plugin is enabled.\n\tFixed so format menu item texts gets translated using the specified language pack.\n\tFixed so the image dialog title is the same as the insert/edit image button text.\n\tFixed so paste as plain text produces BR:s in PRE block and when forced_root_block is disabled.\nVersion 4.0 (2013-06-13)\n\tAdded new insertdate_dateformat, insertdate_timeformat and insertdate_formats options to insertdatetime.\n\tAdded new font_formats, fontsize_formats and block_formats options to configure fontselect, fontsizeselect and formatselect.\n\tAdded new table_clone_elements option to table plugin. Enables you to specify what elements to clone when adding columns/rows.\n\tAdded new auto detect logic for site and email urls in link plugin to match the logic found in 3.x.\n\tAdded new getParams/setParams to WindowManager to make it easier to handle params to iframe based dialogs. Contributed by Ryan Demmer.\n\tAdded new textcolor options that enables you to specify the colors you want to display. Contributed by Jennifer Arsenault.\n\tAdded new external file support for link_list and image_list options. The file format is a simple JSON file.\n\tAdded new \"both\" mode for the resize option. Enables resizing in both width and height.\n\tAdded new paste_data_images option that allows you to enable/disable paste of data images.\n\tAdded new fixed_toolbar_container option that allows you to add a fixed container for the inline toolbar.\n\tFixed so font name, font size and block format select boxes gets updated with the current format.\n\tFixed so the resizeTo/resizeBy methods for the theme are exposed as it as in 3.x.\n\tFixed so the textcolor controls are splitbuttons as in 3.x. Patch contributed by toxalot/jashua212.\n\tFixed bug where the theme content css wasn't loaded into the preview dialog.\n\tFixed bug where the template description in template dialog wouldn't display the text correctly.\n\tFixed bug where various UI elements wasn't properly removed when an editor instance was removed.\n\tFixed bug where editing links in inline mode would fail on WebKit.\n\tFixed bug where the pagebreak_separator option in the pagebreak plugin wasn't working properly.\n\tFixed bug where the child panels of the float panel in inline mode wasn't properly placed.\n\tFixed bug where the float panel children of windows wasn't position fixed.\n\tFixed bug where the size of the ok button was hardcoded, caused issues with i18n.\n\tFixed bug where single comment in editor would cause exceptions due to resolve path logic not detecting elements only.\n\tFixed bug where switching alignment of tables in dialogs wouldn't properly remove existing alignments.\n\tFixed bug where the table properties dialog would show columns/rows textboxes.\n\tFixed bug where jQuery wasn't used instead of Sizzle in the jQuery version of TinyMCE.\n\tFixed bug where setting resize option to false whouldn't properly render the word count.\n\tFixed bug where table row type change would produce multiple table section elements.\n\tFixed bug where table row type change on multiple rows would add them in incorrect order.\n\tFixed bug where fullscreen plugin would maximize the editor on resize after toggling it off.\n\tFixed bug where context menu would be position at an incorrect coordinate in inline mode.\n\tFixed bug where inserting lists in inline mode on IE would produce errors since the body would be converted.\n\tFixed bug where the body couldn't be styled properly in custom content_css files.\n\tFixed bug where template plugins menu item would override the image menu item.\n\tFixed bug where IE 7-8 would render the text inside inputs at the wrong vertical location.\n\tFixed bug where IE configured to IE 7 compatibility mode wouldn't render the icons properly.\n\tFixed bug where editor.focus wouldn't properly fire the focusin event on WebKit.\n\tFixed bug where some keyboard shortcuts wouldn't work on IE 8.\n\tFixed bug where the undo state wasn't updated until the end of a typing level.\n\tFixed bug where keyboard shortcuts on Mac OS wasn't working correctly.\n\tFixed bug where empty inline elements would be created when toggling formatting of in empty block.\n\tFixed bug where applying styles on WebKit would fail in inline mode if the user released the mouse button outside the body.\n\tFixed bug where the visual aids menu item wasn't selected if the editor was empty.\n\tFixed so the isDirty/isNotDirty states gets updated to true/false on save() and change events.\n\tFixed so skins have separate CSS files for inline and iframe mode.\n\tFixed so menus and tool tips gets constrained to the current viewport.\n\tFixed so an error is thrown if users load jQuery after the jQuery version of TinyMCE.\n\tFixed so the filetype for media dialog passes out media instead of image as file type.\n\tFixed so it's possible to disable the toolbar by setting it to false.\n\tFixed so autoresize plugin isn't initialized when the editor is in inline mode.\n\tFixed so the inline editing toolbar will be rendered below elements if it doesn't fit above it.\nVersion 4.0b3 (2013-05-15)\n\tAdded new optional advanced tab for image dialog with hspace, vspace, border and style.\n\tAdded new change event that gets fired when undo levels are added to editor instances.\n\tAdded new removed_menuitems option enables you to list menu items to remove from menus.\n\tAdded new external_plugins option enables you to specify external locations for plugins.\n\tAdded new language_url option enables you to specify an external location for the language pack.\n\tAdded new table toolbar control that displays a menu for inserting/editing menus.\n\tFixed bug where IE 10 wouldn't load files properly from cache.\n\tFixed bug where image dialog wouldn't properly remove width/height if blanked.\n\tFixed bug where all events wasn't properly unbound when editor instances where removed.\n\tFixed bug where data- attributes wasn't working properly in the SaxParser.\n\tFixed bug where Gecko wouldn't properly render broken images.\n\tFixed bug where Gecko wouldn't produce the same error dialog on paste as other browsers.\n\tFixed bug where is wasn't possible to prevent execCommands in beforeExecCommand event.\n\tFixed bug where the fullpage_hide_in_source_view option wasn't working in the fullpage plugin.\n\tFixed bug where the WindowManager close method wouldn't properly close the top most window.\n\tFixed bug where it wasn't possible to paste in IE 10 due to JS exception.\n\tFixed bug where tab key didn't move to the right child control in tabpanels.\n\tFixed bug where enter inside a form would focus the first button like control in TinyMCE.\n\tFixed bug where it would match scripts that looked like the tinymce base directory incorrectly.\n\tFixed bug where the spellchecker wouldn't properly toggle off the spellcheck mode if no errors where found.\n\tFixed bug in searchreplace plugin where it would remove all spans instead of the marker spans.\n\tFixed issue where selector wouldn't disable existing mode setting.\n\tFixed so it's easier to configure the menu and menubar.\n\tFixed so bodyId/bodyClass is applied to preview as it's done to the editor iframe.\nVersion 4.0b2 (2013-04-24)\n\tAdded new rel_list option to link plugin. Enables you to specify values for a rel drop down.\n\tAdded new target_list option to link plugin. Enables you to add to or disable the link targets.\n\tAdded new link_list option to link plugin. Enables you to specify a list of links to pick from.\n\tAdded new image_list option to image pluigin. Enables you to specify a list of images to pick from.\n\tAdded new textcolor plugin. This plugin holds the text color and text background color buttons.\n\tFixed bug where alignment of images wasn't working properly on Firefox.\n\tFixed bug where IE 8 would throw error when inserting a table.\n\tFixed bug where IE 8 wouldn't render the element path properly.\n\tFixed bug where old IE versions would render a red focus border.\n\tFixed bug where old IE versions would render a frameborder for iframes.\n\tFixed bug where WebKit wouldn't properly open the cell properties dialog on edge case selection.\n\tFixed bug where charmap wouldn't correctly render all characters in grid.\n\tFixed bug where link dialog wouldn't update the link text properly.\n\tFixed bug where the focus/blur states on inline editors wasn't handled correctly on IE.\n\tFixed bug where IE would throw \"unknown error\" exception sometimes in ForceBlocks logic.\n\tFixed bug where IE would't properly render disabled buttons in button groups.\n\tFixed bug where tab key wouldn't properly move to next input field in dialogs.\n\tFixed bug where resize handles for tables and images would appear at wrong positions on IE 8.\n\tFixed bug where dialogs would produce stack overflow if title was wider than content.\n\tFixed bug with table cell/row menu items being enabled even if no cell was selected.\n\tFixed so the text to display is after the URL field in the link dialog.\n\tFixed so the width setting applies to the editor panel in modern theme.\n\tFixed so it's easier to make custom icons for buttons using plain old images.\nVersion 4.0b1 (2013-04-11)\n\tAdded new node.js based build process used uglify, amdlc, jake etc.\n\tAdded new package.json to enable easy installation of dependent npm packages used for building.\n\tAdded new link, image, charmap, anchor, code, hr plugins since these are now moved out of the theme.\n\tRewrote all plugins and themes from scratch so they match the new UI framework.\n\tReplaced all events to use the more common <target>.on/off(<event>) methods instead of <target>.<event>.add/remove.\n\tRewrote the TinyMCE core to use AMD style modules. Gets compiled to an inline library using amdlc.\n\tRewrote all core logic to pass jshint rules. Each file has specific jshint rules.\n\tRemoved all IE6 specific logic since 4.x will no longer support such an old browser.\n\tReworked the file names and directory structure of the whole project to be more similar to other JS projects.\n\tReplaced tinymce.util.Cookie with tinymce.util.LocalStorage. Fallback to userData for IE 7 native localStorage for the rest.\n\tReplaced the old 3.x UI with a new modern UI framework.\n\tRemoved \"simple\" theme and added new \"modern\" theme.\n\tRemoved advhr, advimage, advlink, iespell, inlinepopups, xhtmlxtras and style plugins.\n\tUpdated Sizzle to the latest version.\n"
  },
  {
    "path": "static/tinymce/js/tinymce/extentsion_self/codesimple_extentsion/prism.js",
    "content": "/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+abap+actionscript+apacheconf+apl+applescript+asciidoc+aspnet+autoit+autohotkey+bash+basic+batch+c+brainfuck+bison+csharp+cpp+coffeescript+ruby+css-extras+d+dart+diff+docker+eiffel+elixir+erlang+fsharp+fortran+gherkin+git+glsl+go+groovy+haml+handlebars+haskell+haxe+http+icon+inform7+ini+j+jade+java+json+julia+keyman+kotlin+latex+less+lolcode+lua+makefile+markdown+matlab+mel+mizar+monkey+nasm+nginx+nim+nix+nsis+objectivec+ocaml+oz+parigp+parser+pascal+perl+php+php-extras+powershell+processing+prolog+puppet+pure+python+q+qore+r+jsx+rest+rip+roboconf+crystal+rust+sas+sass+scss+scala+scheme+smalltalk+smarty+sql+stylus+swift+tcl+textile+twig+typescript+verilog+vhdl+vim+wiki+yaml */\nvar _self=\"undefined\"!=typeof window?window:\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\\blang(?:uage)?-(\\w+)\\b/i,t=0,n=_self.Prism={util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):\"Array\"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\u00a0/g,\" \")},type:function(e){return Object.prototype.toString.call(e).match(/\\[object (\\w+)\\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,\"__id\",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case\"Object\":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=n.util.clone(e[r]));return a;case\"Array\":return e.map&&e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var a=n.util.clone(n.languages[e]);for(var r in t)a[r]=t[r];return a},insertBefore:function(e,t,a,r){r=r||n.languages;var i=r[e];if(2==arguments.length){a=arguments[1];for(var l in a)a.hasOwnProperty(l)&&(i[l]=a[l]);return i}var o={};for(var s in i)if(i.hasOwnProperty(s)){if(s==t)for(var l in a)a.hasOwnProperty(l)&&(o[l]=a[l]);o[s]=i[s]}return n.languages.DFS(n.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=o)}),r[e]=o},DFS:function(e,t,a,r){r=r||{};for(var i in e)e.hasOwnProperty(i)&&(t.call(e,i,e[i],a||i),\"Object\"!==n.util.type(e[i])||r[n.util.objId(e[i])]?\"Array\"!==n.util.type(e[i])||r[n.util.objId(e[i])]||(r[n.util.objId(e[i])]=!0,n.languages.DFS(e[i],t,i,r)):(r[n.util.objId(e[i])]=!0,n.languages.DFS(e[i],t,null,r)))}},plugins:{},highlightAll:function(e,t){for(var a,r=document.querySelectorAll('code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'),i=0;a=r[i++];)n.highlightElement(a,e===!0,t)},highlightElement:function(t,a,r){for(var i,l,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(i=(o.className.match(e)||[,\"\"])[1],l=n.languages[i]),t.className=t.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+i,o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+i);var s=t.textContent,u={element:t,language:i,grammar:l,code:s};if(!s||!l)return n.hooks.run(\"complete\",u),void 0;if(n.hooks.run(\"before-highlight\",u),a&&_self.Worker){var c=new Worker(n.filename);c.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run(\"before-insert\",u),u.element.innerHTML=u.highlightedCode,r&&r.call(u.element),n.hooks.run(\"after-highlight\",u),n.hooks.run(\"complete\",u)},c.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run(\"before-insert\",u),u.element.innerHTML=u.highlightedCode,r&&r.call(t),n.hooks.run(\"after-highlight\",u),n.hooks.run(\"complete\",u)},highlight:function(e,t,r){var i=n.tokenize(e,t);return a.stringify(n.util.encode(i),r)},tokenize:function(e,t){var a=n.Token,r=[e],i=t.rest;if(i){for(var l in i)t[l]=i[l];delete t.rest}e:for(var l in t)if(t.hasOwnProperty(l)&&t[l]){var o=t[l];o=\"Array\"===n.util.type(o)?o:[o];for(var s=0;s<o.length;++s){var u=o[s],c=u.inside,g=!!u.lookbehind,f=0,h=u.alias;u=u.pattern||u;for(var p=0;p<r.length;p++){var d=r[p];if(r.length>e.length)break e;if(!(d instanceof a)){u.lastIndex=0;var m=u.exec(d);if(m){g&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,b=y+v,k=d.slice(0,y+1),w=d.slice(b+1),_=[p,1];k&&_.push(k);var P=new a(l,c?n.tokenize(m,c):m,h);_.push(P),w&&_.push(w),Array.prototype.splice.apply(r,_)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(t)}}},a=n.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(a.stringify=function(e,t,r){if(\"string\"==typeof e)return e;if(\"Array\"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join(\"\");var i={type:e.type,content:a.stringify(e.content,t,r),tag:\"span\",classes:[\"token\",e.type],attributes:{},language:t,parent:r};if(\"comment\"==i.type&&(i.attributes.spellcheck=\"true\"),e.alias){var l=\"Array\"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}n.hooks.run(\"wrap\",i);var o=\"\";for(var s in i.attributes)o+=(o?\" \":\"\")+s+'=\"'+(i.attributes[s]||\"\")+'\"';return\"<\"+i.tag+' class=\"'+i.classes.join(\" \")+'\" '+o+\">\"+i.content+\"</\"+i.tag+\">\"},!_self.document)return _self.addEventListener?(_self.addEventListener(\"message\",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,i=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),i&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName(\"script\")).pop();return r&&(n.filename=r.src,document.addEventListener&&!r.hasAttribute(\"data-manual\")&&document.addEventListener(\"DOMContentLoaded\",n.highlightAll)),_self.Prism}();\"undefined\"!=typeof module&&module.exports&&(module.exports=Prism),\"undefined\"!=typeof global&&(global.Prism=Prism);\nPrism.languages.markup={comment:/<!--[\\w\\W]*?-->/,prolog:/<\\?[\\w\\W]+?\\?>/,doctype:/<!DOCTYPE[\\w\\W]+?>/,cdata:/<!\\[CDATA\\[[\\w\\W]*?]]>/i,tag:{pattern:/<\\/?(?!\\d)[^\\s>\\/=.$<]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,inside:{tag:{pattern:/^<\\/?[^\\s>\\/]+/i,inside:{punctuation:/^<\\/?/,namespace:/^[^\\s>\\/:]+:/}},\"attr-value\":{pattern:/=(?:('|\")[\\w\\W]*?(\\1)|[^\\s>]+)/i,inside:{punctuation:/[=>\"']/}},punctuation:/\\/?>/,\"attr-name\":{pattern:/[^\\s>\\/]+/,inside:{namespace:/^[^\\s>\\/:]+:/}}}},entity:/&#?[\\da-z]{1,8};/i},Prism.hooks.add(\"wrap\",function(a){\"entity\"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,\"&\"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;\nPrism.languages.css={comment:/\\/\\*[\\w\\W]*?\\*\\//,atrule:{pattern:/@[\\w-]+?.*?(;|(?=\\s*\\{))/i,inside:{rule:/@[\\w-]+/}},url:/url\\((?:([\"'])(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1|.*?)\\)/i,selector:/[^\\{\\}\\s][^\\{\\};]*?(?=\\s*\\{)/,string:/(\"|')(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1/,property:/(\\b|\\B)[\\w-]+(?=\\s*:)/i,important:/\\B!important\\b/i,\"function\":/[-a-z0-9]+(?=\\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore(\"markup\",\"tag\",{style:{pattern:/(<style[\\w\\W]*?>)[\\w\\W]*?(?=<\\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:\"language-css\"}}),Prism.languages.insertBefore(\"inside\",\"attr-value\",{\"style-attr\":{pattern:/\\s*style=(\"|').*?\\1/i,inside:{\"attr-name\":{pattern:/^\\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\\s*=\\s*['\"]|['\"]\\s*$/,\"attr-value\":{pattern:/.+/i,inside:Prism.languages.css}},alias:\"language-css\"}},Prism.languages.markup.tag));\nPrism.languages.clike={comment:[{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0}],string:/([\"'])(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\"class-name\":{pattern:/((?:\\b(?:class|interface|extends|implements|trait|instanceof|new)\\s+)|(?:catch\\s+\\())[a-z0-9_\\.\\\\]+/i,lookbehind:!0,inside:{punctuation:/(\\.|\\\\)/}},keyword:/\\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/,\"boolean\":/\\b(true|false)\\b/,\"function\":/[a-z0-9_]+(?=\\()/i,number:/\\b-?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)\\b/i,operator:/--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.javascript=Prism.languages.extend(\"clike\",{keyword:/\\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/,number:/\\b-?(0x[\\dA-Fa-f]+|0b[01]+|0o[0-7]+|\\d*\\.?\\d+([Ee][+-]?\\d+)?|NaN|Infinity)\\b/,\"function\":/[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*(?=\\()/i}),Prism.languages.insertBefore(\"javascript\",\"keyword\",{regex:{pattern:/(^|[^\\/])\\/(?!\\/)(\\[.+?]|\\\\.|[^\\/\\\\\\r\\n])+\\/[gimyu]{0,5}(?=\\s*($|[\\r\\n,.;})]))/,lookbehind:!0}}),Prism.languages.insertBefore(\"javascript\",\"class-name\",{\"template-string\":{pattern:/`(?:\\\\\\\\|\\\\?[^\\\\])*?`/,inside:{interpolation:{pattern:/\\$\\{[^}]+\\}/,inside:{\"interpolation-punctuation\":{pattern:/^\\$\\{|\\}$/,alias:\"punctuation\"},rest:Prism.languages.javascript}},string:/[\\s\\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore(\"markup\",\"tag\",{script:{pattern:/(<script[\\w\\W]*?>)[\\w\\W]*?(?=<\\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:\"language-javascript\"}}),Prism.languages.js=Prism.languages.javascript;\nPrism.languages.abap={comment:/^\\*.*/m,string:/(`|')(\\\\?.)*?\\1/m,\"string-template\":{pattern:/(\\||\\})(\\\\?.)*?(?=\\||\\{)/,lookbehind:!0,alias:\"string\"},\"eol-comment\":{pattern:/(^|\\s)\".*/m,lookbehind:!0,alias:\"comment\"},keyword:{pattern:/(\\s|\\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\\/MM\\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\\/DD\\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\\/MM\\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\\/DD\\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|SELECTOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\\b/i,lookbehind:!0},number:/\\b\\d+\\b/,operator:{pattern:/(\\s)(?:\\*\\*?|<[=>]?|>=?|\\?=|[-+\\/=])(?=\\s)/,lookbehind:!0},\"string-operator\":{pattern:/(\\s)&&?(?=\\s)/,lookbehind:!0,alias:\"keyword\"},\"token-operator\":[{pattern:/(\\w)(?:->?|=>|[~|{}])(?=\\w)/,lookbehind:!0,alias:\"punctuation\"},{pattern:/[|{}]/,alias:\"punctuation\"}],punctuation:/[,.:()]/};\nPrism.languages.actionscript=Prism.languages.extend(\"javascript\",{keyword:/\\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\\b/,operator:/\\+\\+|--|(?:[+\\-*\\/%^]|&&?|\\|\\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript[\"class-name\"].alias=\"function\",Prism.languages.markup&&Prism.languages.insertBefore(\"actionscript\",\"string\",{xml:{pattern:/(^|[^.])<\\/?\\w+(?:\\s+[^\\s>\\/=]+=(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\2)*\\s*\\/?>/,lookbehind:!0,inside:{rest:Prism.languages.markup}}});\nPrism.languages.apacheconf={comment:/#.*/,\"directive-inline\":{pattern:/^(\\s*)\\b(AcceptFilter|AcceptPathInfo|AccessFileName|Action|AddAlt|AddAltByEncoding|AddAltByType|AddCharset|AddDefaultCharset|AddDescription|AddEncoding|AddHandler|AddIcon|AddIconByEncoding|AddIconByType|AddInputFilter|AddLanguage|AddModuleInfo|AddOutputFilter|AddOutputFilterByType|AddType|Alias|AliasMatch|Allow|AllowCONNECT|AllowEncodedSlashes|AllowMethods|AllowOverride|AllowOverrideList|Anonymous|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail|AsyncRequestWorkerFactor|AuthBasicAuthoritative|AuthBasicFake|AuthBasicProvider|AuthBasicUseDigestAlgorithm|AuthDBDUserPWQuery|AuthDBDUserRealmQuery|AuthDBMGroupFile|AuthDBMType|AuthDBMUserFile|AuthDigestAlgorithm|AuthDigestDomain|AuthDigestNonceLifetime|AuthDigestProvider|AuthDigestQop|AuthDigestShmemSize|AuthFormAuthoritative|AuthFormBody|AuthFormDisableNoStore|AuthFormFakeBasicAuth|AuthFormLocation|AuthFormLoginRequiredLocation|AuthFormLoginSuccessLocation|AuthFormLogoutLocation|AuthFormMethod|AuthFormMimetype|AuthFormPassword|AuthFormProvider|AuthFormSitePassphrase|AuthFormSize|AuthFormUsername|AuthGroupFile|AuthLDAPAuthorizePrefix|AuthLDAPBindAuthoritative|AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareAsUser|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPInitialBindAsUser|AuthLDAPInitialBindPattern|AuthLDAPMaxSubGroupDepth|AuthLDAPRemoteUserAttribute|AuthLDAPRemoteUserIsDN|AuthLDAPSearchAsUser|AuthLDAPSubGroupAttribute|AuthLDAPSubGroupClass|AuthLDAPUrl|AuthMerging|AuthName|AuthnCacheContext|AuthnCacheEnable|AuthnCacheProvideFor|AuthnCacheSOCache|AuthnCacheTimeout|AuthnzFcgiCheckAuthnProvider|AuthnzFcgiDefineProvider|AuthType|AuthUserFile|AuthzDBDLoginToReferer|AuthzDBDQuery|AuthzDBDRedirectQuery|AuthzDBMType|AuthzSendForbiddenOnFailure|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|CacheDefaultExpire|CacheDetailHeader|CacheDirLength|CacheDirLevels|CacheDisable|CacheEnable|CacheFile|CacheHeader|CacheIgnoreCacheControl|CacheIgnoreHeaders|CacheIgnoreNoLastMod|CacheIgnoreQueryString|CacheIgnoreURLSessionIdentifiers|CacheKeyBaseURL|CacheLastModifiedFactor|CacheLock|CacheLockMaxAge|CacheLockPath|CacheMaxExpire|CacheMaxFileSize|CacheMinExpire|CacheMinFileSize|CacheNegotiatedDocs|CacheQuickHandler|CacheReadSize|CacheReadTime|CacheRoot|CacheSocache|CacheSocacheMaxSize|CacheSocacheMaxTime|CacheSocacheMinTime|CacheSocacheReadSize|CacheSocacheReadTime|CacheStaleOnError|CacheStoreExpired|CacheStoreNoStore|CacheStorePrivate|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateInflateLimitRequestBody|DeflateInflateRatioBurst|DeflateInflateRatioLimit|DeflateMemLevel|DeflateWindowSize|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|HeartbeatAddress|HeartbeatListen|HeartbeatMaxServers|HeartbeatStorage|HeartbeatStorage|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|IndexHeadInsert|IndexIgnore|IndexIgnoreReset|IndexOptions|IndexOrderDefault|IndexStyleSheet|InputSed|ISAPIAppendLogToErrors|ISAPIAppendLogToQuery|ISAPICacheFile|ISAPIFakeAsync|ISAPILogNotSupported|ISAPIReadAheadBuffer|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAPCacheEntries|LDAPCacheTTL|LDAPConnectionPoolTTL|LDAPConnectionTimeout|LDAPLibraryDebug|LDAPOpCacheEntries|LDAPOpCacheTTL|LDAPReferralHopLimit|LDAPReferrals|LDAPRetries|LDAPRetryDelay|LDAPSharedCacheFile|LDAPSharedCacheSize|LDAPTimeout|LDAPTrustedClientCert|LDAPTrustedGlobalCert|LDAPTrustedMode|LDAPVerifyServerCert|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|LuaHookAccessChecker|LuaHookAuthChecker|LuaHookCheckUserID|LuaHookFixups|LuaHookInsertFilter|LuaHookLog|LuaHookMapToStorage|LuaHookTranslateName|LuaHookTypeChecker|LuaInherit|LuaInputFilter|LuaMapHandler|LuaOutputFilter|LuaPackageCPath|LuaPackagePath|LuaQuickHandler|LuaRoot|LuaScope|MaxConnectionsPerChild|MaxKeepAliveRequests|MaxMemFree|MaxRangeOverlaps|MaxRangeReversals|MaxRanges|MaxRequestWorkers|MaxSpareServers|MaxSpareThreads|MaxThreads|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|ProxyAddHeaders|ProxyBadHeader|ProxyBlock|ProxyDomain|ProxyErrorOverride|ProxyExpressDBMFile|ProxyExpressDBMType|ProxyExpressEnable|ProxyFtpDirCharset|ProxyFtpEscapeWildcards|ProxyFtpListOnWildcard|ProxyHTMLBufSize|ProxyHTMLCharsetOut|ProxyHTMLDocType|ProxyHTMLEnable|ProxyHTMLEvents|ProxyHTMLExtended|ProxyHTMLFixups|ProxyHTMLInterp|ProxyHTMLLinks|ProxyHTMLMeta|ProxyHTMLStripComments|ProxyHTMLURLMap|ProxyIOBufferSize|ProxyMaxForwards|ProxyPass|ProxyPassInherit|ProxyPassInterpolateEnv|ProxyPassMatch|ProxyPassReverse|ProxyPassReverseCookieDomain|ProxyPassReverseCookiePath|ProxyPreserveHost|ProxyReceiveBufferSize|ProxyRemote|ProxyRemoteMatch|ProxyRequests|ProxySCGIInternalRedirect|ProxySCGISendfile|ProxySet|ProxySourceAddress|ProxyStatus|ProxyTimeout|ProxyVia|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIPHeader|RemoteIPInternalProxy|RemoteIPInternalProxyList|RemoteIPProxiesHeader|RemoteIPTrustedProxy|RemoteIPTrustedProxyList|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|RewriteBase|RewriteCond|RewriteEngine|RewriteMap|RewriteOptions|RewriteRule|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script|ScriptAlias|ScriptAliasMatch|ScriptInterpreterSource|ScriptLog|ScriptLogBuffer|ScriptLogLength|ScriptSock|SecureListen|SeeRequestTail|SendBufferSize|ServerAdmin|ServerAlias|ServerLimit|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|Session|SessionCookieName|SessionCookieName2|SessionCookieRemove|SessionCryptoCipher|SessionCryptoDriver|SessionCryptoPassphrase|SessionCryptoPassphraseFile|SessionDBDCookieName|SessionDBDCookieName2|SessionDBDCookieRemove|SessionDBDDeleteLabel|SessionDBDInsertLabel|SessionDBDPerUser|SessionDBDSelectLabel|SessionDBDUpdateLabel|SessionEnv|SessionExclude|SessionHeader|SessionInclude|SessionMaxAge|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSLCACertificateFile|SSLCACertificatePath|SSLCADNRequestFile|SSLCADNRequestPath|SSLCARevocationCheck|SSLCARevocationFile|SSLCARevocationPath|SSLCertificateChainFile|SSLCertificateFile|SSLCertificateKeyFile|SSLCipherSuite|SSLCompression|SSLCryptoDevice|SSLEngine|SSLFIPS|SSLHonorCipherOrder|SSLInsecureRenegotiation|SSLOCSPDefaultResponder|SSLOCSPEnable|SSLOCSPOverrideResponder|SSLOCSPResponderTimeout|SSLOCSPResponseMaxAge|SSLOCSPResponseTimeSkew|SSLOCSPUseRequestNonce|SSLOpenSSLConfCmd|SSLOptions|SSLPassPhraseDialog|SSLProtocol|SSLProxyCACertificateFile|SSLProxyCACertificatePath|SSLProxyCARevocationCheck|SSLProxyCARevocationFile|SSLProxyCARevocationPath|SSLProxyCheckPeerCN|SSLProxyCheckPeerExpire|SSLProxyCheckPeerName|SSLProxyCipherSuite|SSLProxyEngine|SSLProxyMachineCertificateChainFile|SSLProxyMachineCertificateFile|SSLProxyMachineCertificatePath|SSLProxyProtocol|SSLProxyVerify|SSLProxyVerifyDepth|SSLRandomSeed|SSLRenegBufferSize|SSLRequire|SSLRequireSSL|SSLSessionCache|SSLSessionCacheTimeout|SSLSessionTicketKeyFile|SSLSRPUnknownUserSeed|SSLSRPVerifierFile|SSLStaplingCache|SSLStaplingErrorCacheTimeout|SSLStaplingFakeTryLater|SSLStaplingForceURL|SSLStaplingResponderTimeout|SSLStaplingResponseMaxAge|SSLStaplingResponseTimeSkew|SSLStaplingReturnResponderErrors|SSLStaplingStandardCacheTimeout|SSLStrictSNIVHostCheck|SSLUserName|SSLUseStapling|SSLVerifyClient|SSLVerifyDepth|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|VirtualDocumentRoot|VirtualDocumentRootIP|VirtualScriptAlias|VirtualScriptAliasIP|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\\b/im,lookbehind:!0,alias:\"property\"},\"directive-block\":{pattern:/<\\/?\\b(AuthnProviderAlias|AuthzProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|RequireAll|RequireAny|RequireNone|VirtualHost)\\b *.*>/i,inside:{\"directive-block\":{pattern:/^<\\/?\\w+/,inside:{punctuation:/^<\\/?/},alias:\"tag\"},\"directive-block-parameter\":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/(\"|').*\\1/,inside:{variable:/(\\$|%)\\{?(\\w\\.?(\\+|\\-|:)?)+\\}?/}}},alias:\"attr-value\"},punctuation:/>/},alias:\"tag\"},\"directive-flags\":{pattern:/\\[(\\w,?)+\\]/,alias:\"keyword\"},string:{pattern:/(\"|').*\\1/,inside:{variable:/(\\$|%)\\{?(\\w\\.?(\\+|\\-|:)?)+\\}?/}},variable:/(\\$|%)\\{?(\\w\\.?(\\+|\\-|:)?)+\\}?/,regex:/\\^?.*\\$|\\^.*\\$?/};\nPrism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:/'(?:[^'\\r\\n]|'')*'/,number:/¯?(?:\\d*\\.?\\d+(?:e[+¯]?\\d+)?|¯|∞)(?:j¯?(?:\\d*\\.?\\d+(?:e[\\+¯]?\\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\\b/,\"system-function\":{pattern:/⎕[A-Z]+/i,alias:\"function\"},constant:/[⍬⌾#⎕⍞]/,\"function\":/[-+×÷⌈⌊∣|⍳?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,\"monadic-operator\":{pattern:/[\\\\\\/⌿⍀¨⍨⌶&∥]/,alias:\"operator\"},\"dyadic-operator\":{pattern:/[.⍣⍠⍤∘⌸]/,alias:\"operator\"},assignment:{pattern:/←/,alias:\"keyword\"},punctuation:/[\\[;\\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:\"builtin\"}};\nPrism.languages.applescript={comment:[/\\(\\*(?:\\(\\*[\\w\\W]*?\\*\\)|[\\w\\W])*?\\*\\)/,/--.+/,/#.+/],string:/\"(?:\\\\?.)*?\"/,number:/\\b-?\\d*\\.?\\d+([Ee]-?\\d+)?\\b/,operator:[/[&=≠≤≥*+\\-\\/÷^]|[<>]=?/,/\\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\\b/],keyword:/\\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\\b/,\"class\":{pattern:/\\b(?:alias|application|boolean|class|constant|date|file|integer|list|number|POSIX file|real|record|reference|RGB color|script|text|centimetres|centimeters|feet|inches|kilometres|kilometers|metres|meters|miles|yards|square feet|square kilometres|square kilometers|square metres|square meters|square miles|square yards|cubic centimetres|cubic centimeters|cubic feet|cubic inches|cubic metres|cubic meters|cubic yards|gallons|litres|liters|quarts|grams|kilograms|ounces|pounds|degrees Celsius|degrees Fahrenheit|degrees Kelvin)\\b/,alias:\"builtin\"},punctuation:/[{}():,¬«»《》]/};\n!function(a){var i={pattern:/(^[ \\t]*)\\[(?!\\[)(?:([\"'$`])(?:(?!\\2)[^\\\\]|\\\\.)*\\2|\\[(?:[^\\]\\\\]|\\\\.)*\\]|[^\\]\\\\]|\\\\.)*\\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\\1)[^\\\\]|\\\\.)*\\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\\\]|\\\\.)*'/,inside:{punctuation:/^'|'$/}},string:/\"(?:[^\"\\\\]|\\\\.)*\"/,variable:/\\w+(?==)/,punctuation:/^\\[|\\]$|,/,operator:/=/,\"attr-value\":/(?!^\\s+$).+/}};a.languages.asciidoc={\"comment-block\":{pattern:/^(\\/{4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1/m,alias:\"comment\"},table:{pattern:/^\\|={3,}(?:(?:\\r?\\n|\\r).*)*?(?:\\r?\\n|\\r)\\|={3,}$/m,inside:{specifiers:{pattern:/(?!\\|)(?:(?:(?:\\d+(?:\\.\\d+)?|\\.\\d+)[+*])?(?:[<^>](?:\\.[<^>])?|\\.[<^>])?[a-z]*)(?=\\|)/,alias:\"attr-value\"},punctuation:{pattern:/(^|[^\\\\])[|!]=*/,lookbehind:!0}}},\"passthrough-block\":{pattern:/^(\\+{4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1$/m,inside:{punctuation:/^\\++|\\++$/}},\"literal-block\":{pattern:/^(-{4,}|\\.{4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1$/m,inside:{punctuation:/^(?:-+|\\.+)|(?:-+|\\.+)$/}},\"other-block\":{pattern:/^(--|\\*{4,}|_{4,}|={4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1$/m,inside:{punctuation:/^(?:-+|\\*+|_+|=+)|(?:-+|\\*+|_+|=+)$/}},\"list-punctuation\":{pattern:/(^[ \\t]*)(?:-|\\*{1,5}|\\.{1,5}|(?:[a-z]|\\d+)\\.|[xvi]+\\))(?= )/im,lookbehind:!0,alias:\"punctuation\"},\"list-label\":{pattern:/(^[ \\t]*)[a-z\\d].+(?::{2,4}|;;)(?=\\s)/im,lookbehind:!0,alias:\"symbol\"},\"indented-block\":{pattern:/((\\r?\\n|\\r)\\2)([ \\t]+)\\S.*(?:(?:\\r?\\n|\\r)\\3.+)*(?=\\2{2}|$)/,lookbehind:!0},comment:/^\\/\\/.*/m,title:{pattern:/^.+(?:\\r?\\n|\\r)(?:={3,}|-{3,}|~{3,}|\\^{3,}|\\+{3,})$|^={1,5} +.+|^\\.(?![\\s.]).*/m,alias:\"important\",inside:{punctuation:/^(?:\\.|=+)|(?:=+|-+|~+|\\^+|\\++)$/}},\"attribute-entry\":{pattern:/^:[^:\\r\\n]+:(?: .*?(?: \\+(?:\\r?\\n|\\r).*?)*)?$/m,alias:\"tag\"},attributes:i,hr:{pattern:/^'{3,}$/m,alias:\"punctuation\"},\"page-break\":{pattern:/^<{3,}$/m,alias:\"punctuation\"},admonition:{pattern:/^(?:TIP|NOTE|IMPORTANT|WARNING|CAUTION):/m,alias:\"keyword\"},callout:[{pattern:/(^[ \\t]*)<?\\d*>/m,lookbehind:!0,alias:\"symbol\"},{pattern:/<\\d+>/,alias:\"symbol\"}],macro:{pattern:/\\b[a-z\\d][a-z\\d-]*::?(?:(?:\\S+)??\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*\\1|\\\\.)*\\])/,inside:{\"function\":/^[a-z\\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*\\1|\\\\.)*\\])/,inside:i.inside}}},inline:{pattern:/(^|[^\\\\])(?:(?:\\B\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\2)[^\\\\]|\\\\.)*\\2|\\\\.)*\\])?(?:\\b_(?!\\s)(?: _|[^_\\\\\\r\\n]|\\\\.)+(?:(?:\\r?\\n|\\r)(?: _|[^_\\\\\\r\\n]|\\\\.)+)*_\\b|\\B``(?!\\s).+?(?:(?:\\r?\\n|\\r).+?)*''\\B|\\B`(?!\\s)(?: ['`]|.)+?(?:(?:\\r?\\n|\\r)(?: ['`]|.)+?)*['`]\\B|\\B(['*+#])(?!\\s)(?: \\3|(?!\\3)[^\\\\\\r\\n]|\\\\.)+(?:(?:\\r?\\n|\\r)(?: \\3|(?!\\3)[^\\\\\\r\\n]|\\\\.)+)*\\3\\B)|(?:\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\4)[^\\\\]|\\\\.)*\\4|\\\\.)*\\])?(?:(__|\\*\\*|\\+\\+\\+?|##|\\$\\$|[~^]).+?(?:(?:\\r?\\n|\\r).+?)*\\5|\\{[^}\\r\\n]+\\}|\\[\\[\\[?.+?(?:(?:\\r?\\n|\\r).+?)*\\]?\\]\\]|<<.+?(?:(?:\\r?\\n|\\r).+?)*>>|\\(\\(\\(?.+?(?:(?:\\r?\\n|\\r).+?)*\\)?\\)\\)))/m,lookbehind:!0,inside:{attributes:i,url:{pattern:/^(?:\\[\\[\\[?.+?\\]?\\]\\]|<<.+?>>)$/,inside:{punctuation:/^(?:\\[\\[\\[?|<<)|(?:\\]\\]\\]?|>>)$/}},\"attribute-ref\":{pattern:/^\\{.+\\}$/,inside:{variable:{pattern:/(^\\{)[a-z\\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\\{|\\}$|::?/}},italic:{pattern:/^(['_])[\\s\\S]+\\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\\*[\\s\\S]+\\*$/,inside:{punctuation:/^\\*\\*?|\\*\\*?$/}},punctuation:/^(?:``?|\\+{1,3}|##?|\\$\\$|[~^]|\\(\\(\\(?)|(?:''?|\\+{1,3}|##?|\\$\\$|[~^`]|\\)?\\)\\))$/}},replacement:{pattern:/\\((?:C|TM|R)\\)/,alias:\"builtin\"},entity:/&#?[\\da-z]{1,8};/i,\"line-continuation\":{pattern:/(^| )\\+$/m,lookbehind:!0,alias:\"punctuation\"}},i.inside.interpreted.inside.rest={macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity},a.languages.asciidoc[\"passthrough-block\"].inside.rest={macro:a.languages.asciidoc.macro},a.languages.asciidoc[\"literal-block\"].inside.rest={callout:a.languages.asciidoc.callout},a.languages.asciidoc.table.inside.rest={\"comment-block\":a.languages.asciidoc[\"comment-block\"],\"passthrough-block\":a.languages.asciidoc[\"passthrough-block\"],\"literal-block\":a.languages.asciidoc[\"literal-block\"],\"other-block\":a.languages.asciidoc[\"other-block\"],\"list-punctuation\":a.languages.asciidoc[\"list-punctuation\"],\"indented-block\":a.languages.asciidoc[\"indented-block\"],comment:a.languages.asciidoc.comment,title:a.languages.asciidoc.title,\"attribute-entry\":a.languages.asciidoc[\"attribute-entry\"],attributes:a.languages.asciidoc.attributes,hr:a.languages.asciidoc.hr,\"page-break\":a.languages.asciidoc[\"page-break\"],admonition:a.languages.asciidoc.admonition,\"list-label\":a.languages.asciidoc[\"list-label\"],callout:a.languages.asciidoc.callout,macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity,\"line-continuation\":a.languages.asciidoc[\"line-continuation\"]},a.languages.asciidoc[\"other-block\"].inside.rest={table:a.languages.asciidoc.table,\"list-punctuation\":a.languages.asciidoc[\"list-punctuation\"],\"indented-block\":a.languages.asciidoc[\"indented-block\"],comment:a.languages.asciidoc.comment,\"attribute-entry\":a.languages.asciidoc[\"attribute-entry\"],attributes:a.languages.asciidoc.attributes,hr:a.languages.asciidoc.hr,\"page-break\":a.languages.asciidoc[\"page-break\"],admonition:a.languages.asciidoc.admonition,\"list-label\":a.languages.asciidoc[\"list-label\"],macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity,\"line-continuation\":a.languages.asciidoc[\"line-continuation\"]},a.languages.asciidoc.title.inside.rest={macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity},a.hooks.add(\"wrap\",function(a){\"entity\"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,\"&\"))})}(Prism);\nPrism.languages.aspnet=Prism.languages.extend(\"markup\",{\"page-directive tag\":{pattern:/<%\\s*@.*%>/i,inside:{\"page-directive tag\":/<%\\s*@\\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},\"directive tag\":{pattern:/<%.*%>/i,inside:{\"directive tag\":/<%\\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\\/?[^\\s>\\/]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,Prism.languages.insertBefore(\"inside\",\"punctuation\",{\"directive tag\":Prism.languages.aspnet[\"directive tag\"]},Prism.languages.aspnet.tag.inside[\"attr-value\"]),Prism.languages.insertBefore(\"aspnet\",\"comment\",{\"asp comment\":/<%--[\\w\\W]*?--%>/}),Prism.languages.insertBefore(\"aspnet\",Prism.languages.javascript?\"script\":\"tag\",{\"asp script\":{pattern:/(<script(?=.*runat=['\"]?server['\"]?)[\\w\\W]*?>)[\\w\\W]*?(?=<\\/script>)/i,lookbehind:!0,inside:Prism.languages.csharp||{}}});\nPrism.languages.autoit={comment:[/;.*/,{pattern:/(^\\s*)#(?:comments-start|cs)[\\s\\S]*?^\\s*#(?:comments-end|ce)/m,lookbehind:!0}],url:{pattern:/(^\\s*#include\\s+)(?:<[^\\r\\n>]+>|\"[^\\r\\n\"]+\")/m,lookbehind:!0},string:{pattern:/([\"'])(?:\\1\\1|(?!\\1)[^\\r\\n])*\\1/,inside:{variable:/([%$@])\\w+\\1/}},directive:{pattern:/(^\\s*)#\\w+/m,lookbehind:!0,alias:\"keyword\"},\"function\":/\\b\\w+(?=\\()/,variable:/[$@]\\w+/,keyword:/\\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\\b/i,number:/\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b/i,\"boolean\":/\\b(?:True|False)\\b/i,operator:/<[=>]?|[-+*\\/=&>]=?|[?^]|\\b(?:And|Or|Not)\\b/i,punctuation:/[\\[\\]().,:]/};\nPrism.languages.autohotkey={comment:{pattern:/(^[^\";\\n]*(\"[^\"\\n]*?\"[^\"\\n]*?)*)(;.*$|^\\s*\\/\\*[\\s\\S]*\\n\\*\\/)/m,lookbehind:!0},string:/\"(([^\"\\n\\r]|\"\")*)\"/m,\"function\":/[^\\(\\); \\t,\\n\\+\\*\\-=\\?>:\\\\\\/<&%\\[\\]]+?(?=\\()/m,tag:/^[ \\t]*[^\\s:]+?(?=:(?:[^:]|$))/m,variable:/%\\w+%/,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?)\\b/,operator:/\\?|\\/\\/?=?|:=|\\|[=|]?|&[=&]?|\\+[=+]?|-[=-]?|\\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\\b(?:AND|NOT|OR)\\b/,punctuation:/[\\{}[\\]\\(\\):,]/,\"boolean\":/\\b(true|false)\\b/,selector:/\\b(AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\\b/i,constant:/\\b(a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_formatfloat|a_formatinteger|a_gui|a_guievent|a_guicontrol|a_guicontrolevent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|programfiles|a_programfiles|a_programs|a_programscommon|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel)\\b/i,builtin:/\\b(abs|acos|asc|asin|atan|ceil|chr|class|cos|dllcall|exp|fileexist|Fileopen|floor|il_add|il_create|il_destroy|instr|substr|isfunc|islabel|IsObject|ln|log|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|onmessage|numget|numput|registercallback|regexmatch|regexreplace|round|sin|tan|sqrt|strlen|sb_seticon|sb_setparts|sb_settext|strsplit|tv_add|tv_delete|tv_getchild|tv_getcount|tv_getnext|tv_get|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__New|__Call|__Get|__Set)\\b/i,symbol:/\\b(alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\\b/i,important:/#\\b(AllowSameLineComments|ClipboardTimeout|CommentFlag|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InstallKeybdHook|InstallMouseHook|KeyHistory|LTrim|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|WinActivateForce)\\b/i,keyword:/\\b(Abort|AboveNormal|Add|ahk_class|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Region|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|TryAgain|Type|UnCheck|underline|Unicode|Unlock|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\\b/i};\n!function(e){var t={variable:[{pattern:/\\$?\\(\\([\\w\\W]+?\\)\\)/,inside:{variable:[{pattern:/(^\\$\\(\\([\\w\\W]+)\\)\\)/,lookbehind:!0},/^\\$\\(\\(/],number:/\\b-?(?:0x[\\dA-Fa-f]+|\\d*\\.?\\d+(?:[Ee]-?\\d+)?)\\b/,operator:/--?|-=|\\+\\+?|\\+=|!=?|~|\\*\\*?|\\*=|\\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\\^=?|\\|\\|?|\\|=|\\?|:/,punctuation:/\\(\\(?|\\)\\)?|,|;/}},{pattern:/\\$\\([^)]+\\)|`[^`]+`/,inside:{variable:/^\\$\\(|^`|\\)$|`$/}},/\\$(?:[a-z0-9_#\\?\\*!@]+|\\{[^}]+\\})/i]};e.languages.bash={shebang:{pattern:/^#!\\s*\\/bin\\/bash|^#!\\s*\\/bin\\/sh/,alias:\"important\"},comment:{pattern:/(^|[^\"{\\\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\\s*)(?:\"|')?(\\w+?)(?:\"|')?\\s*\\r?\\n(?:[\\s\\S])*?\\r?\\n\\2/g,lookbehind:!0,inside:t},{pattern:/([\"'])(?:\\\\\\\\|\\\\?[^\\\\])*?\\1/g,inside:t}],variable:t.variable,\"function\":{pattern:/(^|\\s|;|\\||&)(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|\\s|;|\\||&)/,lookbehind:!0},keyword:{pattern:/(^|\\s|;|\\||&)(?:let|:|\\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|\\s|;|\\||&)/,lookbehind:!0},\"boolean\":{pattern:/(^|\\s|;|\\||&)(?:true|false)(?=$|\\s|;|\\||&)/,lookbehind:!0},operator:/&&?|\\|\\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,punctuation:/\\$?\\(\\(?|\\)\\)?|\\.\\.|[{}[\\];]/};var a=t.variable[1].inside;a[\"function\"]=e.languages.bash[\"function\"],a.keyword=e.languages.bash.keyword,a.boolean=e.languages.bash.boolean,a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation}(Prism);\nPrism.languages.basic={string:/\"(?:\"\"|[!#$%&'()*,\\/:;<=>?^_ +\\-.A-Z\\d])*\"/i,comment:{pattern:/(?:!|REM\\b).+/i,inside:{keyword:/^REM/i}},number:/(?:\\b|\\B[.-])(?:\\d+\\.?\\d*)(?:E[+-]?\\d+)?/i,keyword:/\\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SHARED|SINGLE|SELECT CASE|SHELL|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\\$|\\b)/i,\"function\":/\\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\\$|\\b)/i,operator:/<[=>]?|>=?|[+\\-*\\/^=&]|\\b(?:AND|EQV|IMP|NOT|OR|XOR)\\b/i,punctuation:/[,;:()]/};\n!function(e){var r=/%%?[~:\\w]+%?|!\\S+!/,t={pattern:/\\/[a-z?]+(?=[ :]|$):?|-[a-z]\\b|--[a-z-]+\\b/im,alias:\"attr-name\",inside:{punctuation:/:/}},n=/\"[^\"]*\"/,i=/(?:\\b|-)\\d+\\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \\t]*)rem\\b(?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:\"property\"},command:[{pattern:/((?:^|[&(])[ \\t]*)for(?: ?\\/[a-z?](?:[ :](?:\"[^\"]*\"|\\S+))?)* \\S+ in \\([^)]+\\) do/im,lookbehind:!0,inside:{keyword:/^for\\b|\\b(?:in|do)\\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \\t]*)if(?: ?\\/[a-z?](?:[ :](?:\"[^\"]*\"|\\S+))?)* (?:not )?(?:cmdextversion \\d+|defined \\w+|errorlevel \\d+|exist \\S+|(?:\"[^\"]*\"|\\S+)?(?:==| (?:equ|neq|lss|leq|gtr|geq) )(?:\"[^\"]*\"|\\S+))/im,lookbehind:!0,inside:{keyword:/^if\\b|\\b(?:not|cmdextversion|defined|errorlevel|exist)\\b/i,string:n,parameter:t,variable:r,number:i,operator:/\\^|==|\\b(?:equ|neq|lss|leq|gtr|geq)\\b/i}},{pattern:/((?:^|[&()])[ \\t]*)else\\b/im,lookbehind:!0,inside:{keyword:/^else\\b/i}},{pattern:/((?:^|[&(])[ \\t]*)set(?: ?\\/[a-z](?:[ :](?:\"[^\"]*\"|\\S+))?)* (?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,lookbehind:!0,inside:{keyword:/^set\\b/i,string:n,parameter:t,variable:[r,/\\w+(?=(?:[*\\/%+\\-&^|]|<<|>>)?=)/],number:i,operator:/[*\\/%+\\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \\t]*@?)\\w+\\b(?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,lookbehind:!0,inside:{keyword:/^\\w+\\b/i,string:n,parameter:t,label:{pattern:/(^\\s*):\\S+/m,lookbehind:!0,alias:\"property\"},variable:r,number:i,operator:/\\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism);\nPrism.languages.c=Prism.languages.extend(\"clike\",{keyword:/\\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\\b/,operator:/\\-[>-]?|\\+\\+?|!=?|<<?=?|>>?=?|==?|&&?|\\|?\\||[~^%?*\\/]/,number:/\\b-?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)[ful]*\\b/i}),Prism.languages.insertBefore(\"c\",\"string\",{macro:{pattern:/(^\\s*)#\\s*[a-z]+([^\\r\\n\\\\]|\\\\.|\\\\(?:\\r\\n?|\\n))*/im,lookbehind:!0,alias:\"property\",inside:{string:{pattern:/(#\\s*include\\s*)(<.+?>|(\"|')(\\\\?.)+?\\3)/,lookbehind:!0},directive:{pattern:/(#\\s*)\\b(define|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\\b/,lookbehind:!0,alias:\"keyword\"}}},constant:/\\b(__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|stdin|stdout|stderr)\\b/}),delete Prism.languages.c[\"class-name\"],delete Prism.languages.c[\"boolean\"];\nPrism.languages.brainfuck={pointer:{pattern:/<|>/,alias:\"keyword\"},increment:{pattern:/\\+/,alias:\"inserted\"},decrement:{pattern:/-/,alias:\"deleted\"},branching:{pattern:/\\[|\\]/,alias:\"important\"},operator:/[.,]/,comment:/\\S+/};\nPrism.languages.bison=Prism.languages.extend(\"c\",{}),Prism.languages.insertBefore(\"bison\",\"comment\",{bison:{pattern:/^[\\s\\S]*?%%[\\s\\S]*?%%/,inside:{c:{pattern:/%\\{[\\s\\S]*?%\\}|\\{(?:\\{[^}]*\\}|[^{}])*\\}/,inside:{delimiter:{pattern:/^%?\\{|%?\\}$/,alias:\"punctuation\"},\"bison-variable\":{pattern:/[$@](?:<[^\\s>]+>)?[\\w$]+/,alias:\"variable\",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\\S+(?=:)/,keyword:/%\\w+/,number:{pattern:/(^|[^@])\\b(?:0x[\\da-f]+|\\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\\[\\]<>]/}}});\nPrism.languages.csharp=Prism.languages.extend(\"clike\",{keyword:/\\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\\b/,string:[/@(\"|')(\\1\\1|\\\\\\1|\\\\?(?!\\1)[\\s\\S])*\\1/,/(\"|')(\\\\?.)*?\\1/],number:/\\b-?(0x[\\da-f]+|\\d*\\.?\\d+f?)\\b/i}),Prism.languages.insertBefore(\"csharp\",\"keyword\",{preprocessor:{pattern:/(^\\s*)#.*/m,lookbehind:!0,alias:\"property\",inside:{directive:{pattern:/(\\s*#)\\b(define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\\b/,lookbehind:!0,alias:\"keyword\"}}}});\nPrism.languages.cpp=Prism.languages.extend(\"c\",{keyword:/\\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\\b/,\"boolean\":/\\b(true|false)\\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\\->|:{1,2}|={1,2}|\\^|~|%|&{1,2}|\\|?\\||\\?|\\*|\\/|\\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\\b/}),Prism.languages.insertBefore(\"cpp\",\"keyword\",{\"class-name\":{pattern:/(class\\s+)[a-z0-9_]+/i,lookbehind:!0}});\n!function(e){var n=/#(?!\\{).+/,t={pattern:/#\\{[^}]+\\}/,alias:\"variable\"};e.languages.coffeescript=e.languages.extend(\"javascript\",{comment:n,string:[/'(?:\\\\?[^\\\\])*?'/,{pattern:/\"(?:\\\\?[^\\\\])*?\"/,inside:{interpolation:t}}],keyword:/\\b(and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\\b/,\"class-member\":{pattern:/@(?!\\d)\\w+/,alias:\"variable\"}}),e.languages.insertBefore(\"coffeescript\",\"comment\",{\"multiline-comment\":{pattern:/###[\\s\\S]+?###/,alias:\"comment\"},\"block-regex\":{pattern:/\\/{3}[\\s\\S]*?\\/{3}/,alias:\"regex\",inside:{comment:n,interpolation:t}}}),e.languages.insertBefore(\"coffeescript\",\"string\",{\"inline-javascript\":{pattern:/`(?:\\\\?[\\s\\S])*?`/,inside:{delimiter:{pattern:/^`|`$/,alias:\"punctuation\"},rest:e.languages.javascript}},\"multiline-string\":[{pattern:/'''[\\s\\S]*?'''/,alias:\"string\"},{pattern:/\"\"\"[\\s\\S]*?\"\"\"/,alias:\"string\",inside:{interpolation:t}}]}),e.languages.insertBefore(\"coffeescript\",\"keyword\",{property:/(?!\\d)\\w+(?=\\s*:(?!:))/})}(Prism);\n!function(e){e.languages.ruby=e.languages.extend(\"clike\",{comment:/#(?!\\{[^\\r\\n]*?\\}).*/,keyword:/\\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\\b/});var n={pattern:/#\\{[^}]+\\}/,inside:{delimiter:{pattern:/^#\\{|\\}$/,alias:\"tag\"},rest:e.util.clone(e.languages.ruby)}};e.languages.insertBefore(\"ruby\",\"keyword\",{regex:[{pattern:/%r([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[\\s\\S])*\\}[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\][gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\\\]|\\\\[\\s\\S])*>[gim]{0,3}/,inside:{interpolation:n}},{pattern:/(^|[^\\/])\\/(?!\\/)(\\[.+?]|\\\\.|[^\\/\\r\\n])+\\/[gim]{0,3}(?=\\s*($|[\\r\\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\\b)/}),e.languages.insertBefore(\"ruby\",\"number\",{builtin:/\\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\\b/,constant:/\\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[\\s\\S])*\\}/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\]/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\\\]|\\\\[\\s\\S])*>/,inside:{interpolation:n}},{pattern:/(\"|')(#\\{[^}]+\\}|\\\\(?:\\r?\\n|\\r)|\\\\?.)*?\\1/,inside:{interpolation:n}}]}(Prism);\nPrism.languages.css.selector={pattern:/[^\\{\\}\\s][^\\{\\}]*(?=\\s*\\{)/,inside:{\"pseudo-element\":/:(?:after|before|first-letter|first-line|selection)|::[-\\w]+/,\"pseudo-class\":/:[-\\w]+(?:\\(.*\\))?/,\"class\":/\\.[-:\\.\\w]+/,id:/#[-:\\.\\w]+/}},Prism.languages.insertBefore(\"css\",\"function\",{hexcode:/#[\\da-f]{3,6}/i,entity:/\\\\[\\da-f]{1,8}/i,number:/[\\d%\\.]+/});\nPrism.languages.d=Prism.languages.extend(\"clike\",{string:[/\\b[rx]\"(\\\\.|[^\\\\\"])*\"[cwd]?/,/\\bq\"(?:\\[[\\s\\S]*?\\]|\\([\\s\\S]*?\\)|<[\\s\\S]*?>|\\{[\\s\\S]*?\\})\"/,/\\bq\"([_a-zA-Z][_a-zA-Z\\d]*)(?:\\r?\\n|\\r)[\\s\\S]*?(?:\\r?\\n|\\r)\\1\"/,/\\bq\"(.)[\\s\\S]*?\\1\"/,/'(?:\\\\'|\\\\?[^']+)'/,/([\"`])(\\\\.|(?!\\1)[^\\\\])*\\1[cwd]?/],number:[/\\b0x\\.?[a-f\\d_]+(?:(?!\\.\\.)\\.[a-f\\d_]*)?(?:p[+-]?[a-f\\d_]+)?[ulfi]*/i,{pattern:/((?:\\.\\.)?)(?:\\b0b\\.?|\\b|\\.)\\d[\\d_]*(?:(?!\\.\\.)\\.[\\d_]*)?(?:e[+-]?\\d[\\d_]*)?[ulfi]*/i,lookbehind:!0}],keyword:/\\$|\\b(?:abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|public|pure|real|ref|return|scope|shared|short|static|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|__(?:(?:FILE|MODULE|LINE|FUNCTION|PRETTY_FUNCTION|DATE|EOF|TIME|TIMESTAMP|VENDOR|VERSION)__|gshared|traits|vector|parameters)|string|wstring|dstring|size_t|ptrdiff_t)\\b/,operator:/\\|[|=]?|&[&=]?|\\+[+=]?|-[-=]?|\\.?\\.\\.|=[>=]?|!(?:i[ns]\\b|<>?=?|>=?|=)?|\\bi[ns]\\b|(?:<[<>]?|>>?>?|\\^\\^|[*\\/%^~])=?/}),Prism.languages.d.comment=[/^\\s*#!.+/,{pattern:/(^|[^\\\\])\\/\\+(?:\\/\\+[\\w\\W]*?\\+\\/|[\\w\\W])*?\\+\\//,lookbehind:!0}].concat(Prism.languages.d.comment),Prism.languages.insertBefore(\"d\",\"comment\",{\"token-string\":{pattern:/\\bq\\{(?:|\\{[^}]*\\}|[^}])*\\}/,alias:\"string\"}}),Prism.languages.insertBefore(\"d\",\"keyword\",{property:/\\B@\\w*/}),Prism.languages.insertBefore(\"d\",\"function\",{register:{pattern:/\\b(?:[ABCD][LHX]|E[ABCD]X|E?(?:BP|SP|DI|SI)|[ECSDGF]S|CR[0234]|DR[012367]|TR[3-7]|X?MM[0-7]|R[ABCD]X|[BS]PL|R[BS]P|[DS]IL|R[DS]I|R(?:[89]|1[0-5])[BWD]?|XMM(?:[89]|1[0-5])|YMM(?:1[0-5]|\\d))\\b|\\bST(?:\\([0-7]\\)|\\b)/,alias:\"variable\"}});\nPrism.languages.dart=Prism.languages.extend(\"clike\",{string:[/r?(\"\"\"|''')[\\s\\S]*?\\1/,/r?(\"|')(\\\\?.)*?\\1/],keyword:[/\\b(?:async|sync|yield)\\*/,/\\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|default|deferred|do|dynamic|else|enum|export|external|extends|factory|final|finally|for|get|if|implements|import|in|library|new|null|operator|part|rethrow|return|set|static|super|switch|this|throw|try|typedef|var|void|while|with|yield)\\b/],operator:/\\bis!|\\b(?:as|is)\\b|\\+\\+|--|&&|\\|\\||<<=?|>>=?|~(?:\\/=?)?|[+\\-*\\/%&^|=!<>]=?|\\?/}),Prism.languages.insertBefore(\"dart\",\"function\",{metadata:{pattern:/@\\w+/,alias:\"symbol\"}});\nPrism.languages.diff={coord:[/^(?:\\*{3}|-{3}|\\+{3}).*$/m,/^@@.*@@$/m,/^\\d+.*$/m],deleted:/^[-<].+$/m,inserted:/^[+>].+$/m,diff:{pattern:/^!(?!!).+$/m,alias:\"important\"}};\nPrism.languages.docker={keyword:{pattern:/(^\\s*)(?:ONBUILD|FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|COPY|VOLUME|USER|WORKDIR|CMD|LABEL|ENTRYPOINT)(?=\\s)/im,lookbehind:!0},string:/(\"|')(?:(?!\\1)[^\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*?\\1/,comment:/#.*/,punctuation:/---|\\.\\.\\.|[:[\\]{}\\-,|>?]/};\nPrism.languages.eiffel={string:[/\"([^[]*)\\[[\\s\\S]+?\\]\\1\"/,/\"([^{]*)\\{[\\s\\S]+?\\}\\1\"/,/\"(?:%\\s+%|%\"|.)*?\"/],comment:/--.*/,\"char\":/'(?:%'|.)+?'/,keyword:/\\b(?:across|agent|alias|all|and|attached|as|assign|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\\b/i,\"boolean\":/\\b(?:True|False)\\b/i,number:[/\\b0[xcb][\\da-f](?:_*[\\da-f])*\\b/i,/(?:\\d(?:_*\\d)*)?\\.(?:(?:\\d(?:_*\\d)*)?[eE][+-]?)?\\d(?:_*\\d)*|\\d(?:_*\\d)*\\.?/],punctuation:/:=|<<|>>|\\(\\||\\|\\)|->|\\.(?=\\w)|[{}[\\];(),:?]/,operator:/\\\\\\\\|\\|\\.\\.\\||\\.\\.|\\/[~\\/=]?|[><]=?|[-+*^=~]/};\nPrism.languages.elixir={comment:{pattern:/(^|[^#])#(?![{#]).*/m,lookbehind:!0},regex:/~[rR](?:(\"\"\"|'''|[\\/|\"'])(?:\\\\.|(?!\\1)[^\\\\])+\\1|\\((?:\\\\\\)|[^)])+\\)|\\[(?:\\\\\\]|[^\\]])+\\]|\\{(?:\\\\\\}|[^}])+\\}|<(?:\\\\>|[^>])+>)[uismxfr]*/,string:[{pattern:/~[cCsSwW](?:(\"\"\"|'''|[\\/|\"'])(?:\\\\.|(?!\\1)[^\\\\])+\\1|\\((?:\\\\\\)|[^)])+\\)|\\[(?:\\\\\\]|[^\\]])+\\]|\\{(?:\\\\\\}|#\\{[^}]+\\}|[^}])+\\}|<(?:\\\\>|[^>])+>)[csa]?/,inside:{}},{pattern:/(\"\"\"|''')[\\s\\S]*?\\1/,inside:{}},{pattern:/(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,inside:{}}],atom:{pattern:/(^|[^:]):\\w+/,lookbehind:!0,alias:\"symbol\"},\"attr-name\":/\\w+:(?!:)/,capture:{pattern:/(^|[^&])&(?:[^&\\s\\d()][^\\s()]*|(?=\\())/,lookbehind:!0,alias:\"function\"},argument:{pattern:/(^|[^&])&\\d+/,lookbehind:!0,alias:\"variable\"},attribute:{pattern:/@[\\S]+/,alias:\"variable\"},number:/\\b(?:0[box][a-f\\d_]+|\\d[\\d_]*)(?:\\.[\\d_]+)?(?:e[+-]?[\\d_]+)?\\b/i,keyword:/\\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|require|rescue|try|unless|use|when)\\b/,\"boolean\":/\\b(?:true|false|nil)\\b/,operator:[/\\bin\\b|&&?|\\|[|>]?|\\\\\\\\|::|\\.\\.\\.?|\\+\\+?|-[->]?|<[-=>]|>=|!==?|\\B!|=(?:==?|[>~])?|[*\\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\\[\\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\\{[^}]+\\}/,inside:{delimiter:{pattern:/^#\\{|\\}$/,alias:\"punctuation\"},rest:Prism.util.clone(Prism.languages.elixir)}}}});\nPrism.languages.erlang={comment:/%.+/,string:/\"(?:\\\\?.)*?\"/,\"quoted-function\":{pattern:/'(?:\\\\.|[^'\\\\])+'(?=\\()/,alias:\"function\"},\"quoted-atom\":{pattern:/'(?:\\\\.|[^'\\\\])+'/,alias:\"atom\"},\"boolean\":/\\b(?:true|false)\\b/,keyword:/\\b(?:fun|when|case|of|end|if|receive|after|try|catch)\\b/,number:[/\\$\\\\?./,/\\d+#[a-z0-9]+/i,/(?:\\b|-)\\d*\\.?\\d+([Ee][+-]?\\d+)?\\b/],\"function\":/\\b[a-z][\\w@]*(?=\\()/,variable:{pattern:/(^|[^@])(?:\\b|\\?)[A-Z_][\\w@]*/,lookbehind:!0},operator:[/[=\\/<>:]=|=[:\\/]=|\\+\\+?|--?|[=*\\/!]|\\b(?:bnot|div|rem|band|bor|bxor|bsl|bsr|not|and|or|xor|orelse|andalso)\\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\\b[a-z][\\w@]*/,punctuation:/[()[\\]{}:;,.#|]|<<|>>/};\nPrism.languages.fsharp=Prism.languages.extend(\"clike\",{comment:[{pattern:/(^|[^\\\\])\\(\\*[\\w\\W]*?\\*\\)/,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0}],keyword:/\\b(?:let|return|use|yield)(?:!\\B|\\b)|\\b(abstract|and|as|assert|base|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|global|if|in|inherit|inline|interface|internal|lazy|match|member|module|mutable|namespace|new|not|null|of|open|or|override|private|public|rec|select|static|struct|then|to|true|try|type|upcast|val|void|when|while|with|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|include|method|mixin|object|parallel|process|protected|pure|sealed|tailcall|trait|virtual|volatile)\\b/,string:/(?:\"\"\"[\\s\\S]*?\"\"\"|@\"(?:\"\"|[^\"])*\"|(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\s\\S])*\\1)B?/,number:[/\\b-?0x[\\da-fA-F]+(un|lf|LF)?\\b/,/\\b-?0b[01]+(y|uy)?\\b/,/\\b-?(\\d*\\.?\\d+|\\d+\\.)([fFmM]|[eE][+-]?\\d+)?\\b/,/\\b-?\\d+(y|uy|s|us|l|u|ul|L|UL|I)?\\b/]}),Prism.languages.insertBefore(\"fsharp\",\"keyword\",{preprocessor:{pattern:/^[^\\r\\n\\S]*#.*/m,alias:\"property\",inside:{directive:{pattern:/(\\s*#)\\b(else|endif|if|light|line|nowarn)\\b/,lookbehind:!0,alias:\"keyword\"}}}});\nPrism.languages.fortran={\"quoted-number\":{pattern:/[BOZ](['\"])[A-F0-9]+\\1/i,alias:\"number\"},string:{pattern:/(?:\\w+_)?(['\"])(?:\\1\\1|&(?:\\r\\n?|\\n)(?:\\s*!.+(?:\\r\\n?|\\n))?|(?!\\1).)*(?:\\1|&)/,inside:{comment:{pattern:/(&(?:\\r\\n?|\\n)\\s*)!.*/,lookbehind:!0}}},comment:/!.*/,\"boolean\":/\\.(?:TRUE|FALSE)\\.(?:_\\w+)?/i,number:/(?:\\b|[+-])(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[ED][+-]?\\d+)?(?:_\\w+)?/i,keyword:[/\\b(?:INTEGER|REAL|DOUBLE ?PRECISION|COMPLEX|CHARACTER|LOGICAL)\\b/i,/\\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\\b/i,/\\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\\b/i,/\\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEWHERE|ELSEIF|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\\b/i],operator:[/\\*\\*|\\/\\/|=>|[=\\/]=|[<>]=?|::|[+\\-*=%]|\\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV)\\.|\\.[A-Z]+\\./i,{pattern:/(^|(?!\\().)\\/(?!\\))/,lookbehind:!0}],punctuation:/\\(\\/|\\/\\)|[(),;:&]/};\nPrism.languages.gherkin={pystring:{pattern:/(\"\"\"|''')[\\s\\S]+?\\1/,alias:\"string\"},comment:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)#.*/,lookbehind:!0},tag:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)@\\S*/,lookbehind:!0},feature:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)(Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|laH|Lastnost|Mak|Mogucnost|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|perbogh|poQbogh malja'|Potrzeba biznesowa|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):([^:]+(?:\\r?\\n|\\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\\r\\n]+/,lookbehind:!0},keyword:/[^:\\r\\n]+:/}},scenario:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)(Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram senaryo|Dyagram Senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|Examples|EXAMPLZ|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|ghantoH|Grundlage|Hannergrond|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut|lut chovnatlh|lutmey|Lýsing Atburðarásar|Lýsing Dæma|Menggariskan Senario|MISHUN|MISHUN SRSLY|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan senaryo|Plan Senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo|Senaryo deskripsyon|Senaryo Deskripsyon|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie|Situasie Uiteensetting|Skenario|Skenario konsep|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa|Swa hwaer swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo\\-ho\\-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\\r\\n]*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\\r\\n]*/,lookbehind:!0},keyword:/[^:\\r\\n]+:/}},\"table-body\":{pattern:/((?:\\r?\\n|\\r)[ \\t]*\\|.+\\|[^\\r\\n]*)+/,lookbehind:!0,inside:{outline:{pattern:/<[^>]+?>/,alias:\"variable\"},td:{pattern:/\\s*[^\\s|][^|]*/,alias:\"string\"},punctuation:/\\|/}},\"table-head\":{pattern:/((?:\\r?\\n|\\r)[ \\t]*\\|.+\\|[^\\r\\n]*)/,inside:{th:{pattern:/\\s*[^\\s|][^|]*/,alias:\"variable\"},punctuation:/\\|/}},atrule:{pattern:/((?:\\r?\\n|\\r)[ \\t]+)('ach|'a|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cando|Cand|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|Dato|DEN|Den youse gotta|Dengan|De|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|Entonces|En|Epi|E|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kadar|Kada|Kad|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Majd|Maka|Manawa|Mas|Ma|Menawa|Men|Mutta|Nalikaning|Nalika|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Og|Och|Oletetaan|Onda|Ond|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|qaSDI'|Quando|Quand|Quan|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|ugeholl|Und|Un|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadani|Zadano|Zadan|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \\t]+)/,lookbehind:!0},string:{pattern:/(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/,inside:{outline:{pattern:/<[^>]+?>/,alias:\"variable\"}}},outline:{pattern:/<[^>]+?>/,alias:\"variable\"}};\nPrism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\\+.*/m,string:/(\"|')(\\\\?.)*?\\1/m,command:{pattern:/^.*\\$ git .*$/m,inside:{parameter:/\\s(--|-)\\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \\w{40}$/m};\nPrism.languages.glsl=Prism.languages.extend(\"clike\",{comment:[/\\/\\*[\\w\\W]*?\\*\\//,/\\/\\/(?:\\\\(?:\\r\\n|[\\s\\S])|.)*/],number:/\\b(?:0x[\\da-f]+|(?:\\.\\d+|\\d+\\.?\\d*)(?:e[+-]?\\d+)?)[ulf]*\\b/i,keyword:/\\b(?:attribute|const|uniform|varying|buffer|shared|coherent|volatile|restrict|readonly|writeonly|atomic_uint|layout|centroid|flat|smooth|noperspective|patch|sample|break|continue|do|for|while|switch|case|default|if|else|subroutine|in|out|inout|float|double|int|void|bool|true|false|invariant|precise|discard|return|d?mat[234](?:x[234])?|[ibdu]?vec[234]|uint|lowp|mediump|highp|precision|[iu]?sampler[123]D|[iu]?samplerCube|sampler[12]DShadow|samplerCubeShadow|[iu]?sampler[12]DArray|sampler[12]DArrayShadow|[iu]?sampler2DRect|sampler2DRectShadow|[iu]?samplerBuffer|[iu]?sampler2DMS(?:Array)?|[iu]?samplerCubeArray|samplerCubeArrayShadow|[iu]?image[123]D|[iu]?image2DRect|[iu]?imageCube|[iu]?imageBuffer|[iu]?image[12]DArray|[iu]?imageCubeArray|[iu]?image2DMS(?:Array)?|struct|common|partition|active|asm|class|union|enum|typedef|template|this|resource|goto|inline|noinline|public|static|extern|external|interface|long|short|half|fixed|unsigned|superp|input|output|hvec[234]|fvec[234]|sampler3DRect|filter|sizeof|cast|namespace|using)\\b/}),Prism.languages.insertBefore(\"glsl\",\"comment\",{preprocessor:{pattern:/(^[ \\t]*)#(?:(?:define|undef|if|ifdef|ifndef|else|elif|endif|error|pragma|extension|version|line)\\b)?/m,lookbehind:!0,alias:\"builtin\"}});\nPrism.languages.go=Prism.languages.extend(\"clike\",{keyword:/\\b(break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\\b/,builtin:/\\b(bool|byte|complex(64|128)|error|float(32|64)|rune|string|u?int(8|16|32|64|)|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(ln)?|real|recover)\\b/,\"boolean\":/\\b(_|iota|nil|true|false)\\b/,operator:/[*\\/%^!=]=?|\\+[=+]?|-[=-]?|\\|[=|]?|&(?:=|&|\\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\\.\\.\\./,number:/\\b(-?(0x[a-f\\d]+|(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?)i?)\\b/i,string:/(\"|'|`)(\\\\?.|\\r|\\n)*?\\1/}),delete Prism.languages.go[\"class-name\"];\nPrism.languages.groovy=Prism.languages.extend(\"clike\",{keyword:/\\b(as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\\b/,string:/(\"\"\"|''')[\\W\\w]*?\\1|(\"|'|\\/)(?:\\\\?.)*?\\2|(\\$\\/)(\\$\\/\\$|[\\W\\w])*?\\/\\$/,number:/\\b(?:0b[01_]+|0x[\\da-f_]+(?:\\.[\\da-f_p\\-]+)?|[\\d_]+(?:\\.[\\d_]+)?(?:e[+-]?[\\d]+)?)[glidf]?\\b/i,operator:{pattern:/(^|[^.])(~|==?~?|\\?[.:]?|\\*(?:[.=]|\\*=?)?|\\.[@&]|\\.\\.<|\\.{1,2}(?!\\.)|-[-=>]?|\\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\\|[|=]?|\\/=?|\\^=?|%=?)/,lookbehind:!0},punctuation:/\\.+|[{}[\\];(),:$]/}),Prism.languages.insertBefore(\"groovy\",\"string\",{shebang:{pattern:/#!.+/,alias:\"comment\"}}),Prism.languages.insertBefore(\"groovy\",\"punctuation\",{\"spock-block\":/\\b(setup|given|when|then|and|cleanup|expect|where):/}),Prism.languages.insertBefore(\"groovy\",\"function\",{annotation:{pattern:/(^|[^.])@\\w+/,lookbehind:!0}}),Prism.hooks.add(\"wrap\",function(e){if(\"groovy\"===e.language&&\"string\"===e.type){var t=e.content[0];if(\"'\"!=t){var n=/([^\\\\])(\\$(\\{.*?\\}|[\\w\\.]+))/;\"$\"===t&&(n=/([^\\$])(\\$(\\{.*?\\}|[\\w\\.]+))/),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push(\"/\"===t?\"regex\":\"gstring\")}}});\n!function(e){e.languages.haml={\"multiline-comment\":{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*))(?:\\/|-#).*((?:\\r?\\n|\\r)\\2[\\t ]+.+)*/,lookbehind:!0,alias:\"comment\"},\"multiline-code\":[{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*)(?:[~-]|[&!]?=)).*,[\\t ]*((?:\\r?\\n|\\r)\\2[\\t ]+.*,[\\t ]*)*((?:\\r?\\n|\\r)\\2[\\t ]+.+)/,lookbehind:!0,inside:{rest:e.languages.ruby}},{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*)(?:[~-]|[&!]?=)).*\\|[\\t ]*((?:\\r?\\n|\\r)\\2[\\t ]+.*\\|[\\t ]*)*/,lookbehind:!0,inside:{rest:e.languages.ruby}}],filter:{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*)):[\\w-]+((?:\\r?\\n|\\r)(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/,lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"}}},markup:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)<.+/,lookbehind:!0,inside:{rest:e.languages.markup}},doctype:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)[%.#][\\w\\-#.]*[\\w\\-](?:\\([^)]+\\)|\\{(?:\\{[^}]+\\}|[^}])+\\}|\\[[^\\]]+\\])*[\\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\\{(?:\\{[^}]+\\}|[^}])+\\}/,lookbehind:!0,inside:{rest:e.languages.ruby}},{pattern:/\\([^)]+\\)/,inside:{\"attr-value\":{pattern:/(=\\s*)(?:\"(?:\\\\?.)*?\"|[^)\\s]+)/,lookbehind:!0},\"attr-name\":/[\\w:-]+(?=\\s*!?=|\\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\\[[^\\]]+\\]/,inside:{rest:e.languages.ruby}}],punctuation:/[<>]/}},code:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:{rest:e.languages.ruby}},interpolation:{pattern:/#\\{[^}]+\\}/,inside:{delimiter:{pattern:/^#\\{|\\}$/,alias:\"punctuation\"},rest:e.languages.ruby}},punctuation:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)[~=\\-&!]+/,lookbehind:!0}};for(var t=\"((?:^|\\\\r?\\\\n|\\\\r)([\\\\t ]*)):{{filter_name}}((?:\\\\r?\\\\n|\\\\r)(?:\\\\2[\\\\t ]+.+|\\\\s*?(?=\\\\r?\\\\n|\\\\r)))+\",r=[\"css\",{filter:\"coffee\",language:\"coffeescript\"},\"erb\",\"javascript\",\"less\",\"markdown\",\"ruby\",\"scss\",\"textile\"],n={},a=0,i=r.length;i>a;a++){var l=r[a];l=\"string\"==typeof l?{filter:l,language:l}:l,e.languages[l.language]&&(n[\"filter-\"+l.filter]={pattern:RegExp(t.replace(\"{{filter_name}}\",l.filter)),lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"},rest:e.languages[l.language]}})}e.languages.insertBefore(\"haml\",\"filter\",n)}(Prism);\n!function(e){var a=/\\{\\{\\{[\\w\\W]+?\\}\\}\\}|\\{\\{[\\w\\W]+?\\}\\}/g;e.languages.handlebars=e.languages.extend(\"markup\",{handlebars:{pattern:a,inside:{delimiter:{pattern:/^\\{\\{\\{?|\\}\\}\\}?$/i,alias:\"punctuation\"},string:/([\"'])(\\\\?.)*?\\1/,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee][+-]?\\d+)?)\\b/,\"boolean\":/\\b(true|false)\\b/,block:{pattern:/^(\\s*~?\\s*)[#\\/]\\S+?(?=\\s*~?\\s*$|\\s)/i,lookbehind:!0,alias:\"keyword\"},brackets:{pattern:/\\[[^\\]]+\\]/,inside:{punctuation:/\\[|\\]/,variable:/[\\w\\W]+/}},punctuation:/[!\"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{|}~]/,variable:/[^!\"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{|}~\\s]+/}}}),e.languages.insertBefore(\"handlebars\",\"tag\",{\"handlebars-comment\":{pattern:/\\{\\{![\\w\\W]*?\\}\\}/,alias:[\"handlebars\",\"comment\"]}}),e.hooks.add(\"before-highlight\",function(e){\"handlebars\"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(a,function(a){return e.tokenStack.push(a),\"___HANDLEBARS\"+e.tokenStack.length+\"___\"}))}),e.hooks.add(\"before-insert\",function(e){\"handlebars\"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),e.hooks.add(\"after-highlight\",function(a){if(\"handlebars\"===a.language){for(var n,t=0;n=a.tokenStack[t];t++)a.highlightedCode=a.highlightedCode.replace(\"___HANDLEBARS\"+(t+1)+\"___\",e.highlight(n,a.grammar,\"handlebars\").replace(/\\$/g,\"$$$$\"));a.element.innerHTML=a.highlightedCode}})}(Prism);\nPrism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\\\\/])(--[^-!#$%*+=?&@|~.:<>^\\\\\\/].*|{-[\\w\\W]*?-})/m,lookbehind:!0},\"char\":/'([^\\\\']|\\\\([abfnrtv\\\\\"'&]|\\^[A-Z@[\\]\\^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\\d+|o[0-7]+|x[0-9a-fA-F]+))'/,string:/\"([^\\\\\"]|\\\\([abfnrtv\\\\\"'&]|\\^[A-Z@[\\]\\^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\\d+|o[0-7]+|x[0-9a-fA-F]+)|\\\\\\s+\\\\)*\"/,keyword:/\\b(case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\\b/,import_statement:{pattern:/(\\r?\\n|\\r|^)\\s*import\\s+(qualified\\s+)?([A-Z][_a-zA-Z0-9']*)(\\.[A-Z][_a-zA-Z0-9']*)*(\\s+as\\s+([A-Z][_a-zA-Z0-9']*)(\\.[A-Z][_a-zA-Z0-9']*)*)?(\\s+hiding\\b)?/m,inside:{keyword:/\\b(import|qualified|as|hiding)\\b/}},builtin:/\\b(abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\\b/,number:/\\b(\\d+(\\.\\d+)?(e[+-]?\\d+)?|0o[0-7]+|0x[0-9a-f]+)\\b/i,operator:/\\s\\.\\s|[-!#$%*+=?&@|~.:<>^\\\\\\/]*\\.[-!#$%*+=?&@|~.:<>^\\\\\\/]+|[-!#$%*+=?&@|~.:<>^\\\\\\/]+\\.[-!#$%*+=?&@|~.:<>^\\\\\\/]*|[-!#$%*+=?&@|~:<>^\\\\\\/]+|`([A-Z][_a-zA-Z0-9']*\\.)*[_a-z][_a-zA-Z0-9']*`/,hvariable:/\\b([A-Z][_a-zA-Z0-9']*\\.)*[_a-z][_a-zA-Z0-9']*\\b/,constant:/\\b([A-Z][_a-zA-Z0-9']*\\.)*[A-Z][_a-zA-Z0-9']*\\b/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.haxe=Prism.languages.extend(\"clike\",{string:{pattern:/([\"'])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/,inside:{interpolation:{pattern:/(^|[^\\\\])\\$(?:\\w+|\\{[^}]+\\})/,lookbehind:!0,inside:{interpolation:{pattern:/^\\$\\w*/,alias:\"variable\"}}}}},keyword:/\\bthis\\b|\\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|from|for|function|if|implements|import|in|inline|interface|macro|new|null|override|public|private|return|static|super|switch|throw|to|try|typedef|using|var|while)(?!\\.)\\b/,operator:/\\.{3}|\\+\\+?|-[->]?|[=!]=?|&&?|\\|\\|?|<[<=]?|>[>=]?|[*\\/%~^]/}),Prism.languages.insertBefore(\"haxe\",\"class-name\",{regex:{pattern:/~\\/(?:[^\\/\\\\\\r\\n]|\\\\.)+\\/[igmsu]*/}}),Prism.languages.insertBefore(\"haxe\",\"keyword\",{preprocessor:{pattern:/#\\w+/,alias:\"builtin\"},metadata:{pattern:/@:?\\w+/,alias:\"symbol\"},reification:{pattern:/\\$(?:\\w+|(?=\\{))/,alias:\"variable\"}}),Prism.languages.haxe.string.inside.interpolation.inside.rest=Prism.util.clone(Prism.languages.haxe),delete Prism.languages.haxe[\"class-name\"];\nPrism.languages.http={\"request-line\":{pattern:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\\b\\shttps?:\\/\\/\\S+\\sHTTP\\/[0-9.]+/m,inside:{property:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\\b/,\"attr-name\":/:\\w+/}},\"response-status\":{pattern:/^HTTP\\/1.[01] [0-9]+.*/m,inside:{property:{pattern:/(^HTTP\\/1.[01] )[0-9]+.*/i,lookbehind:!0}}},\"header-name\":{pattern:/^[\\w-]+:(?=.)/m,alias:\"keyword\"}};var httpLanguages={\"application/json\":Prism.languages.javascript,\"application/xml\":Prism.languages.markup,\"text/xml\":Prism.languages.markup,\"text/html\":Prism.languages.markup};for(var contentType in httpLanguages)if(httpLanguages[contentType]){var options={};options[contentType]={pattern:new RegExp(\"(content-type:\\\\s*\"+contentType+\"[\\\\w\\\\W]*?)(?:\\\\r?\\\\n|\\\\r){2}[\\\\w\\\\W]*\",\"i\"),lookbehind:!0,inside:{rest:httpLanguages[contentType]}},Prism.languages.insertBefore(\"http\",\"header-name\",options)};\nPrism.languages.icon={comment:/#.*/,string:/([\"'])(?:(?!\\1)[^\\\\\\r\\n]|\\\\.|_(?:\\r?\\n|\\r))*\\1/,number:/\\b(?:\\d+r[a-z\\d]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b|\\.\\d+\\b/i,\"builtin-keyword\":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\\b/,alias:\"variable\"},directive:{pattern:/\\$\\w+/,alias:\"builtin\"},keyword:/\\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\\b/,\"function\":/(?!\\d)\\w+(?=\\s*[({]|\\s*!\\s*\\[)/,operator:/[+-]:(?!=)|(?:[\\/?@^%&]|\\+\\+?|--?|==?=?|~==?=?|\\*\\*?|\\|\\|\\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\\\|~]/,punctuation:/[\\[\\](){},;]/};\nPrism.languages.inform7={string:{pattern:/\"[^\"]*\"/,inside:{substitution:{pattern:/\\[[^\\]]+\\]/,inside:{delimiter:{pattern:/\\[|\\]/,alias:\"punctuation\"}}}}},comment:/\\[[^\\]]+\\]/,title:{pattern:/^[ \\t]*(?:volume|book|part(?! of)|chapter|section|table)\\b.+/im,alias:\"important\"},number:{pattern:/(^|[^-])(?:(?:\\b|-)\\d+(?:\\.\\d+)?(?:\\^\\d+)?\\w*|\\b(?:one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve))\\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\\b(?:applying to|are|attacking|answering|asking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:s|ing)?|consulting|contain(?:s|ing)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:ve|s|ving)|hold(?:s|ing)?|impl(?:y|ies)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:s|ing)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:s|ing)?|setting|showing|singing|sleeping|smelling|squeezing|switching|support(?:s|ing)?|swearing|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:s|ing)?|var(?:y|ies|ying)|waiting|waking|waving|wear(?:s|ing)?)\\b(?!-)/i,lookbehind:!0,alias:\"operator\"},keyword:{pattern:/(^|[^-])\\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|unless|the story)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: on| off)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\\b(?!-)/i,lookbehind:!0,alias:\"symbol\"},position:{pattern:/(^|[^-])\\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\\b(?!-)/i,lookbehind:!0,alias:\"keyword\"},type:{pattern:/(^|[^-])\\b(?:actions?|activit(?:y|ies)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\\b(?!-)/i,lookbehind:!0,alias:\"variable\"},punctuation:/[.,:;(){}]/},Prism.languages.inform7.string.inside.substitution.inside.rest=Prism.util.clone(Prism.languages.inform7),Prism.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\\S(?:\\s*\\S)*/,alias:\"comment\"};\nPrism.languages.ini={comment:/^[ \\t]*;.*$/m,important:/\\[.*?\\]/,constant:/^[ \\t]*[^\\s=]+?(?=[ \\t]*=)/m,\"attr-value\":{pattern:/=.*/,inside:{punctuation:/^[=]/}}};\nPrism.languages.j={comment:/\\bNB\\..*/,string:/'(?:''|[^'\\r\\n])*'/,keyword:/\\b(?:(?:adverb|conjunction|CR|def|define|dyad|LF|monad|noun|verb)\\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\\w+|goto_\\w+|if|label_\\w+|return|select|throw|try|while|whilst)\\.)/,verb:{pattern:/(?!\\^:|;\\.|[=!][.:])(?:\\{(?:\\.|::?)?|p(?:\\.\\.?|:)|[=!\\]]|[<>+*\\-%$|,#][.:]?|[\\^?]\\.?|[;\\[]:?|[~}\"i][.:]|[ACeEIjLor]\\.|(?:[_\\/\\\\qsux]|_?\\d):)/,alias:\"keyword\"},number:/\\b_?(?:(?!\\d:)\\d+(?:\\.\\d+)?(?:(?:[ejpx]|ad|ar)_?\\d+(?:\\.\\d+)?)*(?:b_?[\\da-z]+(?:\\.[\\da-z]+)?)?|_(?!\\.))/,adverb:{pattern:/[~}]|[\\/\\\\]\\.?|[bfM]\\.|t[.:]/,alias:\"builtin\"},operator:/[=a][.:]|_\\./,conjunction:{pattern:/&(?:\\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\\.|`:?|[\\^LS]:|\"/,alias:\"variable\"},punctuation:/[()]/};\n!function(e){e.languages.jade={comment:{pattern:/(^([\\t ]*))\\/\\/.*((?:\\r?\\n|\\r)\\2[\\t ]+.+)*/m,lookbehind:!0},\"multiline-script\":{pattern:/(^([\\t ]*)script\\b.*\\.[\\t ]*)((?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/m,lookbehind:!0,inside:{rest:e.languages.javascript}},filter:{pattern:/(^([\\t ]*)):.+((?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/m,lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"}}},\"multiline-plain-text\":{pattern:/(^([\\t ]*)[\\w\\-#.]+\\.[\\t ]*)((?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\\t ]*)<.+/m,lookbehind:!0,inside:{rest:e.languages.markup}},doctype:{pattern:/((?:^|\\n)[\\t ]*)doctype(?: .+)?/,lookbehind:!0},\"flow-control\":{pattern:/(^[\\t ]*)(?:if|unless|else|case|when|default|each|while)\\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\\b/,inside:{keyword:/\\b(?:each|in)\\b/,punctuation:/,/}},branch:{pattern:/^(?:if|unless|else|case|when|default|while)\\b/,alias:\"keyword\"},rest:e.languages.javascript}},keyword:{pattern:/(^[\\t ]*)(?:block|extends|include|append|prepend)\\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,\"function\":/\\w+(?=\\s*\\(|\\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\\t ]*)\\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\\+\\w+/,alias:\"function\"},rest:e.languages.javascript}}],script:{pattern:/(^[\\t ]*script(?:(?:&[^(]+)?\\([^)]+\\))*[\\t ]+).+/m,lookbehind:!0,inside:{rest:e.languages.javascript}},\"plain-text\":{pattern:/(^[\\t ]*(?!-)[\\w\\-#.]*[\\w\\-](?:(?:&[^(]+)?\\([^)]+\\))*\\/?[\\t ]+).+/m,lookbehind:!0},tag:{pattern:/(^[\\t ]*)(?!-)[\\w\\-#.]*[\\w\\-](?:(?:&[^(]+)?\\([^)]+\\))*\\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\\([^)]+\\)/,inside:{rest:e.languages.javascript}},{pattern:/\\([^)]+\\)/,inside:{\"attr-value\":{pattern:/(=\\s*)(?:\\{[^}]*\\}|[^,)\\r\\n]+)/,lookbehind:!0,inside:{rest:e.languages.javascript}},\"attr-name\":/[\\w-]+(?=\\s*!?=|\\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/}},code:[{pattern:/(^[\\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:{rest:e.languages.javascript}}],punctuation:/[.\\-!=|]+/};for(var t=\"(^([\\\\t ]*)):{{filter_name}}((?:\\\\r?\\\\n|\\\\r(?!\\\\n))(?:\\\\2[\\\\t ]+.+|\\\\s*?(?=\\\\r?\\\\n|\\\\r)))+\",n=[{filter:\"atpl\",language:\"twig\"},{filter:\"coffee\",language:\"coffeescript\"},\"ejs\",\"handlebars\",\"hogan\",\"less\",\"livescript\",\"markdown\",\"mustache\",\"plates\",{filter:\"sass\",language:\"scss\"},\"stylus\",\"swig\"],a={},i=0,r=n.length;r>i;i++){var s=n[i];s=\"string\"==typeof s?{filter:s,language:s}:s,e.languages[s.language]&&(a[\"filter-\"+s.filter]={pattern:RegExp(t.replace(\"{{filter_name}}\",s.filter),\"m\"),lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"},rest:e.languages[s.language]}})}e.languages.insertBefore(\"jade\",\"filter\",a)}(Prism);\nPrism.languages.java=Prism.languages.extend(\"clike\",{keyword:/\\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\\b/,number:/\\b0b[01]+\\b|\\b0x[\\da-f]*\\.?[\\da-fp\\-]+\\b|\\b\\d*\\.?\\d+(?:e[+-]?\\d+)?[df]?\\b/i,operator:{pattern:/(^|[^.])(?:\\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\\|[|=]?|\\*=?|\\/=?|%=?|\\^=?|[?:~])/m,lookbehind:!0}});\nPrism.languages.json={property:/\".*?\"(?=\\s*:)/gi,string:/\"(?!:)(\\\\?[^\"])*?\"(?!:)/g,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?)\\b/g,punctuation:/[{}[\\]);,]/g,operator:/:/g,\"boolean\":/\\b(true|false)\\b/gi,\"null\":/\\bnull\\b/gi},Prism.languages.jsonp=Prism.languages.json;\nPrism.languages.julia={comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:/\"\"\"[\\s\\S]+?\"\"\"|'''[\\s\\S]+?'''|(\"|')(\\\\?.)*?\\1/,keyword:/\\b(abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|let|local|macro|module|print|println|quote|return|try|type|typealias|using|while)\\b/,\"boolean\":/\\b(true|false)\\b/,number:/\\b-?(0[box])?(?:[\\da-f]+\\.?\\d*|\\.\\d+)(?:[efp][+-]?\\d+)?j?\\b/i,operator:/\\+=?|-=?|\\*=?|\\/[\\/=]?|\\\\=?|\\^=?|%=?|÷=?|!=?=?|&=?|\\|[=>]?|\\$=?|<(?:<=?|[=:])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥]/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.keyman={comment:/\\bc\\s.*/i,\"function\":/\\[\\s*((CTRL|SHIFT|ALT|LCTRL|RCTRL|LALT|RALT|CAPS|NCAPS)\\s+)*([TKU]_[a-z0-9_?]+|\".+?\"|'.+?')\\s*\\]/i,string:/(\"|')((?!\\1).)*\\1/,bold:[/&(baselayout|bitmap|capsononly|capsalwaysoff|shiftfreescaps|copyright|ethnologuecode|hotkey|includecodes|keyboardversion|kmw_embedcss|kmw_embedjs|kmw_helpfile|kmw_helptext|kmw_rtl|language|layer|layoutfile|message|mnemoniclayout|name|oldcharposmatching|platform|targets|version|visualkeyboard|windowslanguages)\\b/i,/\\b(bitmap|bitmaps|caps on only|caps always off|shift frees caps|copyright|hotkey|language|layout|message|name|version)\\b/i],keyword:/\\b(any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|return|reset|save|set|store|use)\\b/i,atrule:/\\b(ansi|begin|unicode|group|using keys|match|nomatch)\\b/i,number:/\\b(U\\+[\\dA-F]+|d\\d+|x[\\da-f]+|\\d+)\\b/i,operator:/[+>\\\\,()]/,tag:/\\$(keyman|kmfl|weaver|keymanweb|keymanonly):/i};\n!function(n){n.languages.kotlin=n.languages.extend(\"clike\",{keyword:{pattern:/(^|[^.])\\b(?:abstract|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|else|enum|final|finally|for|fun|get|if|import|in|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|out|override|package|private|protected|public|reified|return|sealed|set|super|tailrec|this|throw|to|try|val|var|when|where|while)\\b/,lookbehind:!0},\"function\":[/\\w+(?=\\s*\\()/,{pattern:/(\\.)\\w+(?=\\s*\\{)/,lookbehind:!0}],number:/\\b(?:0[bx][\\da-fA-F]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?[fFL]?)\\b/,operator:/\\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\\/*%<>]=?|[?:]:?|\\.\\.|&&|\\|\\||\\b(?:and|inv|or|shl|shr|ushr|xor)\\b/}),delete n.languages.kotlin[\"class-name\"],n.languages.insertBefore(\"kotlin\",\"string\",{\"raw-string\":{pattern:/([\"'])\\1\\1[\\s\\S]*?\\1{3}/,alias:\"string\"}}),n.languages.insertBefore(\"kotlin\",\"keyword\",{annotation:{pattern:/\\B@(?:\\w+:)?(?:[A-Z]\\w*|\\[[^\\]]+\\])/,alias:\"builtin\"}}),n.languages.insertBefore(\"kotlin\",\"function\",{label:{pattern:/\\w+@|@\\w+/,alias:\"symbol\"}});var e=[{pattern:/\\$\\{[^}]+\\}/,inside:{delimiter:{pattern:/^\\$\\{|\\}$/,alias:\"variable\"},rest:n.util.clone(n.languages.kotlin)}},{pattern:/\\$\\w+/,alias:\"variable\"}];n.languages.kotlin.string={pattern:n.languages.kotlin.string,inside:{interpolation:e}},n.languages.kotlin[\"raw-string\"].inside={interpolation:e}}(Prism);\n!function(a){var e=/\\\\([^a-z()[\\]]|[a-z\\*]+)/i,n={\"equation-command\":{pattern:e,alias:\"regex\"}};a.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\\\begin\\{((?:verbatim|lstlisting)\\*?)\\})([\\w\\W]*?)(?=\\\\end\\{\\2\\})/,lookbehind:!0},equation:[{pattern:/\\$(?:\\\\?[\\w\\W])*?\\$|\\\\\\((?:\\\\?[\\w\\W])*?\\\\\\)|\\\\\\[(?:\\\\?[\\w\\W])*?\\\\\\]/,inside:n,alias:\"string\"},{pattern:/(\\\\begin\\{((?:equation|math|eqnarray|align|multline|gather)\\*?)\\})([\\w\\W]*?)(?=\\\\end\\{\\2\\})/,lookbehind:!0,inside:n,alias:\"string\"}],keyword:{pattern:/(\\\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\})/,lookbehind:!0},url:{pattern:/(\\\\url\\{)[^}]+(?=\\})/,lookbehind:!0},headline:{pattern:/(\\\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\\*?(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\}(?:\\[[^\\]]+\\])?)/,lookbehind:!0,alias:\"class-name\"},\"function\":{pattern:e,alias:\"selector\"},punctuation:/[[\\]{}&]/}}(Prism);\nPrism.languages.less=Prism.languages.extend(\"css\",{comment:[/\\/\\*[\\w\\W]*?\\*\\//,{pattern:/(^|[^\\\\])\\/\\/.*/,lookbehind:!0}],atrule:{pattern:/@[\\w-]+?(?:\\([^{}]+\\)|[^(){};])*?(?=\\s*\\{)/i,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\\{[\\w-]+\\}|[^{};\\s@])(?:@\\{[\\w-]+\\}|\\([^{}]*\\)|[^{};@])*?(?=\\s*\\{)/,inside:{variable:/@+[\\w-]+/}},property:/(?:@\\{[\\w-]+\\}|[\\w-])+(?:\\+_?)?(?=\\s*:)/i,punctuation:/[{}();:,]/,operator:/[+\\-*\\/]/}),Prism.languages.insertBefore(\"less\",\"punctuation\",{\"function\":Prism.languages.less.function}),Prism.languages.insertBefore(\"less\",\"property\",{variable:[{pattern:/@[\\w-]+\\s*:/,inside:{punctuation:/:/}},/@@?[\\w-]+/],\"mixin-usage\":{pattern:/([{;]\\s*)[.#](?!\\d)[\\w-]+.*?(?=[(;])/,lookbehind:!0,alias:\"function\"}});\nPrism.languages.lolcode={comment:[/\\bOBTW\\s+[\\s\\S]*?\\s+TLDR\\b/,/\\bBTW.+/],string:{pattern:/\"(?::.|[^\"])*\"/,inside:{variable:/:\\{[^}]+\\}/,symbol:[/:\\([a-f\\d]+\\)/i,/:\\[[^\\]]+\\]/,/:[)>o\":]/]}},number:/(-|\\b)\\d*\\.?\\d+/,symbol:{pattern:/(^|\\s)(?:A )?(?:YARN|NUMBR|NUMBAR|TROOF|BUKKIT|NOOB)(?=\\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\\s)/}},label:{pattern:/((?:^|\\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\\w*/,lookbehind:!0,alias:\"string\"},\"function\":{pattern:/((?:^|\\s)(?:I IZ|HOW IZ I|IZ) )[a-zA-Z]\\w*/,lookbehind:!0},keyword:[{pattern:/(^|\\s)(?:O HAI IM|KTHX|HAI|KTHXBYE|I HAS A|ITZ(?: A)?|R|AN|MKAY|SMOOSH|MAEK|IS NOW(?: A)?|VISIBLE|GIMMEH|O RLY\\?|YA RLY|NO WAI|OIC|MEBBE|WTF\\?|OMG|OMGWTF|GTFO|IM IN YR|IM OUTTA YR|FOUND YR|YR|TIL|WILE|UPPIN|NERFIN|I IZ|HOW IZ I|IF U SAY SO|SRS|HAS A|LIEK(?: A)?|IZ)(?=\\s|,|$)/,lookbehind:!0},/'Z(?=\\s|,|$)/],\"boolean\":{pattern:/(^|\\s)(?:WIN|FAIL)(?=\\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\\s)IT(?=\\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:SUM|DIFF|PRODUKT|QUOSHUNT|MOD|BIGGR|SMALLR|BOTH|EITHER|WON|ALL|ANY) OF)(?=\\s|,|$)/,lookbehind:!0},punctuation:/\\.{3}|…|,|!/};\nPrism.languages.lua={comment:/^#!.+|--(?:\\[(=*)\\[[\\s\\S]*?\\]\\1\\]|.*)/m,string:/([\"'])(?:(?!\\1)[^\\\\\\r\\n]|\\\\z(?:\\r\\n|\\s)|\\\\(?:\\r\\n|[\\s\\S]))*\\1|\\[(=*)\\[[\\s\\S]*?\\]\\2\\]/,number:/\\b0x[a-f\\d]+\\.?[a-f\\d]*(?:p[+-]?\\d+)?\\b|\\b\\d+(?:\\.\\B|\\.?\\d*(?:e[+-]?\\d+)?\\b)|\\B\\.\\d+(?:e[+-]?\\d+)?\\b/i,keyword:/\\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\\b/,\"function\":/(?!\\d)\\w+(?=\\s*(?:[({]))/,operator:[/[-+*%^&|#]|\\/\\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\\.\\.(?!\\.)/,lookbehind:!0}],punctuation:/[\\[\\](){},;]|\\.+|:+/};\nPrism.languages.makefile={comment:{pattern:/(^|[^\\\\])#(?:\\\\(?:\\r\\n|[\\s\\S])|.)*/,lookbehind:!0},string:/([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,builtin:/\\.[A-Z][^:#=\\s]+(?=\\s*:(?!=))/,symbol:{pattern:/^[^:=\\r\\n]+(?=\\s*:(?!=))/m,inside:{variable:/\\$+(?:[^(){}:#=\\s]+|(?=[({]))/}},variable:/\\$+(?:[^(){}:#=\\s]+|\\([@*%<^+?][DF]\\)|(?=[({]))/,keyword:[/-include\\b|\\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\\b/,{pattern:/(\\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \\t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/};\nPrism.languages.markdown=Prism.languages.extend(\"markup\",{}),Prism.languages.insertBefore(\"markdown\",\"prolog\",{blockquote:{pattern:/^>(?:[\\t ]*>)*/m,alias:\"punctuation\"},code:[{pattern:/^(?: {4}|\\t).+/m,alias:\"keyword\"},{pattern:/``.+?``|`[^`\\n]+`/,alias:\"keyword\"}],title:[{pattern:/\\w+.*(?:\\r?\\n|\\r)(?:==+|--+)/,alias:\"important\",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\\s*)#+.+/m,lookbehind:!0,alias:\"important\",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\\s*)([*-])([\\t ]*\\2){2,}(?=\\s*$)/m,lookbehind:!0,alias:\"punctuation\"},list:{pattern:/(^\\s*)(?:[*+-]|\\d+\\.)(?=[\\t ].)/m,lookbehind:!0,alias:\"punctuation\"},\"url-reference\":{pattern:/!?\\[[^\\]]+\\]:[\\t ]+(?:\\S+|<(?:\\\\.|[^>\\\\])+>)(?:[\\t ]+(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\)))?/,inside:{variable:{pattern:/^(!?\\[)[^\\]]+/,lookbehind:!0},string:/(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\))$/,punctuation:/^[\\[\\]!:]|[<>]/},alias:\"url\"},bold:{pattern:/(^|[^\\\\])(\\*\\*|__)(?:(?:\\r?\\n|\\r)(?!\\r?\\n|\\r)|.)+?\\2/,lookbehind:!0,inside:{punctuation:/^\\*\\*|^__|\\*\\*$|__$/}},italic:{pattern:/(^|[^\\\\])([*_])(?:(?:\\r?\\n|\\r)(?!\\r?\\n|\\r)|.)+?\\2/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}},url:{pattern:/!?\\[[^\\]]+\\](?:\\([^\\s)]+(?:[\\t ]+\"(?:\\\\.|[^\"\\\\])*\")?\\)| ?\\[[^\\]\\n]*\\])/,inside:{variable:{pattern:/(!?\\[)[^\\]]+(?=\\]$)/,lookbehind:!0},string:{pattern:/\"(?:\\\\.|[^\"\\\\])*\"(?=\\)$)/}}}}),Prism.languages.markdown.bold.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.italic.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.bold.inside.italic=Prism.util.clone(Prism.languages.markdown.italic),Prism.languages.markdown.italic.inside.bold=Prism.util.clone(Prism.languages.markdown.bold);\nPrism.languages.matlab={string:/\\B'(?:''|[^'\\n])*'/,comment:[/%\\{[\\s\\S]*?\\}%/,/%.+/],number:/\\b-?(?:\\d*\\.?\\d+(?:[eE][+-]?\\d+)?(?:[ij])?|[ij])\\b/,keyword:/\\b(?:break|case|catch|continue|else|elseif|end|for|function|if|inf|NaN|otherwise|parfor|pause|pi|return|switch|try|while)\\b/,\"function\":/(?!\\d)\\w+(?=\\s*\\()/,operator:/\\.?[*^\\/\\\\']|[+\\-:@]|[<>=~]=?|&&?|\\|\\|?/,punctuation:/\\.{3}|[.,;\\[\\](){}!]/};\nPrism.languages.mel={comment:/\\/\\/.*/,code:{pattern:/`(?:\\\\.|[^\\\\`\\r\\n])*`/,alias:\"italic\",inside:{delimiter:{pattern:/^`|`$/,alias:\"punctuation\"}}},string:/\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/,variable:/\\$\\w+/,number:/(?:\\b|-)(?:0x[\\da-fA-F]+|\\d+\\.?\\d*)/,flag:{pattern:/-[^\\d\\W]\\w*/,alias:\"operator\"},keyword:/\\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\\b/,\"function\":/\\w+(?=\\()|\\b(?:about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|CBG|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|Mayatomr|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\\b/,operator:[/\\+[+=]?|-[-=]?|&&|\\|\\||[<>]=|[*\\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\\[\\](){}]/},Prism.languages.mel.code.inside.rest=Prism.util.clone(Prism.languages.mel);\nPrism.languages.mizar={comment:/::.+/,keyword:/@proof\\b|\\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|equals|end|environ|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:y|ies)|when|where|with|wrt)\\b/,parameter:{pattern:/\\$(?:10|\\d)/,alias:\"variable\"},variable:/\\w+(?=:)/,number:/(?:\\b|-)\\d+\\b/,operator:/\\.\\.\\.|->|&|\\.?=/,punctuation:/\\(#|#\\)|[,:;\\[\\](){}]/};\nPrism.languages.monkey={string:/\"[^\"\\r\\n]*\"/,comment:[/^#Rem\\s+[\\s\\S]*?^#End/im,/'.+/],preprocessor:{pattern:/(^[ \\t]*)#.+/m,lookbehind:!0,alias:\"comment\"},\"function\":/\\w+(?=\\()/,\"type-char\":{pattern:/(\\w)[?%#$]/,lookbehind:!0,alias:\"variable\"},number:{pattern:/((?:\\.\\.)?)(?:(?:\\b|\\B-\\.?|\\B\\.)\\d+((?!\\.\\.)\\.\\d*)?|\\$[\\da-f]+)/i,lookbehind:!0},keyword:/\\b(?:Void|Strict|Public|Private|Property|Bool|Int|Float|String|Array|Object|Continue|Exit|Import|Extern|New|Self|Super|Try|Catch|Eachin|True|False|Extends|Abstract|Final|Select|Case|Default|Const|Local|Global|Field|Method|Function|Class|End|If|Then|Else|ElseIf|EndIf|While|Wend|Repeat|Until|Forever|For|To|Step|Next|Return|Module|Interface|Implements|Inline|Throw|Null)\\b/i,operator:/\\.\\.|<[=>]?|>=?|:?=|(?:[+\\-*\\/&~|]|\\b(?:Mod|Shl|Shr)\\b)=?|\\b(?:And|Not|Or)\\b/i,punctuation:/[.,:;()\\[\\]]/};\nPrism.languages.nasm={comment:/;.*$/m,string:/(\"|'|`)(\\\\?.)*?\\1/m,label:{pattern:/(^\\s*)[A-Za-z._?$][\\w.?$@~#]*:/m,lookbehind:!0,alias:\"function\"},keyword:[/\\[?BITS (16|32|64)\\]?/m,{pattern:/(^\\s*)section\\s*[a-zA-Z\\.]+:?/im,lookbehind:!0},/(?:extern|global)[^;\\r\\n]*/im,/(?:CPU|FLOAT|DEFAULT).*$/m],register:{pattern:/\\b(?:st\\d|[xyz]mm\\d\\d?|[cdt]r\\d|r\\d\\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(bp|sp|si|di)|[cdefgs]s)\\b/i,alias:\"variable\"},number:/(\\b|-|(?=\\$))(0[hx][\\da-f]*\\.?[\\da-f]+(p[+-]?\\d+)?|\\d[\\da-f]+[hx]|\\$\\d[\\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\\d+|\\d*\\.?\\d+(\\.?e[+-]?\\d+)?[dt]?)\\b/i,operator:/[\\[\\]*+\\-\\/%<>=&|$!]/};\nPrism.languages.nginx=Prism.languages.extend(\"clike\",{comment:{pattern:/(^|[^\"{\\\\])#.*/,lookbehind:!0},keyword:/\\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|accept_mutex|accept_mutex_delay|access_log|add_after_body|add_before_body|add_header|addition_types|aio|alias|allow|ancient_browser|ancient_browser_value|auth|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|autoindex|autoindex_exact_size|autoindex_localtime|break|charset|charset_map|charset_types|chunked_transfer_encoding|client_body_buffer_size|client_body_in_file_only|client_body_in_single_buffer|client_body_temp_path|client_body_timeout|client_header_buffer_size|client_header_timeout|client_max_body_size|connection_pool_size|create_full_put_path|daemon|dav_access|dav_methods|debug_connection|debug_points|default_type|deny|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_cache|fastcgi_cache_bypass|fastcgi_cache_key|fastcgi_cache_lock|fastcgi_cache_lock_timeout|fastcgi_cache_methods|fastcgi_cache_min_uses|fastcgi_cache_path|fastcgi_cache_purge|fastcgi_cache_use_stale|fastcgi_cache_valid|fastcgi_connect_timeout|fastcgi_hide_header|fastcgi_ignore_client_abort|fastcgi_ignore_headers|fastcgi_index|fastcgi_intercept_errors|fastcgi_keep_conn|fastcgi_max_temp_file_size|fastcgi_next_upstream|fastcgi_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|fastcgi_send_timeout|fastcgi_split_path_info|fastcgi_store|fastcgi_store_access|fastcgi_temp_file_write_size|fastcgi_temp_path|flv|geo|geoip_city|geoip_country|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|msie_padding|msie_refresh|multi_accept|open_file_cache|open_file_cache_errors|open_file_cache_min_uses|open_file_cache_valid|open_log_file_cache|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|proxy_busy_buffers_size|proxy_cache|proxy_cache_bypass|proxy_cache_key|proxy_cache_lock|proxy_cache_lock_timeout|proxy_cache_methods|proxy_cache_min_uses|proxy_cache_path|proxy_cache_use_stale|proxy_cache_valid|proxy_connect_timeout|proxy_cookie_domain|proxy_cookie_path|proxy_headers_hash_bucket_size|proxy_headers_hash_max_size|proxy_hide_header|proxy_http_version|proxy_ignore_client_abort|proxy_ignore_headers|proxy_intercept_errors|proxy_max_temp_file_size|proxy_method|proxy_next_upstream|proxy_no_cache|proxy_pass|proxy_pass_error_message|proxy_pass_header|proxy_pass_request_body|proxy_pass_request_headers|proxy_read_timeout|proxy_redirect|proxy_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|sub_filter_once|sub_filter_types|tcp_nodelay|tcp_nopush|timeout|timer_resolution|try_files|types|types_hash_bucket_size|types_hash_max_size|underscores_in_headers|uninitialized_variable_warn|upstream|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\\b/i}),Prism.languages.insertBefore(\"nginx\",\"keyword\",{variable:/\\$[a-z_]+/i});\nPrism.languages.nim={comment:/#.*/,string:/(?:(?:\\b(?!\\d)(?:\\w|\\\\x[8-9a-fA-F][0-9a-fA-F])+)?(?:\"\"\"[\\s\\S]*?\"\"\"(?!\")|\"(?:\\\\[\\s\\S]|\"\"|[^\"\\\\])*\")|'(?:\\\\(?:\\d+|x[\\da-fA-F]{2}|.)|[^'])')/,number:/\\b(?:0[xXoObB][\\da-fA-F_]+|\\d[\\d_]*(?:(?!\\.\\.)\\.[\\d_]*)?(?:[eE][+-]?\\d[\\d_]*)?)(?:'?[iuf]\\d*)?/,keyword:/\\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\\b/,\"function\":{pattern:/(?:(?!\\d)(?:\\w|\\\\x[8-9a-fA-F][0-9a-fA-F])+|`[^`\\r\\n]+`)\\*?(?:\\[[^\\]]+\\])?(?=\\s*\\()/,inside:{operator:/\\*$/}},ignore:{pattern:/`[^`\\r\\n]+`/,inside:{punctuation:/`/}},operator:{pattern:/(^|[({\\[](?=\\.\\.)|(?![({\\[]\\.).)(?:(?:[=+\\-*\\/<>@$~&%|!?^:\\\\]|\\.\\.|\\.(?![)}\\]]))+|\\b(?:and|div|of|or|in|is|isnot|mod|not|notin|shl|shr|xor)\\b)/m,lookbehind:!0},punctuation:/[({\\[]\\.|\\.[)}\\]]|[`(){}\\[\\],:]/};\nPrism.languages.nix={comment:/\\/\\*[\\s\\S]*?\\*\\/|#.*/,string:{pattern:/\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"|''(?:(?!'')[\\s\\S]|''(?:'|\\\\|\\$\\{))*''/,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\\\])\\$\\{(?:[^}]|\\{[^}]*\\})*}/,lookbehind:!0,inside:{antiquotation:{pattern:/^\\$(?=\\{)/,alias:\"variable\"}}}}},url:[/\\b(?:[a-z]{3,7}:\\/\\/)[\\w\\-+%~\\/.:#=?&]+/,{pattern:/([^\\/])(?:[\\w\\-+%~.:#=?&]*(?!\\/\\/)[\\w\\-+%~\\/.:#=?&])?(?!\\/\\/)\\/[\\w\\-+%~\\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\\$(?=\\{)/,alias:\"variable\"},number:/\\b\\d+\\b/,keyword:/\\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\\b/,\"function\":/\\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:url|Tarball)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\\b|\\bfoldl'\\B/,\"boolean\":/\\b(?:true|false)\\b/,operator:/[=!<>]=?|\\+\\+?|\\|\\||&&|\\/\\/|->?|[?@]/,punctuation:/[{}()[\\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside.rest=Prism.util.clone(Prism.languages.nix);\nPrism.languages.nsis={comment:{pattern:/(^|[^\\\\])(\\/\\*[\\w\\W]*?\\*\\/|[#;].*)/,lookbehind:!0},string:/(\"|')(\\\\?.)*?\\1/,keyword:/\\b(Abort|Add(BrandingImage|Size)|AdvSplash|Allow(RootDirInstall|SkipFiles)|AutoCloseWindow|Banner|BG(Font|Gradient|Image)|BrandingText|BringToFront|Call(InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|Create(Directory|Font|ShortCut)|Delete(INISec|INIStr|RegKey|RegValue)?|Detail(Print|sButtonText)|Dialer|Dir(Text|Var|Verify)|EnableWindow|Enum(RegKey|RegValue)|Exch|Exec(Shell|Wait)?|ExpandEnvStrings|File(BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|WriteUTF16LE|Seek|Write|WriteByte|WriteWord)?|Find(Close|First|Next|Window)|FlushINI|Get(CurInstType|CurrentAddress|DlgItem|DLLVersion(Local)?|ErrorLevel|FileTime(Local)?|FullPathName|Function(Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|Install(ButtonText|Colors|Dir(RegKey)?)|InstProgressFlags|Inst(Type(GetText|SetText)?)|Int(CmpU?|Fmt|Op)|IsWindow|Lang(DLL|String)|License(BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(Set|Text)|Manifest(DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|Name|Nop|ns(Dialogs|Exec)|NSISdl|OutFile|Page(Callbacks)?|Pop|Push|Quit|Read(EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|Section(End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(AutoClose|BrandingImage|Compress|Compressor(DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(InstDetails|UninstDetails|Window)|Silent(Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(CmpS?|Cpy|Len)|SubCaption|System|Unicode|Uninstall(ButtonText|Caption|Icon|SubCaption|Text)|UninstPage|UnRegDLL|UserInfo|Var|VI(AddVersionKey|FileVersion|ProductVersion)|VPatch|WindowIcon|Write(INIStr|RegBin|RegDWORD|RegExpandStr|RegStr|Uninstaller)|XPStyle)\\b/,property:/\\b(admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user|ARCHIVE|FILE_(ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(CR|CU|DD|LM|PD|U)|HKEY_(CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)\\b/,variable:/\\$[({]?[-_\\w]+[)}]?/i,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?)\\b/,operator:/--?|\\+\\+?|<=?|>=?|==?=?|&&?|\\|?\\||[?*\\/~^%]/,punctuation:/[{}[\\];(),.:]/,important:/!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|makensis|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)\\b/i};\nPrism.languages.objectivec=Prism.languages.extend(\"c\",{keyword:/\\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\\b|(@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\\b/,string:/(\"|')(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1|@\"(\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,operator:/-[->]?|\\+\\+?|!=?|<<?=?|>>?=?|==?|&&?|\\|\\|?|[~^%?*\\/@]/});\nPrism.languages.ocaml={comment:/\\(\\*[\\s\\S]*?\\*\\)/,string:[/\"(?:\\\\.|[^\\\\\\r\\n\"])*\"/,/(['`])(?:\\\\(?:\\d+|x[\\da-f]+|.)|(?!\\1)[^\\\\\\r\\n])\\1/i],number:/\\b-?(?:0x[\\da-f][\\da-f_]+|(?:0[bo])?\\d[\\d_]*\\.?[\\d_]*(?:e[+-]?[\\d_]+)?)/i,type:{pattern:/\\B['`][a-z\\d_]*/i,alias:\"variable\"},directive:{pattern:/\\B#[a-z\\d_]+/i,alias:\"function\"},keyword:/\\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|prefix|private|rec|then|sig|struct|to|try|type|val|value|virtual|where|while|with)\\b/,\"boolean\":/\\b(?:false|true)\\b/,operator:/:=|[=<>@^|&+\\-*\\/$%!?~][!$%&\\*+\\-.\\/:<=>?@^|~]*|\\b(?:and|asr|land|lor|lxor|lsl|lsr|mod|nor|or)\\b/,punctuation:/[(){}\\[\\]|_.,:;]/};\nPrism.languages.oz={comment:/\\/\\*[\\s\\S]*?\\*\\/|%.*/,string:/\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"/,atom:{pattern:/'(?:[^'\\\\]|\\\\.)*'/,alias:\"builtin\"},keyword:/[$_]|\\[\\]|\\b(?:at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\\b/,\"function\":[/[a-z][A-Za-z\\d]*(?=\\()/,{pattern:/(\\{)[A-Z][A-Za-z\\d]*/,lookbehind:!0}],number:/\\b(?:0[bx][\\da-f]+|\\d+\\.?\\d*(?:e~?\\d+)?\\b)|&(?:[^\\\\]|\\\\(?:\\d{3}|.))/i,variable:/\\b[A-Z][A-Za-z\\d]*|`(?:[^`\\\\]|\\\\.)+`/,\"attr-name\":/\\w+(?=:)/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\\\=:?|!!?|[|#+\\-*\\/,~^@]|\\b(?:andthen|div|mod|orelse)\\b/,punctuation:/[\\[\\](){}.:;?]/};\nPrism.languages.parigp={comment:/\\/\\*[\\s\\S]*?\\*\\/|\\\\\\\\.*/,string:/\"(?:[^\"\\\\]|\\\\.)*\"/,keyword:function(){var r=[\"breakpoint\",\"break\",\"dbg_down\",\"dbg_err\",\"dbg_up\",\"dbg_x\",\"forcomposite\",\"fordiv\",\"forell\",\"forpart\",\"forprime\",\"forstep\",\"forsubgroup\",\"forvec\",\"for\",\"iferr\",\"if\",\"local\",\"my\",\"next\",\"return\",\"until\",\"while\"];return r=r.map(function(r){return r.split(\"\").join(\" *\")}).join(\"|\"),RegExp(\"\\\\b(?:\"+r+\")\\\\b\")}(),\"function\":/\\w[\\w ]*?(?= *\\()/,number:{pattern:/((?:\\. *\\. *)?)(?:\\d(?: *\\d)*(?: *(?!\\. *\\.)\\.(?: *\\d)*)?|\\. *\\d(?: *\\d)*)(?: *e *[+-]? *\\d(?: *\\d)*)?/i,lookbehind:!0},operator:/\\. *\\.|[*\\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\\+(?: *[+=])?|-(?: *[-=>])?|<(?:(?: *<)?(?: *=)?| *>)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\\\(?: *\\/)?(?: *=)?|&(?: *&)?|\\| *\\||['#~^]/,punctuation:/[\\[\\]{}().,:;|]/};\nPrism.languages.parser=Prism.languages.extend(\"markup\",{keyword:{pattern:/(^|[^^])(?:\\^(?:case|eval|for|if|switch|throw)\\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\\B\\$(?:\\w+|(?=[.\\{]))(?:(?:\\.|::?)\\w+)*(?:\\.|::?)?/,lookbehind:!0,inside:{punctuation:/\\.|:+/}},\"function\":{pattern:/(^|[^^])\\B[@^]\\w+(?:(?:\\.|::?)\\w+)*(?:\\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\\.|:+/}},escape:{pattern:/\\^(?:[$^;@()\\[\\]{}\"':]|#[a-f\\d]*)/i,alias:\"builtin\"},punctuation:/[\\[\\](){};]/}),Prism.languages.insertBefore(\"parser\",\"keyword\",{\"parser-comment\":{pattern:/(\\s)#.*/,lookbehind:!0,alias:\"comment\"},expression:{pattern:/(^|[^^])\\((?:[^()]|\\((?:[^()]|\\((?:[^()])*\\))*\\))*\\)/,lookbehind:!0,inside:{string:{pattern:/(^|[^^])([\"'])(?:(?!\\2)[^^]|\\^[\\s\\S])*\\2/,lookbehind:!0},keyword:Prism.languages.parser.keyword,variable:Prism.languages.parser.variable,\"function\":Prism.languages.parser.function,\"boolean\":/\\b(?:true|false)\\b/,number:/\\b(?:0x[a-f\\d]+|\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b/i,escape:Prism.languages.parser.escape,operator:/[~+*\\/\\\\%]|!(?:\\|\\|?|=)?|&&?|\\|\\|?|==|<[<=]?|>[>=]?|-[fd]?|\\b(?:def|eq|ge|gt|in|is|le|lt|ne)\\b/,punctuation:Prism.languages.parser.punctuation}}}),Prism.languages.insertBefore(\"inside\",\"punctuation\",{expression:Prism.languages.parser.expression,keyword:Prism.languages.parser.keyword,variable:Prism.languages.parser.variable,\"function\":Prism.languages.parser.function,escape:Prism.languages.parser.escape,\"parser-punctuation\":{pattern:Prism.languages.parser.punctuation,alias:\"punctuation\"}},Prism.languages.parser.tag.inside[\"attr-value\"]);\nPrism.languages.pascal={comment:[/\\(\\*[\\s\\S]+?\\*\\)/,/\\{[\\s\\S]+?\\}/,/\\/\\/.*/],string:/(?:'(?:''|[^'\\r\\n])*'|#[&$%]?[a-f\\d]+)+|\\^[a-z]/i,keyword:[{pattern:/(^|[^&])\\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\\b/i,lookbehind:!0},{pattern:/(^|[^&])\\b(?:dispose|exit|false|new|true)\\b/i,lookbehind:!0},{pattern:/(^|[^&])\\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\\b/i,lookbehind:!0},{pattern:/(^|[^&])\\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\\b/i,lookbehind:!0}],number:[/[+-]?(?:[&%]\\d+|\\$[a-f\\d]+)/i,/([+-]|\\b)\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?/i],operator:[/\\.\\.|\\*\\*|:=|<[<=>]?|>[>=]?|[+\\-*\\/]=?|[@^=]/i,{pattern:/(^|[^&])\\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\\b/,lookbehind:!0}],punctuation:/\\(\\.|\\.\\)|[()\\[\\]:;,.]/};\nPrism.languages.perl={comment:[{pattern:/(^\\s*)=\\w+[\\s\\S]*?=cut.*/m,lookbehind:!0},{pattern:/(^|[^\\\\$])#.*/,lookbehind:!0}],string:[/\\b(?:q|qq|qx|qw)\\s*([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,/\\b(?:q|qq|qx|qw)\\s+([a-zA-Z0-9])(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,/\\b(?:q|qq|qx|qw)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)/,/\\b(?:q|qq|qx|qw)\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}/,/\\b(?:q|qq|qx|qw)\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\]/,/\\b(?:q|qq|qx|qw)\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>/,/(\"|`)(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,/'(?:[^'\\\\\\r\\n]|\\\\.)*'/],regex:[/\\b(?:m|qr)\\s*([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1[msixpodualngc]*/,/\\b(?:m|qr)\\s+([a-zA-Z0-9])(?:[^\\\\]|\\\\.)*?\\1[msixpodualngc]*/,/\\b(?:m|qr)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)[msixpodualngc]*/,/\\b(?:m|qr)\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}[msixpodualngc]*/,/\\b(?:m|qr)\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\][msixpodualngc]*/,/\\b(?:m|qr)\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>[msixpodualngc]*/,{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\2(?:[^\\\\]|\\\\[\\s\\S])*?\\2[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s+([a-zA-Z0-9])(?:[^\\\\]|\\\\[\\s\\S])*?\\2(?:[^\\\\]|\\\\[\\s\\S])*?\\2[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\]\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\][msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>[msixpodualngcer]*/,lookbehind:!0},/\\/(?:[^\\/\\\\\\r\\n]|\\\\.)*\\/[msixpodualngc]*(?=\\s*(?:$|[\\r\\n,.;})&|\\-+*~<>!?^]|(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\\b))/],variable:[/[&*$@%]\\{\\^[A-Z]+\\}/,/[&*$@%]\\^[A-Z_]/,/[&*$@%]#?(?=\\{)/,/[&*$@%]#?((::)*'?(?!\\d)[\\w$]+)+(::)*/i,/[&*$@%]\\d+/,/(?!%=)[$@%][!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\\S*>|\\b_\\b/,alias:\"symbol\"},vstring:{pattern:/v\\d+(\\.\\d+)*|\\d+(\\.\\d+){2,}/,alias:\"string\"},\"function\":{pattern:/sub [a-z0-9_]+/i,inside:{keyword:/sub/}},keyword:/\\b(any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|say|state|sub|switch|undef|unless|until|use|when|while)\\b/,number:/\\b-?(0x[\\dA-Fa-f](_?[\\dA-Fa-f])*|0b[01](_?[01])*|(\\d(_?\\d)*)?\\.?\\d(_?\\d)*([Ee][+-]?\\d+)?)\\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\\b|\\+[+=]?|-[-=>]?|\\*\\*?=?|\\/\\/?=?|=[=~>]?|~[~=]?|\\|\\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\\.(?:=|\\.\\.?)?|[\\\\?]|\\bx(?:=|\\b)|\\b(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\\b/,punctuation:/[{}[\\];(),:]/};\nPrism.languages.php=Prism.languages.extend(\"clike\",{keyword:/\\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\\b/i,constant:/\\b[A-Z0-9_]{2,}\\b/,comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|\\/\\/.*)/,lookbehind:!0}}),Prism.languages.insertBefore(\"php\",\"class-name\",{\"shell-comment\":{pattern:/(^|[^\\\\])#.*/,lookbehind:!0,alias:\"comment\"}}),Prism.languages.insertBefore(\"php\",\"keyword\",{delimiter:/\\?>|<\\?(?:php)?/i,variable:/\\$\\w+\\b/i,\"package\":{pattern:/(\\\\|namespace\\s+|use\\s+)[\\w\\\\]+/,lookbehind:!0,inside:{punctuation:/\\\\/}}}),Prism.languages.insertBefore(\"php\",\"operator\",{property:{pattern:/(->)[\\w]+/,lookbehind:!0}}),Prism.languages.markup&&(Prism.hooks.add(\"before-highlight\",function(e){\"php\"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\\?php|<\\?)[\\w\\W]*?(?:\\?>)/gi,function(a){return e.tokenStack.push(a),\"{{{PHP\"+e.tokenStack.length+\"}}}\"}))}),Prism.hooks.add(\"before-insert\",function(e){\"php\"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),Prism.hooks.add(\"after-highlight\",function(e){if(\"php\"===e.language){for(var a,n=0;a=e.tokenStack[n];n++)e.highlightedCode=e.highlightedCode.replace(\"{{{PHP\"+(n+1)+\"}}}\",Prism.highlight(a,e.grammar,\"php\").replace(/\\$/g,\"$$$$\"));e.element.innerHTML=e.highlightedCode}}),Prism.hooks.add(\"wrap\",function(e){\"php\"===e.language&&\"markup\"===e.type&&(e.content=e.content.replace(/(\\{\\{\\{PHP[0-9]+\\}\\}\\})/g,'<span class=\"token php\">$1</span>'))}),Prism.languages.insertBefore(\"php\",\"comment\",{markup:{pattern:/<[^?]\\/?(.*?)>/,inside:Prism.languages.markup},php:/\\{\\{\\{PHP[0-9]+\\}\\}\\}/}));\nPrism.languages.insertBefore(\"php\",\"variable\",{\"this\":/\\$this\\b/,global:/\\$(?:_(?:SERVER|GET|POST|FILES|REQUEST|SESSION|ENV|COOKIE)|GLOBALS|HTTP_RAW_POST_DATA|argc|argv|php_errormsg|http_response_header)/,scope:{pattern:/\\b[\\w\\\\]+::/,inside:{keyword:/(static|self|parent)/,punctuation:/(::|\\\\)/}}});\nPrism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\\w\\W]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.+/,lookbehind:!0}],string:[{pattern:/\"(`?[\\w\\W])*?\"/,inside:{\"function\":{pattern:/[^`]\\$\\(.*?\\)/,inside:{}}}},/'([^']|'')*'/],namespace:/\\[[a-z][\\w\\W]*?\\]/i,\"boolean\":/\\$(true|false)\\b/i,variable:/\\$\\w+\\b/i,\"function\":[/\\b(Add-(Computer|Content|History|Member|PSSnapin|Type)|Checkpoint-Computer|Clear-(Content|EventLog|History|Item|ItemProperty|Variable)|Compare-Object|Complete-Transaction|Connect-PSSession|ConvertFrom-(Csv|Json|StringData)|Convert-Path|ConvertTo-(Csv|Html|Json|Xml)|Copy-(Item|ItemProperty)|Debug-Process|Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)|Disconnect-PSSession|Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)|Enter-PSSession|Exit-PSSession|Export-(Alias|Clixml|Console|Csv|FormatData|ModuleMember|PSSession)|ForEach-Object|Format-(Custom|List|Table|Wide)|Get-(Alias|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Culture|Date|Event|EventLog|EventSubscriber|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job|Location|Member|Module|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|WmiObject)|Group-Object|Import-(Alias|Clixml|Csv|LocalizedData|Module|PSSession)|Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)|Join-Path|Limit-EventLog|Measure-(Command|Object)|Move-(Item|ItemProperty)|New-(Alias|Event|EventLog|Item|ItemProperty|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy)|Out-(Default|File|GridView|Host|Null|Printer|String)|Pop-Location|Push-Location|Read-Host|Receive-(Job|PSSession)|Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)|Remove-(Computer|Event|EventLog|Item|ItemProperty|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)|Rename-(Computer|Item|ItemProperty)|Reset-ComputerMachinePassword|Resolve-Path|Restart-(Computer|Service)|Restore-Computer|Resume-(Job|Service)|Save-Help|Select-(Object|String|Xml)|Send-MailMessage|Set-(Alias|Content|Date|Item|ItemProperty|Location|PSBreakpoint|PSDebug|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)|Show-(Command|ControlPanelItem|EventLog)|Sort-Object|Split-Path|Start-(Job|Process|Service|Sleep|Transaction)|Stop-(Computer|Job|Process|Service)|Suspend-(Job|Service)|Tee-Object|Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)|Trace-Command|Unblock-File|Undo-Transaction|Unregister-(Event|PSSessionConfiguration)|Update-(FormatData|Help|List|TypeData)|Use-Transaction|Wait-(Event|Job|Process)|Where-Object|Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning))\\b/i,/\\b(ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\\b/i],keyword:/\\b(Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\\b/i,operator:{pattern:/(\\W?)(!|-(eq|ne|gt|ge|lt|le|sh[lr]|not|b?(and|x?or)|(Not)?(Like|Match|Contains|In)|Replace|Join|is(Not)?|as)\\b|-[-=]?|\\+[+=]?|[*\\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\\];(),.]/},Prism.languages.powershell.string[0].inside.boolean=Prism.languages.powershell.boolean,Prism.languages.powershell.string[0].inside.variable=Prism.languages.powershell.variable,Prism.languages.powershell.string[0].inside.function.inside=Prism.util.clone(Prism.languages.powershell);\nPrism.languages.processing=Prism.languages.extend(\"clike\",{keyword:/\\b(?:break|catch|case|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\\b/,operator:/<[<=]?|>[>=]?|&&?|\\|\\|?|[%?]|[!=+\\-*\\/]=?/}),Prism.languages.insertBefore(\"processing\",\"number\",{constant:/\\b(?!XML\\b)[A-Z][A-Z\\d_]+\\b/,type:{pattern:/\\b(?:boolean|byte|char|color|double|float|int|XML|[A-Z][A-Za-z\\d_]*)\\b/,alias:\"variable\"}}),Prism.languages.processing[\"function\"].pattern=/[a-z0-9_]+(?=\\s*\\()/i,Prism.languages.processing[\"class-name\"].alias=\"variable\";\nPrism.languages.prolog={comment:[/%.+/,/\\/\\*[\\s\\S]*?\\*\\//],string:/([\"'])(?:\\1\\1|\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,builtin:/\\b(?:fx|fy|xf[xy]?|yfx?)\\b/,variable:/\\b[A-Z_]\\w*/,\"function\":/\\b[a-z]\\w*(?:(?=\\()|\\/\\d+)/,number:/\\b\\d+\\.?\\d*/,operator:/[:\\\\=><\\-?*@\\/;+^|!$.]+|\\b(?:is|mod|not|xor)\\b/,punctuation:/[(){}\\[\\],]/};\n!function(e){e.languages.puppet={heredoc:[{pattern:/(@\\(\"([^\"\\r\\n\\/):]+)\"(?:\\/[nrts$uL]*)?\\).*(?:\\r?\\n|\\r))(?:.*(?:\\r?\\n|\\r))*?[ \\t]*\\|?[ \\t]*-?[ \\t]*\\2/,lookbehind:!0,alias:\"string\",inside:{punctuation:/(?=\\S).*\\S(?= *$)/}},{pattern:/(@\\(([^\"\\r\\n\\/):]+)(?:\\/[nrts$uL]*)?\\).*(?:\\r?\\n|\\r))(?:.*(?:\\r?\\n|\\r))*?[ \\t]*\\|?[ \\t]*-?[ \\t]*\\2/,lookbehind:!0,alias:\"string\",inside:{punctuation:/(?=\\S).*\\S(?= *$)/}},{pattern:/@\\(\"?(?:[^\"\\r\\n\\/):]+)\"?(?:\\/[nrts$uL]*)?\\)/,alias:\"string\",inside:{punctuation:{pattern:/(\\().+?(?=\\))/,lookbehind:!0}}}],\"multiline-comment\":{pattern:/(^|[^\\\\])\\/\\*[\\s\\S]*?\\*\\//,lookbehind:!0,alias:\"comment\"},regex:{pattern:/((?:\\bnode\\s+|[^\\s\\w\\\\]\\s*))\\/(?:[^\\/\\\\]|\\\\[\\s\\S])+\\/(?:[imx]+\\b|\\B)/,lookbehind:!0,inside:{\"extended-regex\":{pattern:/^\\/(?:[^\\/\\\\]|\\\\[\\s\\S])+\\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:{pattern:/([\"'])(?:\\$\\{(?:[^'\"}]|([\"'])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2)+\\}|(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/,inside:{\"double-quoted\":{pattern:/^\"[\\s\\S]*\"$/,inside:{}}}},variable:{pattern:/\\$(?:::)?\\w+(?:::\\w+)*/,inside:{punctuation:/::/}},\"attr-name\":/(?:\\w+|\\*)(?=\\s*=>)/,\"function\":[{pattern:/(\\.)(?!\\d)\\w+/,lookbehind:!0},/\\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\\b|\\b(?!\\d)\\w+(?=\\()/],number:/\\b(?:0x[a-f\\d]+|\\d+(?:\\.\\d+)?(?:e-?\\d+)?)\\b/i,\"boolean\":/\\b(?:true|false)\\b/,keyword:/\\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\\b/,datatype:{pattern:/\\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\\b/,alias:\"symbol\"},operator:/=[=~>]?|![=~]?|<(?:<\\|?|[=~|-])?|>[>=]?|->?|~>|\\|>?>?|[*\\/%+?]|\\b(?:and|in|or)\\b/,punctuation:/[\\[\\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\\\])\\$\\{(?:[^'\"{}]|\\{[^}]*\\}|([\"'])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2)+\\}/,lookbehind:!0,inside:{\"short-variable\":{pattern:/(^\\$\\{)(?!\\w+\\()(?:::)?\\w+(?:::\\w+)*/,lookbehind:!0,alias:\"variable\",inside:{punctuation:/::/}},delimiter:{pattern:/^\\$/,alias:\"variable\"},rest:e.util.clone(e.languages.puppet)}},{pattern:/(^|[^\\\\])\\$(?:::)?\\w+(?:::\\w+)*/,lookbehind:!0,alias:\"variable\",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside[\"double-quoted\"].inside.interpolation=n}(Prism);\n!function(e){e.languages.pure={\"inline-lang\":{pattern:/%<[\\s\\S]+?%>/,inside:{lang:{pattern:/(^%< *)-\\*-.+?-\\*-/,lookbehind:!0,alias:\"comment\"},delimiter:{pattern:/^%<.*|%>$/,alias:\"punctuation\"}}},comment:[{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0},/#!.+/],string:/\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,number:{pattern:/((?:\\.\\.)?)(?:\\b(?:inf|nan)\\b|\\b0x[\\da-f]+|(?:\\b(?:0b)?\\d+(?:\\.\\d)?|\\B\\.\\d)\\d*(?:e[+-]?\\d+)?L?)/i,lookbehind:!0},keyword:/\\b(?:ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|NULL|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\\b/,\"function\":/\\b(?:abs|add_(?:(?:fundef|interface|macdef|typedef)(?:_at)?|addr|constdef|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_(?:matrix|pointer)|byte_c?string(?:_pointer)?|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|short|sentry|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\\b/,special:{pattern:/\\b__[a-z]+__\\b/i,alias:\"builtin\"},operator:/(?=\\b_|[^_])[!\"#$%&'*+,\\-.\\/:<=>?@\\\\^_`|~\\u00a1-\\u00bf\\u00d7-\\u00f7\\u20d0-\\u2bff]+|\\b(?:and|div|mod|not|or)\\b/,punctuation:/[(){}\\[\\];,|]/};var t=[\"c\",{lang:\"c++\",alias:\"cpp\"},\"fortran\",\"ats\",\"dsp\"],a=\"%< *-\\\\*- *{lang}\\\\d* *-\\\\*-[\\\\s\\\\S]+?%>\";t.forEach(function(t){var r=t;if(\"string\"!=typeof t&&(r=t.alias,t=t.lang),e.languages[r]){var i={};i[\"inline-lang-\"+r]={pattern:RegExp(a.replace(\"{lang}\",t.replace(/([.+*?\\/\\\\(){}\\[\\]])/g,\"\\\\$1\")),\"i\"),inside:e.util.clone(e.languages.pure[\"inline-lang\"].inside)},i[\"inline-lang-\"+r].inside.rest=e.util.clone(e.languages[r]),e.languages.insertBefore(\"pure\",\"inline-lang\",i)}}),e.languages.c&&(e.languages.pure[\"inline-lang\"].inside.rest=e.util.clone(e.languages.c))}(Prism);\nPrism.languages.python={\"triple-quoted-string\":{pattern:/\"\"\"[\\s\\S]+?\"\"\"|'''[\\s\\S]+?'''/,alias:\"string\"},comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:/(\"|')(?:\\\\?.)*?\\1/,\"function\":{pattern:/((?:^|\\s)def[ \\t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\\()/g,lookbehind:!0},\"class-name\":{pattern:/(\\bclass\\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\\b/,\"boolean\":/\\b(?:True|False)\\b/,number:/\\b-?(?:0[bo])?(?:(?:\\d|0x[\\da-f])[\\da-f]*\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?j?\\b/i,operator:/[-+%=]=?|!=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]|\\b(?:or|and|not)\\b/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.q={string:/\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,comment:[{pattern:/([\\t )\\]}])\\/.*/,lookbehind:!0},{pattern:/(^|\\r?\\n|\\r)\\/[\\t ]*(?:(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?(?:\\\\(?=[\\t ]*(?:\\r?\\n|\\r))|$)|\\S.*)/,lookbehind:!0},/^\\\\[\\t ]*(?:\\r?\\n|\\r)[\\s\\S]+/m,/^#!.+/m],symbol:/`(?::\\S+|[\\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\\d{4}\\.\\d\\d(?:m|\\.\\d\\d(?:T(?:\\d\\d(?::\\d\\d(?::\\d\\d(?:[.:]\\d\\d\\d)?)?)?)?)?[dz]?)|\\d\\d:\\d\\d(?::\\d\\d(?:[.:]\\d\\d\\d)?)?[uvt]?/,alias:\"number\"},number:/\\b-?(?![01]:)(?:0[wn]|0W[hj]?|0N[hje]?|0x[\\da-fA-F]+|\\d+\\.?\\d*(?:e[+-]?\\d+)?[hjfeb]?)/,keyword:/\\\\\\w+\\b|\\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\\b/,adverb:{pattern:/['\\/\\\\]:?|\\beach\\b/,alias:\"function\"},verb:{pattern:/(?:\\B\\.\\B|\\b[01]:|<[=>]?|>=?|[:+\\-*%,!?_~=|$&#@^]):?/,alias:\"operator\"},punctuation:/[(){}\\[\\];.]/};\nPrism.languages.qore=Prism.languages.extend(\"clike\",{comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|(?:\\/\\/|#).*)/,lookbehind:!0},string:/(\"|')(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\])*\\1/,variable:/\\$(?!\\d)\\w+\\b/,keyword:/\\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:int|float|number|bool|string|date|list)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\\b/,number:/\\b(?:0b[01]+|0x[\\da-f]*\\.?[\\da-fp\\-]+|\\d*\\.?\\d+e?\\d*[df]|\\d*\\.?\\d+)\\b/i,\"boolean\":/\\b(?:true|false)\\b/i,operator:{pattern:/(^|[^\\.])(?:\\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\\|[|=]?|[*\\/%^]=?|[~?])/,lookbehind:!0},\"function\":/\\$?\\b(?!\\d)\\w+(?=\\()/});\nPrism.languages.r={comment:/#.*/,string:/(['\"])(?:\\\\?.)*?\\1/,\"percent-operator\":{pattern:/%[^%\\s]*%/,alias:\"operator\"},\"boolean\":/\\b(?:TRUE|FALSE)\\b/,ellipsis:/\\.\\.(?:\\.|\\d+)/,number:[/\\b(?:NaN|Inf)\\b/,/\\b(?:0x[\\dA-Fa-f]+(?:\\.\\d*)?|\\d*\\.?\\d+)(?:[EePp][+-]?\\d+)?[iL]?\\b/],keyword:/\\b(?:if|else|repeat|while|function|for|in|next|break|NULL|NA|NA_integer_|NA_real_|NA_complex_|NA_character_)\\b/,operator:/->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\\|\\|?|[+*\\/^$@~]/,punctuation:/[(){}\\[\\],;]/};\n!function(a){var e=a.util.clone(a.languages.javascript);a.languages.jsx=a.languages.extend(\"markup\",e),a.languages.jsx.tag.pattern=/<\\/?[\\w\\.:-]+\\s*(?:\\s+[\\w\\.:-]+(?:=(?:(\"|')(\\\\?[\\w\\W])*?\\1|[^\\s'\">=]+|(\\{[\\w\\W]*?\\})))?\\s*)*\\/?>/i,a.languages.jsx.tag.inside[\"attr-value\"].pattern=/=[^\\{](?:('|\")[\\w\\W]*?(\\1)|[^\\s>]+)/i;var s=a.util.clone(a.languages.jsx);delete s.punctuation,s=a.languages.insertBefore(\"jsx\",\"operator\",{punctuation:/=(?={)|[{}[\\];(),.:]/},{jsx:s}),a.languages.insertBefore(\"inside\",\"attr-value\",{script:{pattern:/=(\\{(?:\\{[^}]*\\}|[^}])+\\})/i,inside:s,alias:\"language-javascript\"}},a.languages.jsx.tag)}(Prism);\nPrism.languages.rest={table:[{pattern:/(\\s*)(?:\\+[=-]+)+\\+(?:\\r?\\n|\\r)(?:\\1(?:[+|].+)+[+|](?:\\r?\\n|\\r))+\\1(?:\\+[=-]+)+\\+/,lookbehind:!0,inside:{punctuation:/\\||(?:\\+[=-]+)+\\+/}},{pattern:/(\\s*)(?:=+ +)+=+((?:\\r?\\n|\\r)\\1.+)+(?:\\r?\\n|\\r)\\1(?:=+ +)+=+(?=(?:\\r?\\n|\\r){2}|\\s*$)/,lookbehind:!0,inside:{punctuation:/[=-]+/}}],\"substitution-def\":{pattern:/(^\\s*\\.\\. )\\|(?:[^|\\s](?:[^|]*[^|\\s])?)\\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\\|(?:[^|\\s]|[^|\\s][^|]*[^|\\s])\\|/,alias:\"attr-value\",inside:{punctuation:/^\\||\\|$/}},directive:{pattern:/( +)[^:]+::/,lookbehind:!0,alias:\"function\",inside:{punctuation:/::$/}}}},\"link-target\":[{pattern:/(^\\s*\\.\\. )\\[[^\\]]+\\]/m,lookbehind:!0,alias:\"string\",inside:{punctuation:/^\\[|\\]$/}},{pattern:/(^\\s*\\.\\. )_(?:`[^`]+`|(?:[^:\\\\]|\\\\.)+):/m,lookbehind:!0,alias:\"string\",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^\\s*\\.\\. )[^:]+::/m,lookbehind:!0,alias:\"function\",inside:{punctuation:/::$/}},comment:{pattern:/(^\\s*\\.\\.)(?:(?: .+)?(?:(?:\\r?\\n|\\r).+)+| .+)(?=(?:\\r?\\n|\\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2+)(?:\\r?\\n|\\r).+(?:\\r?\\n|\\r)\\1$/m,inside:{punctuation:/^[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+|[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\\r?\\n|\\r){2}).+(?:\\r?\\n|\\r)([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2+(?=\\r?\\n|\\r|$)/,lookbehind:!0,inside:{punctuation:/[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\\r?\\n|\\r){2})([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2{3,}(?=(?:\\r?\\n|\\r){2})/,lookbehind:!0,alias:\"punctuation\"},field:{pattern:/(^\\s*):[^:\\r\\n]+:(?= )/m,lookbehind:!0,alias:\"attr-name\"},\"command-line-option\":{pattern:/(^\\s*)(?:[+-][a-z\\d]|(?:\\-\\-|\\/)[a-z\\d-]+)(?:[ =](?:[a-z][a-z\\d_-]*|<[^<>]+>))?(?:, (?:[+-][a-z\\d]|(?:\\-\\-|\\/)[a-z\\d-]+)(?:[ =](?:[a-z][a-z\\d_-]*|<[^<>]+>))?)*(?=(?:\\r?\\n|\\r)? {2,}\\S)/im,lookbehind:!0,alias:\"symbol\"},\"literal-block\":{pattern:/::(?:\\r?\\n|\\r){2}([ \\t]+).+(?:(?:\\r?\\n|\\r)\\1.+)*/,inside:{\"literal-block-punctuation\":{pattern:/^::/,alias:\"punctuation\"}}},\"quoted-literal-block\":{pattern:/::(?:\\r?\\n|\\r){2}([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]).*(?:(?:\\r?\\n|\\r)\\1.*)*/,inside:{\"literal-block-punctuation\":{pattern:/^(?:::|([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\1*)/m,alias:\"punctuation\"}}},\"list-bullet\":{pattern:/(^\\s*)(?:[*+\\-•‣⁃]|\\(?(?:\\d+|[a-z]|[ivxdclm]+)\\)|(?:\\d+|[a-z]|[ivxdclm]+)\\.)(?= )/im,lookbehind:!0,alias:\"punctuation\"},\"doctest-block\":{pattern:/(^\\s*)>>> .+(?:(?:\\r?\\n|\\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\\s\\-:\\/'\"<(\\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\\*\\*?|``?|\\|)(?!\\s).*?[^\\s]\\2(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\\*\\*).+(?=\\*\\*$)/,lookbehind:!0},italic:{pattern:/(^\\*).+(?=\\*$)/,lookbehind:!0},\"inline-literal\":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:\"symbol\"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:\"function\",inside:{punctuation:/^:|:$/}},\"interpreted-text\":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:\"attr-value\"},substitution:{pattern:/(^\\|).+(?=\\|$)/,lookbehind:!0,alias:\"attr-value\"},punctuation:/\\*\\*?|``?|\\|/}}],link:[{pattern:/\\[[^\\]]+\\]_(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$)/,alias:\"string\",inside:{punctuation:/^\\[|\\]_$/}},{pattern:/(?:\\b[a-z\\d](?:[_.:+]?[a-z\\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$)/i,alias:\"string\",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^\\s*)(?:\\|(?= |$)|(?:---?|—|\\.\\.|__)(?= )|\\.\\.$)/m,lookbehind:!0}};\nPrism.languages.rip={comment:/#.*/,keyword:/(?:=>|->)|\\b(?:class|if|else|switch|case|return|exit|try|catch|finally|raise)\\b/,builtin:/@|\\bSystem\\b/,\"boolean\":/\\b(?:true|false)\\b/,date:/\\b\\d{4}-\\d{2}-\\d{2}\\b/,time:/\\b\\d{2}:\\d{2}:\\d{2}\\b/,datetime:/\\b\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\b/,character:/\\B`[^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]\\b/,regex:{pattern:/(^|[^\\/])\\/(?!\\/)(\\[.+?]|\\\\.|[^\\/\\\\\\r\\n])+\\/(?=\\s*($|[\\r\\n,.;})]))/,lookbehind:!0},symbol:/:[^\\d\\s`'\",.:;#\\/\\\\()<>\\[\\]{}][^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]*/,string:/(\"|')(\\\\?.)*?\\1/,number:/[+-]?(?:(?:\\d+\\.\\d+)|(?:\\d+))/,punctuation:/(?:\\.{2,3})|[`,.:;=\\/\\\\()<>\\[\\]{}]/,reference:/[^\\d\\s`'\",.:;#\\/\\\\()<>\\[\\]{}][^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]*/};\nPrism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\\s)(?:(?:facet|instance of)(?=[ \\t]+[\\w-]+[ \\t]*\\{)|(?:external|import)\\b)/,lookbehind:!0},component:{pattern:/[\\w-]+(?=[ \\t]*\\{)/,alias:\"variable\"},property:/[\\w.-]+(?=[ \\t]*:)/,value:{pattern:/(=[ \\t]*)[^,;]+/,lookbehind:!0,alias:\"attr-value\"},optional:{pattern:/\\(optional\\)/,alias:\"builtin\"},wildcard:{pattern:/(\\.)\\*/,lookbehind:!0,alias:\"operator\"},punctuation:/[{},.;:=]/};\n!function(e){e.languages.crystal=e.languages.extend(\"ruby\",{keyword:[/\\b(?:abstract|alias|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|rescue|return|require|self|sizeof|struct|super|then|type|typeof|union|unless|until|when|while|with|yield|__DIR__|__FILE__|__LINE__)\\b/,{pattern:/(\\.\\s*)(?:is_a|responds_to)\\?/,lookbehind:!0}],number:/\\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[0-9a-fA-F_]*[0-9a-fA-F]|(?:[0-9](?:[0-9_]*[0-9])?)(?:\\.[0-9_]*[0-9])?(?:[eE][+-]?[0-9_]*[0-9])?)(?:_(?:[uif](?:8|16|32|64))?)?\\b/});var t=e.util.clone(e.languages.crystal);e.languages.insertBefore(\"crystal\",\"string\",{attribute:{pattern:/@\\[.+?\\]/,alias:\"attr-name\",inside:{delimiter:{pattern:/^@\\[|\\]$/,alias:\"tag\"},rest:t}},expansion:[{pattern:/\\{\\{.+?\\}\\}/,inside:{delimiter:{pattern:/^\\{\\{|\\}\\}$/,alias:\"tag\"},rest:t}},{pattern:/\\{%.+?%\\}/,inside:{delimiter:{pattern:/^\\{%|%\\}$/,alias:\"tag\"},rest:t}}]})}(Prism);\nPrism.languages.rust={comment:[{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0}],string:[/b?r(#*)\"(?:\\\\?.)*?\"\\1/,/b?(\"|')(?:\\\\?.)*?\\1/],keyword:/\\b(?:abstract|alignof|as|be|box|break|const|continue|crate|do|else|enum|extern|false|final|fn|for|if|impl|in|let|loop|match|mod|move|mut|offsetof|once|override|priv|pub|pure|ref|return|sizeof|static|self|struct|super|true|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\\b/,attribute:{pattern:/#!?\\[.+?\\]/,alias:\"attr-name\"},\"function\":[/[a-z0-9_]+(?=\\s*\\()/i,/[a-z0-9_]+!(?=\\s*\\(|\\[)/i],\"macro-rules\":{pattern:/[a-z0-9_]+!/i,alias:\"function\"},number:/\\b-?(?:0x[\\dA-Fa-f](?:_?[\\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(\\d(_?\\d)*)?\\.?\\d(_?\\d)*([Ee][+-]?\\d+)?)(?:_?(?:[iu](?:8|16|32|64)?|f32|f64))?\\b/,\"closure-params\":{pattern:/\\|[^|]*\\|(?=\\s*[{-])/,inside:{punctuation:/[\\|:,]/,operator:/[&*]/}},punctuation:/[{}[\\];(),:]|\\.+|->/,operator:/[-+*\\/%!^=]=?|@|&[&=]?|\\|[|=]?|<<?=?|>>?=?/};\nPrism.languages.sas={datalines:{pattern:/^\\s*(?:(?:data)?lines|cards);[\\s\\S]+?(?:\\r?\\n|\\r);/im,alias:\"string\",inside:{keyword:{pattern:/^(\\s*)(?:(?:data)?lines|cards)/i,lookbehind:!0},punctuation:/;/}},comment:[{pattern:/(^\\s*|;\\s*)\\*.*;/m,lookbehind:!0},/\\/\\*[\\s\\S]+?\\*\\//],datetime:{pattern:/'[^']+'(?:dt?|t)\\b/i,alias:\"number\"},string:/([\"'])(?:\\1\\1|(?!\\1)[\\s\\S])*\\1/,keyword:/\\b(?:data|else|format|if|input|proc|run|then)\\b/i,number:/(?:\\B-|\\b)(?:[\\da-f]+x|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)/i,operator:/\\*\\*?|\\|\\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\\/=&]|[~¬^]=?|\\b(?:eq|ne|gt|lt|ge|le|in|not)\\b/i,punctuation:/[$%@.(){}\\[\\];,\\\\]/};\n!function(e){e.languages.sass=e.languages.extend(\"css\",{comment:{pattern:/^([ \\t]*)\\/[\\/*].*(?:(?:\\r?\\n|\\r)\\1[ \\t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore(\"sass\",\"atrule\",{\"atrule-line\":{pattern:/^(?:[ \\t]*)[@+=].+/m,inside:{atrule:/(?:@[\\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var a=/((\\$[-_\\w]+)|(#\\{\\$[-_\\w]+\\}))/i,t=[/[+*\\/%]|[=!]=|<=?|>=?|\\b(?:and|or|not)\\b/,{pattern:/(\\s+)-(?=\\s)/,lookbehind:!0}];e.languages.insertBefore(\"sass\",\"property\",{\"variable-line\":{pattern:/^[ \\t]*\\$.+/m,inside:{punctuation:/:/,variable:a,operator:t}},\"property-line\":{pattern:/^[ \\t]*(?:[^:\\s]+ *:.*|:[^:\\s]+.*)/m,inside:{property:[/[^:\\s]+(?=\\s*:)/,{pattern:/(:)[^:\\s]+/,lookbehind:!0}],punctuation:/:/,variable:a,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,delete e.languages.sass.selector,e.languages.insertBefore(\"sass\",\"punctuation\",{selector:{pattern:/([ \\t]*)\\S(?:,?[^,\\r\\n]+)*(?:,(?:\\r?\\n|\\r)\\1[ \\t]+\\S(?:,?[^,\\r\\n]+)*)*/,lookbehind:!0}})}(Prism);\nPrism.languages.scss=Prism.languages.extend(\"css\",{comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|\\/\\/.*)/,lookbehind:!0},atrule:{pattern:/@[\\w-]+(?:\\([^()]+\\)|[^(])*?(?=\\s+[{;])/,inside:{rule:/@[\\w-]+/}},url:/(?:[-a-z]+-)*url(?=\\()/i,selector:{pattern:/(?=\\S)[^@;\\{\\}\\(\\)]?([^@;\\{\\}\\(\\)]|&|#\\{\\$[-_\\w]+\\})+(?=\\s*\\{(\\}|\\s|[^\\}]+(:|\\{)[^\\}]+))/m,inside:{placeholder:/%[-_\\w]+/}}}),Prism.languages.insertBefore(\"scss\",\"atrule\",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore(\"scss\",\"property\",{variable:/\\$[-_\\w]+|#\\{\\$[-_\\w]+\\}/}),Prism.languages.insertBefore(\"scss\",\"function\",{placeholder:{pattern:/%[-_\\w]+/,alias:\"selector\"},statement:/\\B!(?:default|optional)\\b/i,\"boolean\":/\\b(?:true|false)\\b/,\"null\":/\\bnull\\b/,operator:{pattern:/(\\s)(?:[-+*\\/%]|[=!]=|<=?|>=?|and|or|not)(?=\\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.util.clone(Prism.languages.scss);\nPrism.languages.scala=Prism.languages.extend(\"java\",{keyword:/<-|=>|\\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\\b/,string:/\"\"\"[\\W\\w]*?\"\"\"|\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^\\\\\\r\\n']|\\\\.[^\\\\']*)'/,builtin:/\\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\\b/,number:/\\b(?:0x[\\da-f]*\\.?[\\da-f]+|\\d*\\.?\\d+e?\\d*[dfl]?)\\b/i,symbol:/'[^\\d\\s\\\\]\\w*/}),delete Prism.languages.scala[\"class-name\"],delete Prism.languages.scala[\"function\"];\nPrism.languages.scheme={comment:/;.*/,string:/\"(?:[^\"\\\\\\r\\n]|\\\\.)*?\"|'[^('\\s]*/,keyword:{pattern:/(\\()(?:define(?:-syntax|-library|-values)?|(?:case-)?lambda|let(?:\\*|rec)?(?:-values)?|else|if|cond|begin|delay(?:-force)?|parameterize|guard|set!|(?:quasi-)?quote|syntax-rules)/,lookbehind:!0},builtin:{pattern:/(\\()(?:(?:cons|car|cdr|list|call-with-current-continuation|call\\/cc|append|abs|apply|eval)\\b|null\\?|pair\\?|boolean\\?|eof-object\\?|char\\?|procedure\\?|number\\?|port\\?|string\\?|vector\\?|symbol\\?|bytevector\\?)/,lookbehind:!0},number:{pattern:/(\\s|\\))[-+]?[0-9]*\\.?[0-9]+(?:\\s*[-+]\\s*[0-9]*\\.?[0-9]+i)?\\b/,lookbehind:!0},\"boolean\":/#[tf]/,operator:{pattern:/(\\()(?:[-+*%\\/]|[<>]=?|=>?)/,lookbehind:!0},\"function\":{pattern:/(\\()[^\\s()]*(?=\\s)/,lookbehind:!0},punctuation:/[()]/};\nPrism.languages.smalltalk={comment:/\"(?:\"\"|[^\"])+\"/,string:/'(?:''|[^'])+'/,symbol:/#[\\da-z]+|#(?:-|([+\\/\\\\*~<>=@%|&?!])\\1?)|#(?=\\()/i,\"block-arguments\":{pattern:/(\\[\\s*):[^\\[|]*?\\|/,lookbehind:!0,inside:{variable:/:[\\da-z]+/i,punctuation:/\\|/}},\"temporary-variables\":{pattern:/\\|[^|]+\\|/,inside:{variable:/[\\da-z]+/i,punctuation:/\\|/}},keyword:/\\b(?:nil|true|false|self|super|new)\\b/,character:{pattern:/\\$./,alias:\"string\"},number:[/\\d+r-?[\\dA-Z]+(?:\\.[\\dA-Z]+)?(?:e-?\\d+)?/,/(?:\\B-|\\b)\\d+(?:\\.\\d+)?(?:e-?\\d+)?/],operator:/[<=]=?|:=|~[~=]|\\/\\/?|\\\\\\\\|>[>=]?|[!^+\\-*&|,@]/,punctuation:/[.;:?\\[\\](){}]/};\n!function(e){var t=/\\{\\*[\\w\\W]+?\\*\\}|\\{[\\w\\W]+?\\}/g,a=\"{literal}\",n=\"{/literal}\",o=!1;e.languages.smarty=e.languages.extend(\"markup\",{smarty:{pattern:t,inside:{delimiter:{pattern:/^\\{|\\}$/i,alias:\"punctuation\"},string:/([\"'])(?:\\\\?.)*?\\1/,number:/\\b-?(?:0x[\\dA-Fa-f]+|\\d*\\.?\\d+(?:[Ee][-+]?\\d+)?)\\b/,variable:[/\\$(?!\\d)\\w+/,/#(?!\\d)\\w+#/,{pattern:/(\\.|->)(?!\\d)\\w+/,lookbehind:!0},{pattern:/(\\[)(?!\\d)\\w+(?=\\])/,lookbehind:!0}],\"function\":[{pattern:/(\\|\\s*)@?(?!\\d)\\w+/,lookbehind:!0},/^\\/?(?!\\d)\\w+/,/(?!\\d)\\w+(?=\\()/],\"attr-name\":{pattern:/\\w+\\s*=\\s*(?:(?!\\d)\\w+)?/,inside:{variable:{pattern:/(=\\s*)(?!\\d)\\w+/,lookbehind:!0},operator:/=/}},punctuation:[/[\\[\\]().,:`]|\\->/],operator:[/[+\\-*\\/%]|==?=?|[!<>]=?|&&|\\|\\|?/,/\\bis\\s+(?:not\\s+)?(?:div|even|odd)(?:\\s+by)?\\b/,/\\b(?:eq|neq?|gt|lt|gt?e|lt?e|not|mod|or|and)\\b/],keyword:/\\b(?:false|off|on|no|true|yes)\\b/}}}),e.languages.insertBefore(\"smarty\",\"tag\",{\"smarty-comment\":{pattern:/\\{\\*[\\w\\W]*?\\*\\}/,alias:[\"smarty\",\"comment\"]}}),e.hooks.add(\"before-highlight\",function(e){\"smarty\"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(t,function(t){return t===n&&(o=!1),o?t:(t===a&&(o=!0),e.tokenStack.push(t),\"___SMARTY\"+e.tokenStack.length+\"___\")}))}),e.hooks.add(\"before-insert\",function(e){\"smarty\"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),e.hooks.add(\"after-highlight\",function(t){if(\"smarty\"===t.language){for(var a,n=0;a=t.tokenStack[n];n++)t.highlightedCode=t.highlightedCode.replace(\"___SMARTY\"+(n+1)+\"___\",e.highlight(a,t.grammar,\"smarty\").replace(/\\$/g,\"$$$$\"));t.element.innerHTML=t.highlightedCode}})}(Prism);\nPrism.languages.sql={comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|(?:--|\\/\\/|#).*)/,lookbehind:!0},string:{pattern:/(^|[^@\\\\])(\"|')(?:\\\\?[\\s\\S])*?\\2/,lookbehind:!0},variable:/@[\\w.$]+|@(\"|'|`)(?:\\\\?[\\s\\S])+?\\1/,\"function\":/\\b(?:COUNT|SUM|AVG|MIN|MAX|FIRST|LAST|UCASE|LCASE|MID|LEN|ROUND|NOW|FORMAT)(?=\\s*\\()/i,keyword:/\\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR VARYING|CHARACTER (?:SET|VARYING)|CHARSET|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|DATA(?:BASES?)?|DATETIME|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE(?: PRECISION)?|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE KEY|ELSE|ENABLE|ENCLOSED BY|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPE(?:D BY)?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTO|INVOKER|ISOLATION LEVEL|JOIN|KEYS?|KILL|LANGUAGE SQL|LAST|LEFT|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MODIFIES SQL DATA|MODIFY|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL(?: CHAR VARYING| CHARACTER(?: VARYING)?| VARCHAR)?|NATURAL|NCHAR(?: VARCHAR)?|NEXT|NO(?: SQL|CHECK|CYCLE)?|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READ(?:S SQL DATA|TEXT)?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEATABLE|REPLICATION|REQUIRE|RESTORE|RESTRICT|RETURNS?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE MODE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|START(?:ING BY)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED BY|TEXT(?:SIZE)?|THEN|TIMESTAMP|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNPIVOT|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?)\\b/i,\"boolean\":/\\b(?:TRUE|FALSE|NULL)\\b/i,number:/\\b-?(?:0x)?\\d*\\.?[\\da-f]+\\b/,operator:/[-+*\\/=%^~]|&&?|\\|?\\||!=?|<(?:=>?|<|>)?|>[>=]?|\\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\\b/i,punctuation:/[;[\\]()`,.]/};\n!function(n){var t={url:/url\\(([\"']?).*?\\1\\)/i,string:/(\"|')(?:[^\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*?\\1/,interpolation:null,func:null,important:/\\B!(?:important|optional)\\b/i,keyword:{pattern:/(^|\\s+)(?:(?:if|else|for|return|unless)(?=\\s+|$)|@[\\w-]+)/,lookbehind:!0},hexcode:/#[\\da-f]{3,6}/i,number:/\\b\\d+(?:\\.\\d+)?%?/,\"boolean\":/\\b(?:true|false)\\b/,operator:[/~|[+!\\/%<>?=]=?|[-:]=|\\*[*=]?|\\.+|&&|\\|\\||\\B-\\B|\\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\\b/],punctuation:/[{}()\\[\\];:,]/};t.interpolation={pattern:/\\{[^\\r\\n}:]+\\}/,alias:\"variable\",inside:n.util.clone(t)},t.func={pattern:/[\\w-]+\\([^)]*\\).*/,inside:{\"function\":/^[^(]+/,rest:n.util.clone(t)}},n.languages.stylus={comment:{pattern:/(^|[^\\\\])(\\/\\*[\\w\\W]*?\\*\\/|\\/\\/.*)/,lookbehind:!0},\"atrule-declaration\":{pattern:/(^\\s*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\\w-]+/,rest:t}},\"variable-declaration\":{pattern:/(^[ \\t]*)[\\w$-]+\\s*.?=[ \\t]*(?:(?:\\{[^}]*\\}|.+)|$)/m,lookbehind:!0,inside:{variable:/^\\S+/,rest:t}},statement:{pattern:/(^[ \\t]*)(?:if|else|for|return|unless)[ \\t]+.+/m,lookbehind:!0,inside:{keyword:/^\\S+/,rest:t}},\"property-declaration\":{pattern:/((?:^|\\{)([ \\t]*))(?:[\\w-]|\\{[^}\\r\\n]+\\})+(?:\\s*:\\s*|[ \\t]+)[^{\\r\\n]*(?:;|[^{\\r\\n,](?=$)(?!(\\r?\\n|\\r)(?:\\{|\\2[ \\t]+)))/m,lookbehind:!0,inside:{property:{pattern:/^[^\\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \\t]*)(?:(?=\\S)(?:[^{}\\r\\n:()]|::?[\\w-]+(?:\\([^)\\r\\n]*\\))?|\\{[^}\\r\\n]+\\})+)(?:(?:\\r?\\n|\\r)(?:\\1(?:(?=\\S)(?:[^{}\\r\\n:()]|::?[\\w-]+(?:\\([^)\\r\\n]*\\))?|\\{[^}\\r\\n]+\\})+)))*(?:,$|\\{|(?=(?:\\r?\\n|\\r)(?:\\{|\\1[ \\t]+)))/m,lookbehind:!0,inside:{interpolation:t.interpolation,punctuation:/[{},]/}},func:t.func,string:t.string,interpolation:t.interpolation,punctuation:/[{}()\\[\\];:.]/}}(Prism);\nPrism.languages.swift=Prism.languages.extend(\"clike\",{string:{pattern:/(\"|')(\\\\(?:\\((?:[^()]|\\([^)]+\\))+\\)|\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,inside:{interpolation:{pattern:/\\\\\\((?:[^()]|\\([^)]+\\))+\\)/,inside:{delimiter:{pattern:/^\\\\\\(|\\)$/,alias:\"variable\"}}}}},keyword:/\\b(as|associativity|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic(?:Type)?|else|enum|extension|fallthrough|final|for|func|get|guard|if|import|in|infix|init|inout|internal|is|lazy|left|let|mutating|new|none|nonmutating|operator|optional|override|postfix|precedence|prefix|private|Protocol|public|repeat|required|rethrows|return|right|safe|self|Self|set|static|struct|subscript|super|switch|throws?|try|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|__(?:COLUMN__|FILE__|FUNCTION__|LINE__))\\b/,number:/\\b([\\d_]+(\\.[\\de_]+)?|0x[a-f0-9_]+(\\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b/i,constant:/\\b(nil|[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\\b/,atrule:/@\\b(IB(?:Outlet|Designable|Action|Inspectable)|class_protocol|exported|noreturn|NS(?:Copying|Managed)|objc|UIApplicationMain|auto_closure)\\b/,builtin:/\\b([A-Z]\\S+|abs|advance|alignof(?:Value)?|assert|contains|count(?:Elements)?|debugPrint(?:ln)?|distance|drop(?:First|Last)|dump|enumerate|equal|filter|find|first|getVaList|indices|isEmpty|join|last|lexicographicalCompare|map|max(?:Element)?|min(?:Element)?|numericCast|overlaps|partition|print(?:ln)?|reduce|reflect|reverse|sizeof(?:Value)?|sort(?:ed)?|split|startsWith|stride(?:of(?:Value)?)?|suffix|swap|toDebugString|toString|transcode|underestimateCount|unsafeBitCast|with(?:ExtendedLifetime|Unsafe(?:MutablePointers?|Pointers?)|VaList))\\b/}),Prism.languages.swift.string.inside.interpolation.inside.rest=Prism.util.clone(Prism.languages.swift);\nPrism.languages.tcl={comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:/\"(?:[^\"\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*\"/,variable:[{pattern:/(\\$)(?:::)?(?:[a-zA-Z0-9]+::)*[a-zA-Z0-9_]+/,lookbehind:!0},{pattern:/(\\$){[^}]+}/,lookbehind:!0},{pattern:/(^\\s*set[ \\t]+)(?:::)?(?:[a-zA-Z0-9]+::)*[a-zA-Z0-9_]+/m,lookbehind:!0}],\"function\":{pattern:/(^\\s*proc[ \\t]+)[^\\s]+/m,lookbehind:!0},builtin:[{pattern:/(^\\s*)(?:proc|return|class|error|eval|exit|for|foreach|if|switch|while|break|continue)\\b/m,lookbehind:!0},/\\b(elseif|else)\\b/],scope:{pattern:/(^\\s*)(global|upvar|variable)\\b/m,lookbehind:!0,alias:\"constant\"},keyword:{pattern:/(^\\s*|\\[)(after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|Safe_Base|scan|seek|set|socket|source|split|string|subst|Tcl|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|wordBreak(?:After|Before)|test|vars)|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\\b/m,lookbehind:!0},operator:/!=?|\\*\\*?|==|&&?|\\|\\|?|<[=<]?|>[=>]?|[-+~\\/%?^]|\\b(?:eq|ne|in|ni)\\b/,punctuation:/[{}()\\[\\]]/};\n!function(e){var i=\"(?:\\\\([^|)]+\\\\)|\\\\[[^\\\\]]+\\\\]|\\\\{[^}]+\\\\})+\",n={css:{pattern:/\\{[^}]+\\}/,inside:{rest:e.languages.css}},\"class-id\":{pattern:/(\\()[^)]+(?=\\))/,lookbehind:!0,alias:\"attr-value\"},lang:{pattern:/(\\[)[^\\]]+(?=\\])/,lookbehind:!0,alias:\"attr-value\"},punctuation:/[\\\\\\/]\\d+|\\S/};e.languages.textile=e.languages.extend(\"markup\",{phrase:{pattern:/(^|\\r|\\n)\\S[\\s\\S]*?(?=$|\\r?\\n\\r?\\n|\\r\\r)/,lookbehind:!0,inside:{\"block-tag\":{pattern:RegExp(\"^[a-z]\\\\w*(?:\"+i+\"|[<>=()])*\\\\.\"),inside:{modifier:{pattern:RegExp(\"(^[a-z]\\\\w*)(?:\"+i+\"|[<>=()])+(?=\\\\.)\"),lookbehind:!0,inside:e.util.clone(n)},tag:/^[a-z]\\w*/,punctuation:/\\.$/}},list:{pattern:RegExp(\"^[*#]+(?:\"+i+\")?\\\\s+.+\",\"m\"),inside:{modifier:{pattern:RegExp(\"(^[*#]+)\"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/^[*#]+/}},table:{pattern:RegExp(\"^(?:(?:\"+i+\"|[<>=()^~])+\\\\.\\\\s*)?(?:\\\\|(?:(?:\"+i+\"|[<>=()^~_]|[\\\\\\\\/]\\\\d+)+\\\\.)?[^|]*)+\\\\|\",\"m\"),inside:{modifier:{pattern:RegExp(\"(^|\\\\|(?:\\\\r?\\\\n|\\\\r)?)(?:\"+i+\"|[<>=()^~_]|[\\\\\\\\/]\\\\d+)+(?=\\\\.)\"),lookbehind:!0,inside:e.util.clone(n)},punctuation:/\\||^\\./}},inline:{pattern:RegExp(\"(\\\\*\\\\*|__|\\\\?\\\\?|[*_%@+\\\\-^~])(?:\"+i+\")?.+?\\\\1\"),inside:{bold:{pattern:RegExp(\"((^\\\\*\\\\*?)(?:\"+i+\")?).+?(?=\\\\2)\"),lookbehind:!0},italic:{pattern:RegExp(\"((^__?)(?:\"+i+\")?).+?(?=\\\\2)\"),lookbehind:!0},cite:{pattern:RegExp(\"(^\\\\?\\\\?(?:\"+i+\")?).+?(?=\\\\?\\\\?)\"),lookbehind:!0,alias:\"string\"},code:{pattern:RegExp(\"(^@(?:\"+i+\")?).+?(?=@)\"),lookbehind:!0,alias:\"keyword\"},inserted:{pattern:RegExp(\"(^\\\\+(?:\"+i+\")?).+?(?=\\\\+)\"),lookbehind:!0},deleted:{pattern:RegExp(\"(^-(?:\"+i+\")?).+?(?=-)\"),lookbehind:!0},span:{pattern:RegExp(\"(^%(?:\"+i+\")?).+?(?=%)\"),lookbehind:!0},modifier:{pattern:RegExp(\"(^\\\\*\\\\*|__|\\\\?\\\\?|[*_%@+\\\\-^~])\"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/[*_%?@+\\-^~]+/}},\"link-ref\":{pattern:/^\\[[^\\]]+\\]\\S+$/m,inside:{string:{pattern:/(\\[)[^\\]]+(?=\\])/,lookbehind:!0},url:{pattern:/(\\])\\S+$/,lookbehind:!0},punctuation:/[\\[\\]]/}},link:{pattern:RegExp('\"(?:'+i+')?[^\"]+\":.+?(?=[^\\\\w/]?(?:\\\\s|$))'),inside:{text:{pattern:RegExp('(^\"(?:'+i+')?)[^\"]+(?=\")'),lookbehind:!0},modifier:{pattern:RegExp('(^\")'+i),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[\":]/}},image:{pattern:RegExp(\"!(?:\"+i+\"|[<>=()])*[^!\\\\s()]+(?:\\\\([^)]+\\\\))?!(?::.+?(?=[^\\\\w/]?(?:\\\\s|$)))?\"),inside:{source:{pattern:RegExp(\"(^!(?:\"+i+\"|[<>=()])*)[^!\\\\s()]+(?:\\\\([^)]+\\\\))?(?=!)\"),lookbehind:!0,alias:\"url\"},modifier:{pattern:RegExp(\"(^!)(?:\"+i+\"|[<>=()])+\"),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\\b\\[\\d+\\]/,alias:\"comment\",inside:{punctuation:/\\[|\\]/}},acronym:{pattern:/\\b[A-Z\\d]+\\([^)]+\\)/,inside:{comment:{pattern:/(\\()[^)]+(?=\\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\\b\\((TM|R|C)\\)/,alias:\"comment\",inside:{punctuation:/[()]/}}}}});var t={inline:e.util.clone(e.languages.textile.phrase.inside.inline),link:e.util.clone(e.languages.textile.phrase.inside.link),image:e.util.clone(e.languages.textile.phrase.inside.image),footnote:e.util.clone(e.languages.textile.phrase.inside.footnote),acronym:e.util.clone(e.languages.textile.phrase.inside.acronym),mark:e.util.clone(e.languages.textile.phrase.inside.mark)};e.languages.textile.phrase.inside.inline.inside.bold.inside=t,e.languages.textile.phrase.inside.inline.inside.italic.inside=t,e.languages.textile.phrase.inside.inline.inside.inserted.inside=t,e.languages.textile.phrase.inside.inline.inside.deleted.inside=t,e.languages.textile.phrase.inside.inline.inside.span.inside=t,e.languages.textile.phrase.inside.table.inside.inline=t.inline,e.languages.textile.phrase.inside.table.inside.link=t.link,e.languages.textile.phrase.inside.table.inside.image=t.image,e.languages.textile.phrase.inside.table.inside.footnote=t.footnote,e.languages.textile.phrase.inside.table.inside.acronym=t.acronym,e.languages.textile.phrase.inside.table.inside.mark=t.mark}(Prism);\nPrism.languages.twig={comment:/\\{#[\\s\\S]*?#\\}/,tag:{pattern:/\\{\\{[\\s\\S]*?\\}\\}|\\{%[\\s\\S]*?%\\}/,inside:{ld:{pattern:/^(?:\\{\\{\\-?|\\{%\\-?\\s*\\w+)/,inside:{punctuation:/^(?:\\{\\{|\\{%)\\-?/,keyword:/\\w+/}},rd:{pattern:/\\-?(?:%\\}|\\}\\})$/,inside:{punctuation:/.*/}},string:{pattern:/(\"|')(?:\\\\?.)*?\\1/,inside:{punctuation:/^['\"]|['\"]$/}},keyword:/\\b(?:even|if|odd)\\b/,\"boolean\":/\\b(?:true|false|null)\\b/,number:/\\b-?(?:0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee][-+]?\\d+)?)\\b/,operator:[{pattern:/(\\s)(?:and|b\\-and|b\\-xor|b\\-or|ends with|in|is|matches|not|or|same as|starts with)(?=\\s)/,lookbehind:!0},/[=<>]=?|!=|\\*\\*?|\\/\\/?|\\?:?|[-+~%|]/],property:/\\b[a-zA-Z_][a-zA-Z0-9_]*\\b/,punctuation:/[()\\[\\]{}:.,]/}},other:{pattern:/\\S(?:[\\s\\S]*\\S)?/,inside:Prism.languages.markup}};\nPrism.languages.typescript=Prism.languages.extend(\"javascript\",{keyword:/\\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield|module|declare|constructor|string|Function|any|number|boolean|Array|enum)\\b/});\nPrism.languages.verilog={comment:/\\/\\/.*|\\/\\*[\\w\\W]*?\\*\\//,string:/\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,property:/\\B\\$\\w+\\b/,constant:/\\B`\\w+\\b/,\"function\":/[a-z\\d_]+(?=\\()/i,keyword:/\\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|class|case|casex|casez|cell|chandle|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endspecify|endsequence|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_onevent|pulsestyle_ondetect|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\\b/,important:/\\b(?:always_latch|always_comb|always_ff|always)\\b ?@?/,number:/\\B##?\\d+|(?:\\b\\d+)?'[odbh] ?[\\da-fzx_?]+|\\b\\d*[._]?\\d+(?:e[-+]?\\d+)?/i,operator:/[-+{}^~%*\\/?=!<>&|]+/,punctuation:/[[\\];(),.:]/};\nPrism.languages.vhdl={comment:/--.+/,\"vhdl-vectors\":{pattern:/\\b[oxb]\"[\\da-f_]+\"|\"[01uxzwlh-]+\"/i,alias:\"number\"},\"quoted-function\":{pattern:/\"\\S+?\"(?=\\()/,alias:\"function\"},string:/\"(?:[^\\\\\\r\\n]|\\\\?(?:\\r\\n|[\\s\\S]))*?\"/,constant:/\\b(?:use|library)\\b/i,keyword:/\\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\\b/i,\"boolean\":/\\b(?:true|false)\\b/i,\"function\":/[a-z0-9_]+(?=\\()/i,number:/'[01uxzwlh-]'|\\b(?:\\d+#[\\da-f_.]+#|\\d[\\d_.]*)(?:e[-+]?\\d+)?/i,operator:/[<>]=?|:=|[-+*\\/&=]|\\b(?:abs|not|mod|rem|sll|srl|sla|sra|rol|ror|and|or|nand|xnor|xor|nor)\\b/i,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.vim={string:/\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^'\\r\\n]|'')*'/,comment:/\".*/,\"function\":/\\w+(?=\\()/,keyword:/\\b(?:ab|abbreviate|abc|abclear|abo|aboveleft|al|all|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|ar|args|argu|argument|as|ascii|bad|badd|ba|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bN|bNext|bo|botright|bp|bprevious|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|br|brewind|bro|browse|bufdo|b|buffer|buffers|bun|bunload|bw|bwipeout|ca|cabbrev|cabc|cabclear|caddb|caddbuffer|cad|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cgetb|cgetbuffer|cgete|cgetexpr|cg|cgetfile|c|change|changes|chd|chdir|che|checkpath|checkt|checktime|cla|clast|cl|clist|clo|close|cmapc|cmapclear|cnew|cnewer|cn|cnext|cN|cNext|cnf|cnfile|cNfcNfile|cnorea|cnoreabbrev|col|colder|colo|colorscheme|comc|comclear|comp|compiler|conf|confirm|con|continue|cope|copen|co|copy|cpf|cpfile|cp|cprevious|cq|cquit|cr|crewind|cuna|cunabbrev|cu|cunmap|cw|cwindow|debugg|debuggreedy|delc|delcommand|d|delete|delf|delfunction|delm|delmarks|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|di|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|earlier|echoe|echoerr|echom|echomsg|echon|e|edit|el|else|elsei|elseif|em|emenu|endfo|endfor|endf|endfunction|endfun|en|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fina|finally|fin|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|folddoc|folddoclosed|foldd|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|ha|hardcopy|h|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iuna|iunabbrev|iu|iunmap|j|join|ju|jumps|k|keepalt|keepj|keepjumps|kee|keepmarks|laddb|laddbuffer|lad|laddexpr|laddf|laddfile|lan|language|la|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|let|left|lefta|leftabove|lex|lexpr|lf|lfile|lfir|lfirst|lgetb|lgetbuffer|lgete|lgetexpr|lg|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|l|list|ll|lla|llast|lli|llist|lmak|lmake|lm|lmap|lmapc|lmapclear|lnew|lnewer|lne|lnext|lN|lNext|lnf|lnfile|lNf|lNfile|ln|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lpf|lpfile|lp|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|mak|make|ma|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkvie|mkview|mkv|mkvimrc|mod|mode|m|move|mzf|mzfile|mz|mzscheme|nbkey|new|n|next|N|Next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|omapc|omapclear|on|only|o|open|opt|options|ou|ounmap|pc|pclose|ped|pedit|pe|perl|perld|perldo|po|pop|popu|popu|popup|pp|ppop|pre|preserve|prev|previous|p|print|P|Print|profd|profdel|prof|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptN|ptNext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|pyf|pyfile|py|python|qa|qall|q|quit|quita|quitall|r|read|rec|recover|redi|redir|red|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|rub|ruby|rubyd|rubydo|rubyf|rubyfile|ru|runtime|rv|rviminfo|sal|sall|san|sandbox|sa|sargument|sav|saveas|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbN|sbNext|sbp|sbprevious|sbr|sbrewind|sb|sbuffer|scripte|scriptencoding|scrip|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sla|slast|sl|sleep|sm|smagic|sm|smap|smapc|smapclear|sme|smenu|sn|snext|sN|sNext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|sor|sort|so|source|spelld|spelldump|spe|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|sp|split|spr|sprevious|sre|srewind|sta|stag|startg|startgreplace|star|startinsert|startr|startreplace|stj|stjump|st|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tab|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabnew|tabn|tabnext|tabN|tabNext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|ta|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tm|tmenu|tn|tnext|tN|tNext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tu|tunmenu|una|unabbreviate|u|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|verb|verbose|ve|version|vert|vertical|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|vi|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|wa|wall|wh|while|winc|wincmd|windo|winp|winpos|win|winsize|wn|wnext|wN|wNext|wp|wprevious|wq|wqa|wqall|w|write|ws|wsverb|wv|wviminfo|X|xa|xall|x|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|XMLent|XMLns|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\\b/,builtin:/\\b(?:autocmd|acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|t_AB|t_AF|t_al|t_AL|t_bc|t_cd|t_ce|t_Ce|t_cl|t_cm|t_Co|t_cs|t_Cs|t_CS|t_CV|t_da|t_db|t_dl|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_fs|t_IE|t_IS|t_k1|t_K1|t_k2|t_k3|t_K3|t_k4|t_K4|t_k5|t_K5|t_k6|t_K6|t_k7|t_K7|t_k8|t_K8|t_k9|t_K9|t_KA|t_kb|t_kB|t_KB|t_KC|t_kd|t_kD|t_KD|t_ke|t_KE|t_KF|t_KG|t_kh|t_KH|t_kI|t_KI|t_KJ|t_KK|t_kl|t_KL|t_kN|t_kP|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_RI|t_RV|t_Sb|t_se|t_Sf|t_SI|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_WP|t_WS|t_xs|t_ZH|t_ZR)\\b/,number:/\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d+)?)\\b/i,operator:/\\|\\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\\/%?]|\\b(?:is(?:not)?)\\b/,punctuation:/[{}[\\](),;:]/};\nPrism.languages.wiki=Prism.languages.extend(\"markup\",{\"block-comment\":{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0,alias:\"comment\"},heading:{pattern:/^(=+).+?\\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\\1/,inside:{\"bold italic\":{pattern:/(''''').+?(?=\\1)/,lookbehind:!0},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:\"punctuation\"},url:[/ISBN +(?:97[89][ -]?)?(?:\\d[ -]?){9}[\\dx]\\b|(?:RFC|PMID) +\\d+/i,/\\[\\[.+?\\]\\]|\\[.+?\\]/],variable:[/__[A-Z]+__/,/\\{{3}.+?\\}{3}/,/\\{\\{.+?}}/],symbol:[/^#redirect/im,/~{3,5}/],\"table-tag\":{pattern:/((?:^|[|!])[|!])[^|\\r\\n]+\\|(?!\\|)/m,lookbehind:!0,inside:{\"table-bar\":{pattern:/\\|$/,alias:\"punctuation\"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\\{\\||\\|\\}|\\|-|[*#:;!|])|\\|\\||!!/m}),Prism.languages.insertBefore(\"wiki\",\"tag\",{nowiki:{pattern:/<(nowiki|pre|source)\\b[\\w\\W]*?>[\\w\\W]*?<\\/\\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\\b[\\w\\W]*?>|<\\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}});\nPrism.languages.yaml={scalar:{pattern:/([\\-:]\\s*(![^\\s]+)?[ \\t]*[|>])[ \\t]*(?:((?:\\r?\\n|\\r)[ \\t]+)[^\\r\\n]+(?:\\3[^\\r\\n]+)*)/,lookbehind:!0,alias:\"string\"},comment:/#.*/,key:{pattern:/(\\s*[:\\-,[{\\r\\n?][ \\t]*(![^\\s]+)?[ \\t]*)[^\\r\\n{[\\]},#]+?(?=\\s*:\\s)/,lookbehind:!0,alias:\"atrule\"},directive:{pattern:/(^[ \\t]*)%.+/m,lookbehind:!0,alias:\"important\"},datetime:{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(\\d{4}-\\d\\d?-\\d\\d?([tT]|[ \\t]+)\\d\\d?:\\d{2}:\\d{2}(\\.\\d*)?[ \\t]*(Z|[-+]\\d\\d?(:\\d{2})?)?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(:\\d{2}(\\.\\d*)?)?)(?=[ \\t]*($|,|]|}))/m,lookbehind:!0,alias:\"number\"},\"boolean\":{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(true|false)[ \\t]*(?=$|,|]|})/im,lookbehind:!0,alias:\"important\"},\"null\":{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(null|~)[ \\t]*(?=$|,|]|})/im,lookbehind:!0,alias:\"important\"},string:{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')(?=[ \\t]*($|,|]|}))/m,lookbehind:!0},number:{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)[+\\-]?(0x[\\da-f]+|0o[0-7]+|(\\d+\\.?\\d*|\\.?\\d+)(e[\\+\\-]?\\d+)?|\\.inf|\\.nan)[ \\t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\\s]+/,important:/[&*][\\w]+/,punctuation:/---|[:[\\]{}\\-,|>?]|\\.\\.\\./};\n"
  },
  {
    "path": "static/tinymce/js/tinymce/langs/readme.md",
    "content": "This is where language files should be placed.\n\nPlease DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/\n"
  },
  {
    "path": "static/tinymce/js/tinymce/langs/zh_CN.js",
    "content": "tinymce.addI18n('zh_CN',{\n\"Cut\": \"\\u526a\\u5207\",\n\"Heading 5\": \"\\u6807\\u98985\",\n\"Header 2\": \"\\u6807\\u98982\",\n\"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\\/C\\/V keyboard shortcuts instead.\": \"\\u4f60\\u7684\\u6d4f\\u89c8\\u5668\\u4e0d\\u652f\\u6301\\u5bf9\\u526a\\u8d34\\u677f\\u7684\\u8bbf\\u95ee\\uff0c\\u8bf7\\u4f7f\\u7528Ctrl+X\\/C\\/V\\u952e\\u8fdb\\u884c\\u590d\\u5236\\u7c98\\u8d34\\u3002\",\n\"Heading 4\": \"\\u6807\\u98984\",\n\"Div\": \"Div\\u533a\\u5757\",\n\"Heading 2\": \"\\u6807\\u98982\",\n\"Paste\": \"\\u7c98\\u8d34\",\n\"Close\": \"\\u5173\\u95ed\",\n\"Font Family\": \"\\u5b57\\u4f53\",\n\"Pre\": \"\\u9884\\u683c\\u5f0f\\u6587\\u672c\",\n\"Align right\": \"\\u53f3\\u5bf9\\u9f50\",\n\"New document\": \"\\u65b0\\u6587\\u6863\",\n\"Blockquote\": \"\\u5f15\\u7528\",\n\"Numbered list\": \"\\u7f16\\u53f7\\u5217\\u8868\",\n\"Heading 1\": \"\\u6807\\u98981\",\n\"Headings\": \"\\u6807\\u9898\",\n\"Increase indent\": \"\\u589e\\u52a0\\u7f29\\u8fdb\",\n\"Formats\": \"\\u683c\\u5f0f\",\n\"Headers\": \"\\u6807\\u9898\",\n\"Select all\": \"\\u5168\\u9009\",\n\"Header 3\": \"\\u6807\\u98983\",\n\"Blocks\": \"\\u533a\\u5757\",\n\"Undo\": \"\\u64a4\\u6d88\",\n\"Strikethrough\": \"\\u5220\\u9664\\u7ebf\",\n\"Bullet list\": \"\\u9879\\u76ee\\u7b26\\u53f7\",\n\"Header 1\": \"\\u6807\\u98981\",\n\"Superscript\": \"\\u4e0a\\u6807\",\n\"Clear formatting\": \"\\u6e05\\u9664\\u683c\\u5f0f\",\n\"Font Sizes\": \"\\u5b57\\u53f7\",\n\"Subscript\": \"\\u4e0b\\u6807\",\n\"Header 6\": \"\\u6807\\u98986\",\n\"Redo\": \"\\u91cd\\u590d\",\n\"Paragraph\": \"\\u6bb5\\u843d\",\n\"Ok\": \"\\u786e\\u5b9a\",\n\"Bold\": \"\\u7c97\\u4f53\",\n\"Code\": \"\\u4ee3\\u7801\",\n\"Italic\": \"\\u659c\\u4f53\",\n\"Align center\": \"\\u5c45\\u4e2d\",\n\"Header 5\": \"\\u6807\\u98985\",\n\"Heading 6\": \"\\u6807\\u98986\",\n\"Heading 3\": \"\\u6807\\u98983\",\n\"Decrease indent\": \"\\u51cf\\u5c11\\u7f29\\u8fdb\",\n\"Header 4\": \"\\u6807\\u98984\",\n\"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.\": \"\\u5f53\\u524d\\u4e3a\\u7eaf\\u6587\\u672c\\u7c98\\u8d34\\u6a21\\u5f0f\\uff0c\\u518d\\u6b21\\u70b9\\u51fb\\u53ef\\u4ee5\\u56de\\u5230\\u666e\\u901a\\u7c98\\u8d34\\u6a21\\u5f0f\\u3002\",\n\"Underline\": \"\\u4e0b\\u5212\\u7ebf\",\n\"Cancel\": \"\\u53d6\\u6d88\",\n\"Justify\": \"\\u4e24\\u7aef\\u5bf9\\u9f50\",\n\"Inline\": \"\\u6587\\u672c\",\n\"Copy\": \"\\u590d\\u5236\",\n\"Align left\": \"\\u5de6\\u5bf9\\u9f50\",\n\"Visual aids\": \"\\u7f51\\u683c\\u7ebf\",\n\"Lower Greek\": \"\\u5c0f\\u5199\\u5e0c\\u814a\\u5b57\\u6bcd\",\n\"Square\": \"\\u65b9\\u5757\",\n\"Default\": \"\\u9ed8\\u8ba4\",\n\"Lower Alpha\": \"\\u5c0f\\u5199\\u82f1\\u6587\\u5b57\\u6bcd\",\n\"Circle\": \"\\u7a7a\\u5fc3\\u5706\",\n\"Disc\": \"\\u5b9e\\u5fc3\\u5706\",\n\"Upper Alpha\": \"\\u5927\\u5199\\u82f1\\u6587\\u5b57\\u6bcd\",\n\"Upper Roman\": \"\\u5927\\u5199\\u7f57\\u9a6c\\u5b57\\u6bcd\",\n\"Lower Roman\": \"\\u5c0f\\u5199\\u7f57\\u9a6c\\u5b57\\u6bcd\",\n\"Name\": \"\\u540d\\u79f0\",\n\"Anchor\": \"\\u951a\\u70b9\",\n\"You have unsaved changes are you sure you want to navigate away?\": \"\\u4f60\\u8fd8\\u6709\\u6587\\u6863\\u5c1a\\u672a\\u4fdd\\u5b58\\uff0c\\u786e\\u5b9a\\u8981\\u79bb\\u5f00\\uff1f\",\n\"Restore last draft\": \"\\u6062\\u590d\\u4e0a\\u6b21\\u7684\\u8349\\u7a3f\",\n\"Special character\": \"\\u7279\\u6b8a\\u7b26\\u53f7\",\n\"Source code\": \"\\u6e90\\u4ee3\\u7801\",\n\"Color\": \"\\u989c\\u8272\",\n\"Right to left\": \"\\u4ece\\u53f3\\u5230\\u5de6\",\n\"Left to right\": \"\\u4ece\\u5de6\\u5230\\u53f3\",\n\"Emoticons\": \"\\u8868\\u60c5\",\n\"Robots\": \"\\u673a\\u5668\\u4eba\",\n\"Document properties\": \"\\u6587\\u6863\\u5c5e\\u6027\",\n\"Title\": \"\\u6807\\u9898\",\n\"Keywords\": \"\\u5173\\u952e\\u8bcd\",\n\"Encoding\": \"\\u7f16\\u7801\",\n\"Description\": \"\\u63cf\\u8ff0\",\n\"Author\": \"\\u4f5c\\u8005\",\n\"Fullscreen\": \"\\u5168\\u5c4f\",\n\"Horizontal line\": \"\\u6c34\\u5e73\\u5206\\u5272\\u7ebf\",\n\"Horizontal space\": \"\\u6c34\\u5e73\\u8fb9\\u8ddd\",\n\"Insert\\/edit image\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u56fe\\u7247\",\n\"General\": \"\\u666e\\u901a\",\n\"Advanced\": \"\\u9ad8\\u7ea7\",\n\"Source\": \"\\u5730\\u5740\",\n\"Border\": \"\\u8fb9\\u6846\",\n\"Constrain proportions\": \"\\u4fdd\\u6301\\u7eb5\\u6a2a\\u6bd4\",\n\"Vertical space\": \"\\u5782\\u76f4\\u8fb9\\u8ddd\",\n\"Image description\": \"\\u56fe\\u7247\\u63cf\\u8ff0\",\n\"Style\": \"\\u6837\\u5f0f\",\n\"Dimensions\": \"\\u5927\\u5c0f\",\n\"Insert image\": \"\\u63d2\\u5165\\u56fe\\u7247\",\n\"Insert date\\/time\": \"\\u63d2\\u5165\\u65e5\\u671f\\/\\u65f6\\u95f4\",\n\"Remove link\": \"\\u5220\\u9664\\u94fe\\u63a5\",\n\"Url\": \"\\u5730\\u5740\",\n\"Text to display\": \"\\u663e\\u793a\\u6587\\u5b57\",\n\"Anchors\": \"\\u951a\\u70b9\",\n\"Insert link\": \"\\u63d2\\u5165\\u94fe\\u63a5\",\n\"New window\": \"\\u5728\\u65b0\\u7a97\\u53e3\\u6253\\u5f00\",\n\"None\": \"\\u65e0\",\n\"The URL you entered seems to be an external link. Do you want to add the required http:\\/\\/ prefix?\": \"\\u4f60\\u6240\\u586b\\u5199\\u7684URL\\u5730\\u5740\\u5c5e\\u4e8e\\u5916\\u90e8\\u94fe\\u63a5\\uff0c\\u9700\\u8981\\u52a0\\u4e0ahttp:\\/\\/:\\u524d\\u7f00\\u5417\\uff1f\",\n\"Target\": \"\\u6253\\u5f00\\u65b9\\u5f0f\",\n\"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?\": \"\\u4f60\\u6240\\u586b\\u5199\\u7684URL\\u5730\\u5740\\u8c8c\\u4f3c\\u662f\\u90ae\\u4ef6\\u5730\\u5740\\uff0c\\u9700\\u8981\\u52a0\\u4e0amailto:\\u524d\\u7f00\\u5417\\uff1f\",\n\"Insert\\/edit link\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u94fe\\u63a5\",\n\"Insert\\/edit video\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u89c6\\u9891\",\n\"Poster\": \"\\u5c01\\u9762\",\n\"Alternative source\": \"\\u955c\\u50cf\",\n\"Paste your embed code below:\": \"\\u5c06\\u5185\\u5d4c\\u4ee3\\u7801\\u7c98\\u8d34\\u5728\\u4e0b\\u9762:\",\n\"Insert video\": \"\\u63d2\\u5165\\u89c6\\u9891\",\n\"Embed\": \"\\u5185\\u5d4c\",\n\"Nonbreaking space\": \"\\u4e0d\\u95f4\\u65ad\\u7a7a\\u683c\",\n\"Page break\": \"\\u5206\\u9875\\u7b26\",\n\"Paste as text\": \"\\u7c98\\u8d34\\u4e3a\\u6587\\u672c\",\n\"Preview\": \"\\u9884\\u89c8\",\n\"Print\": \"\\u6253\\u5370\",\n\"Save\": \"\\u4fdd\\u5b58\",\n\"Could not find the specified string.\": \"\\u672a\\u627e\\u5230\\u641c\\u7d22\\u5185\\u5bb9.\",\n\"Replace\": \"\\u66ff\\u6362\",\n\"Next\": \"\\u4e0b\\u4e00\\u4e2a\",\n\"Whole words\": \"\\u5168\\u5b57\\u5339\\u914d\",\n\"Find and replace\": \"\\u67e5\\u627e\\u548c\\u66ff\\u6362\",\n\"Replace with\": \"\\u66ff\\u6362\\u4e3a\",\n\"Find\": \"\\u67e5\\u627e\",\n\"Replace all\": \"\\u5168\\u90e8\\u66ff\\u6362\",\n\"Match case\": \"\\u533a\\u5206\\u5927\\u5c0f\\u5199\",\n\"Prev\": \"\\u4e0a\\u4e00\\u4e2a\",\n\"Spellcheck\": \"\\u62fc\\u5199\\u68c0\\u67e5\",\n\"Finish\": \"\\u5b8c\\u6210\",\n\"Ignore all\": \"\\u5168\\u90e8\\u5ffd\\u7565\",\n\"Ignore\": \"\\u5ffd\\u7565\",\n\"Add to Dictionary\": \"\\u6dfb\\u52a0\\u5230\\u5b57\\u5178\",\n\"Insert row before\": \"\\u5728\\u4e0a\\u65b9\\u63d2\\u5165\",\n\"Rows\": \"\\u884c\",\n\"Height\": \"\\u9ad8\",\n\"Paste row after\": \"\\u7c98\\u8d34\\u5230\\u4e0b\\u65b9\",\n\"Alignment\": \"\\u5bf9\\u9f50\\u65b9\\u5f0f\",\n\"Border color\": \"\\u8fb9\\u6846\\u989c\\u8272\",\n\"Column group\": \"\\u5217\\u7ec4\",\n\"Row\": \"\\u884c\",\n\"Insert column before\": \"\\u5728\\u5de6\\u4fa7\\u63d2\\u5165\",\n\"Split cell\": \"\\u62c6\\u5206\\u5355\\u5143\\u683c\",\n\"Cell padding\": \"\\u5355\\u5143\\u683c\\u5185\\u8fb9\\u8ddd\",\n\"Cell spacing\": \"\\u5355\\u5143\\u683c\\u5916\\u95f4\\u8ddd\",\n\"Row type\": \"\\u884c\\u7c7b\\u578b\",\n\"Insert table\": \"\\u63d2\\u5165\\u8868\\u683c\",\n\"Body\": \"\\u8868\\u4f53\",\n\"Caption\": \"\\u6807\\u9898\",\n\"Footer\": \"\\u8868\\u5c3e\",\n\"Delete row\": \"\\u5220\\u9664\\u884c\",\n\"Paste row before\": \"\\u7c98\\u8d34\\u5230\\u4e0a\\u65b9\",\n\"Scope\": \"\\u8303\\u56f4\",\n\"Delete table\": \"\\u5220\\u9664\\u8868\\u683c\",\n\"H Align\": \"\\u6c34\\u5e73\\u5bf9\\u9f50\",\n\"Top\": \"\\u9876\\u90e8\\u5bf9\\u9f50\",\n\"Header cell\": \"\\u8868\\u5934\\u5355\\u5143\\u683c\",\n\"Column\": \"\\u5217\",\n\"Row group\": \"\\u884c\\u7ec4\",\n\"Cell\": \"\\u5355\\u5143\\u683c\",\n\"Middle\": \"\\u5782\\u76f4\\u5c45\\u4e2d\",\n\"Cell type\": \"\\u5355\\u5143\\u683c\\u7c7b\\u578b\",\n\"Copy row\": \"\\u590d\\u5236\\u884c\",\n\"Row properties\": \"\\u884c\\u5c5e\\u6027\",\n\"Table properties\": \"\\u8868\\u683c\\u5c5e\\u6027\",\n\"Bottom\": \"\\u5e95\\u90e8\\u5bf9\\u9f50\",\n\"V Align\": \"\\u5782\\u76f4\\u5bf9\\u9f50\",\n\"Header\": \"\\u8868\\u5934\",\n\"Right\": \"\\u53f3\\u5bf9\\u9f50\",\n\"Insert column after\": \"\\u5728\\u53f3\\u4fa7\\u63d2\\u5165\",\n\"Cols\": \"\\u5217\",\n\"Insert row after\": \"\\u5728\\u4e0b\\u65b9\\u63d2\\u5165\",\n\"Width\": \"\\u5bbd\",\n\"Cell properties\": \"\\u5355\\u5143\\u683c\\u5c5e\\u6027\",\n\"Left\": \"\\u5de6\\u5bf9\\u9f50\",\n\"Cut row\": \"\\u526a\\u5207\\u884c\",\n\"Delete column\": \"\\u5220\\u9664\\u5217\",\n\"Center\": \"\\u5c45\\u4e2d\",\n\"Merge cells\": \"\\u5408\\u5e76\\u5355\\u5143\\u683c\",\n\"Insert template\": \"\\u63d2\\u5165\\u6a21\\u677f\",\n\"Templates\": \"\\u6a21\\u677f\",\n\"Background color\": \"\\u80cc\\u666f\\u8272\",\n\"Custom...\": \"\\u81ea\\u5b9a\\u4e49...\",\n\"Custom color\": \"\\u81ea\\u5b9a\\u4e49\\u989c\\u8272\",\n\"No color\": \"\\u65e0\",\n\"Text color\": \"\\u6587\\u5b57\\u989c\\u8272\",\n\"Show blocks\": \"\\u663e\\u793a\\u533a\\u5757\\u8fb9\\u6846\",\n\"Show invisible characters\": \"\\u663e\\u793a\\u4e0d\\u53ef\\u89c1\\u5b57\\u7b26\",\n\"Words: {0}\": \"\\u5b57\\u6570\\uff1a{0}\",\n\"Insert\": \"\\u63d2\\u5165\",\n\"File\": \"\\u6587\\u4ef6\",\n\"Edit\": \"\\u7f16\\u8f91\",\n\"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help\": \"\\u5728\\u7f16\\u8f91\\u533a\\u6309ALT-F9\\u6253\\u5f00\\u83dc\\u5355\\uff0c\\u6309ALT-F10\\u6253\\u5f00\\u5de5\\u5177\\u680f\\uff0c\\u6309ALT-0\\u67e5\\u770b\\u5e2e\\u52a9\",\n\"Tools\": \"\\u5de5\\u5177\",\n\"View\": \"\\u89c6\\u56fe\",\n\"Table\": \"\\u8868\\u683c\",\n\"Format\": \"\\u683c\\u5f0f\"\n});"
  },
  {
    "path": "static/tinymce/js/tinymce/license.txt",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "static/tinymce/js/tinymce/plugins/codesample/css/prism.css",
    "content": "/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */\n/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\ttext-shadow: 0 1px white;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tdirection: ltr;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n\tcolor: #a67f59;\n\tbackground: hsla(0, 0%, 100%, .5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #07a;\n}\n\n.token.function {\n\tcolor: #DD4A68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n"
  },
  {
    "path": "static/tinymce/js/tinymce/plugins/example/dialog.html",
    "content": "<!DOCTYPE html>\n<html>\n<body>\n\t<h3>Custom dialog</h3>\n\tInput some text: <input id=\"content\">\n\t<button onclick=\"top.tinymce.activeEditor.windowManager.getWindows()[0].close();\">Close window</button>\n</body>\n</html>"
  },
  {
    "path": "static/tinymce/js/tinymce/plugins/visualblocks/css/visualblocks.css",
    "content": ".mce-visualblocks p {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);\n}\n\n.mce-visualblocks h1 {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);\n}\n\n.mce-visualblocks h2 {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);\n}\n\n.mce-visualblocks h3 {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);\n}\n\n.mce-visualblocks h4 {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);\n}\n\n.mce-visualblocks h5 {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);\n}\n\n.mce-visualblocks h6 {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);\n}\n\n.mce-visualblocks div {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);\n}\n\n.mce-visualblocks section {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);\n}\n\n.mce-visualblocks article {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);\n}\n\n.mce-visualblocks blockquote {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);\n}\n\n.mce-visualblocks address {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);\n}\n\n.mce-visualblocks pre {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin-left: 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);\n}\n\n.mce-visualblocks figure {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);\n}\n\n.mce-visualblocks hgroup {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);\n}\n\n.mce-visualblocks aside {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);\n}\n\n.mce-visualblocks figcaption {\n\tborder: 1px dashed #BBB;\n}\n\n.mce-visualblocks ul {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)\n}\n\n.mce-visualblocks ol {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);\n}\n\n.mce-visualblocks dl {\n\tpadding-top: 10px;\n\tborder: 1px dashed #BBB;\n\tmargin: 0 0 1em 3px;\n\tbackground: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);\n}\n"
  },
  {
    "path": "static/tinymce/js/tinymce/skins/myskin/Variables.less",
    "content": "// Variables\n// Syntax: <control>-(<sub control>)-<bg|border|text>-(<state>)-(<extra>);\n// Example: @btn-primary-bg-hover-hlight;\n\n@prefix:                         mce;\n\n// Default font\n@font-family:                    \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-size:                      14px;\n@line-height:                    20px;\n@has-gradients:                  true;\n@has-radius:                     true;\n@has-boxshadow:                  true;\n@has-button-borders:             true;\n\n// Text colors\n@text:                           #b5b9bf;\n@text-inverse:                   #000000;\n@text-disabled:                  #6e737a;\n@text-shadow:                    0 1px 1px hsla(hue(@text-inverse), saturation(@text-inverse), lightness(@text-inverse), 0.75);\n@text-error:                     #aa0000;\n\n// Button\n@btn-text:                       #b5b9bf;\n@btn-text-shadow:                #000000;\n@btn-border-top:                 rgba(32,42,51,1);\n@btn-border-right:               rgba(32,42,51,1);\n@btn-border-bottom:              rgba(32,42,51,1);\n@btn-border-left:                rgba(32,42,51,1);\n@btn-caret-border:               @btn-text;\n@btn-text-disabled:              @text-disabled;\n@btn-box-shadow:                 inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05);\n@btn-box-shadow-active:          inset 0 2px 4px rgba(0, 0, 0, .15), 0 1px 2px rgba(0, 0, 0, .05);\n@btn-box-disabled-opacity:       0.4;\n@btn-bg:                         #515c67;\n@btn-bg-hlight:                  #454f59;\n@btn-bg-hover:                   darken(@btn-bg, 5%);\n@btn-bg-hlight-hover:            darken(@btn-bg-hlight, 5%);\n@btn-border-hover:               darken(@btn-bg, 20%);\n@btn-border-active:              darken(@btn-bg, 20%);\n@btn-padding:                    4px 10px;\n\n@btn-primary-bg:                 #006fa6;\n@btn-primary-bg-hlight:          #005580;\n@btn-primary-bg-hover:           darken(@btn-primary-bg, 5%);\n@btn-primary-bg-hover-hlight:    darken(@btn-primary-bg-hlight, 5%);\n@btn-primary-text:               #ffffff;\n@btn-primary-text-shadow:        #333333;\n@btn-primary-border-top:         mix(@btn-border-top, @btn-primary-bg, 50%);\n@btn-primary-border-right:       mix(@btn-border-right, @btn-primary-bg, 50%);\n@btn-primary-border-bottom:      mix(@btn-border-bottom, @btn-primary-bg, 50%);\n@btn-primary-border-left:        mix(@btn-border-left, @btn-primary-bg, 50%);\n@btn-primary-border:             transparent;\n@btn-primary-border-hover:       transparent;\n\n// Button group\n@btn-group-border-width:         1px;\n\n// Menu\n@menuitem-text:                  #dddddd;\n@menu-bg:                        #2f3740;\n@menu-margin:                    -1px 0 0;\n@menu-border:                    #202a33;\n@menubar-border:                 mix(@panel-border, @panel-bg, 60%);\n@menuitem-text-inverse:          #ffffff;\n@menubar-bg-active:              darken(@btn-bg, 10%);\n@menuitem-bg-hover:              #0081C2;\n@menuitem-bg-selected:           #006fa6;\n@menuitem-bg-selected-hlight:    #005580;\n@menuitem-bg-disabled:           #CCC;\n@menuitem-caret:                 @menuitem-text;\n@menuitem-caret-selected:        @menuitem-text-inverse;\n@menuitem-separator-top:         #25313f;\n@menuitem-separator-bottom:      #424f5f;\n@menuitem-bg-active:             #0085c7;\n@menuitem-text-active:           #ffffff;\n@menuitem-preview-border-active: #08608c;\n@menubar-menubtn-text:           #b5b9bf;\n\n// Panel\n@panel-border:                   #232b33;\n@panel-bg:                       #404952;\n@panel-bg-hlight:                #404952;\n\n// Tabs\n@tab-border:                     #202a33;\n@tab-bg:                         #303942;\n@tab-bg-hover:                   #404952;\n@tab-bg-active:                  #404952;\n@tabs-bg:\t\t\t\t\t\t #303942;\n\n// Tooltip\n@tooltip-bg:                     #000;\n@tooltip-text:                   white;\n@tooltip-font-size:              11px;\n\n// Notification\n@notification-font-size:         14px;\n@notification-bg:                #f0f0f0;\n@notification-border:            #cccccc;\n@notification-text:              #333333;\n@notification-success-bg:        #dff0d8;\n@notification-success-border:    #d6e9c6;\n@notification-success-text:      #3c763d;\n@notification-info-bg:           #d9edf7;\n@notification-info-border:       #779ecb;\n@notification-info-text:         #31708f;\n@notification-warning-bg:        #fcf8e3;\n@notification-warning-border:    #faebcc;\n@notification-warning-text:      #8a6d3b;\n@notification-error-bg:          #f2dede;\n@notification-error-border:      #ebccd1;\n@notification-error-text:        #a94442;\n\n// Window\n@window-border:                  #9e9e9e;\n@window-head-border:             @window-border;\n@window-head-close:              mix(@text, @window-bg, 60%);\n@window-head-close-hover:        mix(@text, @window-bg, 40%);\n@window-foot-border:             @window-border;\n@window-foot-bg:                 @window-bg;\n@window-fullscreen-bg:           #FFF;\n@window-modalblock-bg:           #000;\n@window-modalblock-opacity:      0.3;\n@window-box-shadow:              0 3px 7px rgba(0, 0, 0, 0.3);\n@window-bg:                      #404952;\n@window-title-font-size:         20px;\n\n// Popover\n@popover-bg:                     @window-bg;\n@popover-arrow-width:            10px;\n@popover-arrow:                  @window-bg;\n@popover-arrow-outer-width:      @popover-arrow-width + 1;\n@popover-arrow-outer:            rgba(0, 0, 0, 0.25);\n\n// Floatpanel\n@floatpanel-box-shadow:          0 5px 10px rgba(0, 0, 0, .2);\n\n// Checkbox\n@checkbox-bg:                    @btn-bg;\n@checkbox-bg-hlight:             @btn-bg-hlight;\n@checkbox-box-shadow:            inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05);\n@checkbox-border:                #202a33;\n@checkbox-border-focus:          #1e7dad;\n\n// Path\n@path-text:                      @text;\n@path-bg-focus:                  #666;\n@path-text-focus:                #fff;\n\n// Textbox\n@textbox-text-placeholder:       #aaa;\n@textbox-box-shadow:             inset 0 1px 1px rgba(0, 0, 0, 0.075);\n@textbox-bg:                     #515c67;\n@textbox-border:                 #202a33;\n@textbox-border-focus:           #1e7dad;\n\n// Selectbox\n@selectbox-bg:                   @textbox-bg;\n@selectbox-border:               @textbox-border;\n\n// Throbber\n@throbber-bg:                    #fff url('img/loader.gif') no-repeat center center;\n\n// Combobox\n@combobox-border:                @textbox-border;\n\n// Colorpicker\n@colorpicker-border:             @textbox-border;\n@colorpicker-hue-bg:             #fff;\n@colorpicker-hue-border:         #333;\n\n// Grid\n@grid-bg-active:                 @menuitem-bg-active;\n@grid-border-active:             #d6d6d6;\n@grid-border:                    #d6d6d6;\n\n// Misc\n@colorbtn-backcolor-bg:          #384552;\n@iframe-border:                  @panel-border;\n\n// Slider\n@slider-border:                  #202a33;\n@slider-bg:                      #515c67;\n@slider-handle-border:           #000000;\n@slider-handle-bg:               #454f59;\n\n// Progress\n@progress-border:                #202a33;\n@progress-bar-bg:                #515c67;\n@progress-bar-bg-hlight:         #515c67;\n@progress-text:                  #c4c4c4;\n@progress-text-shadow:           #000000;\n\n// Flow layout\n@flow-layout-spacing:            2px;\n"
  },
  {
    "path": "static/tinymce/js/tinymce/skins/myskin/fonts/readme.md",
    "content": "Icons are generated and provided by the http://icomoon.io service.\n"
  },
  {
    "path": "static/tinymce/js/tinymce/skins/myskin/fonts/tinymce-small.json",
    "content": "{\n\t\"IcoMoonType\": \"selection\",\n\t\"icons\": [\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M704 832v-37.004c151.348-61.628 256-193.82 256-346.996 0-212.078-200.576-384-448-384s-448 171.922-448 384c0 153.176 104.654 285.368 256 346.996v37.004h-192l-64-96v224h320v-222.812c-100.9-51.362-170.666-161.54-170.666-289.188 0-176.732 133.718-320 298.666-320 164.948 0 298.666 143.268 298.666 320 0 127.648-69.766 237.826-170.666 289.188v222.812h320v-224l-64 96h-192z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57376,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 0,\n\t\t\t\t\"order\": 1,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57376,\n\t\t\t\t\"name\": \"charmap\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 0\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M256 64v896l256-256 256 256v-896h-512zM704 789.49l-192-192-192 192v-661.49h384v661.49z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57363,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 1,\n\t\t\t\t\"order\": 2,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57363,\n\t\t\t\t\"name\": \"bookmark\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 1\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M927.274 230.216l-133.49-133.488c-21.104-21.104-49.232-32.728-79.198-32.728s-58.094 11.624-79.196 32.726l-165.492 165.49c-43.668 43.668-43.668 114.724 0 158.392l2.746 2.746 67.882-67.882-2.746-2.746c-6.132-6.132-6.132-16.494 0-22.626l165.492-165.492c4.010-4.008 8.808-4.608 11.312-4.608s7.302 0.598 11.312 4.61l133.49 133.488c6.132 6.134 6.132 16.498 0.002 22.628l-165.494 165.494c-4.008 4.008-8.806 4.608-11.31 4.608s-7.302-0.6-11.312-4.612l-2.746-2.746-67.88 67.884 2.742 2.742c21.106 21.108 49.23 32.728 79.2 32.728s58.094-11.624 79.196-32.726l165.494-165.492c43.662-43.666 43.662-114.72-0.004-158.39zM551.356 600.644l-67.882 67.882 2.746 2.746c4.008 4.008 4.61 8.806 4.61 11.31 0 2.506-0.598 7.302-4.606 11.314l-165.494 165.49c-4.010 4.010-8.81 4.61-11.314 4.61s-7.304-0.6-11.314-4.61l-133.492-133.486c-4.010-4.010-4.61-8.81-4.61-11.314s0.598-7.3 4.61-11.312l165.49-165.488c4.010-4.012 8.81-4.612 11.314-4.612s7.304 0.6 11.314 4.612l2.746 2.742 67.882-67.88-2.746-2.746c-21.104-21.104-49.23-32.726-79.196-32.726s-58.092 11.624-79.196 32.726l-165.488 165.486c-21.106 21.104-32.73 49.234-32.73 79.198s11.624 58.094 32.726 79.198l133.49 133.49c21.106 21.102 49.232 32.726 79.198 32.726s58.092-11.624 79.196-32.726l165.494-165.492c21.104-21.104 32.722-49.23 32.722-79.196s-11.624-58.094-32.726-79.196l-2.744-2.746zM800 838c-9.724 0-19.45-3.708-26.87-11.13l-128-127.998c-14.844-14.84-14.844-38.898 0-53.738 14.84-14.844 38.896-14.844 53.736 0l128 128c14.844 14.84 14.844 38.896 0 53.736-7.416 7.422-17.142 11.13-26.866 11.13zM608 960c-17.674 0-32-14.326-32-32v-128c0-17.674 14.326-32 32-32s32 14.326 32 32v128c0 17.674-14.326 32-32 32zM928 640h-128c-17.674 0-32-14.326-32-32s14.326-32 32-32h128c17.674 0 32 14.326 32 32s-14.326 32-32 32zM224 186c9.724 0 19.45 3.708 26.87 11.13l128 128c14.842 14.84 14.842 38.898 0 53.738-14.84 14.844-38.898 14.844-53.738 0l-128-128c-14.842-14.84-14.842-38.898 0-53.738 7.418-7.422 17.144-11.13 26.868-11.13zM416 64c17.674 0 32 14.326 32 32v128c0 17.674-14.326 32-32 32s-32-14.326-32-32v-128c0-17.674 14.326-32 32-32zM96 384h128c17.674 0 32 14.326 32 32s-14.326 32-32 32h-128c-17.674 0-32-14.326-32-32s14.326-32 32-32z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57362,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 2,\n\t\t\t\t\"order\": 3,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57362,\n\t\t\t\t\"name\": \"link\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 2\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M927.274 230.216l-133.49-133.488c-21.104-21.104-49.232-32.728-79.198-32.728s-58.094 11.624-79.196 32.726l-165.492 165.49c-43.668 43.668-43.668 114.724 0 158.392l2.746 2.746 67.882-67.882-2.746-2.746c-6.132-6.132-6.132-16.494 0-22.626l165.492-165.492c4.010-4.008 8.808-4.608 11.312-4.608s7.302 0.598 11.312 4.61l133.49 133.488c6.132 6.134 6.132 16.498 0.002 22.628l-165.494 165.494c-4.008 4.008-8.806 4.608-11.31 4.608s-7.302-0.6-11.312-4.612l-2.746-2.746-67.88 67.884 2.742 2.742c21.106 21.108 49.23 32.728 79.2 32.728s58.094-11.624 79.196-32.726l165.494-165.492c43.662-43.666 43.662-114.72-0.004-158.39zM551.356 600.644l-67.882 67.882 2.746 2.746c4.008 4.008 4.61 8.806 4.61 11.31 0 2.506-0.598 7.302-4.606 11.314l-165.494 165.49c-4.010 4.010-8.81 4.61-11.314 4.61s-7.304-0.6-11.314-4.61l-133.492-133.486c-4.010-4.010-4.61-8.81-4.61-11.314s0.598-7.3 4.61-11.312l165.49-165.488c4.010-4.012 8.81-4.612 11.314-4.612s7.304 0.6 11.314 4.612l2.746 2.742 67.882-67.88-2.746-2.746c-21.104-21.104-49.23-32.726-79.196-32.726s-58.092 11.624-79.196 32.726l-165.488 165.486c-21.106 21.104-32.73 49.234-32.73 79.198s11.624 58.094 32.726 79.198l133.49 133.49c21.106 21.102 49.232 32.726 79.198 32.726s58.092-11.624 79.196-32.726l165.494-165.492c21.104-21.104 32.722-49.23 32.722-79.196s-11.624-58.094-32.726-79.196l-2.744-2.746zM352 710c-9.724 0-19.45-3.71-26.87-11.128-14.84-14.84-14.84-38.898 0-53.738l320-320c14.84-14.84 38.896-14.84 53.736 0 14.844 14.84 14.844 38.9 0 53.74l-320 320c-7.416 7.416-17.142 11.126-26.866 11.126z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57361,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 3,\n\t\t\t\t\"order\": 4,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57361,\n\t\t\t\t\"name\": \"unlink\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 3\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M576 281.326v-217.326l336.002 336-336.002 336v-222.096c-390.906-9.17-315 247.096-256 446.096-288-320-212.092-690.874 256-678.674z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57360,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 4,\n\t\t\t\t\"order\": 5,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57360,\n\t\t\t\t\"name\": \"redo\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 4\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M704 960c59-199 134.906-455.266-256-446.096v222.096l-336.002-336 336.002-336v217.326c468.092-12.2 544 358.674 256 678.674z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57359,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 5,\n\t\t\t\t\"order\": 6,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57359,\n\t\t\t\t\"name\": \"undo\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 5\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M256.428 424.726c105.8 0 191.572 91.17 191.572 203.638 0 112.464-85.772 203.636-191.572 203.636-105.802 0-191.572-91.17-191.572-203.636l-0.856-29.092c0-224.93 171.54-407.272 383.144-407.272v116.364c-73.1 0-141.826 30.26-193.516 85.204-9.954 10.578-19.034 21.834-27.224 33.656 9.784-1.64 19.806-2.498 30.024-2.498zM768.428 424.726c105.8 0 191.572 91.17 191.572 203.638 0 112.464-85.772 203.636-191.572 203.636-105.802 0-191.572-91.17-191.572-203.636l-0.856-29.092c0-224.93 171.54-407.272 383.144-407.272v116.364c-73.1 0-141.826 30.26-193.516 85.204-9.956 10.578-19.036 21.834-27.224 33.656 9.784-1.64 19.806-2.498 30.024-2.498z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57358,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 6,\n\t\t\t\t\"order\": 7,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57358,\n\t\t\t\t\"name\": \"blockquote\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 6\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192h896v128h-896zM384 576h576v128h-576zM384 384h576v128h-576zM64 768h896v128h-896zM64 384l224 160-224 160z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57356,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 7,\n\t\t\t\t\"order\": 8,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57356,\n\t\t\t\t\"name\": \"indent\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 7\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192h896v128h-896zM64 576h576v128h-576zM64 384h576v128h-576zM64 768h896v128h-896zM960 384l-224 160 224 160z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57357,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 8,\n\t\t\t\t\"order\": 9,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57357,\n\t\t\t\t\"name\": \"outdent\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 8\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M384 128h576v128h-576zM384 448h576v128h-576zM384 768h576v128h-576zM320 530v-146h-64v-320h-128v64h64v256h-64v64h128v50l-128 60v146h128v64h-128v64h128v64h-128v64h192v-320h-128v-50z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57355,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 9,\n\t\t\t\t\"order\": 10,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57355,\n\t\t\t\t\"name\": \"numlist\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 9\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M384 128h576v128h-576zM384 448h576v128h-576zM384 768h576v128h-576zM128 192c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM128 512c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM128 832c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57354,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 10,\n\t\t\t\t\"order\": 11,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57354,\n\t\t\t\t\"name\": \"bullist\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 10\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M888 384h-56v-256h64v-64h-320v64h64v256h-256v-256h64v-64h-320v64h64v256h-56c-39.6 0-72 32.4-72 72v432c0 39.6 32.4 72 72 72h240c39.6 0 72-32.4 72-72v-312h128v312c0 39.6 32.4 72 72 72h240c39.6 0 72-32.4 72-72v-432c0-39.6-32.4-72-72-72zM348 896h-184c-19.8 0-36-14.4-36-32s16.2-32 36-32h184c19.8 0 36 14.4 36 32s-16.2 32-36 32zM544 512h-64c-17.6 0-32-14.4-32-32s14.4-32 32-32h64c17.6 0 32 14.4 32 32s-14.4 32-32 32zM860 896h-184c-19.8 0-36-14.4-36-32s16.2-32 36-32h184c19.8 0 36 14.4 36 32s-16.2 32-36 32z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57353,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 11,\n\t\t\t\t\"order\": 12,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57353,\n\t\t\t\t\"name\": \"searchreplace\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 11\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M704 384v-160c0-17.6-14.4-32-32-32h-160v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-160c-17.602 0-32 14.4-32 32v512c0 17.6 14.398 32 32 32h224v192h384l192-192v-384h-192zM320 128.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 320v-64h384v64h-384zM704 869.49v-101.49h101.49l-101.49 101.49zM832 704h-192v192h-256v-448h448v256z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57352,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 12,\n\t\t\t\t\"order\": 13,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57352,\n\t\t\t\t\"name\": \"paste\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 12\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M832 320h-192v-64l-192-192h-384v704h384v192h576v-448l-192-192zM832 410.51l101.49 101.49h-101.49v-101.49zM448 154.51l101.49 101.49h-101.49v-101.49zM128 128h256v192h192v384h-448v-576zM960 896h-448v-128h128v-384h128v192h192v320z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57393,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 13,\n\t\t\t\t\"order\": 14,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57393,\n\t\t\t\t\"name\": \"copy\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 13\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M960 512h-265.876c-50.078-35.42-114.43-54.86-182.124-54.86-89.206 0-164.572-50.242-164.572-109.712 0-59.47 75.366-109.714 164.572-109.714 75.058 0 140.308 35.576 159.12 82.286h113.016c-7.93-50.644-37.58-97.968-84.058-132.826-50.88-38.16-117.676-59.174-188.078-59.174-70.404 0-137.196 21.014-188.074 59.174-54.788 41.090-86.212 99.502-86.212 160.254s31.424 119.164 86.212 160.254c1.956 1.466 3.942 2.898 5.946 4.316h-265.872v64h512.532c58.208 17.106 100.042 56.27 100.042 100.572 0 59.468-75.368 109.71-164.572 109.71-75.060 0-140.308-35.574-159.118-82.286h-113.016c7.93 50.64 37.582 97.968 84.060 132.826 50.876 38.164 117.668 59.18 188.072 59.18 70.402 0 137.198-21.016 188.074-59.174 54.79-41.090 86.208-99.502 86.208-160.254 0-35.298-10.654-69.792-30.294-100.572h204.012v-64z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57389,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 19,\n\t\t\t\t\"order\": 15,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57389,\n\t\t\t\t\"name\": \"strikethrough\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 14\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M192 832h576v64h-576v-64zM640 128v384c0 31.312-14.7 61.624-41.39 85.352-30.942 27.502-73.068 42.648-118.61 42.648-45.544 0-87.668-15.146-118.608-42.648-26.692-23.728-41.392-54.040-41.392-85.352v-384h-128v384c0 141.382 128.942 256 288 256s288-114.618 288-256v-384h-128z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57388,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 20,\n\t\t\t\t\"order\": 16,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57388,\n\t\t\t\t\"name\": \"underline\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 15\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M832 128v64h-144l-256 640h144v64h-448v-64h144l256-640h-144v-64h448z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57387,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 21,\n\t\t\t\t\"order\": 17,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57387,\n\t\t\t\t\"name\": \"italic\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 16\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M625.442 494.182c48.074-38.15 78.558-94.856 78.558-158.182 0-114.876-100.29-208-224-208h-224v768h288c123.712 0 224-93.124 224-208 0-88.196-59.118-163.562-142.558-193.818zM384 304c0-26.51 21.49-48 48-48h67.204c42.414 0 76.796 42.98 76.796 96s-34.382 96-76.796 96h-115.204v-144zM547.2 768h-115.2c-26.51 0-48-21.49-48-48v-144h163.2c42.418 0 76.8 42.98 76.8 96s-34.382 96-76.8 96z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57386,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 22,\n\t\t\t\t\"order\": 18,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57386,\n\t\t\t\t\"name\": \"bold\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 17\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M850.746 242.746l-133.492-133.49c-24.888-24.892-74.054-45.256-109.254-45.256h-416c-35.2 0-64 28.8-64 64v768c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64v-544c0-35.2-20.366-84.364-45.254-109.254zM805.49 287.998c6.792 6.796 13.792 19.162 18.894 32.002h-184.384v-184.386c12.84 5.1 25.204 12.1 32 18.896l133.49 133.488zM831.884 896h-639.77c-0.040-0.034-0.082-0.076-0.114-0.116v-767.77c0.034-0.040 0.076-0.082 0.114-0.114h383.886v256h256v511.884c-0.034 0.040-0.076 0.082-0.116 0.116z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57345,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 23,\n\t\t\t\t\"order\": 19,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57345,\n\t\t\t\t\"name\": \"newdocument\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 18\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M960 880v-591.938l-223.938-224.062h-592.062c-44.182 0-80 35.816-80 80v736c0 44.184 35.818 80 80 80h736c44.184 0 80-35.816 80-80zM576 192h64v192h-64v-192zM704 832h-384v-255.882c0.034-0.042 0.076-0.082 0.116-0.118h383.77c0.040 0.036 0.082 0.076 0.116 0.118l-0.002 255.882zM832 832h-64v-256c0-35.2-28.8-64-64-64h-384c-35.2 0-64 28.8-64 64v256h-64v-640h64v192c0 35.2 28.8 64 64 64h320c35.2 0 64-28.8 64-64v-171.010l128 128.072v490.938z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57344,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 24,\n\t\t\t\t\"order\": 20,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57344,\n\t\t\t\t\"name\": \"save\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 19\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192v704h896v-704h-896zM384 640v-128h256v128h-256zM640 704v128h-256v-128h256zM640 320v128h-256v-128h256zM320 320v128h-192v-128h192zM128 512h192v128h-192v-128zM704 512h192v128h-192v-128zM704 448v-128h192v128h-192zM128 704h192v128h-192v-128zM704 832v-128h192v128h-192z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57371,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 25,\n\t\t\t\t\"order\": 21,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57371,\n\t\t\t\t\"name\": \"table\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 20\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 140c99.366 0 192.782 38.694 263.042 108.956s108.958 163.678 108.958 263.044-38.696 192.782-108.958 263.042-163.676 108.958-263.042 108.958-192.782-38.696-263.044-108.958-108.956-163.676-108.956-263.042 38.694-192.782 108.956-263.044 163.678-108.956 263.044-108.956zM512 64c-247.424 0-448 200.576-448 448s200.576 448 448 448 448-200.576 448-448-200.576-448-448-448v0zM320 384c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM576 384c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM512 656c-101.84 0-192.56-36.874-251.166-94.328 23.126 117.608 126.778 206.328 251.166 206.328 124.388 0 228.040-88.72 251.168-206.328-58.608 57.454-149.328 94.328-251.168 94.328z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57377,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 26,\n\t\t\t\t\"order\": 22,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57377,\n\t\t\t\t\"name\": \"emoticons\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 21\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M480 384l-192-192 128-128h-352v352l128-128 192 192zM640 480l192-192 128 128v-352h-352l128 128-192 192zM544 640l192 192-128 128h352v-352l-128 128-192-192zM384 544l-192 192-128-128v352h352l-128-128 192-192z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57379,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 27,\n\t\t\t\t\"order\": 23,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57379,\n\t\t\t\t\"name\": \"fullscreen\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 22\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 448h896v128h-896z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57372,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 28,\n\t\t\t\t\"order\": 24,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57372,\n\t\t\t\t\"name\": \"hr\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 23\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 768h512v128h-512v-128zM768 192h-220.558l-183.766 512h-132.288l183.762-512h-223.15v-128h576v128zM929.774 896l-129.774-129.774-129.774 129.774-62.226-62.226 129.774-129.774-129.774-129.774 62.226-62.226 129.774 129.774 129.774-129.774 62.226 62.226-129.774 129.774 129.774 129.774-62.226 62.226z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57373,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 29,\n\t\t\t\t\"order\": 25,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57373,\n\t\t\t\t\"name\": \"removefromat\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 24\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M256 128h512v128h-512v-128zM896 320h-768c-35.2 0-64 28.8-64 64v256c0 35.2 28.796 64 64 64h128v192h512v-192h128c35.2 0 64-28.8 64-64v-256c0-35.2-28.8-64-64-64zM704 832h-384v-256h384v256zM910.4 416c0 25.626-20.774 46.4-46.398 46.4s-46.402-20.774-46.402-46.4 20.778-46.4 46.402-46.4c25.626 0 46.398 20.774 46.398 46.4z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57378,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 30,\n\t\t\t\t\"order\": 26,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57378,\n\t\t\t\t\"name\": \"print\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 25\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M384 128c-123.712 0-224 100.288-224 224s100.288 224 224 224v320h128v-640h64v640h128v-640h128v-128h-448z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57390,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 31,\n\t\t\t\t\"order\": 27,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57390,\n\t\t\t\t\"name\": \"visualchars\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 26\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M448 128c-123.712 0-224 100.288-224 224s100.288 224 224 224v320h128v-640h64v640h128v-640h128v-128h-448zM64 896l224-192-224-192z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57391,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 32,\n\t\t\t\t\"order\": 28,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57391,\n\t\t\t\t\"name\": \"ltr\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 27\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M416 704l-192-192 192-192-64-64-256 256 256 256zM672 256l-64 64 192 192-192 192 64 64 256-256z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57367,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 38,\n\t\t\t\t\"order\": 29,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57367,\n\t\t\t\t\"name\": \"code\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 28\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M448 704h128v128h-128v-128zM704 256c35.346 0 64 28.654 64 64v166l-228 154h-92v-64l192-128v-64h-320v-128h384zM512 64c-119.666 0-232.166 46.6-316.784 131.216-84.614 84.618-131.216 197.118-131.216 316.784 0 119.664 46.602 232.168 131.216 316.784 84.618 84.616 197.118 131.216 316.784 131.216 119.664 0 232.168-46.6 316.784-131.216 84.616-84.616 131.216-197.12 131.216-316.784 0-119.666-46.6-232.166-131.216-316.784-84.616-84.616-197.12-131.216-316.784-131.216z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57366,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 39,\n\t\t\t\t\"order\": 30,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57366,\n\t\t\t\t\"name\": \"help\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 29\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 128h-768c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64v-640c0-35.2-28.8-64-64-64zM896 831.884c-0.012 0.014-0.030 0.028-0.042 0.042l-191.958-319.926-160 128-224-288-191.968 479.916c-0.010-0.010-0.022-0.022-0.032-0.032v-639.77c0.034-0.040 0.076-0.082 0.114-0.114h767.77c0.040 0.034 0.082 0.076 0.116 0.116v639.768zM640 352c0 53.019 42.981 96 96 96s96-42.981 96-96c0-53.019-42.981-96-96-96-53.019 0-96 42.981-96 96z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57364,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 40,\n\t\t\t\t\"order\": 31,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57364,\n\t\t\t\t\"name\": \"image\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 30\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 128h-768c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64v-640c0-35.2-28.8-64-64-64zM256 832h-128v-128h128v128zM256 576h-128v-128h128v128zM256 320h-128v-128h128v128zM704 832h-384v-640h384v640zM896 832h-128v-128h128v128zM896 576h-128v-128h128v128zM896 320h-128v-128h128v128zM384 320v384l288-192z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57365,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 41,\n\t\t\t\t\"order\": 32,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57365,\n\t\t\t\t\"name\": \"media\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 31\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M77.798 304.624l81.414 50.882c50.802-81.114 128.788-143.454 221.208-174.246l-30.366-91.094c-113.748 37.898-209.728 114.626-272.256 214.458zM673.946 90.166l-30.366 91.094c92.422 30.792 170.404 93.132 221.208 174.248l81.412-50.882c-62.526-99.834-158.506-176.562-272.254-214.46zM607.974 704.008c-4.808 0-9.692-1.090-14.286-3.386l-145.688-72.844v-211.778c0-17.672 14.328-32 32-32s32 14.328 32 32v172.222l110.31 55.156c15.806 7.902 22.214 27.124 14.31 42.932-5.604 11.214-16.908 17.696-28.646 17.698zM512 192c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384 0-212.078-171.922-384-384-384zM512 864c-159.058 0-288-128.942-288-288s128.942-288 288-288c159.058 0 288 128.942 288 288 0 159.058-128.942 288-288 288z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57368,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 42,\n\t\t\t\t\"order\": 33,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57368,\n\t\t\t\t\"name\": \"insertdatetime\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 32\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 455.746c45.318-49.92 97.162-92.36 153.272-125.124 90.332-52.744 192.246-80.622 294.728-80.622 102.48 0 204.396 27.878 294.726 80.624 56.112 32.764 107.956 75.204 153.274 125.124v-117.432c-33.010-28.118-68.124-53.14-104.868-74.594-105.006-61.314-223.658-93.722-343.132-93.722s-238.128 32.408-343.134 93.72c-36.742 21.454-71.856 46.478-104.866 74.596v117.43zM512 320c-183.196 0-345.838 100.556-448 256 102.162 155.448 264.804 256 448 256 183.196 0 345.838-100.552 448-256-102.162-155.444-264.804-256-448-256zM512 512c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.348 28.654-64 64-64s64 28.652 64 64zM728.066 696.662c-67.434 39.374-140.128 59.338-216.066 59.338s-148.632-19.964-216.066-59.338c-51.554-30.104-98.616-71.31-138.114-120.662 39.498-49.35 86.56-90.558 138.116-120.66 13.276-7.752 26.758-14.74 40.426-20.982-10.512 23.742-16.362 50.008-16.362 77.642 0 106.040 85.962 192 192 192 106.040 0 192-85.96 192-192 0-27.634-5.85-53.9-16.36-77.642 13.668 6.244 27.15 13.23 40.426 20.982 51.554 30.102 98.616 71.31 138.116 120.66-39.498 49.352-86.56 90.558-138.116 120.662z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57369,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 43,\n\t\t\t\t\"order\": 34,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57369,\n\t\t\t\t\"name\": \"preview\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 33\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M651.168 283.834c-24.612-81.962-28.876-91.834-107.168-91.834h-64c-79.618 0-82.664 10.152-108.418 96 0 0.002 0 0.002-0.002 0.004l-143.998 479.996h113.636l57.6-192h226.366l57.6 192h113.63l-145.246-484.166zM437.218 448l38.4-136c10.086-33.618 36.38-30 36.38-30s26.294-3.618 36.38 30h0.004l38.4 136h-149.564z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57370,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 44,\n\t\t\t\t\"order\": 35,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57370,\n\t\t\t\t\"name\": \"forecolor\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 34\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M576 64c247.424 0 448 200.576 448 448s-200.576 448-448 448v-96c94.024 0 182.418-36.614 248.902-103.098 66.484-66.484 103.098-154.878 103.098-248.902 0-94.022-36.614-182.418-103.098-248.902-66.484-66.484-154.878-103.098-248.902-103.098-94.022 0-182.418 36.614-248.902 103.098-51.14 51.138-84.582 115.246-97.306 184.902h186.208l-224 256-224-256h164.57c31.060-217.102 217.738-384 443.43-384zM768 448v128h-256v-320h128v192z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57384,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 45,\n\t\t\t\t\"order\": 36,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57384,\n\t\t\t\t\"name\": \"restoredraft\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 35\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M1024 592.458v-160.916l-159.144-15.914c-8.186-30.042-20.088-58.548-35.21-84.98l104.596-127.838-113.052-113.050-127.836 104.596c-26.434-15.124-54.942-27.026-84.982-35.208l-15.914-159.148h-160.916l-15.914 159.146c-30.042 8.186-58.548 20.086-84.98 35.208l-127.838-104.594-113.050 113.050 104.596 127.836c-15.124 26.432-27.026 54.94-35.21 84.98l-159.146 15.916v160.916l159.146 15.914c8.186 30.042 20.086 58.548 35.21 84.982l-104.596 127.836 113.048 113.048 127.838-104.596c26.432 15.124 54.94 27.028 84.98 35.21l15.916 159.148h160.916l15.914-159.144c30.042-8.186 58.548-20.088 84.982-35.21l127.836 104.596 113.048-113.048-104.596-127.836c15.124-26.434 27.028-54.942 35.21-84.98l159.148-15.92zM704 576l-128 128h-128l-128-128v-128l128-128h128l128 128v128z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57346,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 46,\n\t\t\t\t\"order\": 37,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57346,\n\t\t\t\t\"name\": \"fullpage\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 36\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M768 206v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57375,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 47,\n\t\t\t\t\"order\": 38,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57375,\n\t\t\t\t\"name\": \"superscript\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 37\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M768 910v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57374,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 48,\n\t\t\t\t\"order\": 39,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57374,\n\t\t\t\t\"name\": \"subscript\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 38\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M704 384v-160c0-17.6-14.4-32-32-32h-160v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-160c-17.602 0-32 14.4-32 32v512c0 17.6 14.398 32 32 32h224v192h576v-576h-192zM320 128.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 320v-64h384v64h-384zM832 896h-448v-448h448v448zM448 512v128h32l32-64h64v192h-48v64h160v-64h-48v-192h64l32 64h32v-128z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"pastetext\"\n\t\t\t\t],\n\t\t\t\t\"defaultCode\": 57397,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 49,\n\t\t\t\t\"order\": 40,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57397,\n\t\t\t\t\"name\": \"pastetext\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 39\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M768 256h64v64h-64zM640 384h64v64h-64zM640 512h64v64h-64zM640 640h64v64h-64zM512 512h64v64h-64zM512 640h64v64h-64zM384 640h64v64h-64zM768 384h64v64h-64zM768 512h64v64h-64zM768 640h64v64h-64zM768 768h64v64h-64zM640 768h64v64h-64zM512 768h64v64h-64zM384 768h64v64h-64zM256 768h64v64h-64z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"resize\",\n\t\t\t\t\t\"dots\"\n\t\t\t\t],\n\t\t\t\t\"defaultCode\": 57394,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 50,\n\t\t\t\t\"order\": 41,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57394,\n\t\t\t\t\"name\": \"resize\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 40\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M928 128h-416l-32-64h-352l-64 128h896zM840.34 704h87.66l32-448h-896l64 640h356.080c-104.882-37.776-180.080-138.266-180.080-256 0-149.982 122.018-272 272-272 149.98 0 272 122.018 272 272 0 21.678-2.622 43.15-7.66 64zM874.996 849.75l-134.496-110.692c17.454-28.922 27.5-62.814 27.5-99.058 0-106.040-85.96-192-192-192s-192 85.96-192 192 85.96 192 192 192c36.244 0 70.138-10.046 99.058-27.5l110.692 134.496c22.962 26.678 62.118 28.14 87.006 3.252l5.492-5.492c24.888-24.888 23.426-64.044-3.252-87.006zM576 764c-68.484 0-124-55.516-124-124s55.516-124 124-124 124 55.516 124 124-55.516 124-124 124z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"browse\"\n\t\t\t\t],\n\t\t\t\t\"defaultCode\": 57396,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 51,\n\t\t\t\t\"order\": 42,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57396,\n\t\t\t\t\"name\": \"browse\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 41\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M864.408 670.132c-46.47-46.47-106.938-68.004-161.082-62.806l-63.326-63.326 192-192c0 0 128-128 0-256l-320 320-320-320c-128 128 0 256 0 256l192 192-63.326 63.326c-54.144-5.198-114.61 16.338-161.080 62.806-74.98 74.98-85.112 186.418-22.626 248.9 62.482 62.482 173.92 52.354 248.9-22.626 46.47-46.468 68.002-106.938 62.806-161.080l63.326-63.326 63.328 63.328c-5.196 54.144 16.336 114.61 62.806 161.078 74.978 74.98 186.418 85.112 248.898 22.626 62.488-62.482 52.356-173.918-22.624-248.9zM353.124 758.578c-2.212 24.332-15.020 49.826-35.14 69.946-22.212 22.214-51.080 35.476-77.218 35.476-10.524 0-25.298-2.228-35.916-12.848-21.406-21.404-17.376-73.132 22.626-113.136 22.212-22.214 51.080-35.476 77.218-35.476 10.524 0 25.298 2.228 35.916 12.848 13.112 13.11 13.47 32.688 12.514 43.19zM512 608c-35.346 0-64-28.654-64-64s28.654-64 64-64 64 28.654 64 64-28.654 64-64 64zM819.152 851.152c-10.62 10.62-25.392 12.848-35.916 12.848-26.138 0-55.006-13.262-77.218-35.476-20.122-20.12-32.928-45.614-35.138-69.946-0.958-10.502-0.6-30.080 12.514-43.192 10.618-10.622 25.39-12.848 35.916-12.848 26.136 0 55.006 13.262 77.216 35.474 40.004 40.008 44.032 91.736 22.626 113.14z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57351,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 14,\n\t\t\t\t\"order\": 43,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57351,\n\t\t\t\t\"name\": \"cut\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 42\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192h896v128h-896zM64 576h896v128h-896zM64 384h896v128h-896zM64 768h896v128h-896z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57350,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 15,\n\t\t\t\t\"order\": 44,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57350,\n\t\t\t\t\"name\": \"alignjustify\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 43\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192h896v128h-896zM64 576h896v128h-896zM256 384h512v128h-512zM256 768h512v128h-512z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57348,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 16,\n\t\t\t\t\"order\": 45,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57348,\n\t\t\t\t\"name\": \"aligncenter\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 44\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192h896v128h-896zM64 576h896v128h-896zM384 384h576v128h-576zM384 768h576v128h-576z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57349,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 17,\n\t\t\t\t\"order\": 46,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57349,\n\t\t\t\t\"name\": \"alignright\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 45\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192h896v128h-896zM64 576h896v128h-896zM64 384h576v128h-576zM64 768h576v128h-576z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57347,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 18,\n\t\t\t\t\"order\": 47,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57347,\n\t\t\t\t\"name\": \"alignleft\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 46\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M320 128c-123.712 0-224 100.288-224 224s100.288 224 224 224v320h128v-640h64v640h128v-640h128v-128h-448zM960 512l-224 192 224 192z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57392,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 33,\n\t\t\t\t\"order\": 48,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57392,\n\t\t\t\t\"name\": \"rtl\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 47\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 384h128v64h-128zM512 768h128v64h-128zM576 576h128v64h-128zM768 576v192h-64v64h128v-256zM384 576h128v64h-128zM320 768h128v64h-128zM320 384h128v64h-128zM192 192v256h64v-192h64v-64zM704 448h128v-256h-64v192h-64zM64 64v896h896v-896h-896zM896 896h-768v-768h768v768zM192 576v256h64v-192h64v-64zM576 192h128v64h-128zM384 192h128v64h-128z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57382,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 34,\n\t\t\t\t\"order\": 49,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57382,\n\t\t\t\t\"name\": \"template\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 48\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M816 64l16 384h-640l16-384h32l16 320h512l16-320h32zM208 960l-16-320h640l-16 320h-32l-16-256h-512l-16 256h-32zM64 512h128v64h-128zM256 512h128v64h-128zM448 512h128v64h-128zM640 512h128v64h-128zM832 512h128v64h-128z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57383,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 35,\n\t\t\t\t\"order\": 50,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57383,\n\t\t\t\t\"name\": \"pagebreak\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 49\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M960 128v-64h-192c-35.202 0-64 28.8-64 64v320c0 15.856 5.858 30.402 15.496 41.614l-303.496 260.386-142-148-82 70 224 288 416-448h128v-64h-192v-320h192zM256 512h64v-384c0-35.2-28.8-64-64-64h-128c-35.2 0-64 28.8-64 64v384h64v-192h128v192zM128 256v-128h128v128h-128zM640 448v-96c0-35.2-8.8-64-44-64 35.2 0 44-28.8 44-64v-96c0-35.2-28.8-64-64-64h-192v448h192c35.2 0 64-28.8 64-64zM448 128h128v128h-128v-128zM448 320h128v128h-128v-128z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57380,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 36,\n\t\t\t\t\"order\": 51,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57380,\n\t\t\t\t\"name\": \"spellcheck\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 50\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M448 512h-128v-128h128v-128h128v128h128v128h-128v128h-128v-128zM960 576v320h-896v-320h128v192h640v-192h128z\"\n\t\t\t\t],\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"defaultCode\": 57381,\n\t\t\t\t\"grid\": 0\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"id\": 37,\n\t\t\t\t\"order\": 52,\n\t\t\t\t\"prevSize\": 32,\n\t\t\t\t\"code\": 57381,\n\t\t\t\t\"name\": \"nonbreaking\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"setId\": 2,\n\t\t\t\"iconIdx\": 51\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M256 352v-128c0-53.020 42.98-96 96-96h32v-128h-32c-123.712 0-224 100.288-224 224v128c0 53.020-42.98 96-96 96h-32v128h32c53.020 0 96 42.98 96 96v128c0 123.71 100.288 224 224 224h32v-128h-32c-53.020 0-96-42.98-96-96v-128c0-62.684-25.758-119.342-67.254-160 41.496-40.658 67.254-97.316 67.254-160z\",\n\t\t\t\t\t\"M1024 352v-128c0-53.020-42.98-96-96-96h-32v-128h32c123.71 0 224 100.288 224 224v128c0 53.020 42.98 96 96 96h32v128h-32c-53.020 0-96 42.98-96 96v128c0 123.71-100.29 224-224 224h-32v-128h32c53.020 0 96-42.98 96-96v-128c0-62.684 25.758-119.342 67.254-160-41.496-40.658-67.254-97.316-67.254-160z\",\n\t\t\t\t\t\"M768 320.882c0 70.692-57.308 128-128 128s-128-57.308-128-128c0-70.692 57.308-128 128-128s128 57.308 128 128z\",\n\t\t\t\t\t\"M640 511.118c-70.692 0-128 57.308-128 128 0 68.732 32 123.216 130.156 127.852-29.19 41.126-73.156 57.366-130.156 62.7v76c0 0 256 22.332 256-266.55-0.25-70.694-57.306-128.002-128-128.002z\"\n\t\t\t\t],\n\t\t\t\t\"width\": 1280,\n\t\t\t\t\"attrs\": [],\n\t\t\t\t\"isMulticolor\": false,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"code\",\n\t\t\t\t\t\"semicolon\",\n\t\t\t\t\t\"curly-braces\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16\n\t\t\t},\n\t\t\t\"attrs\": [],\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 1,\n\t\t\t\t\"id\": 0,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58883,\n\t\t\t\t\"name\": \"codesample\"\n\t\t\t},\n\t\t\t\"setIdx\": 1,\n\t\t\t\"setId\": 1,\n\t\t\t\"iconIdx\": 0\n\t\t}\n\t],\n\t\"height\": 1024,\n\t\"metadata\": {\n\t\t\"name\": \"tinymce-small\"\n\t},\n\t\"preferences\": {\n\t\t\"showGlyphs\": true,\n\t\t\"showQuickUse\": true,\n\t\t\"showQuickUse2\": true,\n\t\t\"showSVGs\": true,\n\t\t\"fontPref\": {\n\t\t\t\"prefix\": \"icon-\",\n\t\t\t\"metadata\": {\n\t\t\t\t\"fontFamily\": \"tinymce-small\",\n\t\t\t\t\"majorVersion\": 1,\n\t\t\t\t\"minorVersion\": 0\n\t\t\t},\n\t\t\t\"metrics\": {\n\t\t\t\t\"emSize\": 1024,\n\t\t\t\t\"baseline\": 6.25,\n\t\t\t\t\"whitespace\": 50\n\t\t\t},\n\t\t\t\"showMetrics\": false,\n\t\t\t\"showMetadata\": false,\n\t\t\t\"showVersion\": false,\n\t\t\t\"embed\": false\n\t\t},\n\t\t\"imagePref\": {\n\t\t\t\"prefix\": \"icon-\",\n\t\t\t\"png\": true,\n\t\t\t\"useClassSelector\": true,\n\t\t\t\"color\": 4473924,\n\t\t\t\"bgColor\": 16777215\n\t\t},\n\t\t\"historySize\": 100,\n\t\t\"showCodes\": true\n\t}\n}"
  },
  {
    "path": "static/tinymce/js/tinymce/skins/myskin/fonts/tinymce.json",
    "content": "{\n\t\"selection\": [\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58882,\n\t\t\t\"name\": \"invert\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 0,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57396,\n\t\t\t\"name\": \"browse\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57394,\n\t\t\t\"name\": \"resize\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 2,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57393,\n\t\t\t\"name\": \"copy\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 3,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57392,\n\t\t\t\"name\": \"rtl\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 4,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57391,\n\t\t\t\"name\": \"ltr\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 5,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57390,\n\t\t\t\"name\": \"visualchars\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 6,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57389,\n\t\t\t\"name\": \"strikethrough\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 7,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57388,\n\t\t\t\"name\": \"underline\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 8,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57387,\n\t\t\t\"name\": \"italic\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 9,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57386,\n\t\t\t\"name\": \"bold\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 11,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57384,\n\t\t\t\"name\": \"restoredraft\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 12,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57383,\n\t\t\t\"name\": \"pagebreak\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 13,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57382,\n\t\t\t\"name\": \"template\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 14,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57381,\n\t\t\t\"name\": \"nonbreaking\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 15,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57380,\n\t\t\t\"name\": \"spellchecker\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 19,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57376,\n\t\t\t\"name\": \"charmap\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 20,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57375,\n\t\t\t\"name\": \"sup\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 21,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57374,\n\t\t\t\"name\": \"sub\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 22,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57373,\n\t\t\t\"name\": \"removeformat\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 23,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57372,\n\t\t\t\"name\": \"hr\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 24,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57371,\n\t\t\t\"name\": \"table\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 25,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57370,\n\t\t\t\"name\": \"forecolor\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 26,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57369,\n\t\t\t\"name\": \"preview\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 27,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57368,\n\t\t\t\"name\": \"inserttime\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 28,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57367,\n\t\t\t\"name\": \"code\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 29,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57366,\n\t\t\t\"name\": \"help\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 30,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57365,\n\t\t\t\"name\": \"media\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 31,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57364,\n\t\t\t\"name\": \"image\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 32,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57363,\n\t\t\t\"name\": \"anchor\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 33,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57362,\n\t\t\t\"name\": \"unlink\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 34,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57361,\n\t\t\t\"name\": \"link\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 38,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57357,\n\t\t\t\"name\": \"outdent\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 39,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57356,\n\t\t\t\"name\": \"indent\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 40,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57355,\n\t\t\t\"name\": \"numlist\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 41,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57354,\n\t\t\t\"name\": \"bullist\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 42,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57353,\n\t\t\t\"name\": \"searchreplace\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 43,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57352,\n\t\t\t\"name\": \"paste\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 44,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57351,\n\t\t\t\"name\": \"cut\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 45,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57350,\n\t\t\t\"name\": \"alignjustify\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 46,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57349,\n\t\t\t\"name\": \"alignright\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 47,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57348,\n\t\t\t\"name\": \"aligncenter\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 48,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57347,\n\t\t\t\"name\": \"alignleft\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 49,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57346,\n\t\t\t\"name\": \"fullpage\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 50,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57345,\n\t\t\t\"name\": \"newdocument\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 51,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57344,\n\t\t\t\"name\": \"save\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 52,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57395,\n\t\t\t\"name\": \"checkbox\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 53,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57397,\n\t\t\t\"name\": \"pastetext\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 16,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57379,\n\t\t\t\"name\": \"fullscreen\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 17,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57378,\n\t\t\t\"name\": \"print\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 18,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57377,\n\t\t\t\"name\": \"emoticons\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 37,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57358,\n\t\t\t\"name\": \"blockquote\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 36,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57359,\n\t\t\t\"name\": \"undo\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 35,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 57360,\n\t\t\t\"name\": \"redo\",\n\t\t\t\"ligatures\": \"\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 1,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58883,\n\t\t\t\"name\": \"codesample\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 87,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 59700,\n\t\t\t\"ligatures\": \"droplet, color9\",\n\t\t\t\"name\": \"drop\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 635,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60327,\n\t\t\t\"ligatures\": \"diamond2, gem2\",\n\t\t\t\"name\": \"sharpen\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 854,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60628,\n\t\t\t\"ligatures\": \"contrast\",\n\t\t\t\"name\": \"contrast\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 24,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60778,\n\t\t\t\"ligatures\": \"cross2, cancel3\",\n\t\t\t\"name\": \"cross2\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1097,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60921,\n\t\t\t\"ligatures\": \"arrow-resize2, diagonal2\",\n\t\t\t\"name\": \"arrow-resize2\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 1,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58880,\n\t\t\t\"name\": \"gamma\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58881,\n\t\t\t\"name\": \"orientation\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 68,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 59668,\n\t\t\t\"ligatures\": \"pencil7, write7\",\n\t\t\t\"name\": \"editimage\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 22,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60072,\n\t\t\t\"ligatures\": \"rotate-ccw3, ccw4\",\n\t\t\t\"name\": \"rotateleft\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 1679,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60073,\n\t\t\t\"ligatures\": \"rotate-cw3, cw4\",\n\t\t\t\"name\": \"rotateright\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 403,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60074,\n\t\t\t\"ligatures\": \"flip-vertical, mirror\",\n\t\t\t\"name\": \"flipv\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 405,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60076,\n\t\t\t\"ligatures\": \"flip-horizontal, mirror3\",\n\t\t\t\"name\": \"fliph\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 534,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60213,\n\t\t\t\"ligatures\": \"zoom-in3, magnifier9\",\n\t\t\t\"name\": \"zoomin\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 535,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60214,\n\t\t\t\"ligatures\": \"zoom-out3, magnifier10\",\n\t\t\t\"name\": \"zoomout\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 1448,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60522,\n\t\t\t\"ligatures\": \"menu3, list4\",\n\t\t\t\"name\": \"options\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 844,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60620,\n\t\t\t\"ligatures\": \"sun2, weather21\",\n\t\t\t\"name\": \"sun\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 855,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60621,\n\t\t\t\"ligatures\": \"moon, night\",\n\t\t\t\"name\": \"moon\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1056,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 60864,\n\t\t\t\"ligatures\": \"arrow-left, left4\",\n\t\t\t\"name\": \"arrowleft\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1201,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 61048,\n\t\t\t\"ligatures\": \"crop, resize\",\n\t\t\t\"name\": \"crop\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1680,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58884,\n\t\t\t\"name\": \"tablerowprops\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1681,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58885,\n\t\t\t\"name\": \"tablecellprops\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1682,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58886,\n\t\t\t\"name\": \"table2\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1683,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58887,\n\t\t\t\"name\": \"tablemergecells\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1684,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58888,\n\t\t\t\"name\": \"tableinsertcolbefore\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1685,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58889,\n\t\t\t\"name\": \"tableinsertcolafter\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1686,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58890,\n\t\t\t\"name\": \"tableinsertrowbefore\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1687,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58891,\n\t\t\t\"name\": \"tableinsertrowafter\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1688,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58893,\n\t\t\t\"name\": \"tablesplitcells\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1689,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58894,\n\t\t\t\"name\": \"tabledelete\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1690,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58922,\n\t\t\t\"name\": \"tableleftheader\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1691,\n\t\t\t\"order\": 0,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 58923,\n\t\t\t\"name\": \"tabletopheader\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 1693,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 59392,\n\t\t\t\"name\": \"tabledeleterow\",\n\t\t\t\"tempChar\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"order\": 0,\n\t\t\t\"id\": 1692,\n\t\t\t\"prevSize\": 32,\n\t\t\t\"code\": 59393,\n\t\t\t\"name\": \"tabledeletecol\",\n\t\t\t\"tempChar\": \"\"\n\t\t}\n\t],\n\t\"metadata\": {\n\t\t\"name\": \"tinymce\",\n\t\t\"iconsHash\": 757772004\n\t},\n\t\"height\": 1024,\n\t\"prevSize\": 32,\n\t\"icons\": [\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M892.8 982.4l-89.6-89.6c-70.4 80-172.8 131.2-288 131.2-208 0-380.8-166.4-384-377.6 0 0 0 0 0 0 0-3.2 0-3.2 0-6.4s0-3.2 0-6.4v0c0 0 0 0 0-3.2 0 0 0-3.2 0-3.2 3.2-105.6 48-211.2 105.6-304l-192-192 44.8-44.8 182.4 182.4c0 0 0 0 0 0l569.6 569.6c0 0 0 0 0 0l99.2 99.2-48 44.8zM896 633.6c0 0 0 0 0 0 0-3.2 0-6.4 0-6.4-9.6-316.8-384-627.2-384-627.2s-108.8 89.6-208 220.8l70.4 70.4c6.4-9.6 16-22.4 22.4-32 41.6-51.2 83.2-96 115.2-128v0c32 32 73.6 76.8 115.2 128 108.8 137.6 169.6 265.6 172.8 371.2 0 0 0 3.2 0 3.2v0 0c0 3.2 0 3.2 0 6.4s0 3.2 0 3.2v0 0c0 22.4-3.2 41.6-9.6 64l76.8 76.8c16-41.6 28.8-89.6 28.8-137.6 0 0 0 0 0 0 0-3.2 0-3.2 0-6.4s-0-3.2-0-6.4z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"invert\"\n\t\t\t],\n\t\t\t\"grid\": 16,\n\t\t\t\"defaultCode\": 58882\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M928 128h-416l-32-64h-352l-64 128h896zM904.34 704h74.86l44.8-448h-1024l64 640h484.080c-104.882-37.776-180.080-138.266-180.080-256 0-149.982 122.018-272 272-272 149.98 0 272 122.018 272 272 0 21.678-2.622 43.15-7.66 64zM1002.996 913.75l-198.496-174.692c17.454-28.92 27.5-62.814 27.5-99.058 0-106.040-85.96-192-192-192s-192 85.96-192 192 85.96 192 192 192c36.244 0 70.138-10.046 99.058-27.5l174.692 198.496c22.962 26.678 62.118 28.14 87.006 3.252l5.492-5.492c24.888-24.888 23.426-64.044-3.252-87.006zM640 764c-68.484 0-124-55.516-124-124s55.516-124 124-124 124 55.516 124 124-55.516 124-124 124z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"defaultCode\": 57396,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M768 256h64v64h-64zM640 384h64v64h-64zM640 512h64v64h-64zM640 640h64v64h-64zM512 512h64v64h-64zM512 640h64v64h-64zM384 640h64v64h-64zM768 384h64v64h-64zM768 512h64v64h-64zM768 640h64v64h-64zM768 768h64v64h-64zM640 768h64v64h-64zM512 768h64v64h-64zM384 768h64v64h-64zM256 768h64v64h-64z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"resize\",\n\t\t\t\t\"dots\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57394,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M832 256h-192v-64l-192-192h-448v768h384v256h640v-576l-192-192zM832 346.51l101.49 101.49h-101.49v-101.49zM448 90.51l101.49 101.49h-101.49v-101.49zM64 64h320v192h192v448h-512v-640zM960 960h-512v-192h192v-448h128v192h192v448z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"copy\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57393,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M256 64h512v128h-128v768h-128v-768h-128v768h-128v-448c-123.712 0-224-100.288-224-224s100.288-224 224-224zM960 896l-256-224 256-224z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"rtl\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57392,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M448 64h512v128h-128v768h-128v-768h-128v768h-128v-448c-123.712 0-224-100.288-224-224s100.288-224 224-224zM64 448l256 224-256 224z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"ltr\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57391,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M384 64h512v128h-128v768h-128v-768h-128v768h-128v-448c-123.712 0-224-100.288-224-224s100.288-224 224-224z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"visualchars\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57390,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M731.42 517.036c63.92 47.938 100.58 116.086 100.58 186.964s-36.66 139.026-100.58 186.964c-59.358 44.518-137.284 69.036-219.42 69.036-82.138 0-160.062-24.518-219.42-69.036-63.92-47.938-100.58-116.086-100.58-186.964h128c0 69.382 87.926 128 192 128 104.074 0 192-58.618 192-128 0-69.382-87.926-128-192-128-82.138 0-160.062-24.518-219.42-69.036-63.92-47.94-100.58-116.086-100.58-186.964 0-70.878 36.66-139.024 100.58-186.964 59.358-44.518 137.282-69.036 219.42-69.036 82.136 0 160.062 24.518 219.42 69.036 63.92 47.94 100.58 116.086 100.58 186.964h-128c0-69.382-87.926-128-192-128-104.074 0-192 58.618-192 128 0 69.382 87.926 128 192 128 82.136 0 160.062 24.518 219.42 69.036zM0 512h1024v64h-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"strikethrough\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57389,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M704 64h128v416c0 159.058-143.268 288-320 288-176.73 0-320-128.942-320-288v-416h128v416c0 40.166 18.238 78.704 51.354 108.506 36.896 33.204 86.846 51.494 140.646 51.494 53.8 0 103.75-18.29 140.646-51.494 33.116-29.802 51.354-68.34 51.354-108.506v-416zM192 832h640v128h-640z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"underline\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57388,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M896 64v64h-128l-320 768h128v64h-448v-64h128l320-768h-128v-64z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"italic\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57387,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M707.88 484.652c37.498-44.542 60.12-102.008 60.12-164.652 0-141.16-114.842-256-256-256h-320v896h384c141.158 0 256-114.842 256-256 0-92.956-49.798-174.496-124.12-219.348zM384 192h101.5c55.968 0 101.5 57.42 101.5 128s-45.532 128-101.5 128h-101.5v-256zM543 832h-159v-256h159c58.45 0 106 57.42 106 128s-47.55 128-106 128z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"bold0\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57386,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M576 64c247.424 0 448 200.576 448 448s-200.576 448-448 448v-96c94.024 0 182.418-36.614 248.902-103.098 66.484-66.484 103.098-154.878 103.098-248.902 0-94.022-36.614-182.418-103.098-248.902-66.484-66.484-154.878-103.098-248.902-103.098-94.022 0-182.418 36.614-248.902 103.098-51.14 51.138-84.582 115.246-97.306 184.902h186.208l-224 256-224-256h164.57c31.060-217.102 217.738-384 443.43-384zM768 448v128h-256v-320h128v192z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"restoredraft\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57384,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 512h128v64h-128zM192 512h192v64h-192zM448 512h128v64h-128zM640 512h192v64h-192zM896 512h128v64h-128zM880 0l16 448h-768l16-448h32l16 384h640l16-384zM144 1024l-16-384h768l-16 384h-32l-16-320h-640l-16 320z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"pagebreak\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57383,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M384 192h128v64h-128zM576 192h128v64h-128zM896 192v256h-192v-64h128v-128h-64v-64zM320 384h128v64h-128zM512 384h128v64h-128zM192 256v128h64v64h-128v-256h192v64zM384 576h128v64h-128zM576 576h128v64h-128zM896 576v256h-192v-64h128v-128h-64v-64zM320 768h128v64h-128zM512 768h128v64h-128zM192 640v128h64v64h-128v-256h192v64zM960 64h-896v896h896v-896zM1024 0v0 1024h-1024v-1024h1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"template\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57382,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M448 576h-192v-128h192v-192h128v192h192v128h-192v192h-128zM1024 640v384h-1024v-384h128v256h768v-256z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"nonbreaking\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57381,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M128 256h128v192h64v-384c0-35.2-28.8-64-64-64h-128c-35.2 0-64 28.8-64 64v384h64v-192zM128 64h128v128h-128v-128zM960 64v-64h-192c-35.202 0-64 28.8-64 64v320c0 35.2 28.798 64 64 64h192v-64h-192v-320h192zM640 160v-96c0-35.2-28.8-64-64-64h-192v448h192c35.2 0 64-28.8 64-64v-96c0-35.2-8.8-64-44-64 35.2 0 44-28.8 44-64zM576 384h-128v-128h128v128zM576 192h-128v-128h128v128zM832 576l-416 448-224-288 82-70 142 148 352-302z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"spellchecker\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57380,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M704 896h256l64-128v256h-384v-214.214c131.112-56.484 224-197.162 224-361.786 0-214.432-157.598-382.266-352-382.266-194.406 0-352 167.832-352 382.266 0 164.624 92.886 305.302 224 361.786v214.214h-384v-256l64 128h256v-32.59c-187.63-66.46-320-227.402-320-415.41 0-247.424 229.23-448 512-448 282.77 0 512 200.576 512 448 0 188.008-132.37 348.95-320 415.41v32.59z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"charmap\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57376,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M768 206v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"sup\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57375,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M768 910v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"sub\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57374,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 896h576v128h-576zM192 0h704v128h-704zM277.388 832l204.688-784.164 123.85 32.328-196.25 751.836zM929.774 1024l-129.774-129.774-129.774 129.774-62.226-62.226 129.774-129.774-129.774-129.774 62.226-62.226 129.774 129.774 129.774-129.774 62.226 62.226-129.774 129.774 129.774 129.774z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"removeformat\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57373,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 448h1024v128h-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"hr\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57372,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v896h1024v-896h-1024zM384 640v-192h256v192h-256zM640 704v192h-256v-192h256zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM64 448h256v192h-256v-192zM704 448h256v192h-256v-192zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192zM704 896v-192h256v192h-256z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"table\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57371,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M322.018 832l57.6-192h264.764l57.6 192h113.632l-191.996-640h-223.236l-192 640h113.636zM475.618 320h72.764l57.6 192h-187.964l57.6-192z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"forecolor\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57370,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M512 320c-209.368 0-395.244 100.556-512 256 116.756 155.446 302.632 256 512 256 209.368 0 395.244-100.554 512-256-116.756-155.444-302.632-256-512-256zM448 448c35.346 0 64 28.654 64 64s-28.654 64-64 64-64-28.654-64-64 28.654-64 64-64zM773.616 705.296c-39.648 20.258-81.652 35.862-124.846 46.376-44.488 10.836-90.502 16.328-136.77 16.328-46.266 0-92.282-5.492-136.768-16.324-43.194-10.518-85.198-26.122-124.846-46.376-63.020-32.202-120.222-76.41-167.64-129.298 47.418-52.888 104.62-97.1 167.64-129.298 32.336-16.522 66.242-29.946 101.082-40.040-19.888 30.242-31.468 66.434-31.468 105.336 0 106.040 85.962 192 192 192 106.038 0 192-85.96 192-192 0-38.902-11.582-75.094-31.466-105.34 34.838 10.096 68.744 23.52 101.082 40.042 63.022 32.198 120.218 76.408 167.638 129.298-47.42 52.886-104.618 97.1-167.638 129.296zM860.918 243.722c-108.72-55.554-226.112-83.722-348.918-83.722-122.806 0-240.198 28.168-348.918 83.722-58.772 30.032-113.732 67.904-163.082 112.076v109.206c55.338-58.566 120.694-107.754 192.194-144.29 99.62-50.904 207.218-76.714 319.806-76.714s220.186 25.81 319.804 76.716c71.502 36.536 136.858 85.724 192.196 144.29v-109.206c-49.35-44.174-104.308-82.046-163.082-112.078z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"preview\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57369,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M512 192c-212.076 0-384 171.922-384 384s171.922 384 384 384c212.074 0 384-171.922 384-384s-171.926-384-384-384zM715.644 779.646c-54.392 54.396-126.716 84.354-203.644 84.354s-149.25-29.958-203.646-84.354c-54.396-54.394-84.354-126.718-84.354-203.646s29.958-149.25 84.354-203.646c54.396-54.396 126.718-84.354 203.646-84.354s149.252 29.958 203.642 84.354c54.402 54.396 84.358 126.718 84.358 203.646s-29.958 149.252-84.356 203.646zM325.93 203.862l-42.94-85.878c-98.874 49.536-179.47 130.132-229.006 229.008l85.876 42.94c40.248-80.336 105.732-145.822 186.070-186.070zM884.134 389.93l85.878-42.938c-49.532-98.876-130.126-179.472-229.004-229.008l-42.944 85.878c80.338 40.248 145.824 105.732 186.070 186.068zM512 384h-64v192c0 10.11 4.7 19.11 12.022 24.972l-0.012 0.016 160 128 39.976-49.976-147.986-118.39v-176.622z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"inserttime\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57368,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M320 256l-256 256 256 256h128l-256-256 256-256zM704 256h-128l256 256-256 256h128l256-256z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"code\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57367,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M448 704h128v128h-128zM704 256c35.346 0 64 28.654 64 64v192l-192 128h-128v-64l192-128v-64h-320v-128h384zM512 96c-111.118 0-215.584 43.272-294.156 121.844s-121.844 183.038-121.844 294.156c0 111.118 43.272 215.584 121.844 294.156 78.572 78.572 183.038 121.844 294.156 121.844 111.118 0 215.584-43.272 294.156-121.844 78.572-78.572 121.844-183.038 121.844-294.156 0-111.118-43.272-215.584-121.844-294.156-78.572-78.572-183.038-121.844-294.156-121.844zM512 0v0c282.77 0 512 229.23 512 512s-229.23 512-512 512c-282.77 0-512-229.23-512-512 0-282.77 229.23-512 512-512z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"help\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57366,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 128v768h1024v-768h-1024zM192 832h-128v-128h128v128zM192 576h-128v-128h128v128zM192 320h-128v-128h128v128zM768 832h-512v-640h512v640zM960 832h-128v-128h128v128zM960 576h-128v-128h128v128zM960 320h-128v-128h128v128zM384 320v384l256-192z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"media\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57365,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 128v832h1024v-832h-1024zM960 896h-896v-704h896v704zM704 352c0-53.019 42.981-96 96-96s96 42.981 96 96c0 53.019-42.981 96-96 96-53.019 0-96-42.981-96-96zM896 832h-768l192-512 256 320 128-96z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"image\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57364,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M192 0v1024l320-320 320 320v-1024h-640zM768 869.49l-256-256-256 256v-805.49h512v805.49z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"anchor\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57363,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M476.888 675.114c4.56 9.048 6.99 19.158 6.99 29.696 0 17.616-6.744 34.058-18.992 46.308l-163.38 163.38c-12.248 12.248-28.696 18.992-46.308 18.992s-34.060-6.744-46.308-18.992l-99.38-99.38c-12.248-12.25-18.992-28.696-18.992-46.308s6.744-34.060 18.992-46.308l163.38-163.382c12.248-12.246 28.696-18.992 46.308-18.992 10.538 0 20.644 2.43 29.696 6.988l65.338-65.336c-27.87-21.41-61.44-32.16-95.034-32.16-39.986 0-79.972 15.166-110.308 45.502l-163.38 163.382c-60.67 60.67-60.67 159.95 0 220.618l99.38 99.382c30.334 30.332 70.32 45.5 110.306 45.5 39.988 0 79.974-15.168 110.308-45.502l163.38-163.38c55.82-55.82 60.238-144.298 13.344-205.346l-65.34 65.338zM978.496 144.884l-99.38-99.382c-30.334-30.336-70.32-45.502-110.308-45.502-39.986 0-79.97 15.166-110.306 45.502l-163.382 163.382c-55.82 55.82-60.238 144.298-13.342 205.342l65.338-65.34c-4.558-9.050-6.988-19.16-6.988-29.694 0-17.616 6.744-34.060 18.992-46.308l163.382-163.382c12.246-12.248 28.694-18.994 46.306-18.994 17.616 0 34.060 6.746 46.308 18.994l99.38 99.382c12.248 12.248 18.992 28.694 18.992 46.308s-6.744 34.060-18.992 46.308l-163.38 163.382c-12.248 12.248-28.694 18.992-46.308 18.992-10.536 0-20.644-2.43-29.696-6.99l-65.338 65.338c27.872 21.41 61.44 32.16 95.034 32.16 39.988 0 79.974-15.168 110.308-45.504l163.38-163.38c60.672-60.666 60.672-159.944 0-220.614zM233.368 278.624l-191.994-191.994 45.256-45.256 191.994 191.994zM384 0h64v192h-64zM0 384h192v64h-192zM790.632 745.376l191.996 191.996-45.256 45.256-191.996-191.996zM576 832h64v192h-64zM832 576h192v64h-192z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"unlink\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57362,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M320 704c17.6 17.6 47.274 16.726 65.942-1.942l316.118-316.116c18.668-18.668 19.54-48.342 1.94-65.942s-47.274-16.726-65.942 1.942l-316.116 316.116c-18.668 18.668-19.542 48.342-1.942 65.942zM476.888 675.112c4.56 9.050 6.99 19.16 6.99 29.696 0 17.616-6.744 34.060-18.992 46.308l-163.382 163.382c-12.248 12.248-28.694 18.992-46.308 18.992s-34.060-6.744-46.308-18.992l-99.382-99.382c-12.248-12.248-18.992-28.694-18.992-46.308s6.744-34.060 18.992-46.308l163.382-163.382c12.248-12.248 28.694-18.994 46.308-18.994 10.536 0 20.644 2.43 29.696 6.99l65.338-65.338c-27.87-21.41-61.44-32.16-95.034-32.16-39.986 0-79.972 15.166-110.308 45.502l-163.382 163.382c-60.67 60.67-60.67 159.948 0 220.618l99.382 99.382c30.334 30.332 70.32 45.5 110.306 45.5 39.988 0 79.974-15.168 110.308-45.502l163.382-163.382c55.82-55.82 60.238-144.298 13.344-205.344l-65.34 65.34zM978.498 144.884l-99.382-99.382c-30.334-30.336-70.32-45.502-110.308-45.502-39.986 0-79.972 15.166-110.308 45.502l-163.382 163.382c-55.82 55.82-60.238 144.298-13.342 205.342l65.338-65.34c-4.558-9.050-6.988-19.16-6.988-29.694 0-17.616 6.744-34.060 18.992-46.308l163.382-163.382c12.248-12.248 28.694-18.994 46.308-18.994s34.060 6.746 46.308 18.994l99.382 99.382c12.248 12.248 18.992 28.694 18.992 46.308s-6.744 34.060-18.992 46.308l-163.382 163.382c-12.248 12.248-28.694 18.992-46.308 18.992-10.536 0-20.644-2.43-29.696-6.99l-65.338 65.338c27.872 21.41 61.44 32.16 95.034 32.16 39.988 0 79.974-15.168 110.308-45.502l163.382-163.382c60.67-60.666 60.67-159.944 0-220.614z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"link\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57361,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64h1024v128h-1024zM384 256h640v128h-640zM384 448h640v128h-640zM384 640h640v128h-640zM0 832h1024v128h-1024zM256 320v384l-256-192z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"outdent\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57357,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64h1024v128h-1024zM384 256h640v128h-640zM384 448h640v128h-640zM384 640h640v128h-640zM0 832h1024v128h-1024zM0 704v-384l256 192z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"indent\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57356,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M384 832h640v128h-640zM384 448h640v128h-640zM384 64h640v128h-640zM192 0v256h-64v-192h-64v-64zM128 526v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM256 704v320h-192v-64h128v-64h-128v-64h128v-64h-128v-64z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"numlist\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57355,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M384 64h640v128h-640v-128zM384 448h640v128h-640v-128zM384 832h640v128h-640v-128zM0 128c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 512c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 896c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"bullist\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57354,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M64 0h384v64h-384zM576 0h384v64h-384zM952 320h-56v-256h-256v256h-256v-256h-256v256h-56c-39.6 0-72 32.4-72 72v560c0 39.6 32.4 72 72 72h304c39.6 0 72-32.4 72-72v-376h128v376c0 39.6 32.4 72 72 72h304c39.6 0 72-32.4 72-72v-560c0-39.6-32.4-72-72-72zM348 960h-248c-19.8 0-36-14.4-36-32s16.2-32 36-32h248c19.8 0 36 14.4 36 32s-16.2 32-36 32zM544 512h-64c-17.6 0-32-14.4-32-32s14.4-32 32-32h64c17.6 0 32 14.4 32 32s-14.4 32-32 32zM924 960h-248c-19.8 0-36-14.4-36-32s16.2-32 36-32h248c19.8 0 36 14.4 36 32s-16.2 32-36 32z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"searchreplace\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57353,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M832 320v-160c0-17.6-14.4-32-32-32h-224v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-224c-17.602 0-32 14.4-32 32v640c0 17.6 14.398 32 32 32h288v192h448l192-192v-512h-192zM384 64.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 256v-64h512v64h-512zM832 933.49v-101.49h101.49l-101.49 101.49zM960 768h-192v192h-320v-576h512v384z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"paste\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57352,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M890.774 709.154c-45.654-45.556-103.728-69.072-157.946-69.072h-29.112l-63.904-64.008 255.62-256.038c63.904-64.010 63.904-192.028 0-256.038l-383.43 384.056-383.432-384.054c-63.904 64.008-63.904 192.028 0 256.038l255.622 256.034-63.906 64.008h-29.114c-54.22 0-112.292 23.518-157.948 69.076-81.622 81.442-92.65 202.484-24.63 270.35 29.97 29.902 70.288 44.494 112.996 44.494 54.216 0 112.29-23.514 157.946-69.072 53.584-53.464 76.742-124 67.084-185.348l65.384-65.488 65.376 65.488c-9.656 61.348 13.506 131.882 67.084 185.348 45.662 45.558 103.732 69.072 157.948 69.072 42.708 0 83.024-14.592 112.994-44.496 68.020-67.866 56.988-188.908-24.632-270.35zM353.024 845.538c-7.698 17.882-19.010 34.346-33.626 48.926-14.636 14.604-31.172 25.918-49.148 33.624-16.132 6.916-32.96 10.568-48.662 10.568-15.146 0-36.612-3.402-52.862-19.612-16.136-16.104-19.52-37.318-19.52-52.288 0-15.542 3.642-32.21 10.526-48.212 7.7-17.884 19.014-34.346 33.626-48.926 14.634-14.606 31.172-25.914 49.15-33.624 16.134-6.914 32.96-10.568 48.664-10.568 15.146 0 36.612 3.4 52.858 19.614 16.134 16.098 19.522 37.316 19.522 52.284 0.002 15.542-3.638 32.216-10.528 48.214zM512.004 666.596c-49.914 0-90.376-40.532-90.376-90.526 0-49.992 40.462-90.52 90.376-90.52s90.372 40.528 90.372 90.52c0 49.998-40.46 90.526-90.372 90.526zM855.272 919.042c-16.248 16.208-37.712 19.612-52.86 19.612-15.704 0-32.53-3.652-48.666-10.568-17.972-7.706-34.508-19.020-49.142-33.624-14.614-14.58-25.926-31.042-33.626-48.926-6.886-15.998-10.526-32.672-10.526-48.212 0-14.966 3.384-36.188 19.52-52.286 16.246-16.208 37.712-19.614 52.86-19.614 15.7 0 32.53 3.654 48.66 10.568 17.978 7.708 34.516 19.018 49.15 33.624 14.61 14.58 25.924 31.042 33.626 48.926 6.884 15.998 10.526 32.67 10.526 48.212-0.002 14.97-3.39 36.186-19.522 52.288z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"cut\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57351,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64h1024v128h-1024zM0 256h1024v128h-1024zM0 448h1024v128h-1024zM0 640h1024v128h-1024zM0 832h1024v128h-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"alignjustify\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57350,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64h1024v128h-1024zM384 256h640v128h-640zM384 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"alignright\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57349,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64h1024v128h-1024zM192 256h640v128h-640zM192 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"aligncenter\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57348,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64h1024v128h-1024zM0 256h640v128h-640zM0 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"alignleft\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57347,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M1024 592.458v-160.916l-159.144-15.914c-8.186-30.042-20.088-58.548-35.21-84.98l104.596-127.838-113.052-113.050-127.836 104.596c-26.434-15.124-54.942-27.026-84.982-35.208l-15.914-159.148h-160.916l-15.914 159.146c-30.042 8.186-58.548 20.086-84.98 35.208l-127.838-104.594-113.050 113.050 104.596 127.836c-15.124 26.432-27.026 54.94-35.21 84.98l-159.146 15.916v160.916l159.146 15.914c8.186 30.042 20.086 58.548 35.21 84.982l-104.596 127.836 113.048 113.048 127.838-104.596c26.432 15.124 54.94 27.028 84.98 35.21l15.916 159.148h160.916l15.914-159.144c30.042-8.186 58.548-20.088 84.982-35.21l127.836 104.596 113.048-113.048-104.596-127.836c15.124-26.434 27.028-54.942 35.21-84.98l159.148-15.92zM704 576l-128 128h-128l-128-128v-128l128-128h128l128 128v128z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"fullpage\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57346,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M903.432 199.43l-142.864-142.862c-31.112-31.112-92.568-56.568-136.568-56.568h-480c-44 0-80 36-80 80v864c0 44 36 80 80 80h736c44 0 80-36 80-80v-608c0-44-25.456-105.458-56.568-136.57zM858.178 244.686c3.13 3.13 6.25 6.974 9.28 11.314h-163.458v-163.456c4.34 3.030 8.184 6.15 11.314 9.28l142.864 142.862zM896 944c0 8.672-7.328 16-16 16h-736c-8.672 0-16-7.328-16-16v-864c0-8.672 7.328-16 16-16h480c4.832 0 10.254 0.61 16 1.704v254.296h254.296c1.094 5.746 1.704 11.166 1.704 16v608z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"newdocument\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57345,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M896 0h-896v1024h1024v-896l-128-128zM512 128h128v256h-128v-256zM896 896h-768v-768h64v320h576v-320h74.978l53.022 53.018v714.982z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"save\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57344,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M128 544l288 288 480-480-128-128-352 352-160-160z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"defaultCode\": 57395,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M512 512v128h32l32-64h64v256h-48v64h224v-64h-48v-256h64l32 64h32v-128zM832 320v-160c0-17.6-14.4-32-32-32h-224v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-224c-17.602 0-32 14.4-32 32v640c0 17.6 14.398 32 32 32h288v192h640v-704h-192zM384 64.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 256v-64h512v64h-512zM960 960h-512v-576h512v576z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"pastetext\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57397,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M1024 0v384l-138.26-138.26-212 212-107.48-107.48 212-212-138.26-138.26zM245.74 138.26l212 212-107.48 107.48-212-212-138.26 138.26v-384h384zM885.74 778.26l138.26-138.26v384h-384l138.26-138.26-212-212 107.48-107.48zM457.74 673.74l-212 212 138.26 138.26h-384v-384l138.26 138.26 212-212z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"fullscreen\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57379,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M256 64h512v128h-512zM960 256h-896c-35.2 0-64 28.8-64 64v320c0 35.2 28.796 64 64 64h192v256h512v-256h192c35.2 0 64-28.8 64-64v-320c0-35.2-28.8-64-64-64zM704 896h-384v-320h384v320zM974.4 352c0 25.626-20.774 46.4-46.398 46.4-25.626 0-46.402-20.774-46.402-46.4s20.776-46.4 46.402-46.4c25.626 0 46.398 20.774 46.398 46.4z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"print\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57378,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M512 0c-282.77 0-512 229.228-512 512 0 282.77 229.228 512 512 512 282.77 0 512-229.23 512-512 0-282.772-229.23-512-512-512zM512 944c-238.586 0-432-193.412-432-432 0-238.586 193.414-432 432-432 238.59 0 432 193.414 432 432 0 238.588-193.41 432-432 432zM384 320c0 35.346-28.654 64-64 64s-64-28.654-64-64 28.654-64 64-64 64 28.654 64 64zM768 320c0 35.346-28.652 64-64 64s-64-28.654-64-64 28.652-64 64-64 64 28.654 64 64zM512 652c141.074 0 262.688-57.532 318.462-123.192-20.872 171.22-156.288 303.192-318.462 303.192-162.118 0-297.498-132.026-318.444-303.168 55.786 65.646 177.386 123.168 318.444 123.168z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"emoticons\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57377,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M225 448c123.712 0 224 100.29 224 224 0 123.712-100.288 224-224 224-123.712 0-224-100.288-224-224l-1-32c0-247.424 200.576-448 448-448v128c-85.474 0-165.834 33.286-226.274 93.726-11.634 11.636-22.252 24.016-31.83 37.020 11.438-1.8 23.16-2.746 35.104-2.746zM801 448c123.71 0 224 100.29 224 224 0 123.712-100.29 224-224 224-123.71 0-224-100.288-224-224l-1-32c0-247.424 200.576-448 448-448v128c-85.474 0-165.834 33.286-226.274 93.726-11.636 11.636-22.254 24.016-31.832 37.020 11.44-1.8 23.16-2.746 35.106-2.746z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"blockquote\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57358,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M761.862 1024c113.726-206.032 132.888-520.306-313.862-509.824v253.824l-384-384 384-384v248.372c534.962-13.942 594.57 472.214 313.862 775.628z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"undo\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57359,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M576 248.372v-248.372l384 384-384 384v-253.824c-446.75-10.482-427.588 303.792-313.86 509.824-280.712-303.414-221.1-789.57 313.86-775.628z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"redo\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57360,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M199.995 381.998v-104.002c0-43.078 34.923-78.001 78.001-78.001h26v-104.002h-26c-100.518 0-182.003 81.485-182.003 182.003v104.002c0 43.078-34.923 78.001-78.001 78.001h-26v104.002h26c43.078 0 78.001 34.923 78.001 78.001v104.002c0 100.515 81.485 182.003 182.003 182.003h26v-104.002h-26c-43.078 0-78.001-34.923-78.001-78.001v-104.002c0-50.931-20.928-96.966-54.646-130.002 33.716-33.036 54.646-79.072 54.646-130.002z\",\n\t\t\t\t\"M824.005 381.998v-104.002c0-43.078-34.923-78.001-78.001-78.001h-26v-104.002h26c100.515 0 182.003 81.485 182.003 182.003v104.002c0 43.078 34.923 78.001 78.001 78.001h26v104.002h-26c-43.078 0-78.001 34.923-78.001 78.001v104.002c0 100.515-81.488 182.003-182.003 182.003h-26v-104.002h26c43.078 0 78.001-34.923 78.001-78.001v-104.002c0-50.931 20.928-96.966 54.646-130.002-33.716-33.036-54.646-79.072-54.646-130.002z\",\n\t\t\t\t\"M616.002 356.715c0 57.439-46.562 104.002-104.002 104.002s-104.002-46.562-104.002-104.002c0-57.439 46.562-104.002 104.002-104.002s104.002 46.562 104.002 104.002z\",\n\t\t\t\t\"M512 511.283c-57.439 0-104.002 46.562-104.002 104.002 0 55.845 26 100.115 105.752 103.88-23.719 33.417-59.441 46.612-105.752 50.944v61.751c0 0 208.003 18.144 208.003-216.577-0.202-57.441-46.56-104.004-104.002-104.004z\"\n\t\t\t],\n\t\t\t\"width\": 1024,\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"code\",\n\t\t\t\t\"semicolon\",\n\t\t\t\t\"curly-braces\"\n\t\t\t],\n\t\t\t\"grid\": 16,\n\t\t\t\"defaultCode\": 58883\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M864.626 473.162c-65.754-183.44-205.11-348.15-352.626-473.162-147.516 125.012-286.87 289.722-352.626 473.162-40.664 113.436-44.682 236.562 12.584 345.4 65.846 125.14 198.632 205.438 340.042 205.438s274.196-80.298 340.040-205.44c57.27-108.838 53.25-231.962 12.586-345.398zM738.764 758.956c-43.802 83.252-132.812 137.044-226.764 137.044-55.12 0-108.524-18.536-152.112-50.652 13.242 1.724 26.632 2.652 40.112 2.652 117.426 0 228.668-67.214 283.402-171.242 44.878-85.292 40.978-173.848 23.882-244.338 14.558 28.15 26.906 56.198 36.848 83.932 22.606 63.062 40.024 156.34-5.368 242.604z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"drop\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57381,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M768 128h-512l-256 256 512 576 512-576-256-256zM512 778.666v-2.666h-2.37l-14.222-16h16.592v-16h-30.814l-14.222-16h45.036v-16h-59.258l-14.222-16h73.48v-16h-87.704l-14.222-16h101.926v-16h-116.148l-14.222-16h130.37v-16h-144.592l-14.222-16h158.814v-16h-173.038l-14.222-16h187.26v-16h-201.482l-14.222-16h215.704v-16h-229.926l-14.222-16h244.148v-16h-258.372l-14.222-16h272.594v-16h-286.816l-14.222-16h301.038v-16h-315.26l-14.222-16h329.482v-16h-343.706l-7.344-8.262 139.072-139.072h211.978v3.334h215.314l16 16h-231.314v16h247.314l16 16h-263.314v16h279.314l16 16h-295.314v16h311.314l16 16h-327.314v16h343.312l7.738 7.738-351.050 394.928z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"diamond\",\n\t\t\t\t\"gem\",\n\t\t\t\t\"jewelry\",\n\t\t\t\t\"dualtone\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57889,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM128 512c0-212.078 171.922-384 384-384v768c-212.078 0-384-171.922-384-384z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"contrast\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58104,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M893.254 221.254l-90.508-90.508-290.746 290.744-290.746-290.744-90.508 90.506 290.746 290.748-290.746 290.746 90.508 90.508 290.746-290.746 290.746 290.746 90.508-90.51-290.744-290.744z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"cross\",\n\t\t\t\t\"cancel\",\n\t\t\t\t\"close\",\n\t\t\t\t\"quit\",\n\t\t\t\t\"remove\"\n\t\t\t],\n\t\t\t\"defaultCode\": 60778,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v384c0 35.346 28.654 64 64 64s64-28.654 64-64v-229.488l677.488 677.488h-229.488c-35.346 0-64 28.652-64 64 0 35.346 28.654 64 64 64h384c35.346 0 64-28.654 64-64v-384c0-35.348-28.654-64-64-64s-64 28.652-64 64v229.488l-677.488-677.488h229.488c35.346 0 64-28.654 64-64s-28.652-64-64-64h-384c-35.346 0-64 28.654-64 64z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"arrow-resize\",\n\t\t\t\t\"diagonal\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58329,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M483.2 640l-147.2-336c-9.6-25.6-19.2-44.8-25.6-54.4s-16-12.8-25.6-12.8c-16 0-25.6 3.2-28.8 3.2v-70.4c9.6-6.4 25.6-6.4 38.4-9.6 32 0 57.6 6.4 73.6 22.4 6.4 6.4 12.8 16 19.2 25.6 6.4 12.8 12.8 25.6 16 41.6l121.6 291.2 150.4-371.2h92.8l-198.4 470.4v224h-86.4v-224z\",\n\t\t\t\t\"M0 0v1024h1024v-1024h-1024zM960 960h-896v-896h896v896z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"gamma2\"\n\t\t\t],\n\t\t\t\"grid\": 16,\n\t\t\t\"defaultCode\": 58880\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M627.2 880h-579.2v-396.8h579.2v396.8zM553.6 553.6h-435.2v256h435.2v-256z\",\n\t\t\t\t\"M259.2 227.2c176-176 457.6-176 633.6 0s176 457.6 0 633.6c-121.6 121.6-297.6 160-454.4 108.8 121.6 28.8 262.4-9.6 361.6-108.8 150.4-150.4 160-384 22.4-521.6-121.6-121.6-320-128-470.4-19.2l86.4 86.4-294.4 22.4 22.4-294.4 92.8 92.8z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"orientation\"\n\t\t\t],\n\t\t\t\"grid\": 16,\n\t\t\t\"defaultCode\": 58881\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M768 544v352h-640v-640h352l128-128h-512c-52.8 0-96 43.2-96 96v704c0 52.8 43.2 96 96 96h704c52.798 0 96-43.2 96-96v-512l-128 128z\",\n\t\t\t\t\"M864 0l-608 608v160h160l608-608c0-96-64-160-160-160zM416 640l-48-48 480-480 48 48-480 480z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"pencil\",\n\t\t\t\t\"write\",\n\t\t\t\t\"edit\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57361,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M607.998 128.014c-212.070 0-383.986 171.916-383.986 383.986h-191.994l246.848 246.848 246.848-246.848h-191.994c0-151.478 122.798-274.276 274.276-274.276 151.48 0 274.276 122.798 274.276 274.276 0 151.48-122.796 274.276-274.276 274.276v109.71c212.070 0 383.986-171.916 383.986-383.986s-171.916-383.986-383.986-383.986z\"\n\t\t\t],\n\t\t\t\"width\": 1024,\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"rotate-ccw\",\n\t\t\t\t\"ccw\",\n\t\t\t\t\"arrow\"\n\t\t\t],\n\t\t\t\"defaultCode\": 60072,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M416.002 128.014c212.070 0 383.986 171.916 383.986 383.986h191.994l-246.848 246.848-246.848-246.848h191.994c0-151.478-122.798-274.276-274.276-274.276-151.48 0-274.276 122.798-274.276 274.276 0 151.48 122.796 274.276 274.276 274.276v109.71c-212.070 0-383.986-171.916-383.986-383.986s171.916-383.986 383.986-383.986z\"\n\t\t\t],\n\t\t\t\"width\": 1024,\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"rotate-cw\",\n\t\t\t\t\"cw\",\n\t\t\t\t\"arrow\"\n\t\t\t],\n\t\t\t\"defaultCode\": 60073,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 384h1024v-384zM1024 960v-384h-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"flip-vertical\",\n\t\t\t\t\"mirror\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57663,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M576 0v1024h384zM0 1024h384v-1024z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"flip-horizontal\",\n\t\t\t\t\"mirror\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57664,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M992.262 871.396l-242.552-206.294c-25.074-22.566-51.89-32.926-73.552-31.926 57.256-67.068 91.842-154.078 91.842-249.176 0-212.078-171.922-384-384-384-212.076 0-384 171.922-384 384 0 212.078 171.922 384 384 384 95.098 0 182.108-34.586 249.176-91.844-1 21.662 9.36 48.478 31.926 73.552l206.294 242.552c35.322 39.246 93.022 42.554 128.22 7.356s31.892-92.898-7.354-128.22zM384 640c-141.384 0-256-114.616-256-256s114.616-256 256-256 256 114.616 256 256-114.614 256-256 256zM448 192h-128v128h-128v128h128v128h128v-128h128v-128h-128z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"zoom-in\",\n\t\t\t\t\"magnifier\",\n\t\t\t\t\"magnifier-plus\",\n\t\t\t\t\"enlarge\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57788,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M992.262 871.396l-242.552-206.294c-25.074-22.566-51.89-32.926-73.552-31.926 57.256-67.068 91.842-154.078 91.842-249.176 0-212.078-171.922-384-384-384-212.076 0-384 171.922-384 384 0 212.078 171.922 384 384 384 95.098 0 182.108-34.586 249.176-91.844-1 21.662 9.36 48.478 31.926 73.552l206.294 242.552c35.322 39.246 93.022 42.554 128.22 7.356s31.892-92.898-7.354-128.22zM384 640c-141.384 0-256-114.616-256-256s114.616-256 256-256 256 114.616 256 256-114.614 256-256 256zM192 320h384v128h-384z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"zoom-out\",\n\t\t\t\t\"magnifier\",\n\t\t\t\t\"magnifier-minus\",\n\t\t\t\t\"reduce\"\n\t\t\t],\n\t\t\t\"defaultCode\": 57789,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M64 192h896v192h-896zM64 448h896v192h-896zM64 704h896v192h-896z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"menu\",\n\t\t\t\t\"list\",\n\t\t\t\t\"options\",\n\t\t\t\t\"lines\",\n\t\t\t\t\"hamburger\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58031,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M512 832c35.346 0 64 28.654 64 64v64c0 35.346-28.654 64-64 64s-64-28.654-64-64v-64c0-35.346 28.654-64 64-64zM512 192c-35.346 0-64-28.654-64-64v-64c0-35.346 28.654-64 64-64s64 28.654 64 64v64c0 35.346-28.654 64-64 64zM960 448c35.346 0 64 28.654 64 64s-28.654 64-64 64h-64c-35.348 0-64-28.654-64-64s28.652-64 64-64h64zM192 512c0 35.346-28.654 64-64 64h-64c-35.346 0-64-28.654-64-64s28.654-64 64-64h64c35.346 0 64 28.654 64 64zM828.784 738.274l45.256 45.258c24.992 24.99 24.992 65.516 0 90.508-24.994 24.992-65.518 24.992-90.51 0l-45.256-45.256c-24.992-24.99-24.992-65.516 0-90.51 24.994-24.992 65.518-24.992 90.51-0zM195.216 285.726l-45.256-45.256c-24.994-24.994-24.994-65.516 0-90.51s65.516-24.994 90.51 0l45.256 45.256c24.994 24.994 24.994 65.516 0 90.51s-65.516 24.994-90.51 0zM828.784 285.726c-24.992 24.992-65.516 24.992-90.51 0-24.992-24.994-24.992-65.516 0-90.51l45.256-45.254c24.992-24.994 65.516-24.994 90.51 0 24.992 24.994 24.992 65.516 0 90.51l-45.256 45.254zM195.216 738.274c24.992-24.992 65.518-24.992 90.508 0 24.994 24.994 24.994 65.52 0 90.51l-45.254 45.256c-24.994 24.992-65.516 24.992-90.51 0s-24.994-65.518 0-90.508l45.256-45.258z\",\n\t\t\t\t\"M512 256c-141.384 0-256 114.616-256 256 0 141.382 114.616 256 256 256 141.382 0 256-114.618 256-256 0-141.384-114.616-256-256-256zM512 672c-88.366 0-160-71.634-160-160s71.634-160 160-160 160 71.634 160 160-71.634 160-160 160z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"sun\",\n\t\t\t\t\"weather\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58094,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M715.812 64.48c-60.25-34.784-124.618-55.904-189.572-64.48 122.936 160.082 144.768 384.762 37.574 570.42-107.2 185.67-312.688 279.112-512.788 252.68 39.898 51.958 90.376 97.146 150.628 131.934 245.908 141.974 560.37 57.72 702.344-188.198 141.988-245.924 57.732-560.372-188.186-702.356z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"moon\",\n\t\t\t\t\"night\",\n\t\t\t\t\"sleep\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58105,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M672 1024l192-192-320-320 320-320-192-192-512 512z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"arrow-left\",\n\t\t\t\t\"left\",\n\t\t\t\t\"previous\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58291,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M832 256l192-192-64-64-192 192h-448v-192h-128v192h-192v128h192v512h512v192h128v-192h192v-128h-192v-448zM320 320h320l-320 320v-320zM384 704l320-320v320h-320z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"crop\",\n\t\t\t\t\"resize\",\n\t\t\t\t\"cut\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58428,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v896h1024v-896h-1024zM640 704v192h-256v-192h256zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192zM704 896v-192h256v192h-256z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tablerowprops\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58880,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v896h1024v-896h-1024zM640 704v192h-256v-192h256zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM64 448h256v192h-256v-192zM704 448h256v192h-256v-192zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192zM704 896v-192h256v192h-256z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tablecellprops\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58881,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v832h1024v-832h-1024zM320 832h-256v-192h256v192zM320 576h-256v-192h256v192zM640 832h-256v-192h256v192zM640 576h-256v-192h256v192zM960 832h-256v-192h256v192zM960 576h-256v-192h256v192zM960 320h-896v-192h896v192z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"table2\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58882,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v896h1024v-896h-1024zM384 896v-448h576v448h-576zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM64 448h256v192h-256v-192zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tablemergecells\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58884,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M320 771.2v-182.4h-182.4v-89.6h182.4v-182.4h86.4v182.4h185.6v89.6h-185.6v182.4zM0 64v896h1024v-896h-1024zM640 896h-576v-704h576v704zM960 896h-256v-192h256v192zM960 640h-256v-192h256v192zM960 384h-256v-192h256v192z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tableinsertcolbefore\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58885,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M704 316.8v182.4h182.4v89.6h-182.4v182.4h-86.4v-182.4h-185.6v-89.6h185.6v-182.4zM0 64v896h1024v-896h-1024zM320 896h-256v-192h256v192zM320 640h-256v-192h256v192zM320 384h-256v-192h256v192zM960 896h-576v-704h576v704z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tableinsertcolafter\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58886,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M691.2 451.2h-144v144h-70.4v-144h-144v-67.2h144v-144h70.4v144h144zM0 64v896h1024v-896h-1024zM320 896h-256v-192h256v192zM640 896h-256v-192h256v192zM960 896h-256v-192h256v192zM960 643.2h-896v-451.2h896v451.2z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tableinsertrowbefore\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58887,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M332.8 636.8h144v-144h70.4v144h144v67.2h-144v144h-70.4v-144h-144zM0 64v896h1024v-896h-1024zM384 192h256v192h-256v-192zM64 192h256v192h-256v-192zM960 896h-896v-451.2h896v451.2zM960 384h-256v-192h256v192z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tableinsertrowafter\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58888,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v896h1024v-896h-1024zM384 192h256v192h-256v-192zM320 896h-256v-192h256v192zM320 640h-256v-192h256v192zM320 384h-256v-192h256v192zM960 896h-576v-448h576v448zM960 384h-256v-192h256v192zM864 803.2l-60.8 60.8-131.2-131.2-131.2 131.2-60.8-60.8 131.2-131.2-131.2-131.2 60.8-60.8 131.2 131.2 131.2-131.2 60.8 60.8-131.2 131.2z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tablesplitcells\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58890,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64h1024v896h-1024v-896zM60.8 192v704h899.2v-704h-899.2zM809.6 748.8l-96 96-204.8-204.8-204.8 204.8-96-96 204.8-204.8-204.8-204.8 96-96 204.8 204.8 204.8-204.8 96 96-204.8 204.8z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tabledelete\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58891,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v832h1024v-832h-1024zM640 832h-256v-192h256v192zM640 576h-256v-192h256v192zM640 320h-256v-192h256v192zM960 832h-256v-192h256v192zM960 576h-256v-192h256v192zM960 320h-256v-192h256v192z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tableleftheader\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58922,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M0 64v832h1024v-832h-1024zM320 832h-256v-192h256v192zM320 576h-256v-192h256v192zM640 832h-256v-192h256v192zM640 576h-256v-192h256v192zM960 832h-256v-192h256v192zM960 576h-256v-192h256v192z\"\n\t\t\t],\n\t\t\t\"attrs\": [\n\t\t\t\t{\n\t\t\t\t\t\"fill\": \"rgb(0, 0, 0)\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"tags\": [\n\t\t\t\t\"tabletopheader\"\n\t\t\t],\n\t\t\t\"defaultCode\": 58923,\n\t\t\t\"grid\": 16\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M886.4 387.2l-156.8 156.8 160 160-76.8 76.8-160-160-156.8 156.8-76.8-73.6 160-160-163.2-163.2 76.8-76.8 163.2 163.2 156.8-156.8 73.6 76.8zM0 64v896h1024v-896h-1024zM960 384h-22.4l-64 64h86.4v192h-89.6l64 64h25.6v192h-896v-192h310.4l64-64h-374.4v-192h371.2l-64-64h-307.2v-192h896v192z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"grid\": 16,\n\t\t\t\"tags\": [\n\t\t\t\t\"tabledeleterow\"\n\t\t\t],\n\t\t\t\"defaultCode\": 59392\n\t\t},\n\t\t{\n\t\t\t\"paths\": [\n\t\t\t\t\"M320 460.8l64 64v12.8l-64 64v-140.8zM640 537.6l64 64v-137.6l-64 64v9.6zM1024 64v896h-1024v-896h1024zM960 192h-256v51.2l-12.8-12.8-51.2 51.2v-89.6h-256v89.6l-51.2-51.2-12.8 12.8v-51.2h-256v704h256v-118.4l35.2 35.2 28.8-28.8v115.2h256v-115.2l48 48 16-16v83.2h256v-707.2zM672 297.6l-156.8 156.8-163.2-163.2-76.8 76.8 163.2 163.2-156.8 156.8 76.8 76.8 156.8-156.8 160 160 76.8-76.8-160-160 156.8-156.8-76.8-76.8z\"\n\t\t\t],\n\t\t\t\"attrs\": [],\n\t\t\t\"isMulticolor\": false,\n\t\t\t\"grid\": 16,\n\t\t\t\"tags\": [\n\t\t\t\t\"tabledeletecol\"\n\t\t\t],\n\t\t\t\"defaultCode\": 59393\n\t\t}\n\t],\n\t\"preferences\": {\n\t\t\"showGlyphs\": true,\n\t\t\"showQuickUse\": true,\n\t\t\"showQuickUse2\": true,\n\t\t\"showSVGs\": true,\n\t\t\"fontPref\": {\n\t\t\t\"prefix\": \"icon-\",\n\t\t\t\"metadata\": {\n\t\t\t\t\"fontFamily\": \"tinymce\",\n\t\t\t\t\"majorVersion\": 1,\n\t\t\t\t\"minorVersion\": 0\n\t\t\t},\n\t\t\t\"metrics\": {\n\t\t\t\t\"emSize\": 1024,\n\t\t\t\t\"baseline\": 6.25,\n\t\t\t\t\"whitespace\": 50\n\t\t\t},\n\t\t\t\"resetPoint\": 58880,\n\t\t\t\"embed\": false\n\t\t},\n\t\t\"imagePref\": {\n\t\t\t\"prefix\": \"icon-\",\n\t\t\t\"png\": true,\n\t\t\t\"useClassSelector\": true,\n\t\t\t\"color\": 4473924,\n\t\t\t\"bgColor\": 16777215\n\t\t},\n\t\t\"historySize\": 100,\n\t\t\"gridSize\": 16,\n\t\t\"showGrid\": true,\n\t\t\"showCodes\": true,\n\t\t\"showLiga\": false\n\t},\n\t\"IcoMoonType\": \"icon-set\"\n}"
  },
  {
    "path": "static/tinymce/js/tinymce/skins/myskin/skin.json",
    "content": "{\r\n\t\"skin-name\": \"myskin\",\r\n\t\"preview-bg\": \"#666666\",\r\n\t\"text\": \"#b5b9bf\",\r\n\t\"text-inverse\": \"#000000\",\r\n\t\"text-disabled\": \"#6e737a\",\r\n\t\"has-gradients\": true,\r\n\t\"has-radius\": true,\r\n\t\"has-boxshadow\": true,\r\n\t\"has-button-borders\": true,\r\n\t\"btn-text\": \"#b5b9bf\",\r\n\t\"btn-text-shadow\": \"#000000\",\r\n\t\"btn-bg\": \"#515c67\",\r\n\t\"btn-bg-hlight\": \"#454f59\",\r\n\t\"btn-border-top\": \"rgba(32,42,51,1)\",\r\n\t\"btn-border-right\": \"rgba(32,42,51,1)\",\r\n\t\"btn-border-bottom\": \"rgba(32,42,51,1)\",\r\n\t\"btn-border-left\": \"rgba(32,42,51,1)\",\r\n\t\"btn-split-border\": \"#202a33\",\r\n\t\"btn-primary-text\": \"#ffffff\",\r\n\t\"btn-primary-text-shadow\": \"#333333\",\r\n\t\"btn-primary-bg\": \"#006fa6\",\r\n\t\"btn-primary-bg-hlight\": \"#005580\",\r\n\t\"btn-padding\": \"4px 10px\",\r\n\t\"menu-bg\": \"#2f3740\",\r\n\t\"menu-border\": \"#202a33\",\r\n\t\"menuitem-text\": \"#dddddd\",\r\n\t\"menuitem-bg-selected\": \"#006fa6\",\r\n\t\"menuitem-bg-selected-hlight\": \"#005580\",\r\n\t\"menuitem-separator-top\": \"#25313f\",\r\n\t\"menuitem-separator-bottom\": \"#424f5f\",\r\n\t\"menuitem-text-inverse\": \"#ffffff\",\r\n\t\"menuitem-bg-active\": \"#0085c7\",\r\n\t\"menuitem-text-active\": \"#ffffff\",\r\n\t\"menuitem-preview-border-active\": \"#08608c\",\r\n\t\"menubar-menubtn-text\": \"#b5b9bf\",\r\n\t\"checkbox-border\": \"#202a33\",\r\n\t\"checkbox-border-focus\": \"#1e7dad\",\r\n\t\"panel-border\": \"#232b33\",\r\n\t\"panel-bg\": \"#404952\",\r\n\t\"panel-bg-hlight\": \"#404952\",\r\n\t\"textbox-bg\": \"#515c67\",\r\n\t\"textbox-border\": \"#202a33\",\r\n\t\"textbox-border-focus\": \"#1e7dad\",\r\n\t\"window-bg\": \"#404952\",\r\n\t\"window-border\": \"#9e9e9e\",\r\n\t\"tab-bg\": \"#303942\",\r\n\t\"tab-bg-hover\": \"#404952\",\r\n\t\"tab-bg-active\": \"#404952\",\r\n\t\"tab-border\": \"#202a33\",\r\n\t\"tabs-bg\": \"#303942\",\r\n\t\"notification-bg\": \"#f0f0f0\",\r\n\t\"notification-border\": \"#cccccc\",\r\n\t\"notification-text\": \"#333333\",\r\n\t\"notification-success-bg\": \"#dff0d8\",\r\n\t\"notification-success-border\": \"#d6e9c6\",\r\n\t\"notification-success-text\": \"#3c763d\",\r\n\t\"notification-info-bg\": \"#d9edf7\",\r\n\t\"notification-info-border\": \"#779ecb\",\r\n\t\"notification-info-text\": \"#31708f\",\r\n\t\"notification-warning-bg\": \"#fcf8e3\",\r\n\t\"notification-warning-border\": \"#faebcc\",\r\n\t\"notification-warning-text\": \"#8a6d3b\",\r\n\t\"notification-error-bg\": \"#f2dede\",\r\n\t\"notification-error-border\": \"#ebccd1\",\r\n\t\"notification-error-text\": \"#a94442\",\r\n\t\"progress-bar-bg\": \"#515c67\",\r\n\t\"progress-bar-bg-hlight\": \"#515c67\",\r\n\t\"progress-border\": \"#202a33\",\r\n\t\"progress-text\": \"#c4c4c4\",\r\n\t\"progress-text-shadow\": \"#000000\",\r\n\t\"slider-bg\": \"#515c67\",\r\n\t\"slider-border\": \"#202a33\",\r\n\t\"slider-handle-bg\": \"#454f59\",\r\n\t\"slider-handle-border\": \"#000000\",\r\n\t\"colorbtn-backcolor-bg\": \"#384552\",\r\n\t\"grid-border\": \"#d6d6d6\",\r\n\t\"grid-border-active\": \"#d6d6d6\"\r\n}"
  },
  {
    "path": "template/403.html",
    "content": "{% extends 'base.html' %}\n\n{% block title %}\n    禁止访问\n{% end %}\n{% block content %}\n<div class=\"page-header\">\n    <h1>亲，您没有访问的权限哦！</h1>\n</div>\n{% end %}\n"
  },
  {
    "path": "template/404.html",
    "content": "{% extends 'base.html' %}\n\n{% block title %}\n    无法找到该页面\n{% end %}\n{% block content %}\n<div class=\"page-header\">\n    <h1>嘿嘿，您要找的页面不存在哦！</h1>\n</div>\n{% end %}\n"
  },
  {
    "path": "template/500.html",
    "content": "{% extends 'base.html' %}\n\n{% block title %}\n    服务器内部错误\n{% end %}\n{% block content %}\n<div class=\"page-header\">\n    <h1>不好意思，服务器开小差了！</h1>\n</div>\n{% end %}\n"
  },
  {
    "path": "template/_article_comments.html",
    "content": "<ul class=\"comments\">\n    {% if comments_pager and comments_pager.result %}\n        {% for comment in comments_pager.result %}\n        <li class=\"comment\">\n            {% if comment.comment_type == Constants.COMMENT_TYPE_REPLY %}\n                <p class=\"comment-reply-info\">\n                    <span class=\"glyphicon glyphicon-envelope\"></span>\n                    回复给<strong><i>{{ comment.reply_to_floor }}：</i></strong>\n                </p>\n            {% end %}\n            <div class=\"comment-thumbnail\">\n                <img class=\"img-rounded profile-thumbnail\" src=\"{{ handler.get_gravatar_url(comment.author_email) }}\">\n                <strong class=\"comment-floor\">{{comment.floor}}楼</strong>\n            </div>\n            <div class=\"comment-info\">\n                <div class=\"comment-date\"><span>{{ comment.create_time.strftime(\"%Y年%m月%d日 %H:%M:%S\") }}</span></div>\n                <div class=\"comment-author\">\n                    <span>{{ comment.author_name }}</span>\n                    {% if comment.rank == Constants.COMMENT_RANK_ADMIN %}\n                        <span class=\"glyphicon glyphicon-user\">管理员</span>\n                    {% end %}\n                </div>\n                <div class=\"comment-content\">\n                    {% if not comment.disabled or current_user %}\n                    <p>{{ comment.content }}</p>\n                    {% end %}\n                    {% if comment.disabled and current_user %}\n                    <p class=\"disabled-comment-admin-info\">\n                        <span class=\"glyphicon glyphicon-remove-sign\"></span>\n                        <i>该评论已经被管理员屏蔽！访客无法查看和回复此评论内容。</i>\n                    </p>\n                    {% elif comment.disabled %}\n                    <p class=\"disabled-comment-admin-info\">\n                        <span class=\"glyphicon glyphicon-remove-sign\"></span>\n                        <i>该评论已经被管理员屏蔽！</i>\n                    </p>\n                    {% end %}\n                </div>\n            </div>\n            <div class=\"row comment-handle\">\n                {% if current_user %}\n                <div class=\"col-sm-1 col-sm-offset-8\">\n                    {% if not comment.disabled %}\n                    <button class=\"btn btn-sm btn-warning\" onclick=\"update_disable('{{ reverse_url(\"admin.comment.update\", article.id, comment.id, \"disable\")}}')\">\n                        <span class=\"glyphicon glyphicon-remove-sign\" ></span> 屏蔽\n                    </button>\n                    {% else %}\n                    <button class=\"btn btn-sm btn-success\" onclick=\"update_disable('{{ reverse_url(\"admin.comment.update\", article.id, comment.id, \"enable\")}}')\">\n                        <span class=\"glyphicon glyphicon-ok-sign\"></span> 恢复\n                    </button>\n                    {% end %}\n                </div>\n                <div class=\"col-sm-1 delete-comment\">\n                    <button class=\"btn btn-sm btn-danger\" onclick=\"delCommentCfm('{{ reverse_url(\"admin.comment.update\", article.id, comment.id, \"delete\")}}')\">\n                        <span class=\"glyphicon glyphicon-trash\"></span> 删除\n                    </button>\n                </div>\n                {% end %}\n                {% if not comment.disabled or current_user %}\n                <div class=\"col-sm-1 {% if not current_user %}col-sm-offset-10{% end %}\">\n                    <button class=\"btn btn-sm btn-info\" onclick=\"go_to_reply('{{Constants.COMMENT_TYPE_REPLY}}', {{comment.id}}, '{{comment.floor}}楼')\">\n                        <span class=\"glyphicon glyphicon-comment\"></span> 回复\n                    </button>\n                </div>\n                {% end %}\n            </div>\n        </li>\n        {% end %}\n    {% else %}\n        <li class=\"comment\">\n            <div class=\"comment-content\">暂无评论</div>\n        </li>\n    {% end %}\n</ul>\n\n<!-- 信息删除确认: For delete a comment confirm -->\n<div class=\"modal fade\" id=\"delCommentCfmModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">确认删除评论？</h4>\n            </div>\n            <div class=\"modal-body\">\n                <p>\n                    将该评论删除后不可恢复，您确认要删除吗？\n                </p>\n                <p>\n                    （提示：如果您只是不想显示该评论内容，可以选择将其屏蔽，而不必删除。）\n                </p>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                <button id=\"delCommentCfmClick\" class=\"btn btn-success\" data-dismiss=\"modal\">确定</button>\n            </div>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->"
  },
  {
    "path": "template/_macros.html",
    "content": "<div class=\"pagination\">\n    <ul class=\"pagination\">\n        <li {% if not pager.has_prev() %} class=\"disabled\" {% end %}>\n            <a href=\"{% if pager.has_prev() %}{{ pager.build_url(url, pager.pageNo-1, params) }}{% else %}#{% end %}\">\n                &laquo;\n            </a>\n        </li>\n\n        {% if pager.totalPage <= 8 %}\n            {% for p in range(1, pager.totalPage+1) %}\n                <li {% if p == pager.pageNo %} class=\"active\" {% end %}>\n                    <a href=\"{{ pager.build_url(url, p, params) }}\">{{ p }}</a>\n                </li>\n            {% end %}\n        {% else %}\n            {% if pager.pageNo <= 5 %}\n                {% for p in range(1, 6) %}\n                    <li {% if p == pager.pageNo %} class=\"active\" {% end %}>\n                        <a href=\"{{ pager.build_url(url, p, params) }}\">{{ p }}</a>\n                    </li>\n                {% end %}\n            {% else %}\n                {% for p in range(1, 3) %}\n                    <li>\n                        <a href=\"{{ pager.build_url(url, p, params) }}\">{{ p }}</a>\n                    </li>\n                {% end %}\n                    <li class=\"disabled\"><a href=\"#\">&hellip;</a></li>\n                {% for p in range(pager.pageNo-2, pager.pageNo+1) %}\n                    <li {% if p == pager.pageNo %} class=\"active\" {% end %}>\n                        <a href=\"{{ pager.build_url(url, p, params) }}\">{{ p }}</a>\n                    </li>\n                {% end %}\n            {% end %}\n\n            {% if pager.pageNo >= pager.totalPage-3 %}\n                {% for p in range(pager.pageNo+1, pager.totalPage+1) %}\n                    <li>\n                        <a href=\"{{ pager.build_url(url, p, params) }}\">{{ p }}</a>\n                    </li>\n                {% end %}\n            {% else %}\n                {% for p in range(pager.pageNo+1 if pager.pageNo > 5 else 6, pager.pageNo+3) %}\n                    <li>\n                        <a href=\"{{ pager.build_url(url, p, params) }}\">{{ p }}</a>\n                    </li>\n                {% end %}\n                <li class=\"disabled\"><a href=\"#\">&hellip;</a></li>\n                <li>\n                    <a href=\"{{ pager.build_url(url, pager.totalPage, params) }}\">{{ pager.totalPage }}</a>\n                </li>\n            {% end %}\n        {% end %}\n        <li {% if not pager.has_next() %} class=\"disabled\" {% end %}>\n            <a href=\"{% if pager.has_next() %}{{ pager.build_url(url, pager.pageNo+1, params) }}{% else %}#{% end %}\">\n                &raquo;\n            </a>\n        </li>\n    </ul>\n</div>"
  },
  {
    "path": "template/admin/admin_account.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block admin_content %}\n<div class=\"entry-box account\">\n    <h4><strong><i>{{ current_user.name }}</i>，欢迎来到blog_xtg管理平台！</strong></h4>\n    <hr/>\n    <div class=\"user-info\">\n        <img class=\"img-rounded profile-thumbnail\" src=\"{{ handler.get_gravatar_url(current_user.email, size=120) }}\">\n        <div class=\"profile-header\">\n            <h5>昵称：</h5>\n            <h4 class=\"username\">{{ current_user.name }}</h4>\n            <h5>电子邮件：</h5>\n            <h4 class=\"email\">{{ current_user.email }}</h4>\n            <a class=\"btn btn-sm btn-danger\" onclick=\"changePassword()\">\n                修改密码\n            </a>\n            <a class=\"btn btn-sm btn-info\" onclick=\"editUserInfo()\">\n                修改信息\n            </a>\n        </div>\n    </div>\n</div>\n\n<!-- 信息确认: For change password form-->\n<div class=\"modal fade\" id=\"changePasswordFormModal\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\" id=\"NavModalTitle\"></h4>\n            </div>\n            <form id=\"changePasswordForm\" method=\"post\" onsubmit=\"return checkChangePasswordForm()\"\n                  action=\"{{ reverse_url('admin.account.update', 'change-password') }}\">\n                <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            {% module xsrf_form_html() %}\n                            <label for=\"old_password\">原密码</label>\n                            <input class=\"form-control\" id=\"old_password\" required name=\"old_password\" type=\"password\" >\n                            <label for=\"password\">新密码</label>\n                            <input class=\"form-control\" id=\"password\" required name=\"password\" type=\"password\" >\n                        </div>\n                        <div id=\"group_password2\" class=\"form-group\">\n                            <label for=\"password2\">新密码确认</label>\n                            <input class=\"form-control\" id=\"password2\" required name=\"password2\" type=\"password\" >\n                            <span id=\"password2_err\" class=\"help-block\" style=\"display: none\">两次密码不一致</span>\n                        </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button id=\"changePasswordCfmClick\" type=\"submit\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n\n<!-- 信息确认: For edit user info form-->\n<div class=\"modal fade\" id=\"editUserInfoFormModal\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\" id=\"NavModalTitle\"></h4>\n            </div>\n            <form id=\"editUserInfoForm\" method=\"post\"\n                  action=\"{{ reverse_url('admin.account.update', 'edit-user-info') }}\">\n                <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            {% module xsrf_form_html() %}\n                            <label for=\"username\">昵称</label>\n                            <input class=\"form-control\" id=\"username\" required name=\"username\"  type=\"text\" value=\"{{current_user.name}}\">\n                            <label for=\"email\">email</label>\n                            <input class=\"form-control\" id=\"email\" required name=\"email\" type=\"text\" value=\"{{current_user.email}}\">\n                            <label for=\"password\">密码确认</label>\n                            <input class=\"form-control\" id=\"password\" required name=\"password\" type=\"text\" >\n                        </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button id=\"editUserInfoCfmClick\" type=\"submit\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n{% end %}\n"
  },
  {
    "path": "template/admin/admin_base.html",
    "content": "{% extends '../base.html' %}\n\n{% block title %}\n    blog_xtg - {% block title2 %}欢迎来到blog_xtg管理平台！{% end %}\n{% end %}\n\n{% block main %}\n<div class=\"container\">\n    <div class=\"row\">\n        <div class=\"col-md-2 entry-box\" >\n            <ul class=\"nav nav-list\">\n\t\t\t\t<li class=\"nav-header\">博文管理</li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.article.action', 'submit') }}\">发表博文</a></li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.articles') }}\">管理博文</a></li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.articleTypes') }}\">博文分类</a></li>\n\n\t\t\t\t<li class=\"nav-header\">评论管理</li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.comments') }}\">博文评论</a></li>\n\n                <li class=\"nav-header\">博客定制</li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.custom.blog_info') }}\">基本信息</a></li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.custom.blog_plugin') }}\">插件管理</a></li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.custom.plugin.action', 'add') }}\">添加插件</a></li>\n\n\t\t\t\t<li class=\"nav-header\">其它管理</li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.account') }}\">用户账户</a></li>\n\t\t\t\t<li><a href=\"{{ reverse_url('admin.help') }}\">帮助</a></li>\n\t\t\t</ul>\n        </div>\n        <div class=\"col-md-10\">\n            {% if handler.has_message() %}\n                {% for message in handler.read_messages() %}\n                <div class=\"alert alert-{{ message['category'] }} alert-dismissable\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>\n                        {{ message['message'] }}\n                </div>\n                {% end %}\n            {% end %}\n            {% block admin_content %}\n            {% end %}\n        </div>\n    </div>\n</div>\n{% end %}\n\n{% block script %}\n    <script src=\"{{ static_url('js/admin.js') }}\"></script>\n    {% block private_script %}\n    {% end %}\n{% end %}\n"
  },
  {
    "path": "template/admin/blog_plugin_add.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    添加插件\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box submit-article\">\n    <h4><strong>添加插件</strong></h4>\n    <hr/>\n    <div>\n    <form class=\"add-blog-plugin\" method=\"post\" action=\"\">\n        {% module xsrf_form_html() %}\n        <div class=\"form-group\">\n            <label for=\"title\">插件名称</label>\n            <input class=\"form-control\" id=\"title\" name=\"title\" required=\"\" type=\"text\" value=\"\">\n            <label for=\"note\">备注</label>（可选）\n            <textarea class=\"form-control\" id=\"note\" name=\"note\"></textarea>\n            <label for=\"pluginContent\">内容</label>\n            <textarea id=\"pluginContent\" name=\"content\"></textarea>\n        </div>\n        <div class=\"add-plugin-button\">\n            <button type=\"submit\" class=\"btn btn-success\">提交</button>\n        </div>\n    </form>\n    </div>\n</div>\n{% end %}\n\n{% block private_script %}\n    <script type=\"text/javascript\" src=\"{{ static_url('tinymce/js/tinymce/tinymce.min.js') }}\"></script>\n    <script type=\"text/javascript\" src=\"{{ static_url('js/tinymce_setup.js') }}\"></script>\n{% end %}"
  },
  {
    "path": "template/admin/blog_plugin_edit.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    修改插件\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box submit-article\">\n    <h4><strong>添加插件</strong></h4>\n    <hr/>\n    <div>\n    <form class=\"add-blog-plugin\" method=\"post\" action=\"\">\n        {% module xsrf_form_html() %}\n        <div class=\"form-group\">\n            <label for=\"title\">插件名称</label>\n            <input class=\"form-control\" id=\"title\" name=\"title\" required=\"\" type=\"text\" value=\"{{ plugin.title }}\">\n            <label for=\"note\">备注</label>（可选）\n            <textarea class=\"form-control\" id=\"note\" name=\"note\">{{ plugin.note }}</textarea>\n            <label for=\"pluginContent\">内容</label>\n            <textarea id=\"pluginContent\" name=\"content\">{{ plugin.content }}</textarea>\n        </div>\n        <div class=\"add-plugin-button\">\n            <button type=\"submit\" class=\"btn btn-success\">提交</button>\n        </div>\n    </form>\n    </div>\n</div>\n{% end %}\n\n{% block private_script %}\n    <script type=\"text/javascript\" src=\"{{ static_url('tinymce/js/tinymce/tinymce.min.js') }}\"></script>\n    <script type=\"text/javascript\" src=\"{{ static_url('js/tinymce_setup.js') }}\"></script>\n{% end %}"
  },
  {
    "path": "template/admin/custom_blog_info.html",
    "content": "{% from model.site_info import SiteCollection %}\n{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    基本信息\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box custom-blog\">\n    <h4><strong>基本信息</strong></h4>\n    <hr/>\n    <div class=\"blog-info-box\">\n        <h5 class=\"info-header\"><strong>博客标题：</strong></h5>\n        <i>{{ SiteCollection.title }}</i>\n        <h5 class=\"info-header\"><strong>个性签名：</strong></h5>\n        <i>{{ SiteCollection.signature }}</i>\n        <h5 class=\"info-header\"><strong>导航样式：</strong></h5>\n        <i>\n            {% if SiteCollection.navbar in navbar_styles %}\n                {{ navbar_styles[SiteCollection.navbar] }}\n            {% else %}\n                {{ navbar_styles['default'] }}\n            {% end %}\n        </i>\n        <div class=\"add-articleType-nav\">\n            <a class=\"btn btn-sm btn-primary blog-info-btn\" id=\"editBlogInfo\"\n               onclick=\"get_blog_info()\">\n                <span class=\"glyphicon glyphicon-edit\"></span>\n                修改\n            </a>\n        </div>\n    </div>\n</div>\n\n<!-- 信息删除确认: For edit blog info form-->\n<div class=\"modal fade\" id=\"editBlogInfoFormModal\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">修改基本信息</h4>\n            </div>\n            <form id=\"editBlogInfoForm\" method=\"post\" action=\"\">\n                <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            {% module xsrf_form_html() %}\n                            <label for=\"title\">博客标题</label>\n                            <input class=\"form-control\" id=\"title\" required name=\"title\"  type=\"text\" value=\"{{ SiteCollection.title }}\" />\n                            <label for=\"signature\">个性签名</label>\n                            <textarea class=\"form-control\" id=\"signature\" required name=\"signature\">{{ SiteCollection.signature }}</textarea>\n                            <label for=\"navbar\">导航样式</label>\n                            <select class=\"form-control\" id=\"navbar\" name=\"navbar\" required>\n                                {% for navbar in navbar_styles %}\n                                    {% if navbar == SiteCollection.navbar %}\n                                        <option value=\"{{navbar}}\" selected=\"selected\" >{{navbar_styles[navbar]}}</option>\n                                    {% else %}\n                                        <option value=\"{{navbar}}\" >{{navbar_styles[navbar]}}</option>\n                                    {% end %}\n                                {% end %}\n                            </select>\n                        </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button id=\"editblogInfoCfmClick\" type=\"submit\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n{% end %}"
  },
  {
    "path": "template/admin/custom_blog_plugin.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    插件管理\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box custom-blog-plugin\">\n    <h4><strong>插件管理</strong></h4>\n    <hr/>\n    <p><span class=\"glyphicon glyphicon-wrench\"></span>插件总数：<span class=\"badge\">{{ pager.totalCount }}</span></p>\n    <div class=\"blog-plugin-box\">\n        <div class=\"blog-plugin\" id=\"blogPlugin\">\n            <table class=\"table table-striped table-hover\">\n                <thead>\n                <tr class=\"table-header\">\n                    <th>序号</th>\n                    <th>插件名称</th>\n                    <th>备注</th>\n                    <th>排序</th>\n                    <th>启用</th>\n                    <th>修改</th>\n                    <th>删除</th>\n                </tr>\n                </thead>\n                <tbody>\n                {% for plugin in pager.result %}\n                    <tr>\n                        <td>{{ plugin.order }}</td>\n                        <td>{{ plugin.title }}</td>\n                        <td>{{ plugin.note }}</td>\n                        <td>\n                            <a class=\"btn sort-up\" title=\"升序\"\n                               href=\"{{ reverse_url('admin.custom.plugin.update', plugin.id, 'sort-up') }}?pageNo={{pager.pageNo}}\">\n                                <span class=\"glyphicon glyphicon-circle-arrow-up\"></span>\n                            </a>\n                            <a class=\"btn sort-down\" title=\"降序\"\n                               href=\"{{ reverse_url('admin.custom.plugin.update', plugin.id, 'sort-down') }}?pageNo={{pager.pageNo}}\">\n                                <span class=\"glyphicon glyphicon-circle-arrow-down\"></span>\n                            </a>\n                        </td>\n                        <td>\n                            {% if plugin.disabled %}\n                                <a class=\"btn btn-sm btn-warning comment-handle-admin enabled-blog-plugin-btn\"\n                                   title=\"启用插件\"\n                                   href=\"{{ reverse_url('admin.custom.plugin.update', plugin.id, 'enable') }}?pageNo={{pager.pageNo}}\">\n                                    <span class=\"glyphicon glyphicon-remove-sign\"></span>\n                                </a>\n                            {% else %}\n                                <a class=\"btn btn-sm btn-success comment-handle-admin disabled-blog-plugin-btn\"\n                                   title=\"禁用插件\"\n                                   href=\"{{ reverse_url('admin.custom.plugin.update', plugin.id, 'disable') }}?pageNo={{pager.pageNo}}\">\n                                    <span class=\"glyphicon glyphicon-ok-sign\"></span>\n                                </a>\n                            {% end %}\n                        </td>\n                        {% if plugin.content != 'system_plugin' %}\n                            <td>\n                                <a class=\"btn\" title=\"修改插件信息\"\n                                   href=\"{{ reverse_url('admin.custom.plugin.update', plugin.id, 'edit') }}?pageNo={{pager.pageNo}}\">\n                                    <span class=\"glyphicon glyphicon-edit\"></span>\n                                </a>\n                            </td>\n                            <td>\n                                <a class=\"btn btn-sm btn-default delete-blog-plugin\" title=\"删除插件\"\n                                   onclick=\"delPluginCfm('{{ reverse_url('admin.custom.plugin.update', plugin.id, 'delete') }}?pageNo={{pager.pageNo}}')\">\n                                    <span class=\"glyphicon glyphicon-trash\"></span>\n                                </a>\n                            </td>\n                        {% else %}\n                            <td></td>\n                            <td></td>\n                        {% end %}\n                    </tr>\n                {% end %}\n                </tbody>\n            </table>\n        </div>\n    </div>\n    {% module Template(\"_macros.html\", pager=pager, url=reverse_url('admin.custom.blog_plugin'), params=None) %}\n</div>\n\n<!-- 信息删除确认: For delete a plugin confirm -->\n<div class=\"modal fade\" id=\"delPluginCfmModal\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">确认删除插件？</h4>\n            </div>\n            <div class=\"modal-body\">\n                <p>\n                    将该导航删除后不可恢复，您确认要删除吗？\n                </p>\n                <p>\n                    （提示：如果您只是不想显示该插件，可以将其禁用，而不必删除。）\n                </p>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                <button id=\"delPluginCfmClick\" class=\"btn btn-success\" data-dismiss=\"modal\">确定</button>\n            </div>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n{% end %}\n"
  },
  {
    "path": "template/admin/help_page.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n帮助\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box\">\n    <h4><strong>blog_xtg帮助页面</strong></h4>\n    <hr/>\n    <h5>一、blog_xtg简介</h5>\n\n    <p><a href=\"https://github.com/xtg20121013/blog_xtg\">blog_xtg</a> 是作者<code>xiaotaogou</code>基于<a\n            href=\"https://github.com/xpleaf/Blog_mini\">Blog_mini</a>重构的个人分布式博客系统。</p>\n\n    <p>由于不太擅长前端，所以基本照搬<a href=\"https://github.com/xpleaf/Blog_mini\">Blog_mini</a>的页面，但是整个后端逻辑都是重写的，以下是与<a\n            href=\"https://github.com/xpleaf/Blog_mini\">Blog_mini</a>的主要区别：</p>\n\n    <ol>\n        <li>改用tornado框架，是个基于异步IO的web server。</li>\n        <li>分布式架构，可以多进程多主机启动server实例，再通过nginx等代理服务器做负载均衡，实现横向扩展提高并发性能。</li>\n        <li>\n            提高多数主要页面访问性能。对频繁查询的组件（例如博客标题、菜单、公告、访问统计）进行缓存，优化sql查询（多条sql语句合并一次执行、仅查需要的字段，例如搜索博文列表不查博文的具体内容）以提高首页博文等主要页面访问性能。\n        </li>\n        <li>访问统计改为日pv和日uv。</li>\n        <li>博文编辑器改为markdown编辑器。</li>\n        <li>引入alembic管理数据库版本。</li>\n        <li>可使用docker快速部署。</li>\n    </ol>\n\n    <h5>二、开源声明</h5>\n\n    <ol>\n        <li><a href=\"https://github.com/xtg20121013/blog_xtg\">blog_xtg</a>是完全开源的，你可以在GitHub获取他的全部代码，当然也可以对他进行二次开发。</li>\n        <li>作者不对任何基于<a href=\"https://github.com/xtg20121013/blog_xtg\">blog_xtg</a>开发的或搭建的项目、站点负责。</li>\n        <li>如果没有获得作者授权，请勿将其商用。</li>\n    </ol>\n\n    <h5>三、技术支持</h5>\n\n    <p>如果你有任何疑问，可以给作者留言:</p>\n\n    <p>附： </p>\n\n    <ul>\n        <li><p>作者博客：<a href=\"http://blog.xiaotaogou.site\">http://blog.xiaotaogou.site</a></p></li>\n        <li><p>作者简书：<a href=\"http://www.jianshu.com/u/dfb6bf87c35e\">http://www.jianshu.com/u/dfb6bf87c35e</a></p></li>\n        <li><p>blog_xtg的github地址：<a href=\"https://github.com/xtg20121013/blog_xtg\">https://github.com/xtg20121013/blog_xtg</a>\n        </p></li>\n    </ul>\n</div>\n{% end %}"
  },
  {
    "path": "template/admin/manage_articleTypes.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    博文分类\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box manage-articleTypes\">\n    <h4><strong>博文分类</strong></h4>\n    <hr/>\n    <p><span class=\"glyphicon glyphicon-book\"></span>分类总数：<span class=\"badge\">{{ pager.totalCount }}</span></p>\n    <div class=\"articleTypes-box\">\n        <ul class=\"nav nav-tabs\">\n            <li class=\"active\"><a href=\"{{ reverse_url('admin.articleTypes') }}\">博文分类</a></li>\n            <li class=\"\"><a href=\"{{ reverse_url('admin.articleTypeNavs') }}\">分类导航</a></li>\n        </ul>\n        <div class=\"articleTypes\" id=\"articleTypes\">\n            <table class=\"table table-striped table-hover\">\n                <thead>\n                <tr class=\"table-header\">\n                    <th>分类名称</th>\n                    <th>分类介绍</th>\n                    <th>属性</th>\n                    <th>所属导航</th>\n                    <th>博文数量</th>\n                    <th>修改</th>\n                    <th>删除</th>\n                </tr>\n                </thead>\n                <tbody>\n                {% for articleType in pager.result %}\n                    <tr>\n                        <td>\n                            <a href=\"{{ reverse_url('articleType', articleType.id) }}\" target=\"_blank\">\n                                {{ articleType.name }}\n                            </a>\n                        </td>\n                        <td>\n                            {% if articleType.introduction %}\n                                {{ articleType.introduction }}\n                            {% else %}\n                                该分类暂时没有介绍\n                            {% end %}\n                        </td>\n                        <td>\n                            {% if articleType.is_hide %}\n                                隐藏\n                            {% else %}\n                                公开\n                            {% end %}\n                        </td>\n                        <td>\n                            {% if articleType.menu %}\n                                {{ articleType.menu.name }}\n                            {% else %}\n                                该分类暂时没有所属导航\n                            {% end %}\n                        </td>\n                        <td>{{ articleType.articles_count }}</td>\n                        {% if not articleType.is_protected %}\n                        <td>\n                            <a class=\"btn\" title=\"修改分类信息\"\n                               onclick=\"get_articleType_info('{{ reverse_url('admin.articleType.update', articleType.id, 'update') }}?pageNo={{pager.pageNo}}', {{articleType.id}},\n                               '{{articleType.name}}', {{'true' if articleType.is_hide else 'false'}}, '{{articleType.introduction}}', {{articleType.menu_id if articleType.menu_id else 'null'}})\">\n                                <span class=\"glyphicon glyphicon-edit\"></span>\n                            </a>\n                        </td>\n                        <td>\n                            <a class=\"btn btn-sm btn-default delete-articleType\" title=\"删除分类\"\n                               onclick=\"delArticleTypeCfm('{{ reverse_url('admin.articleType.update', articleType.id, 'delete') }}?pageNo={{pager.pageNo}}')\">\n                                <span class=\"glyphicon glyphicon-trash\"></span>\n                            </a>\n                        </td>\n                        {% else %}\n                        <td/>\n                        <td/>\n                        {% end %}\n                    </tr>\n                {% end %}\n                </tbody>\n            </table>\n        </div>\n        <div class=\"add-articleType\">\n            <a class=\"btn btn-sm btn-primary add-articleType-btn\">\n                <span class=\"glyphicon glyphicon-plus-sign\"></span>\n                添加分类\n            </a>\n        </div>\n    </div>\n    {% module Template(\"_macros.html\", pager=pager, url=reverse_url('admin.articleTypes'), params=None) %}\n</div>\n\n<!--  add articleType form-->\n<div class=\"modal fade\" id=\"addArticleTypeFormModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">添加博文分类</h4>\n            </div>\n            <form id=\"addArticleTypeForm\" method=\"post\" action=\"{{ reverse_url('admin.articleType.action', 'add') }}\">\n                <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            {% module xsrf_form_html() %}\n                            <label for=\"name\">分类名称</label>\n                            <input class=\"form-control\" id=\"name\" name=\"name\" required=\"\" type=\"text\" value=\"\">\n                            <label for=\"setting_hide\">属性</label>\n                            <select class=\"form-control\" id=\"setting_hide\" name=\"setting_hide\" required=\"\"><option value='false'>公开</option><option value='true'>隐藏</option></select>\n                            <label for=\"introduction\">分类介绍</label>（可选）\n                            <textarea class=\"form-control\" id=\"introduction\" name=\"introduction\"></textarea>\n                            <label for=\"menus\">所属导航</label>\n                            <select class=\"form-control\" id=\"menus\" name=\"menu_id\" required=\"\">\n                                {% for menu in menus %}\n                                <option value=\"{{ menu.id }}\">{{ menu.name }}</option>\n                                {% end %}\n                                <option value=\"-1\" selected>不选择导航（该分类将单独成一导航）</option>\n                            </select>\n                        </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button id=\"addArticlyTypeCfmClick\" type=\"submit\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n\n<!--  For edit articleType form-->\n<div class=\"modal fade\" id=\"editArticleTypeFormModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\" id=\"ModalTitle\"></h4>\n            </div>\n            <form id=\"editArticleTypeForm\" method=\"post\" action=\"\">\n                <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            {% module xsrf_form_html() %}\n                            <label for=\"name\">分类名称</label>\n                            <input class=\"form-control\" id=\"editName\" name=\"name\" required=\"\" type=\"text\" value=\"\">\n                            <label for=\"setting_hide\">属性</label>\n                            <select class=\"form-control\" id=\"editSetting_hide\" name=\"setting_hide\" required=\"\"><option value=\"false\">公开</option><option value=\"true\">隐藏</option></select>\n                            <label for=\"introduction\">分类介绍</label>（可选）\n                            <textarea class=\"form-control\" id=\"editIntroduction\" name=\"introduction\"></textarea>\n                            <label for=\"menus\">所属导航</label>\n                            <select class=\"form-control\" id=\"editMenus\" name=\"menu_id\" required=\"\">\n                                {% for menu in menus %}\n                                <option value=\"{{ menu.id }}\">{{ menu.name }}</option>\n                                {% end %}\n                                <option value=\"-1\" selected>不选择导航（该分类将单独成一导航）</option>\n                            </select>\n                        </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button id=\"editArticlyTypeCfmClick\" type=\"submit\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n\n<!--  For delete an articletype confirm -->\n<div class=\"modal fade\" id=\"delArticleTypeCfmModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">确认删除分类？</h4>\n            </div>\n            <div class=\"modal-body\">\n                <p>\n                    将该分类删除后不可恢复，同时会将该分类的所有博文设置为<strong>未分类</strong>，您确认要删除吗？\n                </p>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                <button id=\"delArticleTypeCfmClick\" class=\"btn btn-success\" data-dismiss=\"modal\">确定</button>\n            </div>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n{% end %}"
  },
  {
    "path": "template/admin/manage_articleTypes_nav.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    分类导航\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box manage-articleTypes-nav\">\n    <h4><strong>分类导航</strong></h4>\n    <hr/>\n    <p><span class=\"glyphicon glyphicon-bookmark\"></span>导航总数：<span class=\"badge\">{{ pager.totalCount }}</span></p>\n     <div class=\"articleTypes-nav-box\">\n        <ul class=\"nav nav-tabs\">\n            <li class=\"\"><a href=\"{{ reverse_url('admin.articleTypes') }}\">博文分类</a></li>\n            <li class=\"active\"><a href=\"{{ reverse_url('admin.articleTypeNavs') }}\">分类导航</a></li>\n        </ul>\n        <div class=\"articleTypes-nav\" id=\"articleTypesNav\">\n            <table class=\"table table-striped table-hover\">\n                <thead>\n                <tr class=\"table-header\">\n                    <th>序号</th>\n                    <th>导航名称</th>\n                    <th>所含分类</th>\n                    <th>排序</th>\n                    <th>修改</th>\n                    <th>删除</th>\n                </tr>\n                </thead>\n                <tbody>\n                    {% for menu in pager.result %}\n                    <tr>\n                        <td>{{ menu.order }}</td>\n                        <td>{{ menu.name }}</td>\n                        <td>\n                            {% if menu.all_types %}\n                                {% for articleType in menu.all_types %}\n                                    <a href=\"{{ reverse_url('articleType', articleType.id) }}\" target=\"_blank\">\n                                        {{ articleType.name }}\n                                    </a>\n                                {% end %}\n                            {% else %}\n                                没有分类，该导航将不显示。\n                            {% end %}\n                        </td>\n                        <td>\n                            <a class=\"btn sort-up\" title=\"升序\"\n                               href=\"{{ reverse_url('admin.articleTypeNav.update', menu.id, 'sort-up') }}?pageNo={{pager.pageNo}}\">\n                                <span class=\"glyphicon glyphicon-circle-arrow-up\"></span>\n                            </a>\n                            <a class=\"btn sort-down\" title=\"降序\"\n                               href=\"{{ reverse_url('admin.articleTypeNav.update', menu.id, 'sort-down') }}?pageNo={{pager.pageNo}}\">\n                                <span class=\"glyphicon glyphicon-circle-arrow-down\"></span>\n                            </a>\n                        </td>\n                        <td>\n                            <a class=\"btn\" title=\"修改导航信息\"\n                               onclick=\"get_articleTypeNav_info('{{ reverse_url('admin.articleTypeNav.update', menu.id, 'update') }}?pageNo={{pager.pageNo}}','{{ menu.id }}', '{{ menu.name}}')\">\n                                <span class=\"glyphicon glyphicon-edit\"></span>\n                            </a>\n                        </td>\n                        <td>\n                            <a class=\"btn btn-sm btn-default delete-articleType-nav\" title=\"删除导航\"\n                               onclick=\"delArticleTypeNavCfm('{{ reverse_url('admin.articleTypeNav.update', menu.id, 'delete') }}?pageNo={{pager.pageNo}}')\">\n                                <span class=\"glyphicon glyphicon-trash\"></span>\n                            </a>\n                        </td>\n                    </tr>\n                    {% end %}\n                </tbody>\n            </table>\n        </div>\n        <div class=\"add-articleType-nav\">\n            <a class=\"btn btn-sm btn-primary add-articleType-nav-btn\">\n                <span class=\"glyphicon glyphicon-plus-sign\"></span>\n                添加导航\n            </a>\n        </div>\n    </div>\n    {% module Template(\"_macros.html\", pager=pager, url=reverse_url('admin.articleTypeNavs'), params=None) %}\n</div>\n\n<!-- 导航添加确认: For add articleTypeNav form-->\n<div class=\"modal fade\" id=\"addArticleTypeNavFormModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">添加分类导航</h4>\n            </div>\n            <form id=\"addArticleTypeNavForm\" method=\"post\"\n                  action=\"{{ reverse_url('admin.articleTypeNav.action', 'add')}}?pageNo={{pager.pageNo}}\">\n                <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            {% module xsrf_form_html() %}\n                            <label for=\"name\">导航名称</label>\n                            <input class=\"form-control\" id=\"name\" name=\"name\" required=\"\" type=\"text\" >\n                        </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button id=\"addArticleTypeNavCfmClick\" type=\"submit\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n\n<!-- 导航修改确认: For edit articleType nav form-->\n<div class=\"modal fade\" id=\"editArticleTypeNavFormModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\" id=\"NavModalTitle\"></h4>\n            </div>\n            <form id=\"editArticleTypeNavForm\" method=\"post\"\n                  action=\"\">\n                <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            {% module xsrf_form_html() %}\n                            <input id=\"nav_id\" name=\"nav_id\" type=\"hidden\" >\n                            <label for=\"editNavName\">导航名称</label>\n                            <input class=\"form-control\" id=\"editNavName\" name=\"name\" required=\"\" type=\"text\" >\n                        </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button id=\"editArticleTypeNavCfmClick\" type=\"submit\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n\n<!-- 导航删除确认: For delete an nav confirm -->\n<div class=\"modal fade\" id=\"delArticleTypeNavCfmModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">确认删除导航？</h4>\n            </div>\n            <div class=\"modal-body\">\n                <p>\n                    将该导航删除后不可恢复，同时会将该导航的所有分类的导航设置为<strong>无</strong>，您确认要删除吗？\n                </p>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                <button id=\"delArticleTypeNavCfmClick\" class=\"btn btn-success\" data-dismiss=\"modal\">确定</button>\n            </div>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n{% end %}"
  },
  {
    "path": "template/admin/manage_articles.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    管理博文\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box manage-articles\">\n    <h4><strong>管理博文</strong></h4>\n    <hr/>\n    <p><span class=\"glyphicon glyphicon-file\"></span>博文总数：<span class=\"badge\">{{ pager.totalCount }}</span></p>\n    <div class=\"row articles-list\">\n        <div class=\"list-handle\">\n            <form class=\"manage-articles\" method=\"GET\" action=\"\">\n                <div class=\"form-group\">\n                    <div class=\"col-sm-2\">\n                        <select class=\"form-control\" id=\"types_choice\" name=\"articleType_id\" >\n                            <option value=\"\">全部分类</option>\n                            {% for at in article_types %}\n                            <option value=\"{{at.id}}\"\n                                    {%if article_search_params and str(article_search_params.articleType_id)==str(at.id) %}\n                                    selected\n                                    {%end%} >{{at.name}}</option>\n                            {% end %}\n                        </select>\n                    </div>\n                    <div class=\"col-sm-2\">\n                        <select class=\"form-control\" id=\"source_choice\" name=\"source_id\" >\n                            <option value=\"\">全部来源</option>\n                            {% for source in SiteCollection.article_sources %}\n                            <option value=\"{{source.id}}\"\n                                    {% if article_search_params and str(article_search_params.source_id)==str(source.id) %}\n                                    selected\n                                    {%end%} >{{source.name}}</option>\n                            {% end %}\n                        </select>\n                    </div>\n                    <div class=\"col-sm-2\">\n                        <button type=\"submit\" class=\"btn btn-primary\">\n                            <span class=\"glyphicon glyphicon-search\"></span> 筛选\n                        </button>\n                    </div>\n                </div>\n            </form>\n        </div>\n        <div class=\"list-detials\">\n            <table class=\"table table-striped table-hover\">\n                <thead>\n                <tr class=\"table-header\">\n                    <th class=\"table-checkbox-or-left\"><input type=\"checkbox\" id=\"select-all\">全选</th>\n                    <th>博文标题</th>\n                    <th>来源</th>\n                    <th>分类</th>\n                    <th>发表日期</th>\n                    <th>编辑</th>\n                    <th>删除</th>\n                </tr>\n                </thead>\n                <tbody>\n                    {% for article in pager.result %}\n                    <tr>\n                        <td class=\"table-checkbox-or-left\"><input type=\"checkbox\" class=\"op_check\" value=\"{{ article.id }}\"></td>\n                        <td class=\"table-checkbox-or-left\"><a href=\"{{ reverse_url('article', article.id) }}\" target=\"_blank\">{{ article.title }}</a></td>\n                        <td>\n                            <a href=\"{{ reverse_url('articleSource', article.source.id) }}\" target=\"_blank\">\n                                {{ article.source.name }}\n                            </a>\n                        </td>\n                        <td>\n                            <a href=\"{{ reverse_url('articleType', article.articleType.id) }}\" target=\"_blank\">\n                                {{ article.articleType.name }}\n                            </a>\n                        </td>\n                        <td>{{ article.create_time.strftime(\"%Y-%m-%d %H:%M:%S\") }}</td>\n                        <td>\n                            <a href=\"{{ reverse_url('admin.article', article.id) }}\">\n                                <span class=\"glyphicon glyphicon-pencil\" title=\"编辑博文\"></span>\n                            </a>\n                        </td>\n                        <td>\n                            <a class=\"btn btn-sm btn-default\"\n                               onclick=\"delCfm('{{reverse_url('admin.article.update', article.id, 'delete')}}')\"\n                               title=\"删除博文\">\n                                <span class=\"glyphicon glyphicon-trash delete-article\"></span>\n                            </a>\n                        </td>\n                    </tr>\n                    {% end %}\n                </tbody>\n            </table>\n        </div>\n        {% module Template(\"_macros.html\", pager=pager, url=reverse_url('admin.articles'), params=article_search_params.to_url_params()) %}\n    </div>\n</div>\n<!-- 信息删除确认: For delete an article confirm -->\n<div class=\"modal fade\" id=\"delCfmModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">确认删除博文？</h4>\n            </div>\n            <div class=\"modal-body\">\n                <p>将连同博文评论一起删除，并且删除后不可恢复，您确认要删除吗？</p>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                <button id=\"cfmClick\" class=\"btn btn-success\" data-dismiss=\"modal\">确定</button>\n            </div>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n{% end %}"
  },
  {
    "path": "template/admin/manage_comments.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    博文评论\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box manage-comments\">\n    <h4><strong>博文评论</strong></h4>\n    <hr/>\n    <p><span class=\"glyphicon glyphicon-comment\"></span>评论总数：<span class=\"badge\">{{ pager.totalCount }}</span></p>\n    <ul class=\"comments\">\n        {% for comment in pager.result %}\n        <li class=\"comment\">\n            <div class=\"comment-thumbnail\">\n                <input type=\"checkbox\" class=\"op_check op_check_com\" value=\"{{ comment.id }}\">&nbsp;\n                <img class=\"img-rounded profile-thumbnail\"\n                     src=\"{{ handler.get_gravatar_url(comment.author_email) }}\">\n            </div>\n            <div class=\"comment-info-admin\">\n                <span class=\"comment-author\">\n                    {{ comment.author_name }}\n                    {{ comment.author_email }}\n                    {% if comment.rank == Constants.COMMENT_RANK_ADMIN %}\n                        <span class=\"glyphicon glyphicon-user\">管理员</span>\n                    {% end %}\n                </span>\n                <span>\n                    在《<a href=\"{{ reverse_url('article', comment.article.id) }}\" target=\"_blank\">{{ comment.article.title }}</a>》\n                    的 <span class=\"comment-author\"><i>{{comment.floor}}楼</i></span> 发表评论：\n                </span>\n                <button class=\"btn btn-sm btn-info comment-handle-admin\" title=\"回复评论\"\n                   onclick=\"replyComment('{{ reverse_url('articleComment', comment.article.id)}}', {{comment.id}}, '{{comment.floor}}楼')\">\n                    <span class=\"glyphicon glyphicon-comment\"></span>\n                </button>\n                <button class=\"btn btn-sm btn-danger comment-handle-admin delete-comment-admin-btn\"  title=\"删除评论\"\n                   onclick=\"delCommentCfm('{{ reverse_url(\"admin.comment.update\", comment.article.id, comment.id, \"delete\")}}')\">\n                    <span class=\"glyphicon glyphicon-trash\"></span>\n                </button>\n                {% if comment.disabled %}\n                    <button class=\"btn btn-sm btn-success comment-handle-admin enabled-comment-admin-btn\" title=\"恢复评论\"\n                     onclick=\"update_comment('{{ reverse_url(\"admin.comment.update\", comment.article.id, comment.id, \"enable\")}}')\">\n                        <span class=\"glyphicon glyphicon-ok-sign\"></span>\n                    </button>\n                {% else %}\n                    <a class=\"btn btn-sm btn-warning comment-handle-admin disabled-comment-admin-btn\" title=\"屏蔽评论\"\n                     onclick=\"update_comment('{{ reverse_url(\"admin.comment.update\", comment.article.id, comment.id, \"disable\")}}')\">\n                        <span class=\"glyphicon glyphicon-remove-sign\"></span>\n                    </a>\n                {% end %}\n                <div class=\"comment-date\">\n                    <span>\n                        <small>{{ comment.create_time.strftime(\"%Y年%m月%d日 %H:%M:%S\") }}</small>\n                    </span>\n                </div>\n                <div class=\"comment-content\">\n                    {% if comment.comment_type == Constants.COMMENT_TYPE_REPLY %}\n                        <p class=\"comment-reply-info\">\n                            <span class=\"glyphicon glyphicon-envelope\"></span>\n                            回复给<strong><i>\n                            {{ comment.reply_to_floor }}：</i></strong>\n                        </p>\n                    {% end %}\n                    <p>{{ comment.content }}</p>\n                    {% if comment.disabled %}\n                        <p class=\"disabled-comment-admin-info\">\n                            <span class=\"glyphicon glyphicon-remove-sign\"></span>\n                            <i>该评论已在博文页面中屏蔽！</i>\n                        </p>\n                    {% end %}\n                </div>\n            </div>\n        </li>\n        {% end %}\n    </ul>\n    {% module Template(\"_macros.html\", pager=pager, url=reverse_url('admin.comments'), params=None) %}\n</div>\n\n\n<!-- 信息删除确认: For delete a comment confirm -->\n<div class=\"modal fade\" id=\"delCommentCfmModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">确认删除评论？</h4>\n            </div>\n            <div class=\"modal-body\">\n                <p>\n                    将该评论删除后不可恢复，您确认要删除吗？\n                </p>\n                <p>\n                    （提示：如果您只是不想显示该评论内容，可以选择将其屏蔽，而不必删除。）\n                </p>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                <button id=\"delCommentCfmClick\" class=\"btn btn-success\" data-dismiss=\"modal\">确定</button>\n            </div>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n\n<!-- 信息提交确认: For comment form-->\n<div class=\"modal fade\" id=\"commentFormModel\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content message_align\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                        aria-hidden=\"true\">×</span></button>\n                <h4 class=\"modal-title\">提交评论（管理员）</h4>\n            </div>\n            <form id=\"commentForm\" method=\"post\" action=\"\">\n                <div class=\"modal-body\">\n                    <div class=\"form-group\">\n                        {% module xsrf_form_html() %}\n                        <input type=\"hidden\" name=\"next\" value=\"{{ reverse_url('admin.comments') }}\">\n                        <input type=\"hidden\" name=\"comment_type\" value=\"{{Constants.COMMENT_TYPE_REPLY}}\">\n                        <input type=\"hidden\" name=\"reply_to_id\" value=\"\">\n                        <input type=\"hidden\" name=\"reply_to_floor\" value=\"\">\n                        <label for=\"name\">昵称</label>\n                        <input class=\"form-control\" id=\"name\" name=\"author_name\" readonly=\"true\" required=\"\" type=\"text\" value=\"{{ current_user['name'] }}\">\n                        <label for=\"email\">邮箱</label>\n                        <input class=\"form-control\" id=\"email\" name=\"author_email\" readonly=\"true\" required=\"\" type=\"text\" value=\"{{ current_user['email'] }}\">\n                        <label for=\"content\">内容</label><textarea class=\"form-control\" id=\"content\" name=\"content\" required=\"\"></textarea>\n                    </div>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                    <button type=\"submit\" id=\"subCommentCfmClick\" class=\"btn btn-success\">确定</button>\n                </div>\n            </form>\n        </div><!-- /.modal-content -->\n    </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n{% end %}\n"
  },
  {
    "path": "template/admin/submit_articles.html",
    "content": "{% extends 'admin_base.html' %}\n\n{% block title2 %}\n    发表博文\n{% end %}\n\n{% block private_stylesheet %}\n    <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"{{ static_url('css/bootstrap-markdown.min.css')}}\">\n    <link rel=\"stylesheet\" href=\"{{ static_url('css/highlight/default.min.css') }}\" />\n{% end %}\n\n{% block admin_content %}\n<div class=\"entry-box submit-article\">\n    <h4><strong>发表博文</strong></h4>\n    <hr/>\n    <form class=\"submit-article\" method=\"post\" action=\"\">\n        {% module xsrf_form_html() %}\n        <div class=\"form-group\">\n            <label class=\"control-label\" for=\"title\">标题</label>：\n            <select class=\"\" id=\"source\" name=\"source_id\" required=\"\">\n                {% for source in SiteCollection.article_sources %}\n                <option value=\"{{source.id}}\" {% if article and article.source_id==source.id %} selected {%end%}  >{{source.name}}</option>\n                {% end %}\n            </select>\n            <input class=\"submit-article-title\" id=\"title\" name=\"title\" required=\"\" type=\"text\"\n                   value=\"{% if article %} {{article.title}} {%end%}\">（1-50字）\n        </div>\n        <div class=\"form-group\">\n            <label class=\"control-label\" for=\"types\">博文分类</label>：\n            <select id=\"types\" name=\"articleType_id\">\n                {% for at in article_types %}\n                <option value=\"{{at.id}}\" {% if article and article.articleType_id==at.id %} selected {%end%} >{{at.name}}</option>\n                {% end %}\n            </select>\n        </div>\n        <div class=\"form-group\">\n            <textarea id=\"content\" class=\"markdown-edit\" name=\"content\">{% if article %}{% raw article.content %}{%end%}</textarea>\n        </div>\n        <div class=\"form-group\">\n            <label class=\"control-label\" for=\"summary\">博文摘要</label>（显示在博客首页,不填的话,默认取文章前120个字）<br>\n            <textarea class=\"submit-article-summary form-control\" id=\"summary\" name=\"summary\" >{% if article %}{{article.summary}}{%end%}</textarea>\n        </div>\n        <div class=\"submit-article-button\">\n            <button type=\"submit\" class=\"btn btn-success\">提交</button>\n        </div>\n    </form>\n</div>\n{% end %}\n\n{% block private_script %}\n    <!--<script src=\"//cdn.bootcss.com/markdown.js/0.5.0/markdown.min.js\"></script>-->\n    <script src=\"{{ static_url('js/markdown/markdown.js') }}\"></script>\n    <script src=\"{{ static_url('js/highlight/highlight.min.js') }}\"></script>\n    <script src=\"{{ static_url('js/markdown/to-markdown.js')}}\"></script>\n    <script src=\"{{ static_url('js/markdown/bootstrap-markdown.js')}}\"></script>\n    <script src=\"{{ static_url('js/markdown/locale/bootstrap-markdown.zh.js')}}\"></script>\n    <script src=\"{{ static_url('js/markdownEdit.js')}}\"></script>\n{% end %}"
  },
  {
    "path": "template/article_detials.html",
    "content": "{% extends 'base.html' %}\n\n{% block title %}\n    {{ article.title }}\n{% end %}\n{% block private_stylesheet %}\n    <link rel=\"stylesheet\" href=\"{{ static_url('css/highlight/default.min.css') }}\" />\n{% end %}\n{% block content %}\n<div id='article-detials' class=\"entry-box\">\n    <div class=\"article-entry-header\">\n        <h3 class=\"article-entry-title\">\n            <a href=\"{{ reverse_url('article', article.id) }}\">{{ article.title }}</a>\n        </h3>\n    </div>\n    <div class=\"article-entry-info\">\n        <div class=\"base-info\">\n            <span class=\"label label-default\"> {{ article.create_time.strftime(\"%Y年%m月%d日\") }} </span>&nbsp;\n            <span class=\"label label-warning\">\n            <a href=\"{{ reverse_url('articleSource', article.source.id) }}\" target=\"_blank\" style=\"color: white\">\n                {{ article.source.name }}\n            </a>\n        </span>&nbsp;\n            <span class=\"label label-info\">\n            <a href=\"{{ reverse_url('articleType', article.articleType.id) }}\" target=\"_blank\" style=\"color: white\">\n                {{ article.articleType.name }}\n            </a>\n        </span>&nbsp;\n        </div>\n        <div class=\"main-info\">\n            <span class=\"label label-primary\">浏览 {{ article.num_of_view }}</span>\n            <span class=\"label label-success\">评论 {{ comments_pager.totalCount }}</span>\n        </div>\n    </div>\n\n    <hr>\n    <div>\n        <img class=\"article-loading\" src=\"{{ static_url('images/loading154.gif') }}\">\n        <p class=\"article-content\" style=\"display: none\">\n            {{ article.content }}\n        </p>\n    </div>\n    <br><br>\n    <div class=\"article-add-info\">\n        <p>\n            <span class=\"glyphicon glyphicon-time\">\n                博文最后更新时间：\n            </span>\n            {{ article.create_time.strftime(\"%Y年%m月%d日 %H:%M:%S\") }}\n        </p>\n    </div>\n    {% if current_user %}\n    <div class=\"article-edit\">\n        <a href=\"{{ reverse_url('admin.article', article.id) }}\">\n            <button type=\"button\" class=\"btn btn-default btn-sm\">\n                <span class=\"glyphicon glyphicon-pencil\"></span>\n                编辑\n            </button>\n        </a>\n    </div>\n    {% end %}\n    <hr>\n\n    <h4 id=\"comments\" name=\"comments\"><span class=\"glyphicon glyphicon-comment\">评论</span></h4>\n    {% include \"_article_comments.html\" %}\n    {% module Template(\"_macros.html\", pager=comments_pager, url=reverse_url('article', article.id), params=\"#comments\") %}\n\n    <h4  id=\"submit-comment\"><span class=\"glyphicon glyphicon-comment\">发表评论</span></h4>\n    <div class=\"row\">\n    <div class=\"col-md-8\" id=\"submit-comment-container\">\n        <form class=\"submit-comment-form\" id=\"submit-comment-form\" method=\"post\" action=\"{{ reverse_url('articleComment', article.id)}}\">\n            {% module xsrf_form_html() %}\n            <label for=\"name\">昵称</label>\n            <input class=\"form-control\" id=\"name\" name=\"author_name\" required=\"\" type=\"text\"\n                   value=\"{{ current_user['name'] if current_user else '' }}\">\n            <label for=\"email\">邮箱</label>\n            <input class=\"form-control\" id=\"email\" name=\"author_email\" required=\"\" type=\"text\"\n                   value=\"{{ current_user['email'] if current_user else '' }}\">\n            <label for=\"content\">内容</label>\n            <textarea class=\"form-control\" id=\"content\" name=\"content\" required=\"\"></textarea>\n            <button type=\"submit\" class=\"btn btn-default\">\n                提交\n            </button>\n        </form>\n    </div>\n</div>\n\n</div>\n{% end %}\n\n{% block script %}\n    <script src=\"{{ static_url('js/markdown/markdown.js') }}\"></script>\n    <script src=\"{{ static_url('js/highlight/highlight.min.js') }}\"></script>\n    <script src=\"{{ static_url('js/articleDetail.js') }}\"></script>\n{% end %}\n"
  },
  {
    "path": "template/auth/login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>登陆blog_mhq管理后台</title>\n    <link href=\"{{ static_url('css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/common.css') }}\" rel=\"stylesheet\">\n</head>\n<body background=\"{{ static_url('images/background.jpg') }}\">\n<div class=\"container login-page\">\n    <div class=\"row\">\n        <div class=\"col-md-4 col-lg-offset-4\">\n            {% if handler.has_message() %}\n                {% for message in handler.read_messages() %}\n                    <div class=\"alert alert-{{ message['category'] }} alert-dismissable\">\n                        <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>\n                        {{ message['message'] }}\n                    </div>\n                {% end %}\n            {% end %}\n            <h3 class=\"text-center\">欢迎登陆博客管理后台</h3>\n            <form class=\"form-horizontal\" role=\"form\" method=\"post\" action=\"{{ reverse_url('login') }}\">\n                {% module xsrf_form_html() %}\n                <input type=\"hidden\" name=\"next\" value=\"{{ next_url }}\">\n                <div class=\"form-group\">\n                    <label class=\"col-sm-3 control-label\" >用户名</label>\n                    <div class=\"col-sm-9\">\n                        <div class=\"input-group\">\n                            <span class=\"input-group-addon\"><span class=\"glyphicon glyphicon-user\"></span></span>\n                            <input class=\"form-control\" id=\"username\" name=\"username\" placeholder=\"请输入您的用户名\" required=\"\" type=\"text\" value=\"\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"form-group\">\n                    <label class=\"col-sm-3 control-label\" >密码</label>\n                    <div class=\"col-sm-9\">\n                        <div class=\"input-group\">\n                            <span class=\"input-group-addon\"><span class=\"glyphicon glyphicon-lock\"></span></span>\n                            <input class=\"form-control\" id=\"password\" name=\"password\" placeholder=\"请输入您的密码\" required=\"\" type=\"password\" value=\"\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"form-group\">\n                    <div class=\"col-sm-offset-3 col-sm-9\">\n                        <button type=\"submit\" class=\"btn btn-default\">登录</button>\n                    </div>\n                </div>\n            </form>\n        </div>\n    </div>\n</div>\n\n<script src=\"{{ static_url('js/jquery-2.2.1.min.js') }}\"></script>\n<script src=\"{{ static_url('js/bootstrap.min.js') }}\"></script>\n</body>\n</html>"
  },
  {
    "path": "template/base.html",
    "content": "<!DOCTYPE html>\n{% from model.site_info import SiteCollection %}\n{% from model.constants import Constants %}\n<html>\n<head>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"UTF-8\">\n    <title>\n        {% block title %}\n        {{ SiteCollection.title }}\n        {% end %}\n    </title>\n    {% block stylesheet %}\n        <link href=\"{{ static_url('css/bootstrap.css') }}\" rel=\"stylesheet\">\n        <link href=\"{{ static_url('css/common.css') }}\" rel=\"stylesheet\">\n        {% block private_stylesheet %}\n        {% end %}\n    {% end %}\n</head>\n<body>\n<header>\n    <div class='header-top'>\n        <div class=\"container\">\n            <h2  class=\"blog-title\"><a href=\"{{ reverse_url('index') }}\">{{ SiteCollection.title }}</a></h2>\n            <p class=\"lead signature\">\n                {{ SiteCollection.signature }}\n            </p>\n        </div>\n    </div>\n    <nav class=\"navbar navbar-{{ SiteCollection.navbar }}\" role=\"navigation\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n                    <span class=\"sr-only\">切换导航</span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                </button>\n            </div>\n            <div class=\"collapse navbar-collapse\">\n                <ul class=\"nav navbar-nav\">\n                    <li class=\"\"><a href=\"/\"><span class=\"glyphicon glyphicon-home\"> 首页</span></a></li>\n                    {% for menu in SiteCollection.menus %}\n                        {% if menu.all_types %}\n                            <li class=\"dropdown\">\n                                <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" data-hover=\"dropdown\">\n                                    {{ menu.name }}\n                                    <b class=\"caret\"></b></a>\n                                <ul class=\"dropdown-menu\">\n                                    {% for article_type in menu.all_types %}\n                                        {% if not article_type.is_hide %}\n                                            <li>\n                                                <a href=\"{{ reverse_url('articleType', article_type.id) }}\">\n                                                    {{ article_type.name }}\n                                                </a>\n                                            </li>\n                                            <li class=\"divider\"></li>\n                                        {% end %}\n                                    {% end %}\n                                </ul>\n                            </li>\n                        {% end %}\n                    {% end %}\n                    {% for article_type in SiteCollection.article_types_not_under_menu %}\n                        {% if not article_type.is_hide %}\n                            <li>\n                                <a href=\"{{ reverse_url('articleType', article_type.id) }}\">\n                                        {{ article_type.name }}\n                                </a>\n                            </li>\n                        {% end %}\n                    {% end %}\n                </ul>\n                <ul class=\"nav navbar-nav navbar-right\">\n                    {% if current_user %}\n                        <li class=\"dropdown\">\n                            <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" data-hover=\"dropdown\">\n                                <img style=\"height: 18px\" src=\"{{ current_user['avatar'] }}\">\n                                {{ current_user['name'] }} <b class=\"caret\"></b>\n                            </a>\n                            <ul class=\"dropdown-menu\">\n                                <li><a href=\"{{ reverse_url('admin.article.action', 'submit') }}\">发表博文</a></li>\n                                <li><a href=\"{{ reverse_url('admin.account') }}\">管理博客</a></li>\n                                <li><a href=\"{{ reverse_url('logout') }}\">退出登陆</a></li>\n                            </ul>\n                        </li>\n                    {% end %}\n                </ul>\n            </div>\n        </div>\n    </nav>\n</header>\n{% block main %}\n    <div class=\"content\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-md-8 article\">\n                    {% if handler.has_message() %}\n                        {% for message in handler.read_messages() %}\n                            <div class=\"alert alert-{{ message['category'] }} alert-dismissable\">\n                                <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>\n                                {{ message['message'] }}\n                            </div>\n                        {% end %}\n                    {% end %}\n                    {% block content %}\n                    {% end %}\n                </div>\n                <div class=\"col-md-4 blog_nav\">\n                    {% block blog_nav_plugin %}\n                        {% for plugin in SiteCollection.plugins %}\n                            {% if not plugin.disabled %}\n                                {% if plugin.content != Constants.SYSTEM_PLUGIN %}\n                                    <div id=\"{{ plugin.title }}\" class=\"entry-box\">\n                                        <h5><strong>{{ plugin.title }}</strong></h5>\n                                        {% raw plugin.content %}\n                                    </div>\n                                {% else %}\n                                    <div class=\"entry-box\">\n                                        <h5><strong>博客统计</strong></h5>\n                                        <p>\n                                            今日PV：<span class=\"badge\">{{ SiteCollection.pv }}</span>\n                                            今日UV：<span class=\"badge\">{{ SiteCollection.uv }}</span>\n                                        </p>\n                                        <p>\n                                            博文总数：<span class=\"badge\">{{ SiteCollection.article_count }}</span>\n                                            评论总数：<span class=\"badge\">{{ SiteCollection.comment_count }}</span>\n                                        </p>\n                                        <p>\n                                            {% for source in SiteCollection.article_sources %}\n                                                <a href=\"{{ reverse_url('articleSource', source.id) }}\">{{ source.name }}</a>：\n                                                <span class=\"badge\">{{ source.articles_count }}</span>\n                                            {% end %}\n                                        </p>\n                                    </div>\n                                {% end %}\n                            {% end %}\n                        {% end %}\n                    {% end %}\n                </div>\n            </div>\n        </div>\n    </div>\n{% end %}\n<div class=\"footer\">\n    <p class=\"footer-content\">\n        @2017\n        <a target=\"_blank\" href=\"https://github.com/xtg20121013/blog_xtg\">blog_xtg</a>\n        -开源的分布式博客系统\n        {% if not current_user %}\n            -<a href=\"{{ handler.login_url() }}\">\n            <span class=\"glyphicon glyphicon-wrench\">后台管理</span>\n        </a>\n        {% end %}\n    </p>\n</div>\n<div class=\"btn-group-vertical floatButton\">\n    <button id=\"goTop\" class=\"btn btn-default\" title=\"去顶部\" type=\"button\">\n        <span class=\"glyphicon glyphicon-arrow-up\"></span>\n    </button>\n    <button id=\"refresh\" class=\"btn btn-default\" title=\"刷新\" type=\"button\">\n        <span class=\"glyphicon glyphicon-refresh\"></span>\n    </button>\n    <button id=\"goBottom\" class=\"btn btn-default\" title=\"去底部\" type=\"button\">\n        <span class=\"glyphicon glyphicon-arrow-down\"></span>\n    </button>\n</div>\n{% block base_script %}\n    <script src=\"{{ static_url('js/jquery-2.2.1.min.js') }}\"></script>\n    <script src=\"{{ static_url('js/bootstrap.min.js') }}\"></script>\n    <script src=\"//cdn.bootcss.com/bootstrap-hover-dropdown/2.2.1/bootstrap-hover-dropdown.min.js\"></script>\n    <script src=\"{{ static_url('js/floatButton.js') }}\"></script>\n{% end %}\n{% block script %}\n{% end %}\n</body>\n</html>\n"
  },
  {
    "path": "template/index.html",
    "content": "{% extends 'base.html' %}\n\n{% block content %}\n\n{% if pager and pager.result %}\n{% for article in pager.result %}\n<div id=\"article-entry\" class=\"entry-box\">\n    <div class=\"article-entry-header\">\n        <h3 class=\"article-entry-title\">\n            <a href=\"{{ reverse_url('article', article.id) }}\">{{ article.title }}</a>\n        </h3>\n    </div>\n    <div class=\"article-entry-info\">\n        <div class=\"base-info\">\n            <span class=\"label label-default\"> {{ article.create_time.strftime(\"%Y年%m月%d日\") }} </span>&nbsp;\n            <span class=\"label label-warning\">\n            <a href=\"{{ reverse_url('articleSource', article.source.id) }}\" target=\"_blank\" style=\"color: white\">\n                {{ article.source.name }}\n            </a>\n        </span>&nbsp;\n            <span class=\"label label-info\">\n            <a href=\"{{ reverse_url('articleType', article.articleType.id) }}\" target=\"_blank\" style=\"color: white\">\n                {{ article.articleType.name }}\n            </a>\n        </span>&nbsp;\n        </div>\n        <div class=\"main-info\">\n            <span class=\"label label-primary\">浏览 {{ article.num_of_view }}</span>\n            <span class=\"label label-success\">评论 {{ article.comments_count }}</span>\n        </div>\n    </div>\n    <div class=\"article-entry-sum\">\n        <p>{{ article.summary }}{% if len(article.summary) >= 100 %}...... {%end%}</p>\n    </div>\n</div>\n{% end %}\n{% end %}\n{% module Template(\"_macros.html\", pager=pager, url=base_url, params=article_search_params.to_url_params()) %}\n\n{% end %}"
  },
  {
    "path": "template/super/init.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>创建管理员账户</title>\n    <link href=\"{{ static_url('css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/common.css') }}\" rel=\"stylesheet\">\n</head>\n<body background=\"{{ static_url('images/background.jpg') }}\">\n<div class=\"container login-page\">\n    <div class=\"row\">\n        <div class=\"col-md-4 col-lg-offset-4\">\n            {% if handler.has_message() %}\n                {% for message in handler.read_messages() %}\n                    <div class=\"alert alert-{{ message['category'] }} alert-dismissable\">\n                        <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>\n                        {{ message['message'] }}\n                    </div>\n                {% end %}\n            {% end %}\n            <h3 class=\"text-center\">创建管理员账户</h3>\n            <form class=\"form-horizontal\" role=\"form\" method=\"post\"\n                  onsubmit=\"return checkPasswordForm()\" action=\"{{ reverse_url('super.init') }}\">\n                {% module xsrf_form_html() %}\n                <div class=\"form-group\">\n                    <label for=\"username\">用户名</label>\n                    <input class=\"form-control\" id=\"username\" required name=\"username\" type=\"text\" >\n                </div>\n                <div class=\"form-group\">\n                    <label for=\"email\">邮箱</label>\n                    <input class=\"form-control\" id=\"email\" required name=\"email\" type=\"text\" >\n                </div>\n                <div class=\"form-group\">\n                    <label for=\"password\">密码</label>\n                    <input class=\"form-control\" id=\"password\" required name=\"password\" type=\"password\" >\n                </div>\n                <div id=\"group_password2\" class=\"form-group\">\n                    <label for=\"password2\">密码确认</label>\n                    <input class=\"form-control\" id=\"password2\" required name=\"password2\" type=\"password\" >\n                    <span id=\"password2_err\" class=\"help-block\" style=\"display: none\">两次密码不一致</span>\n                </div>\n                <button id=\"changePasswordCfmClick\" type=\"submit\" class=\"btn btn-success\">创建账户</button>\n            </form>\n        </div>\n    </div>\n</div>\n<script src=\"{{ static_url('js/super.js') }}\"></script>\n<script src=\"{{ static_url('js/jquery-2.2.1.min.js') }}\"></script>\n<script src=\"{{ static_url('js/bootstrap.min.js') }}\"></script>\n</body>\n</html>"
  },
  {
    "path": "url_mapping.py",
    "content": "# coding=utf-8\nimport controller.home\nimport controller.admin\nimport controller.admin_custom\nimport controller.admin_article_type\nimport controller.admin_article\nimport controller.super\nfrom tornado.web import url\n\n\n# url映射\nhandlers = [\n    url(r\"/\", controller.home.HomeHandler, name=\"index\"),\n    url(r\"/auth/login\", controller.home.LoginHandler, name=\"login\"),\n    url(r\"/auth/logout\", controller.home.LogoutHandler, name=\"logout\"),\n    # articleSource\n    url(r\"/source/([0-9]+)/articles\", controller.home.articleSourceHandler, name=\"articleSource\"),\n    # articleType\n    url(r\"/type/([0-9]+)/articles\", controller.home.ArticleTypeHandler, name=\"articleType\"),\n    # article\n    url(r\"/article/([0-9]+)\", controller.home.ArticleHandler, name=\"article\"),\n    url(r\"/article/([0-9]+)/comment\", controller.home.ArticleCommentHandler, name=\"articleComment\"),\n    # admin\n    url(r\"/admin/account\", controller.admin.AdminAccountHandler, name=\"admin.account\"),\n    url(r\"/admin/help\", controller.admin.AdminHelpHandler, name=\"admin.help\"),\n    url(r\"/admin/account/(change-password|edit-user-info)\",\n        controller.admin.AdminAccountHandler, name=\"admin.account.update\"),\n    # admin.custom\n    url(r\"/admin/custom/blog-info\",\n        controller.admin_custom.AdminCustomBlogInfoHandler, name=\"admin.custom.blog_info\"),\n    url(r\"/admin/custom/blog-plugin\",\n        controller.admin_custom.AdminCustomBlogPluginHandler, name=\"admin.custom.blog_plugin\"),\n    url(r\"/admin/custom/blog-plugin/(add)\",\n        controller.admin_custom.AdminCustomBlogPluginHandler, name=\"admin.custom.plugin.action\"),\n    url(r\"/admin/custom/blog-plugin/([0-9]+)/(sort-down|sort-up|disable|enable|edit|delete)\",\n        controller.admin_custom.AdminCustomBlogPluginHandler, name=\"admin.custom.plugin.update\"),\n    # admin.article_type\n    url(r\"/admin/articleType\", controller.admin_article_type.AdminArticleTypeHandler, name=\"admin.articleTypes\"),\n    url(r\"/admin/articleType/(add)\",\n        controller.admin_article_type.AdminArticleTypeHandler, name=\"admin.articleType.action\"),\n    url(r\"/admin/articleType/([0-9]+)/(delete|update)\",\n        controller.admin_article_type.AdminArticleTypeHandler, name=\"admin.articleType.update\"),\n    # admin.article_type_nav (menu)\n    url(r\"/admin/articleType/nav\",\n        controller.admin_article_type.AdminArticleTypeNavHandler, name=\"admin.articleTypeNavs\"),\n    url(r\"/admin/articleType/nav/(add)\",\n        controller.admin_article_type.AdminArticleTypeNavHandler, name=\"admin.articleTypeNav.action\"),\n    url(r\"/admin/articleType/nav/([0-9]+)/(sort-down|sort-up|delete|update)\",\n        controller.admin_article_type.AdminArticleTypeNavHandler, name=\"admin.articleTypeNav.update\"),\n    # admin.article\n    url(r\"/admin/article/(submit)\", controller.admin_article.AdminArticleHandler, name=\"admin.article.action\"),\n    url(r\"/admin/article\", controller.admin_article.AdminArticleHandler, name=\"admin.articles\"),\n    url(r\"/admin/article/([0-9]+)\", controller.admin_article.AdminArticleHandler, name=\"admin.article\"),\n    url(r\"/admin/article/([0-9]+)/(delete)\", controller.admin_article.AdminArticleHandler, name=\"admin.article.update\"),\n\n    url(r\"/admin/comment\", controller.admin_article.AdminArticleCommentHandler, name=\"admin.comments\"),\n    url(r\"/admin/article/([0-9]+)/comment/([0-9]+)/(disable|enable|delete)\",\n        controller.admin_article.AdminArticleCommentHandler, name=\"admin.comment.update\"),\n    # super.init\n    url(r\"/super/init\", controller.super.SuperHandler, name=\"super.init\"),\n]"
  }
]