From b87f52500cab89447b88b66c3b11e6119be27e24 Mon Sep 17 00:00:00 2001 From: LY Date: Sat, 25 Oct 2025 19:05:25 +0800 Subject: [PATCH 01/13] =?UTF-8?q?ly=5F=E7=AC=AC=E5=85=AD=E5=91=A8=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/oauth/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes src/oauth/__pycache__/admin.cpython-310.pyc | Bin 0 -> 2263 bytes src/oauth/__pycache__/apps.cpython-310.pyc | Bin 0 -> 366 bytes src/oauth/__pycache__/forms.cpython-310.pyc | Bin 0 -> 882 bytes src/oauth/__pycache__/models.cpython-310.pyc | Bin 0 -> 2760 bytes .../__pycache__/oauthmanager.cpython-310.pyc | Bin 0 -> 13559 bytes src/oauth/__pycache__/tests.cpython-310.pyc | Bin 0 -> 7498 bytes src/oauth/__pycache__/urls.cpython-310.pyc | Bin 0 -> 655 bytes src/oauth/__pycache__/views.cpython-310.pyc | Bin 0 -> 7486 bytes src/oauth/admin.py | 89 +++ src/oauth/apps.py | 12 + src/oauth/forms.py | 30 + src/oauth/migrations/0001_initial.py | 99 ++++ ...ptions_alter_oauthuser_options_and_more.py | 97 ++++ .../0003_alter_oauthuser_nickname.py | 20 + src/oauth/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 1993 bytes ...oauthuser_options_and_more.cpython-310.pyc | Bin 0 -> 1892 bytes ...3_alter_oauthuser_nickname.cpython-310.pyc | Bin 0 -> 674 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes src/oauth/models.py | 115 ++++ src/oauth/oauthmanager.py | 538 ++++++++++++++++++ src/oauth/templatetags/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../__pycache__/oauth_tags.cpython-310.pyc | Bin 0 -> 911 bytes src/oauth/templatetags/oauth_tags.py | 54 ++ src/oauth/tests.py | 323 +++++++++++ src/oauth/urls.py | 46 ++ src/oauth/views.py | 313 ++++++++++ 30 files changed, 1737 insertions(+) create mode 100644 src/oauth/__init__.py create mode 100644 src/oauth/__pycache__/__init__.cpython-310.pyc create mode 100644 src/oauth/__pycache__/admin.cpython-310.pyc create mode 100644 src/oauth/__pycache__/apps.cpython-310.pyc create mode 100644 src/oauth/__pycache__/forms.cpython-310.pyc create mode 100644 src/oauth/__pycache__/models.cpython-310.pyc create mode 100644 src/oauth/__pycache__/oauthmanager.cpython-310.pyc create mode 100644 src/oauth/__pycache__/tests.cpython-310.pyc create mode 100644 src/oauth/__pycache__/urls.cpython-310.pyc create mode 100644 src/oauth/__pycache__/views.cpython-310.pyc create mode 100644 src/oauth/admin.py create mode 100644 src/oauth/apps.py create mode 100644 src/oauth/forms.py create mode 100644 src/oauth/migrations/0001_initial.py create mode 100644 src/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py create mode 100644 src/oauth/migrations/0003_alter_oauthuser_nickname.py create mode 100644 src/oauth/migrations/__init__.py create mode 100644 src/oauth/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 src/oauth/migrations/__pycache__/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.cpython-310.pyc create mode 100644 src/oauth/migrations/__pycache__/0003_alter_oauthuser_nickname.cpython-310.pyc create mode 100644 src/oauth/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 src/oauth/models.py create mode 100644 src/oauth/oauthmanager.py create mode 100644 src/oauth/templatetags/__init__.py create mode 100644 src/oauth/templatetags/__pycache__/__init__.cpython-310.pyc create mode 100644 src/oauth/templatetags/__pycache__/oauth_tags.cpython-310.pyc create mode 100644 src/oauth/templatetags/oauth_tags.py create mode 100644 src/oauth/tests.py create mode 100644 src/oauth/urls.py create mode 100644 src/oauth/views.py diff --git a/src/oauth/__init__.py b/src/oauth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/oauth/__pycache__/__init__.cpython-310.pyc b/src/oauth/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e99526b9a34cc532a0cec251a0cf6df42318fef7 GIT binary patch literal 146 zcmd1j<>g`kf~$)zWq|0%AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUT37ps_@%J_n! z{H)aEl9=M6ZiW7y$Avjh-BDlaJvEnjX7|l+%?eWfQyT=4u zo73jN1tBCp01yXqN8&$_xbzhTlruLZ2vzNM*mZ*FaaC8htGnLSMZ4V~Fn;;&=h1;n z$gj9KIc!+m08pO*;)K(b1UR#lW-MS7X)CodJFpFHr%vVuE+v9|Qxo2|G^oEzxWnCh zgu8-`8%I{qgq<4qV8=V&X>qzk{Q5(XLAHIWorq^i4n$3gPlZ$h$mXDsSyY9iDobNz zJUJ{_+yGD?0um&koCJ*1z~U^hxfM9v4qWa8wIK;SzHY>WYP`-H_ejv-P2PgJ$=iGd z<`!QS&9KeaL<_JBs&(|r2RA3x=p!ZMO`{vrUY^AJd6Wt5h%8Fdhi5^y?`oEC39cl1 zJx%icuqwg{oXQF=QoX81#T~N_lPnqvZCBG$$QqtxvJR6u>ND*|Ag++I1$)~u+P4@; zBisT|T|gB%Bx8C+IpypgIb>rtwr-OndJaPKc*maafGzfROySgGFd*={9e_VNfQE40 z$Ie}PNXO(WcEEPXeR7{_8%@2>H0xf`&L9yfm#e^S(4SXtU)xQmVJVBTh^t*CP5bIS4Rv zRkxQGag?e)5Q{7R(wE#rWdvTiRA49bn2HOavUaioNlYAbsX3);td~6;`1~*C>0m#_YdmTmSEb82z;v zNMleOvmhawg&7jt87jW*@od5I|InwFW6nHa=CSA8NQl)c|H$->j)Zz zS$T^Uhm3_>o^?z@UAw44_{AegI_ws9B!_BtrWb9Fq!?V^x~R7L7gg_a)c5PM4T?#0 zyRJuN8K%)5lxD+JXoy)Zu^#5th{l+boY$y5cO-g9+etnsFjeyXC8tV^<`#f@7LZHN z(hbVs>p*zzM;=3L|25lO^6eAt;*@JqCj{eKOk#8gxDm=8-G~nI+4k(UUXl$rp#Y7| zo2r_o;`-K|gjb_$Z(J!qdut?;;ixk7R=;-{xcks{}t?y?HGP_azP3JT+d8%*mny~6=sxl|Q z9_^)21M{cDccc$@OAMEM6%jre@(QBI{d-OsbFRW4uLCHI6q@5viFS<_}JQ0G)>Bbq_A|I>zu{?jK{!;05*ZRj+G GGyV&1MN^*u literal 0 HcmV?d00001 diff --git a/src/oauth/__pycache__/forms.cpython-310.pyc b/src/oauth/__pycache__/forms.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1c692162d48ee0a822cbfb81bfe5b638b5243e9 GIT binary patch literal 882 zcmZ8fy>8S%5Z<-DKIh_th@VJ#1Q)piQAG$L6b{m)04nRGmE+mF_*mPQU0YG2t4O3& zK@^l!h$aP*D0mShnr#t^@(MICyADyrNHdQnNZfDgejfk4n%aO9^9*ejBRm-r7!s9}>@l^UJiegRX_ z=-d`=iXCG`Z=ew*r9e_o__F{gc;KIUDZ?m4?LhzxD4p~S)9qX+Wf7Q&^P(ym&Xoma`i|vRHE$ae zP6{DGs~#2--vnC7i3u__)h2wiZ@*{MEOGAobACpCKiJ$D%L6`F^-Sc=SgU-zIm@bP z{Z!V|^)l0qP~$plo87Uyz~THr4Y2zXs*cdC(tt+v&Y#1z|Cc`ehcj8Wn5(Q5oSQ!9 zWeu&ge$4q^o5`-CJnVMGW@Kq7+up=mRU@WCxs+LcQ2>alW7~7M3UGkT;EGl*q{Q9a z$DccM*Lthg*!3|~2RtIT=nB2(x$Jflnl*65hwf5}ouMT?bfg`$G`^~LDYyGzgtzD# a+?eMk+j%B>)KPtGUy`q_5T8r>gp!| literal 0 HcmV?d00001 diff --git a/src/oauth/__pycache__/models.cpython-310.pyc b/src/oauth/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c6ff615fa0c3509ab935aa435d5d1fded772135 GIT binary patch literal 2760 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 adqfZ65`?W_m$kgQK)a3KygF+vEdCeh5-@`R literal 0 HcmV?d00001 diff --git a/src/oauth/__pycache__/urls.cpython-310.pyc b/src/oauth/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cda9c8d86d2aaff61d4751dac157d1dd79a04c6 GIT binary patch literal 655 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' % + (link, obj.author.nickname if obj.author.nickname else obj.author.email)) + + def show_user_image(self, obj): + """ + 自定义字段:显示用户头像 + 在admin列表中显示50x50像素的头像图片 + """ + img = obj.picture + return format_html( + u'' % + (img)) + + # 设置自定义字段在admin中的显示名称 + link_to_usermodel.short_description = '用户' + show_user_image.short_description = '用户头像' + + +class OAuthConfigAdmin(admin.ModelAdmin): + """ + OAuth配置模型的管理界面配置 + 用于管理第三方登录的配置信息 + """ + + # 列表页显示的字段 + list_display = ('type', 'appkey', 'appsecret', 'is_enable') + # 右侧筛选器 + list_filter = ('type',) \ No newline at end of file diff --git a/src/oauth/apps.py b/src/oauth/apps.py new file mode 100644 index 0000000..75bc3a6 --- /dev/null +++ b/src/oauth/apps.py @@ -0,0 +1,12 @@ +from django.apps import AppConfig + + +class OauthConfig(AppConfig): + """ + OAuth应用配置类 + 用于配置Django应用中OAuth模块的元数据和行为 + """ + + # 指定Django应用的完整Python路径 + # 这应该与应用目录名和settings.INSTALLED_APPS中的名称一致 + name = 'oauth' \ No newline at end of file diff --git a/src/oauth/forms.py b/src/oauth/forms.py new file mode 100644 index 0000000..daf69bd --- /dev/null +++ b/src/oauth/forms.py @@ -0,0 +1,30 @@ +# 导入Django的表单基础模块和组件模块 +from django.contrib.auth.forms import forms +from django.forms import widgets + + +# 定义一个用于获取用户邮箱的表单类,继承自Django的基础表单类forms.Form +class RequireEmailForm(forms.Form): + # 定义邮箱字段: + # - 类型为EmailField,自动验证邮箱格式 + # - label设置表单显示的标签为"电子邮箱" + # - required=True表示该字段为必填项 + email = forms.EmailField(label='电子邮箱', required=True) + + # 定义oauthid字段: + # - 类型为IntegerField,用于存储第三方登录的关联ID + # - widget=forms.HiddenInput设置为隐藏输入框,不在页面显式展示 + # - required=False表示该字段为非必填项 + oauthid = forms.IntegerField(widget=forms.HiddenInput, required=False) + + # 重写表单的初始化方法 + def __init__(self, *args, **kwargs): + # 调用父类的初始化方法,确保表单基础功能正常 + super(RequireEmailForm, self).__init__(*args, **kwargs) + # 自定义email字段的渲染组件: + # - 使用widgets.EmailInput作为输入组件(语义化邮箱输入框) + # - attrs设置HTML属性: + # - placeholder="email":输入框默认提示文本 + # - "class": "form-control":添加CSS类,用于样式控制(通常配合Bootstrap等框架) + self.fields['email'].widget = widgets.EmailInput( + attrs={'placeholder': "email", "class": "form-control"}) \ No newline at end of file diff --git a/src/oauth/migrations/0001_initial.py b/src/oauth/migrations/0001_initial.py new file mode 100644 index 0000000..7b7a487 --- /dev/null +++ b/src/oauth/migrations/0001_initial.py @@ -0,0 +1,99 @@ +# Generated by Django 4.1.7 on 2023-03-07 09:53 +# 备注:此迁移文件由Django 4.1.7版本自动生成,生成时间为2023年3月7日9:53 + +from django.conf import settings +# 备注:导入Django的配置模块,用于获取项目设置(如用户模型) +from django.db import migrations, models +# 备注:导入Django的数据库迁移和模型字段模块,用于定义迁移操作和模型结构 +import django.db.models.deletion +# 备注:导入Django的外键删除行为模块,用于定义外键关联的删除策略 +import django.utils.timezone +# 备注:导入Django的时区工具,用于处理时间字段的默认值 + + +class Migration(migrations.Migration): +# 备注:定义迁移类,所有数据库迁移操作都通过此类实现 + + initial = True + # 备注:标记为初始迁移(首次创建模型时的迁移) + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + # 备注:迁移依赖配置,依赖项目中配置的用户模型(确保用户表先于当前表创建) + + operations = [ + # 备注:定义迁移操作列表,包含需要执行的数据库操作 + migrations.CreateModel( + # 备注:创建第一个模型(数据库表)的操作 + name='OAuthConfig', + # 备注:模型名称,对应数据库表名为"oauth_oauthconfig"(应用名_模型名) + fields=[ + # 备注:模型字段定义列表 + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + # 备注:主键字段,自增BigInteger类型,自动创建,不可序列化,显示名为"ID" + ('type', models.CharField(choices=[('weibo', '微博'), ('google', '谷歌'), ('github', 'GitHub'), ('facebook', 'FaceBook'), ('qq', 'QQ')], default='a', max_length=10, verbose_name='类型')), + # 备注:第三方平台类型字段,字符类型,最大长度10,可选值为微博/谷歌等,默认值为'a'(可能需要修正),显示名为"类型" + ('appkey', models.CharField(max_length=200, verbose_name='AppKey')), + # 备注:第三方应用的AppKey字段,字符类型,最大长度200,显示名为"AppKey" + ('appsecret', models.CharField(max_length=200, verbose_name='AppSecret')), + # 备注:第三方应用的AppSecret字段,字符类型,最大长度200,显示名为"AppSecret" + ('callback_url', models.CharField(default='http://www.baidu.com', max_length=200, verbose_name='回调地址')), + # 备注:授权回调地址字段,字符类型,默认值为百度地址(需替换为实际地址),最大长度200,显示名为"回调地址" + ('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), + # 备注:是否启用该平台的字段,布尔类型,默认值为True(启用),显示名为"是否显示" + ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), + # 备注:创建时间字段,日期时间类型,默认值为当前时间,显示名为"创建时间" + ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), + # 备注:最后修改时间字段,日期时间类型,默认值为当前时间,显示名为"修改时间" + ], + options={ + # 备注:模型的额外配置 + 'verbose_name': 'oauth配置', + # 备注:模型的单数显示名称 + 'verbose_name_plural': 'oauth配置', + # 备注:模型的复数显示名称(与单数相同) + 'ordering': ['-created_time'], + # 备注:默认排序方式,按创建时间倒序(最新的在前) + }, + ), + migrations.CreateModel( + # 备注:创建第二个模型(数据库表)的操作 + name='OAuthUser', + # 备注:模型名称,对应数据库表名为"oauth_oauthuser" + fields=[ + # 备注:模型字段定义列表 + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + # 备注:主键字段,同OAuthConfig的id字段 + ('openid', models.CharField(max_length=50)), + # 备注:第三方平台返回的用户唯一标识,字符类型,最大长度50 + ('nickname', models.CharField(max_length=50, verbose_name='昵称')), + # 备注:第三方用户的昵称,字符类型,最大长度50,显示名为"昵称" + ('token', models.CharField(blank=True, max_length=150, null=True)), + # 备注:第三方授权令牌,字符类型,允许为空,最大长度150,可设为null + ('picture', models.CharField(blank=True, max_length=350, null=True)), + # 备注:第三方用户的头像地址,字符类型,允许为空,最大长度350,可设为null + ('type', models.CharField(max_length=50)), + # 备注:关联的第三方平台类型(如"weibo"),字符类型,最大长度50 + ('email', models.CharField(blank=True, max_length=50, null=True)), + # 备注:第三方用户的邮箱,字符类型,允许为空,最大长度50,可设为null + ('metadata', models.TextField(blank=True, null=True)), + # 备注:存储额外的第三方用户信息,文本类型,允许为空,可设为null + ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), + # 备注:创建时间字段,同OAuthConfig + ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), + # 备注:最后修改时间字段,同OAuthConfig + ('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')), + # 备注:外键字段,关联项目的用户模型,允许为空(支持未绑定本地账号的场景),删除策略为级联删除(用户删除时关联记录也删除),显示名为"用户" + ], + options={ + # 备注:模型的额外配置 + 'verbose_name': 'oauth用户', + # 备注:模型的单数显示名称 + 'verbose_name_plural': 'oauth用户', + # 备注:模型的复数显示名称(与单数相同) + 'ordering': ['-created_time'], + # 备注:默认排序方式,按创建时间倒序 + }, + ), + ] \ No newline at end of file diff --git a/src/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py b/src/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py new file mode 100644 index 0000000..98111ea --- /dev/null +++ b/src/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py @@ -0,0 +1,97 @@ +# Generated by Django 4.2.5 on 2023-09-06 13:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('oauth', '0001_initial'), + ] + + operations = [ + # 修改模型选项:设置排序方式和中文显示名称 + migrations.AlterModelOptions( + name='oauthconfig', + options={'ordering': ['-creation_time'], 'verbose_name': 'oauth配置', 'verbose_name_plural': 'oauth配置'}, + ), + migrations.AlterModelOptions( + name='oauthuser', + options={'ordering': ['-creation_time'], 'verbose_name': 'oauth user', 'verbose_name_plural': 'oauth user'}, + ), + + # 移除旧的时间字段(从 created_time 和 last_mod_time 改为新的字段命名) + migrations.RemoveField( + model_name='oauthconfig', + name='created_time', + ), + migrations.RemoveField( + model_name='oauthconfig', + name='last_mod_time', + ), + migrations.RemoveField( + model_name='oauthuser', + name='created_time', + ), + migrations.RemoveField( + model_name='oauthuser', + name='last_mod_time', + ), + + # 添加新的时间字段(使用新的字段命名 convention) + migrations.AddField( + model_name='oauthconfig', + name='creation_time', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), + ), + migrations.AddField( + model_name='oauthconfig', + name='last_modify_time', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), + ), + migrations.AddField( + model_name='oauthuser', + name='creation_time', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), + ), + migrations.AddField( + model_name='oauthuser', + name='last_modify_time', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), + ), + + # 修改字段定义和选项 + migrations.AlterField( + model_name='oauthconfig', + name='callback_url', + field=models.CharField(default='', max_length=200, verbose_name='callback url'), + ), + migrations.AlterField( + model_name='oauthconfig', + name='is_enable', + field=models.BooleanField(default=True, verbose_name='is enable'), + ), + # 修改OAuth类型选择项,定义支持的第三方登录平台 + migrations.AlterField( + model_name='oauthconfig', + name='type', + field=models.CharField( + choices=[('weibo', 'weibo'), ('google', 'google'), ('github', 'GitHub'), ('facebook', 'FaceBook'), + ('qq', 'QQ')], default='a', max_length=10, verbose_name='type'), + ), + # 修改外键关系,关联到用户模型 + migrations.AlterField( + model_name='oauthuser', + name='author', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, verbose_name='author'), + ), + migrations.AlterField( + model_name='oauthuser', + name='nickname', + field=models.CharField(max_length=50, verbose_name='nickname'), + ), + ] \ No newline at end of file diff --git a/src/oauth/migrations/0003_alter_oauthuser_nickname.py b/src/oauth/migrations/0003_alter_oauthuser_nickname.py new file mode 100644 index 0000000..7e38bbe --- /dev/null +++ b/src/oauth/migrations/0003_alter_oauthuser_nickname.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.7 on 2024-01-26 02:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('oauth', '0002_alter_oauthconfig_options_alter_oauthuser_options_and_more'), + ] + + operations = [ + # 修改OAuth用户昵称字段的显示名称 + # 将verbose_name从'nickname'改为'nick name'(添加空格) + migrations.AlterField( + model_name='oauthuser', + name='nickname', + field=models.CharField(max_length=50, verbose_name='nick name'), + ), + ] \ No newline at end of file diff --git a/src/oauth/migrations/__init__.py b/src/oauth/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/oauth/migrations/__pycache__/0001_initial.cpython-310.pyc b/src/oauth/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23c471da63879448cce547d00c7806ab8e9f5310 GIT binary patch literal 1993 zcmb7FOKjXk81{SZeWYn#ZOW@ac^JqhEpVw2YLabQ1ZgQrFRKX4>zVa>ah@}r?tTb~U@-|;pvDDO%fJB^c77z~uyg*7vstYIw zSkdN?dW}aK%A*1*GQ5=FXb9~>!yN&5yEAztlSi3628?ku(Gh{M2apoj-is#LihUpt z;a$z)=I-VQx+g>L{TF&)irOl=AI1YVkM>^?(SsfEA3T2OKRte!?R)?|(&1s(M>FZM z%&*6p%p)Bw>NYD(d9ZS|iDHSFa{#Eh3a1P40OS>R9oCC`7$k>oQzEc_!$FON*zn92rc%`Qu`WYX$!plDkywG2 z>E5}~?Ysw=ViRJ!n1OdUZuUNVn}JT$h-*|i=0wNi8X#)jv~Z1(RjMw)Yz}6C3TMtx z;nXS0oBia>Fe95^-0og|3w+I44dPfhq&bA^X6#1L)aF^k#hx8Cf+Fy#V){P#-v6En zv%dc#ZtFs@55$z90U^W?Z$vdvFQwC>Wx8(7v{sEcaM#BgQRE+3RU^3}T==ek!my6?ZPi@{`KcEGk18rU;y5PU-JUHZKH&h_4?%uxDyZCkg;+M4Knqg$X5#7=M{N0V-g>O=Q3|9z8plpr)o1M*XZ>*Q5 z2JL}cY?IN!k{P}m2c}C^5+Eq5XX_%BSS^*hgIxqEC4PE0Xsl6AL+ze+V|z zc@`*DJ;z#2R#>yWAS9==u5P?&2XR@3-j#oEGAcKkX+@oIOo`K+Q>qZTB^-A%pjc>q03!t zdZ|>Zz?oZy7Dz<}HBHYZRE{IZ4XK(m$2##a6+N;>wPk!ZN{RUe0;#k;Xl*K>8dX_B z;9{q_`PrrU*~(FxhstG_{ij^82u`ujpOwnt6}N5p0cm0@S_uPdrNVZdbBR6Gg1*DS z3hS+vo!`aE%*@O|Bg)5F#Iz&)&^Bj3FZ?bHWvpM-Uzl}WqlGjbaP+)-S_dsdP>q!=&GqCqSWbUx v<*jT4^WYsF&-5&*<*l5uO?L8<&Q2tJ^|`cNo`+85!sHGr3d6h#V?z7~6%b$X literal 0 HcmV?d00001 diff --git a/src/oauth/migrations/__pycache__/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.cpython-310.pyc b/src/oauth/migrations/__pycache__/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d06bd524b88cc87708991c0a58ed85e9d0bdf5a GIT binary patch literal 1892 zcmaJ?Id264MAYAnWZSIu$JJ?o9~@7-Xt0^qfi8C#N$L3`Wz@ro_Cbp?6Z!OC-_gkH4TFr zO%sf!MeQFP>h=mhnqY=j(^I*?0y{J@JLdo1hQb)F5cM?bgFk~7(Y6RBZK34yRQ6_Y zZ;F@Drb5fT3a$3$dh@*nsKVUXg88wHIh1zchIa9W*1Of$yTx}ABQIg(C0K?PScSE* zJ;|vw>!?|V4cMH?rtmw;BQ)UdTNAe6J-7q!kDaNX2lr6Ff_@vgn$=#px7J%%dkOcT zHg;$1?(57Szag;^@YnCp%0vkhC-cZrz2__h7CX0Li)Gz}gIt&&SFxCz_XCxC$8kfIgkkJ&Z zA&8NeRCT3(@Fih14%4pAD2q`-XdJW|JsF`~%Vp`L!vU?kiiryvwYj*f%Clr4)LL=(BV%Tg+iR0F)2bWQmc?ejPEP*dmc0%%F7yH8ddK}t`M_FP+lUJ!>|x>*{r zMEa^BMm(m{j`@Ww>DaktaladgT&&=RG8)ABtaQi)jl%eII+PZ)rLVULFF)z+?;h{( zHV$No59s7V{K*jeSciW7bJ6&u#fD@cc#n3{Rw6pBhOTFi@$gX}dzgxr?)%pDmD%vP%QYSYQXuH|U?^NHLG^m_9lm^{WLu{5pHr~RiW;5kQR6s& z_qb#_|2nR+xLul?+F_1~$I4XNno3IR|E4Rf7iBr;XIrf?Z-?Rpfwu0PoYl=KxQ$(g x-<$0#62!;2Lb*E8YnHdKNY+WN>ByyqviCpDoAopNHW`UJEfs6Q^zpZ5{|~^xBclKS literal 0 HcmV?d00001 diff --git a/src/oauth/migrations/__pycache__/0003_alter_oauthuser_nickname.cpython-310.pyc b/src/oauth/migrations/__pycache__/0003_alter_oauthuser_nickname.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01eb1b99c804b70d8e276443a78d3f5f95c6e0e2 GIT binary patch literal 674 zcmZWnO^eh(5bcj-CJD13f_wHP%)wz;Zz8(tq9^wvUP7SBrfM^ZNji4VEUs6*?w|1H zFYzvT>8q#x3xcfGJq|lyLlyn%Rq9n$S|1!_jLy%mKUUv4W4}DuKM{drGW&oWFyI~Q zdCq&03(j6M5Fo!WkjPv4S>_U=w`?9?Q!bkem-S6;%5|d$>n6Ph>}=(!{WB$SOlBA4 zkmVd$E`ZlOml(CN7r;q7g$QDpTnU(7N#YVnNGNsbo1Fs5#k$vMMT0aULIx-@*{IhPDg^?oROygs7#KBXSs_c%;fepDR}^?K!I z7iiA3MHM(nlly4{a*>a@_`JamPO0Zag}72KQzQtR4(UEq>cgh&e6B};BMyK=)u1(k zv|aYxPxQ)HG13Rpm#cD%U8YC;x9D%o+#@!)-|tQy7u}^Ajc&187uHn8Nm~xJe$nar zVP9IRScGYd+h0}C{vQ3erQISHg`kf~$)zWq|0%AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUSC7ps_@%J_n! z{H)aEl9=M62CKnE3e2yv&mL ac)fzkTO2mI`6;D2sdgZfig`kf~$)zWiSHi#~=wzk|f$m5IN=5^VPi1|0dxkVVI60qF{B?4cz7W#ga(OssiX z3#z&04avW7sT^I)xy~v&(Zh_^wVG~t{^HgmiaymvHCFARE=3<)wCm-hhIYGu_0EDu z3p9rr$PEn)7I21U=p0|5Gthx1C+GwQm|+$i$1_;q1+PFLQ)`P9w2uRp#u(V&tg)wXJIaEYbM-H@8<;U)UL zySv#FhgmJF5%24slKtN9h>r7W$LfDxQl+`<`FwgejnFh#SEkI-c715#EkVnDMmy^+ zHJ4+IVu+X1L{yaB_35rFTcYYyp*rmwPeWWElTZ@tEnRO+%k_9L5h8P94H1RXCMap` zvX=bwge#pkt=nx_dEYrV9k_9oEf?nTe>AMvkG>5NCScXVI>rz!Nl2FVhsjbtvNyWP zs)?8{iL`@{%)P5a+crUYo#_K#pSH)6j%m)N&%!i56#J4&TOY}DE1pZ!vNItj%1)*$ io`2y=uNUpXi;lO-icJLXxS>(b-b77k;uy!l8vFq+M)_0# literal 0 HcmV?d00001 diff --git a/src/oauth/templatetags/oauth_tags.py b/src/oauth/templatetags/oauth_tags.py new file mode 100644 index 0000000..f5b1969 --- /dev/null +++ b/src/oauth/templatetags/oauth_tags.py @@ -0,0 +1,54 @@ +from django import template +from django.urls import reverse + +from oauth.oauthmanager import get_oauth_apps + +# 注册Django模板标签库 +register = template.Library() + + +@register.inclusion_tag('oauth/oauth_applications.html') +def load_oauth_applications(request): + """ + 自定义模板标签:加载OAuth认证应用程序列表 + + 功能: + - 获取所有可用的OAuth应用配置 + - 生成每个OAuth应用的登录URL + - 通过包含模板的方式渲染OAuth登录按钮 + + 参数: + request: HttpRequest对象,用于获取当前请求路径 + + 返回: + 包含apps列表的字典,用于渲染模板 + """ + + # 获取所有配置的OAuth应用 + applications = get_oauth_apps() + + if applications: + # 获取OAuth登录的基础URL + baseurl = reverse('oauth:oauthlogin') + # 获取当前请求的完整路径(用于登录成功后跳转回原页面) + path = request.get_full_path() + + # 为每个OAuth应用生成登录URL + # 格式:/oauth/login/?type=github&next_url=/current/path/ + apps = list(map(lambda x: ( + x.ICON_NAME, # OAuth应用类型标识(如:github、weibo等) + '{baseurl}?type={type}&next_url={next}'.format( + baseurl=baseurl, + type=x.ICON_NAME, + next=path + )), + applications + )) + else: + # 如果没有配置任何OAuth应用,返回空列表 + apps = [] + + # 返回模板上下文数据 + return { + 'apps': apps # 包含(OAuth类型, 登录URL)元组的列表 + } \ No newline at end of file diff --git a/src/oauth/tests.py b/src/oauth/tests.py new file mode 100644 index 0000000..0c3a525 --- /dev/null +++ b/src/oauth/tests.py @@ -0,0 +1,323 @@ +# 导入必要的模块:JSON处理、单元测试Mock工具、Django配置/认证/测试/URL工具、项目工具类及OAuth相关模型和管理器 +import json +from unittest.mock import patch # 用于Mock测试中替换真实函数/方法,模拟第三方接口返回 + +from django.conf import settings # 导入Django项目配置 +from django.contrib import auth # 导入Django认证模块,用于获取/验证用户 +from django.test import Client, RequestFactory, TestCase # Django测试基础类:Client模拟HTTP请求,RequestFactory构建请求对象,TestCase测试基类 +from django.urls import reverse # 用于通过URL名称反向解析URL + +from djangoblog.utils import get_sha256 # 导入项目自定义工具类,用于生成SHA256加密字符串 +from oauth.models import OAuthConfig # 导入OAuth配置模型,用于测试中创建配置数据 +from oauth.oauthmanager import BaseOauthManager # 导入OAuth管理器基类,用于获取所有第三方登录管理器子类 + + +# Create your tests here. +# 定义OAuth配置相关的测试类,继承Django测试基类TestCase +class OAuthConfigTest(TestCase): + # 测试前置方法:在每个测试方法执行前初始化测试环境 + def setUp(self): + self.client = Client() # 创建HTTP客户端对象,用于发送测试请求 + self.factory = RequestFactory() # 创建请求工厂对象,用于构建自定义请求 + + # 测试OAuth登录流程的基础功能(以微博为例) + def test_oauth_login_test(self): + # 1. 创建测试用的微博OAuth配置数据并保存到数据库 + c = OAuthConfig() + c.type = 'weibo' # 平台类型为微博 + c.appkey = 'appkey' # 模拟AppKey + c.appsecret = 'appsecret' # 模拟AppSecret + c.save() # 保存到数据库 + + # 2. 发送GET请求到微博OAuth登录地址,测试跳转是否正常 + response = self.client.get('/oauth/oauthlogin?type=weibo') + self.assertEqual(response.status_code, 302) # 断言响应状态码为302(重定向,符合OAuth授权流程) + self.assertTrue("api.weibo.com" in response.url) # 断言重定向URL包含微博API域名,确认跳转到微博授权页 + + # 3. 模拟授权成功后回调,发送带code参数的请求到授权处理地址 + response = self.client.get('/oauth/authorize?type=weibo&code=code') + self.assertEqual(response.status_code, 302) # 断言响应状态码为302(处理后重定向) + self.assertEqual(response.url, '/') # 断言重定向到首页,确认授权后跳转正常 + + +# 定义第三方登录流程的测试类,继承TestCase +class OauthLoginTest(TestCase): + # 测试前置方法:初始化客户端、请求工厂,并创建所有支持的第三方平台配置 + def setUp(self) -> None: + self.client = Client() # 初始化HTTP客户端 + self.factory = RequestFactory() # 初始化请求工厂 + self.apps = self.init_apps() # 调用自定义方法,创建所有第三方平台的测试配置 + + # 初始化所有第三方登录平台的配置(基于BaseOauthManager的子类) + def init_apps(self): + # 1. 获取BaseOauthManager的所有子类(即各第三方平台的具体管理器,如微博、谷歌等) + applications = [p() for p in BaseOauthManager.__subclasses__()] + # 2. 为每个平台创建对应的OAuthConfig数据并保存 + for application in applications: + c = OAuthConfig() + c.type = application.ICON_NAME.lower() # 平台类型与管理器的ICON_NAME一致(小写) + c.appkey = 'appkey' # 模拟AppKey + c.appsecret = 'appsecret' # 模拟AppSecret + c.save() # 保存到数据库 + return applications # 返回所有平台管理器实例,供后续测试使用 + + # 根据平台类型获取对应的管理器实例 + def get_app_by_type(self, type): + for app in self.apps: + if app.ICON_NAME.lower() == type: # 匹配平台类型(小写) + return app + return None # 未找到时返回None + + # 测试微博登录流程(使用@patch模拟管理器的do_post/do_get方法,避免真实调用第三方接口) + @patch("oauth.oauthmanager.WBOauthManager.do_post") # Mock微博管理器的POST请求方法 + @patch("oauth.oauthmanager.WBOauthManager.do_get") # Mock微博管理器的GET请求方法 + def test_weibo_login(self, mock_do_get, mock_do_post): + # 1. 获取微博管理器实例,断言实例存在(确认初始化成功) + weibo_app = self.get_app_by_type('weibo') + assert weibo_app + + # 2. 调用获取授权URL的方法(仅验证方法可执行,未断言URL内容) + url = weibo_app.get_authorization_url() + + # 3. 模拟do_post返回(第三方平台返回的access_token和uid) + mock_do_post.return_value = json.dumps({"access_token": "access_token", + "uid": "uid" + }) + # 4. 模拟do_get返回(第三方平台返回的用户信息,如头像、昵称等) + mock_do_get.return_value = json.dumps({ + "avatar_large": "avatar_large", + "screen_name": "screen_name", + "id": "id", + "email": "email", + }) + + # 5. 调用获取access_token的方法,获取用户信息对象 + userinfo = weibo_app.get_access_token_by_code('code') + # 6. 断言用户信息中的token和openid与模拟返回一致(验证流程正确性) + self.assertEqual(userinfo.token, 'access_token') + self.assertEqual(userinfo.openid, 'id') + + # 测试谷歌登录流程(逻辑与微博类似,Mock谷歌管理器的请求方法) + @patch("oauth.oauthmanager.GoogleOauthManager.do_post") + @patch("oauth.oauthmanager.GoogleOauthManager.do_get") + def test_google_login(self, mock_do_get, mock_do_post): + # 1. 获取谷歌管理器实例,断言存在 + google_app = self.get_app_by_type('google') + assert google_app + + # 2. 调用获取授权URL的方法 + url = google_app.get_authorization_url() + + # 3. 模拟do_post返回(谷歌返回的access_token和id_token) + mock_do_post.return_value = json.dumps({ + "access_token": "access_token", + "id_token": "id_token", + }) + # 4. 模拟do_get返回(谷歌返回的用户信息) + mock_do_get.return_value = json.dumps({ + "picture": "picture", + "name": "name", + "sub": "sub", # 谷歌用户唯一标识(对应openid) + "email": "email", + }) + + # 5. 调用获取token和用户信息的方法 + token = google_app.get_access_token_by_code('code') + userinfo = google_app.get_oauth_userinfo() + # 6. 断言token和openid与模拟返回一致 + self.assertEqual(userinfo.token, 'access_token') + self.assertEqual(userinfo.openid, 'sub') + + # 测试GitHub登录流程 + @patch("oauth.oauthmanager.GitHubOauthManager.do_post") + @patch("oauth.oauthmanager.GitHubOauthManager.do_get") + def test_github_login(self, mock_do_get, mock_do_post): + # 1. 获取GitHub管理器实例,断言存在 + github_app = self.get_app_by_type('github') + assert github_app + + # 2. 调用获取授权URL,断言URL包含GitHub域名和client_id(验证授权URL正确性) + url = github_app.get_authorization_url() + self.assertTrue("github.com" in url) # 确认跳转到GitHub授权页 + self.assertTrue("client_id" in url) # 确认URL包含client_id参数 + + # 3. 模拟do_post返回(GitHub返回的token字符串,非JSON格式) + mock_do_post.return_value = "access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer" + # 4. 模拟do_get返回(GitHub返回的用户信息) + mock_do_get.return_value = json.dumps({ + "avatar_url": "avatar_url", + "name": "name", + "id": "id", # GitHub用户唯一标识 + "email": "email", + }) + + # 5. 调用获取token和用户信息的方法 + token = github_app.get_access_token_by_code('code') + userinfo = github_app.get_oauth_userinfo() + # 6. 断言token与模拟返回一致 + self.assertEqual(userinfo.token, 'gho_16C7e42F292c6912E7710c838347Ae178B4a') + self.assertEqual(userinfo.openid, 'id') + + # 测试Facebook登录流程 + @patch("oauth.oauthmanager.FaceBookOauthManager.do_post") + @patch("oauth.oauthmanager.FaceBookOauthManager.do_get") + def test_facebook_login(self, mock_do_get, mock_do_post): + # 1. 获取Facebook管理器实例,断言存在 + facebook_app = self.get_app_by_type('facebook') + assert facebook_app + + # 2. 调用获取授权URL,断言包含Facebook域名 + url = facebook_app.get_authorization_url() + self.assertTrue("facebook.com" in url) + + # 3. 模拟do_post返回(Facebook返回的access_token) + mock_do_post.return_value = json.dumps({ + "access_token": "access_token", + }) + # 4. 模拟do_get返回(Facebook返回的用户信息,头像嵌套在picture.data.url中) + mock_do_get.return_value = json.dumps({ + "name": "name", + "id": "id", # Facebook用户唯一标识 + "email": "email", + "picture": { + "data": { + "url": "url" + } + } + }) + + # 5. 调用获取token和用户信息的方法 + token = facebook_app.get_access_token_by_code('code') + userinfo = facebook_app.get_oauth_userinfo() + # 6. 断言token与模拟返回一致 + self.assertEqual(userinfo.token, 'access_token') + + # 测试QQ登录流程(Mock do_get方法,模拟多步返回:token、openid、用户信息) + @patch("oauth.oauthmanager.QQOauthManager.do_get", side_effect=[ + # 模拟三次do_get调用的返回值(QQ授权流程需多步请求) + 'access_token=access_token&expires_in=3600', # 第一步:获取token + 'callback({"client_id":"appid","openid":"openid"} );', # 第二步:获取openid(带callback包裹) + json.dumps({ # 第三步:获取用户信息 + "nickname": "nickname", + "email": "email", + "figureurl": "figureurl", + "openid": "openid", + }) + ]) + def test_qq_login(self, mock_do_get): + # 1. 获取QQ管理器实例,断言存在 + qq_app = self.get_app_by_type('qq') + assert qq_app + + # 2. 调用获取授权URL,断言包含QQ域名 + url = qq_app.get_authorization_url() + self.assertTrue("qq.com" in url) + + # 3. 调用获取token和用户信息的方法 + token = qq_app.get_access_token_by_code('code') + userinfo = qq_app.get_oauth_userinfo() + # 4. 断言token与模拟返回一致 + self.assertEqual(userinfo.token, 'access_token') + + # 测试微博登录(用户信息包含邮箱的场景):验证登录后自动绑定用户、跳转首页 + @patch("oauth.oauthmanager.WBOauthManager.do_post") + @patch("oauth.oauthmanager.WBOauthManager.do_get") + def test_weibo_authoriz_login_with_email(self, mock_do_get, mock_do_post): + # 1. 模拟do_post返回(access_token和uid) + mock_do_post.return_value = json.dumps({"access_token": "access_token", + "uid": "uid" + }) + # 2. 模拟do_get返回(包含邮箱的用户信息) + mock_user_info = { + "avatar_large": "avatar_large", + "screen_name": "screen_name1", # 昵称(将作为Django用户名) + "id": "id", + "email": "email", # 包含邮箱 + } + mock_do_get.return_value = json.dumps(mock_user_info) + + # 3. 发送请求到微博登录地址,断言重定向到微博API + response = self.client.get('/oauth/oauthlogin?type=weibo') + self.assertEqual(response.status_code, 302) + self.assertTrue("api.weibo.com" in response.url) + + # 4. 模拟授权回调,发送带code的请求到授权处理地址 + response = self.client.get('/oauth/authorize?type=weibo&code=code') + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, '/') # 断言授权后跳转到首页 + + # 5. 验证用户已登录,且用户信息与模拟数据一致 + user = auth.get_user(self.client) # 获取当前登录用户 + assert user.is_authenticated # 断言用户已认证 + self.assertTrue(user.is_authenticated) + self.assertEqual(user.username, mock_user_info['screen_name']) # 用户名=微博昵称 + self.assertEqual(user.email, mock_user_info['email']) # 邮箱=微博返回的邮箱 + + # 6. 测试登出后再次登录(验证重复登录逻辑) + self.client.logout() # 登出当前用户 + response = self.client.get('/oauth/authorize?type=weibo&code=code') # 再次授权 + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, '/') + + # 7. 再次验证用户登录状态和信息 + user = auth.get_user(self.client) + assert user.is_authenticated + self.assertTrue(user.is_authenticated) + self.assertEqual(user.username, mock_user_info['screen_name']) + self.assertEqual(user.email, mock_user_info['email']) + + # 测试微博登录(用户信息不含邮箱的场景):验证跳转邮箱填写页、绑定邮箱后登录 + @patch("oauth.oauthmanager.WBOauthManager.do_post") + @patch("oauth.oauthmanager.WBOauthManager.do_get") + def test_weibo_authoriz_login_without_email(self, mock_do_get, mock_do_post): + # 1. 模拟do_post返回(access_token和uid) + mock_do_post.return_value = json.dumps({"access_token": "access_token", + "uid": "uid" + }) + # 2. 模拟do_get返回(不含邮箱的用户信息) + mock_user_info = { + "avatar_large": "avatar_large", + "screen_name": "screen_name1", + "id": "id", + } + mock_do_get.return_value = json.dumps(mock_user_info) + + # 3. 发送请求到微博登录地址,断言重定向到微博API + response = self.client.get('/oauth/oauthlogin?type=weibo') + self.assertEqual(response.status_code, 302) + self.assertTrue("api.weibo.com" in response.url) + + # 4. 模拟授权回调:因无邮箱,应跳转到邮箱填写页 + response = self.client.get('/oauth/authorize?type=weibo&code=code') + self.assertEqual(response.status_code, 302) # 重定向到邮箱填写页 + + # 5. 解析邮箱填写页URL中的oauth_user_id(第三方用户记录ID) + oauth_user_id = int(response.url.split('/')[-1].split('.')[0]) + self.assertEqual(response.url, f'/oauth/requireemail/{oauth_user_id}.html') # 断言跳转地址正确 + + # 6. 模拟提交邮箱:发送POST请求到邮箱填写页,传入邮箱和oauth_user_id + response = self.client.post(response.url, {'email': 'test@gmail.com', 'oauthid': oauth_user_id}) + self.assertEqual(response.status_code, 302) # 提交后重定向到绑定成功页 + + # 7. 生成邮箱验证的签名(使用项目工具类,基于SECRET_KEY和oauth_user_id) + sign = get_sha256(settings.SECRET_KEY + str(oauth_user_id) + settings.SECRET_KEY) + + # 8. 反向解析绑定成功页URL,断言提交邮箱后跳转地址正确 + url = reverse('oauth:bindsuccess', kwargs={'oauthid': oauth_user_id}) + self.assertEqual(response.url, f'{url}?type=email') # 跳转带type=email参数的绑定成功页 + + # 9. 模拟访问邮箱验证链接(确认邮箱绑定) + path = reverse('oauth:email_confirm', kwargs={'id': oauth_user_id, 'sign': sign}) + response = self.client.get(path) + self.assertEqual(response.status_code, 302) + # 断言验证后跳转到带type=success的绑定成功页 + self.assertEqual(response.url, f'/oauth/bindsuccess/{oauth_user_id}.html?type=success') + + # 10. 验证用户已登录,且信息与填写的邮箱一致 + user = auth.get_user(self.client) + from oauth.models import OAuthUser # 导入OAuthUser模型(避免循环导入) + oauth_user = OAuthUser.objects.get(author=user) # 获取关联的第三方用户记录 + self.assertTrue(user.is_authenticated) # 断言用户已认证 + self.assertEqual(user.username, mock_user_info['screen_name']) # 用户名=微博昵称 + self.assertEqual(user.email, 'test@gmail.com') # 邮箱=填写的测试邮箱 + self.assertEqual(oauth_user.pk, oauth_user_id) # 关联的第三方用户ID正确 \ No newline at end of file diff --git a/src/oauth/urls.py b/src/oauth/urls.py new file mode 100644 index 0000000..d237931 --- /dev/null +++ b/src/oauth/urls.py @@ -0,0 +1,46 @@ +from django.urls import path + +from . import views + +# 定义应用命名空间,用于URL反向解析时区分不同应用的URL +app_name = "oauth" + +# OAuth认证模块的URL配置 +urlpatterns = [ + # OAuth授权回调端点 + # 第三方平台授权成功后回调此URL + path( + r'oauth/authorize', + views.authorize), + + # 邮箱补充页面 + # 当OAuth用户没有邮箱时需要补充邮箱信息 + # oauthid: OAuth用户ID + path( + r'oauth/requireemail/.html', + views.RequireEmailView.as_view(), + name='require_email'), + + # 邮箱确认端点 + # 验证用户邮箱的确认链接 + # id: 用户ID, sign: 安全签名 + path( + r'oauth/emailconfirm//.html', + views.emailconfirm, + name='email_confirm'), + + # 绑定成功页面 + # OAuth账号绑定成功后的展示页面 + # oauthid: OAuth用户ID + path( + r'oauth/bindsuccess/.html', + views.bindsuccess, + name='bindsuccess'), + + # OAuth登录入口 + # 发起第三方登录请求的端点 + path( + r'oauth/oauthlogin', + views.oauthlogin, + name='oauthlogin') +] \ No newline at end of file diff --git a/src/oauth/views.py b/src/oauth/views.py new file mode 100644 index 0000000..6dd92a9 --- /dev/null +++ b/src/oauth/views.py @@ -0,0 +1,313 @@ +import logging # 导入日志模块,用于记录系统运行日志 +# Create your views here. +from urllib.parse import urlparse # 导入URL解析工具,用于验证跳转URL的合法性 + +from django.conf import settings # 导入Django项目配置 +from django.contrib.auth import get_user_model # 导入获取用户模型的工具(支持自定义用户模型) +from django.contrib.auth import login # 导入登录函数,用于实现用户登录 +from django.core.exceptions import ObjectDoesNotExist # 导入对象不存在异常类 +from django.db import transaction # 导入数据库事务工具,确保数据操作的原子性 +from django.http import HttpResponseForbidden # 导入403禁止访问响应类 +from django.http import HttpResponseRedirect # 导入重定向响应类 +from django.shortcuts import get_object_or_404 # 导入获取对象或返回404的工具 +from django.shortcuts import render # 导入渲染模板函数 +from django.urls import reverse # 导入URL反向解析工具 +from django.utils import timezone # 导入时间工具,用于生成时间相关的唯一标识 +from django.utils.translation import gettext_lazy as _ # 导入国际化翻译工具 +from django.views.generic import FormView # 导入表单视图基类,用于处理表单提交 + +from djangoblog.blog_signals import oauth_user_login_signal # 导入OAuth用户登录信号 +from djangoblog.utils import get_current_site # 导入获取当前站点信息的工具 +from djangoblog.utils import send_email, get_sha256 # 导入发送邮件和SHA256加密工具 +from oauth.forms import RequireEmailForm # 导入获取邮箱的表单类 +from .models import OAuthUser # 导入OAuth用户模型 +from .oauthmanager import get_manager_by_type, OAuthAccessTokenException # 导入OAuth管理器和异常类 + +# 初始化日志记录器,用于记录当前模块的日志 +logger = logging.getLogger(__name__) + + +def get_redirecturl(request): + """ + 处理跳转URL的验证和清洗,确保跳转地址合法 + :param request: HTTP请求对象 + :return: 清洗后的合法跳转URL + """ + nexturl = request.GET.get('next_url', None) # 从请求参数中获取跳转URL + # 处理默认情况:无next_url或指向登录页时,默认跳转到首页 + if not nexturl or nexturl == '/login/' or nexturl == '/login': + nexturl = '/' + return nexturl + # 解析URL,验证域名合法性(防止跳转到外部恶意网站) + p = urlparse(nexturl) + if p.netloc: # 如果URL包含域名(非相对路径) + site = get_current_site().domain # 获取当前网站域名 + # 比较跳转URL的域名与当前网站域名(忽略www.前缀) + if not p.netloc.replace('www.', '') == site.replace('www.', ''): + logger.info('非法url:' + nexturl) # 记录非法URL日志 + return "/" # 非法URL时跳转到首页 + return nexturl # 返回合法的跳转URL + + +def oauthlogin(request): + """ + 处理第三方登录请求,生成并跳转到第三方平台的授权页面 + :param request: HTTP请求对象 + :return: 重定向到第三方授权页面的响应 + """ + type = request.GET.get('type', None) # 获取第三方平台类型(如weibo、github等) + if not type: # 无平台类型时跳转到首页 + return HttpResponseRedirect('/') + # 根据平台类型获取对应的OAuth管理器(如微博管理器、GitHub管理器) + manager = get_manager_by_type(type) + if not manager: # 管理器不存在时跳转到首页 + return HttpResponseRedirect('/') + nexturl = get_redirecturl(request) # 获取并验证跳转URL + # 通过管理器生成第三方平台的授权URL(包含回调地址、state等参数) + authorizeurl = manager.get_authorization_url(nexturl) + return HttpResponseRedirect(authorizeurl) # 重定向到第三方授权页面 + + +def authorize(request): + """ + 处理第三方平台的授权回调,验证授权码并完成用户登录/绑定流程 + :param request: HTTP请求对象 + :return: 重定向到目标页面或邮箱填写页的响应 + """ + type = request.GET.get('type', None) # 获取第三方平台类型 + if not type: # 无平台类型时跳转到首页 + return HttpResponseRedirect('/') + manager = get_manager_by_type(type) # 获取对应的OAuth管理器 + if not manager: # 管理器不存在时跳转到首页 + return HttpResponseRedirect('/') + code = request.GET.get('code', None) # 获取第三方平台返回的授权码 + try: + # 使用授权码获取访问令牌(access token) + rsp = manager.get_access_token_by_code(code) + except OAuthAccessTokenException as e: # 捕获令牌获取失败异常 + logger.warning("OAuthAccessTokenException:" + str(e)) # 记录警告日志 + return HttpResponseRedirect('/') + except Exception as e: # 捕获其他异常 + logger.error(e) # 记录错误日志 + rsp = None + nexturl = get_redirecturl(request) # 获取验证后的跳转URL + if not rsp: # 令牌获取失败时,重新生成授权URL并跳转 + return HttpResponseRedirect(manager.get_authorization_url(nexturl)) + + # 通过令牌获取第三方用户信息(如昵称、头像、邮箱等) + user = manager.get_oauth_userinfo() + if user: # 成功获取用户信息 + # 处理空昵称:生成基于时间的默认昵称 + if not user.nickname or not user.nickname.strip(): + user.nickname = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S') + + try: + # 查找是否已存在该第三方用户的关联记录 + temp = OAuthUser.objects.get(type=type, openid=user.openid) + # 更新已有记录的头像、元数据和昵称 + temp.picture = user.picture + temp.metadata = user.metadata + temp.nickname = user.nickname + user = temp # 复用已有记录 + except ObjectDoesNotExist: + # 不存在时使用新用户信息(后续会保存) + pass + + # 特殊处理Facebook的token(因过长可能导致存储问题,此处清空) + if type == 'facebook': + user.token = '' + + if user.email: # 若第三方用户信息包含邮箱(可直接绑定/创建本地用户) + with transaction.atomic(): # 使用数据库事务确保操作原子性 + author = None + try: + # 尝试通过关联ID获取本地用户 + author = get_user_model().objects.get(id=user.author_id) + except ObjectDoesNotExist: + pass # 关联用户不存在时继续处理 + + if not author: # 本地用户不存在时,通过邮箱查找或创建 + # 查找或创建与第三方邮箱一致的本地用户 + result = get_user_model().objects.get_or_create(email=user.email) + author = result[0] + # 若为新创建的用户(result[1]为True) + if result[1]: + try: + # 检查昵称是否已被使用 + get_user_model().objects.get(username=user.nickname) + except ObjectDoesNotExist: + # 未被使用则设置昵称 + author.username = user.nickname + else: + # 已被使用则生成基于时间的唯一用户名 + author.username = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S') + author.source = 'authorize' # 标记用户来源为OAuth授权 + author.save() # 保存本地用户信息 + + # 关联第三方用户记录与本地用户 + user.author = author + user.save() # 保存第三方用户记录 + + # 发送OAuth用户登录信号(供其他模块监听处理) + oauth_user_login_signal.send( + sender=authorize.__class__, id=user.id) + login(request, author) # 登录本地用户 + return HttpResponseRedirect(nexturl) # 重定向到目标页面 + else: # 第三方用户信息不含邮箱(需要用户补充邮箱) + user.save() # 先保存第三方用户记录(无关联本地用户) + # 生成邮箱填写页的URL + url = reverse('oauth:require_email', kwargs={'oauthid': user.id}) + return HttpResponseRedirect(url) # 重定向到邮箱填写页 + else: # 未获取到用户信息时,跳转到目标页面 + return HttpResponseRedirect(nexturl) + + +def emailconfirm(request, id, sign): + """ + 处理邮箱验证请求,完成第三方用户与本地用户的绑定 + :param request: HTTP请求对象 + :param id: OAuthUser记录ID + :param sign: 验证签名(防止恶意请求) + :return: 重定向到绑定成功页或403禁止访问 + """ + if not sign: # 无签名时返回403 + return HttpResponseForbidden() + # 验证签名合法性(使用SECRET_KEY和ID生成SHA256比对) + if not get_sha256(settings.SECRET_KEY + str(id) + settings.SECRET_KEY).upper() == sign.upper(): + return HttpResponseForbidden() # 签名不匹配时返回403 + + # 获取对应的第三方用户记录(不存在则返回404) + oauthuser = get_object_or_404(OAuthUser, pk=id) + with transaction.atomic(): # 数据库事务确保操作原子性 + if oauthuser.author: # 若已关联本地用户 + author = get_user_model().objects.get(pk=oauthuser.author_id) + else: # 未关联本地用户时,通过邮箱创建或查找 + result = get_user_model().objects.get_or_create(email=oauthuser.email) + author = result[0] + # 若为新创建的用户 + if result[1]: + author.source = 'emailconfirm' # 标记用户来源为邮箱验证 + # 设置用户名为第三方昵称(为空时生成默认值) + author.username = oauthuser.nickname.strip() if oauthuser.nickname.strip() else "djangoblog" + timezone.now().strftime( + '%y%m%d%I%M%S') + author.save() # 保存本地用户 + # 关联第三方用户记录与本地用户 + oauthuser.author = author + oauthuser.save() # 保存第三方用户记录 + + # 发送OAuth用户登录信号 + oauth_user_login_signal.send( + sender=emailconfirm.__class__, id=oauthuser.id) + login(request, author) # 登录本地用户 + + # 生成欢迎邮件内容(包含网站信息) + site = 'http://' + get_current_site().domain + content = _(''' +

Congratulations, you have successfully bound your email address. You can use + %(oauthuser_type)s to directly log in to this website without a password.

+ You are welcome to continue to follow this site, the address is + %(site)s + Thank you again! +
+ If the link above cannot be opened, please copy this link to your browser. + %(site)s + ''') % {'oauthuser_type': oauthuser.type, 'site': site} + + # 发送绑定成功邮件 + send_email(emailto=[oauthuser.email, ], title=_('Congratulations on your successful binding!'), content=content) + # 生成绑定成功页URL + url = reverse('oauth:bindsuccess', kwargs={'oauthid': id}) + url = url + '?type=success' # 添加成功标识参数 + return HttpResponseRedirect(url) # 重定向到绑定成功页 + + +class RequireEmailView(FormView): + """处理邮箱填写的表单视图,继承自Django的FormView""" + form_class = RequireEmailForm # 指定使用的表单类 + template_name = 'oauth/require_email.html' # 指定渲染的模板 + + def get(self, request, *args, **kwargs): + """处理GET请求:获取第三方用户记录,若已填写邮箱则跳转(注释中逻辑)""" + oauthid = self.kwargs['oauthid'] # 从URL参数中获取第三方用户ID + oauthuser = get_object_or_404(OAuthUser, pk=oauthid) # 获取第三方用户记录 + if oauthuser.email: + pass # 若已填写邮箱,此处可添加跳转逻辑(当前注释) + # 调用父类的GET方法,渲染表单页面 + return super(RequireEmailView, self).get(request, *args, **kwargs) + + def get_initial(self): + """设置表单初始值:预填第三方用户ID""" + oauthid = self.kwargs['oauthid'] + return {'email': '', 'oauthid': oauthid} # 邮箱为空,ID为URL参数中的值 + + def get_context_data(self, **kwargs): + """扩展上下文数据:添加第三方用户的头像(用于模板显示)""" + oauthid = self.kwargs['oauthid'] + oauthuser = get_object_or_404(OAuthUser, pk=oauthid) + if oauthuser.picture: # 若存在头像地址 + kwargs['picture'] = oauthuser.picture # 添加到上下文 + # 调用父类方法,返回扩展后的上下文 + return super(RequireEmailView, self).get_context_data(**kwargs) + + def form_valid(self, form): + """处理合法的表单提交:保存邮箱并发送验证邮件""" + email = form.cleaned_data['email'] # 获取清洗后的邮箱 + oauthid = form.cleaned_data['oauthid'] # 获取第三方用户ID + oauthuser = get_object_or_404(OAuthUser, pk=oauthid) # 获取第三方用户记录 + oauthuser.email = email # 设置邮箱 + oauthuser.save() # 保存记录 + + # 生成邮箱验证的签名 + sign = get_sha256(settings.SECRET_KEY + str(oauthuser.id) + settings.SECRET_KEY) + # 获取当前站点域名(开发环境使用127.0.0.1:8000) + site = get_current_site().domain + if settings.DEBUG: + site = '127.0.0.1:8000' + # 生成邮箱验证链接 + path = reverse('oauth:email_confirm', kwargs={'id': oauthid, 'sign': sign}) + url = "http://{site}{path}".format(site=site, path=path) + + # 生成验证邮件内容 + content = _(""" +

Please click the link below to bind your email

+ + %(url)s + + Thank you again! +
+ If the link above cannot be opened, please copy this link to your browser. +
+ %(url)s + """) % {'url': url} + # 发送验证邮件 + send_email(emailto=[email, ], title=_('Bind your email'), content=content) + # 生成绑定成功页URL(带邮件发送标识) + url = reverse('oauth:bindsuccess', kwargs={'oauthid': oauthid}) + url = url + '?type=email' + return HttpResponseRedirect(url) # 重定向到绑定成功页 + + +def bindsuccess(request, oauthid): + """ + 显示绑定成功页面(根据类型显示不同内容) + :param request: HTTP请求对象 + :param oauthid: 第三方用户ID + :return: 渲染绑定成功页面的响应 + """ + type = request.GET.get('type', None) # 获取类型参数(email或success) + oauthuser = get_object_or_404(OAuthUser, pk=oauthid) # 获取第三方用户记录 + + if type == 'email': # 邮件已发送但未验证 + title = _('Bind your email') + content = _( + 'Congratulations, the binding is just one step away. ' + 'Please log in to your email to check the email to complete the binding. Thank you.') + else: # 绑定已完成 + title = _('Binding successful') + content = _( + "Congratulations, you have successfully bound your email address. You can use %(oauthuser_type)s" + " to directly log in to this website without a password. You are welcome to continue to follow this site." % { + 'oauthuser_type': oauthuser.type}) + + # 渲染绑定成功页面,传递标题和内容 + return render(request, 'oauth/bindsuccess.html', {'title': title, 'content': content}) \ No newline at end of file -- 2.34.1 From c43fad78cd87609e5489f07f2df082770501bfaf Mon Sep 17 00:00:00 2001 From: hyt <691385292@qq.com> Date: Sat, 25 Oct 2025 23:17:12 +0800 Subject: [PATCH 02/13] =?UTF-8?q?hyt=5F=E7=AC=AC=E5=85=AD=E5=91=A8?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__init__.py | 1 + src/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 151 bytes src/article_copyright/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 169 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 2131 bytes src/article_copyright/plugin.py | 55 +++++ src/external_links/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 166 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3255 bytes src/external_links/plugin.py | 86 +++++++ src/reading_time/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 164 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 2395 bytes src/reading_time/plugin.py | 73 ++++++ src/seo_optimizer/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 165 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 8832 bytes src/seo_optimizer/plugin.py | 219 ++++++++++++++++++ src/view_count/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 162 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 1591 bytes src/view_count/plugin.py | 37 +++ 22 files changed, 476 insertions(+) create mode 100644 src/__pycache__/__init__.cpython-312.pyc create mode 100644 src/article_copyright/__init__.py create mode 100644 src/article_copyright/__pycache__/__init__.cpython-312.pyc create mode 100644 src/article_copyright/__pycache__/plugin.cpython-312.pyc create mode 100644 src/article_copyright/plugin.py create mode 100644 src/external_links/__init__.py create mode 100644 src/external_links/__pycache__/__init__.cpython-312.pyc create mode 100644 src/external_links/__pycache__/plugin.cpython-312.pyc create mode 100644 src/external_links/plugin.py create mode 100644 src/reading_time/__init__.py create mode 100644 src/reading_time/__pycache__/__init__.cpython-312.pyc create mode 100644 src/reading_time/__pycache__/plugin.cpython-312.pyc create mode 100644 src/reading_time/plugin.py create mode 100644 src/seo_optimizer/__init__.py create mode 100644 src/seo_optimizer/__pycache__/__init__.cpython-312.pyc create mode 100644 src/seo_optimizer/__pycache__/plugin.cpython-312.pyc create mode 100644 src/seo_optimizer/plugin.py create mode 100644 src/view_count/__init__.py create mode 100644 src/view_count/__pycache__/__init__.cpython-312.pyc create mode 100644 src/view_count/__pycache__/plugin.cpython-312.pyc create mode 100644 src/view_count/plugin.py diff --git a/src/__init__.py b/src/__init__.py index e69de29..e88afca 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/src/__pycache__/__init__.cpython-312.pyc b/src/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2da2903299f25d9cc7dfd0be2403412c5af3cef GIT binary patch literal 151 zcmX@j%ge<81ceMYGBknoV-N=&d}aZPOlPQM&}8&m$xy@uKECAw=B%lBQ literal 0 HcmV?d00001 diff --git a/src/article_copyright/__init__.py b/src/article_copyright/__init__.py new file mode 100644 index 0000000..e88afca --- /dev/null +++ b/src/article_copyright/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/src/article_copyright/__pycache__/__init__.cpython-312.pyc b/src/article_copyright/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01c80d26bd38a1b6963fa533ef8e99420efffef7 GIT binary patch literal 169 zcmX@j%ge<81ceMYGBknoV-N=&d}aZPOlPQM&}8&m$xy@u3AL rAD@|*SrQ+wS5SG2!zMRBr8Fniu80+AFe4BbgBTx~85tRin1L(+S2rvw literal 0 HcmV?d00001 diff --git a/src/article_copyright/__pycache__/plugin.cpython-312.pyc b/src/article_copyright/__pycache__/plugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cb84e88b6ac831ecea1f551be400bf6ae96ea00 GIT binary patch literal 2131 zcmZ`)|4$QV7=N$#rKLi3uqiBNsZNI_T8zJq5fVg1qP7fh$u1<9+B*xiU)bF>rlguG z2$d0JP65BoIhPErN{x%6$ovEL3&t&yOZ;W_uJtEz_|vi<_PlpTktuJ|=bq<%-uLRa2J z8}>DF4PH-sqoa~nE zKCGQSlbyb&E7id(`QDjVk1nW}CX9pHt!uz&m(ptHxBS2jb#OwvKdlZfGmw3JRXaYZ z8;F&IAJfJ3_i*QJN3qXAnVm{zr*6F0{=1fQ7y69oUL;TS(A(WR+}oAnP?s+f&`CV* zU#t~aMil(;41AyAxfSz_lwqi3ks@a}}#KlJj< zb@kSWIxwT1%M?`k$LAqEZS;Y5_Z&`AudSN8tp4(?Iy9<{-OK-!HtLwq^ybb^ym~YQ zH2ZK^&GZ|GA!p+m3?rKEOHE~Rcc*jHS3qm{%}xy#oO)c8h|^JQq7dkkWI+@$$dz&* z&vX7oBye&RgorFeWWXXN386z0E|K$}ox5r}r05~JV^3UmwusT7;Fmjg1)k({-7owEsw+qz=%Klu>b95R!4?0Qg07w z=YIWPNQ%`2N~{zrXRqxP>uS5}v`aU!@3VKDvCm*zPb+m1qRY?R%+Ji^C+`E)VH~Lg z522jU@U_+5buLmN1A?qDzL?w@6%|`d62yovEVvl47_2B(vsem+Ggla+0^$c)=U9S% zSL9Gs!d;H*>vW1Gz>2GY^i;2a)0J9hJzSC+fh5sfN*MrrD@IEBz(0P`Z}hVpzd+y~)r zku$bL+{Q}zN=J=(R=JYejfV`LW|HiS$dW$p^w<@~G`|7NFD0kgYK@}Si5Pr%G)S9) n%##E`JV#$VM^(?!{x{54V#_%D2Epg`K>~XHY0-w`jBe&XU%d84 literal 0 HcmV?d00001 diff --git a/src/article_copyright/plugin.py b/src/article_copyright/plugin.py new file mode 100644 index 0000000..ab14d18 --- /dev/null +++ b/src/article_copyright/plugin.py @@ -0,0 +1,55 @@ +from djangoblog.plugin_manage.base_plugin import BasePlugin +from djangoblog.plugin_manage import hooks +from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME + + +class ArticleCopyrightPlugin(BasePlugin): + """ + 文章版权声明插件 + 功能:在文章正文末尾自动添加版权声明信息 + """ + + # 插件基本信息配置 + PLUGIN_NAME = '文章结尾版权声明' # 插件显示名称 + PLUGIN_DESCRIPTION = '一个在文章正文末尾添加版权声明的插件。' # 插件功能描述 + PLUGIN_VERSION = '0.2.0' # 插件版本号 + PLUGIN_AUTHOR = 'liangliangyy' # 插件作者 + + # 2. 实现 register_hooks 方法,专门用于注册钩子 + def register_hooks(self): + """ + 注册钩子函数 + 这个方法在插件初始化时被自动调用,用于将插件的功能方法注册到系统的钩子上 + """ + # 将 add_copyright_to_content 方法注册到文章内容钩子 + # 当系统处理文章内容时,会自动调用这个方法来添加版权信息 + hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.add_copyright_to_content) + + def add_copyright_to_content(self, content, *args, **kwargs): + """ + 文章内容处理函数 - 在文章末尾添加版权声明 + + 参数: + content: str - 原始的文章内容 + *args, **kwargs: 其他参数,其中包含文章对象 + + 返回值: + str - 添加了版权声明后的完整内容 + """ + # 从参数中获取文章对象 + article = kwargs.get('article') + + # 如果没有文章对象,直接返回原内容(避免错误) + if not article: + return content + + # 构建版权声明HTML代码 + copyright_info = f"\n

本文由 {article.author.username} 原创,转载请注明出处。

" + + # 将版权信息追加到文章内容末尾 + return content + copyright_info + + +# 3. 实例化插件。 +# 这会自动调用 BasePlugin.__init__,然后 BasePlugin.__init__ 会调用我们上面定义的 register_hooks 方法。 +plugin = ArticleCopyrightPlugin() diff --git a/src/external_links/__init__.py b/src/external_links/__init__.py new file mode 100644 index 0000000..e88afca --- /dev/null +++ b/src/external_links/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/src/external_links/__pycache__/__init__.cpython-312.pyc b/src/external_links/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8670a60bb21ceb8b8778637b1ac84d2805a9330 GIT binary patch literal 166 zcmX@j%ge<81ceMYGBknoV-N=&d}aZPOlPQM&}8&m$xy@u2KczG$)vkyYXeuKR7lRldnHd=wir)%o6~8O3p2k392OEbtvc|5FNMuZAoEdCG{ZMTJ2nI+$EF|kiyMV;%k=<2O z6x>k~Y_JP{VH-P4Vw$8A#f(!snThRUH-A9CNFg0O+xkNrR#=}x3Z3b6`l09Uu7p)! znme<1&%O6N?mg#s&b@!yxY3TF{q^tv>B|%$^c^1Lnn@>?P5?21Si}-MqVV6q6Cnd- zATVv@jUkdERhr~YAv0xGX%lY=St%=l4CokQ%|nQ_aOAX6(@EJ3h_g-W1}OUg;j(7& z$mb$tYfRvyj39DA+Yd7$*UHCw17R4M`XZ5j5s30bZ5<6qn!NOp7GH!a+Y@$8)knaeZE@QiY4G;{ufGB&($Ihh%`JO6MzdvjDZ6?+zT^t488Gs^X3jE0pT zxdDg72)&$i&`EdmOt|0a0D}&J;}1H+kw}yabAlrr5x5>s5I6x=)t!EqcsFjU_U!dk z%SC*E3HPeqz<@vJb+C^}_;AdZnxLCNQhqIHfQkQU66RLhAPSmu^vZu)mmv_~#Sp`x zR-J$YlKC>JoF2_y`b@cXK^cCSxpF(dq})Ee+C!PE_cLE!(WI1-+ggB>)2Ecr?`ul( z;yxEC;8c*U0@oW50Tcq>n_LzZB7RO3X-)?U&10khI!Te^dqjLx$G_{3)^>@J9;xg2 zfaGWuB0i*i^%_U2(ar*;9E*UH*A4)Cm_vHh&TzUZ9s!$ zE?I;5AOWM^&RQf(jt*LL)XJYVO8IaG)q=CKhN)a&Pnt$7Jp@Y*Sx=e=O~H+YTzE8S z9wc(y?Z{<{*}%>DQ0bYdCYu(^)hTCR;XeN^z@#=m#xU|n!V(vjY8|2^I9_rn=WZyU z{sxj(!^iQC<|a*Vfsh-rM|{!YcK5%9sal6}>Z|#gtBR_B#om*zFDsKDDv1Y$CUr|{ z5m7Fj%Nx@SK|Lq{@7*s}*NpsT1RPNSU@0Us?Tuy)2)8nq+!_>J75*WvA6MRcQ2S;BaCJ>}%K8ayoZ!9sb z&z=O_tixl>@dWj2ASaFgIeh&R2|xLN^6f~h&mP-}^$;lOr`w_MBI`dAsco|*hQGxm{IzA*YU zOpINbzjsr=YDVv8PmQfW3X5wnE5sC@4>6LzuhyYyR#ZXd_xGRN`E8;2I;g}NRwGl} z1x|zcnU5Ey-YGak7Nak2(eDx!i&-3+c$IV21+(tulEu()k+P{*h{U3@iI2Pm1s6}s z<}fGm5kFp3&nA-?z_ML^E3h=Y8srTa>@*t*F@dm%3l*FqArxb2sNPYY@pD4_z*-e_ z?PBgZ00tRetb+=xN$&++;s?lnsiCcqb(H^Z(n?SYVY{3Q>D9>&1jo*YUkwkkyjV(sC3(0iQ}6R#}qZU zYhQZTzI#>Q?D8&J(Q}R)RoAPgm`P8n+?Cv!EKBX7Qk^H}I(yQcJ*nQl+0Hj0#KlcEYeh~|1Q&m}pN=vTekuvufn9hWIuYLi;CkGC zrn+B%$0drpf4t|P!)h9#13&+BE3)nTTiH)%%PQx}_N2@9jBHpgLR+^@#4pBE&em_+ zI_BEwbQ?Xp<-|zQGP&L6Ts%ym(u%o~7t$p!Oj(n=XG>~Q)*96-K9^m#(sY;!aWpO4 zX*v{PV?3sdX!^|CftDI#xOk5zm2>|Sr#gC8U`phJ|Huq3LlBK1hJSyzvfW#!DW^?>HM 标签 + # 分组1: ... (href属性后的内容和标签闭合部分) + link_pattern = re.compile(r'(]*?\s+)?href=")([^"]*)(".*?/a>)', re.IGNORECASE) + + def replacer(match): + """ + 正则替换函数 - 处理单个链接匹配 + + 参数: + match: 正则匹配对象 + + 返回值: + str - 处理后的链接HTML代码 + """ + # 提取链接URL + href = match.group(2) + + # 如果链接已经有 target 属性,则不处理(避免重复添加) + if 'target=' in match.group(0).lower(): + return match.group(0) + + # 解析链接URL,提取域名信息 + parsed_url = urlparse(href) + + # 判断是否为外部链接: + # 1. 有域名 (parsed_url.netloc 不为空) + # 2. 且域名不等于当前网站域名 + if parsed_url.netloc and parsed_url.netloc != site_domain: + # 为外部链接添加安全属性: + # - target="_blank": 在新标签页打开 + # - rel="noopener noreferrer": 安全防护,防止钓鱼攻击 + return f'{match.group(1)}{href}" target="_blank" rel="noopener noreferrer"{match.group(3)}' + + # 内部链接或无效链接,返回原样 + return match.group(0) + + # 使用正则表达式替换所有匹配的链接 + return link_pattern.sub(replacer, content) + + +# 实例化插件,自动注册到系统 +plugin = ExternalLinksPlugin() \ No newline at end of file diff --git a/src/reading_time/__init__.py b/src/reading_time/__init__.py new file mode 100644 index 0000000..e88afca --- /dev/null +++ b/src/reading_time/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/src/reading_time/__pycache__/__init__.cpython-312.pyc b/src/reading_time/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..030d2a5454af44b26341f340091a730384cfa2b2 GIT binary patch literal 164 zcmX@j%ge<81ceMYGBknoV-N=&d}aZPOlPQM&}8&m$xy@u79$%7~n;H`zpP83g m5+AQuPF^uG4J_O;N0UmFP1j=7i?MRZ$q2rPaOU_xPt`|+%M*1iW6Ut4@1Av7iF zHoy+eaBd3fHrQq&j*OA$*c6<9m+Vg&TO`ksERk2}{)mHL%YN+M_xhmf%x=p7{}AA}Uq z5(=FZAdJHKFeYF+7lpb}%QpD0Wi1Y&%pjT1`2BVCO zfx;OhMKCyJVhGC2n7RN(GG+)Z9i-DDuW4Ytj6c}i=nteGAoW5mRtH?kf$oKGCldYR z$^M(kFS`=ook{eapPLw050&1*h4=3~oV>hn`fH_kcy4lRezZSv@$~%2(ER1DbW!Ej zcw*qk`Kz~;PlvS&%4Afzdh_ArS>=aOrT02CvJmZ_yWO*J?W#FevF17tk0 zM08tS5zuPV@zs4KC4&K&Z-a!=rh0|Ko47Ho^qftezpi|9PC0!iabaxbNEz!%_h(`B z3pKd65;rbrQc7$r70RA&W%QP&WJTQV#Ch~EndI4KzaX+akE&YE_A(63YYC@Cm~mKR zxWIBv0&>#vciF)bj}U4SJyji|qn;17vOdvsuoVU>w4Vz#d)m|r6+G!GQp}>Z4%x0- zqtyZqJD#eoqQ`HnhgOAL2%=!w3M}?M`v>-4pD!NUa&K4V)UL|k$f_lH2z=>*M~-B{ z-_oBD{9k$)j4?zoy#+h*2;Qoj~{7M2jvTAx2U~(rIGw zPP3SypR{J`*yGdY>YsVs<_QK>( zFknfP5NRg_rESou4vsA=@P)V#U*dRa&z?Pd3(8B`Ksg+0FplY_;XISFp_D_3^(4;^ zmhOPJN_VuCJI%6zXJw-xosbFmbbp&{Zt@2iFUQG7jt$Cqz$>=MxR3R7PAiYnE}K(P zm2ngv*`$R@w)r^L8>IC^qCLbjf^0<_WJ*C%w(0#Pw6QEBXX#|XACyE^kk{x8)WUR& z7~ll-IYWum7H@+jkE$?S@N^G8IRx_HJ>d)lunRYW+`K{4CDTB7c-L_Ibk6RW?T?(7 z@8uLu(NN?O@Hie(Oipc;3#jvgz!7G2-_PIRhI$refAb66EH`Y;zko4LUD5 zhu$1}VQNeH^u{-0S&LSXnK$s(FBzL=Hf@g8!Hb*gv3NZluR9(;-WJb46(@5SO(6Tl zq1{tit~lx9QH#5sR+*&fpci^c%T}5WgcylKcqUDslDu5%#7xsn$OqXO^)*K-tKI4s zQeK-P4ptmK&`@39SY79q?J3^d6%B_GZA;Pnjx<))HSl(5R1Mp8pgus0qZx4#AmLAN zLeK>s8H@zEm^0l)QG$3]*>', '', content) + # 移除首尾空白字符 + clean_content = clean_content.strip() + + # 2. 计算字数(支持中英文混合) + # 正则表达式说明: + # [\u4e00-\u9fa5] - 匹配中文字符(Unicode范围) + # | - 或者 + # \w+ - 匹配连续的英文单词字符(字母、数字、下划线) + words = re.findall(r'[\u4e00-\u9fa5]|\w+', clean_content) + word_count = len(words) + + # 3. 计算阅读时间 + # 按照平均每分钟200字的速度计算(适合中文阅读速度) + reading_speed = 200 + # 使用math.ceil向上取整,确保不会出现0分钟的情况 + reading_minutes = math.ceil(word_count / reading_speed) + + # 4. 处理边界情况 + # 如果计算出的阅读时间少于1分钟,统一显示为1分钟 + # 避免出现"预计阅读时间:0分钟"的不合理显示 + if reading_minutes < 1: + reading_minutes = 1 + + # 5. 生成阅读时间提示的HTML代码 + # 使用灰色文字和斜体样式,视觉上不突兀 + reading_time_html = f'

预计阅读时间:{reading_minutes} 分钟

' + + # 6. 将阅读时间提示添加到文章内容开头 + return reading_time_html + content + + +# 实例化插件,自动注册到系统 +plugin = ReadingTimePlugin() \ No newline at end of file diff --git a/src/seo_optimizer/__init__.py b/src/seo_optimizer/__init__.py new file mode 100644 index 0000000..e88afca --- /dev/null +++ b/src/seo_optimizer/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/src/seo_optimizer/__pycache__/__init__.cpython-312.pyc b/src/seo_optimizer/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61a9e3bd86f9cba11c4a49771079af22b7674a1a GIT binary patch literal 165 zcmX@j%ge<81ceMYGBknoV-N=&d}aZPOlPQM&}8&m$xy@u@Pl9`)Xm0A=NAD@|* nSrQ+wS5SG2!zMRBr8Fniu80+AC?gOTgBTx~85tRin1L(+i-jta literal 0 HcmV?d00001 diff --git a/src/seo_optimizer/__pycache__/plugin.cpython-312.pyc b/src/seo_optimizer/__pycache__/plugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2b73af6391612376a5212112d0abea3bd64ea25 GIT binary patch literal 8832 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 + + + + + + + + ''' + # 为每个标签添加article:tag meta标签 + for tag in article.tags.all(): + meta_tags += f'' + # 添加网站名称 + meta_tags += f'' + + # 生成JSON-LD结构化数据(用于搜索引擎理解内容结构) + structured_data = { + "@context": "https://schema.org", + "@type": "Article", # 文章类型 + "mainEntityOfPage": {"@type": "WebPage", "@id": request.build_absolute_uri()}, + "headline": article.title, # 文章标题 + "description": description, # 文章描述 + "image": request.build_absolute_uri(article.get_first_image_url()), # 文章首图 + "datePublished": article.pub_time.isoformat(), # 发布时间 + "dateModified": article.last_modify_time.isoformat(), # 修改时间 + "author": {"@type": "Person", "name": article.author.username}, # 作者信息 + "publisher": {"@type": "Organization", "name": blog_setting.site_name} # 发布者信息 + } + # 如果没有图片,移除image字段 + if not structured_data.get("image"): + del structured_data["image"] + + return { + "title": f"{article.title} | {blog_setting.site_name}", # 页面标题 + "description": description, # 页面描述 + "keywords": keywords, # 页面关键词 + "meta_tags": meta_tags, # meta标签 + "json_ld": structured_data # JSON-LD数据 + } + + def _get_category_seo_data(self, context, request, blog_setting): + """ + 生成分类页面的SEO数据 + + 参数: + context: 模板上下文 + request: HTTP请求对象 + blog_setting: 博客设置 + + 返回值: + dict - 包含分类页面SEO数据的字典 + """ + # 从上下文中获取分类名称 + category_name = context.get('tag_name') # 注意:这里变量名可能有误,应该是category_name + if not category_name: + return None + + # 获取分类对象 + category = Category.objects.filter(name=category_name).first() + if not category: + return None + + # 生成页面基本信息 + title = f"{category.name} | {blog_setting.site_name}" + description = strip_tags(category.name) or blog_setting.site_description + keywords = category.name + + # 生成面包屑导航的结构化数据 + breadcrumb_items = [ + {"@type": "ListItem", "position": 1, "name": "首页", "item": request.build_absolute_uri('/')} + ] + breadcrumb_items.append( + {"@type": "ListItem", "position": 2, "name": category.name, "item": request.build_absolute_uri()}) + + # 面包屑导航的JSON-LD数据 + structured_data = { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + "itemListElement": breadcrumb_items + } + + return { + "title": title, + "description": description, + "keywords": keywords, + "meta_tags": "", + "json_ld": structured_data + } + + def _get_default_seo_data(self, context, request, blog_setting): + """ + 生成默认页面(首页等)的SEO数据 + + 参数: + context: 模板上下文 + request: HTTP请求对象 + blog_setting: 博客设置 + + 返回值: + dict - 包含默认页面SEO数据的字典 + """ + # 网站类型的JSON-LD结构化数据 + structured_data = { + "@context": "https://schema.org", + "@type": "WebSite", + "url": request.build_absolute_uri('/'), + "potentialAction": { + "@type": "SearchAction", + "target": f"{request.build_absolute_uri('/search/')}?q={{search_term_string}}", + "query-input": "required name=search_term_string" + } + } + return { + "title": f"{blog_setting.site_name} | {blog_setting.site_description}", + "description": blog_setting.site_description, + "keywords": blog_setting.site_keywords, + "meta_tags": "", + "json_ld": structured_data + } + + def dispatch_seo_generation(self, metas, context): + """ + SEO数据分发器 - 根据当前页面类型调用相应的SEO生成方法 + + 参数: + metas: 原始的meta标签内容 + context: 模板上下文 + + 返回值: + str - 完整的SEO相关HTML代码 + """ + request = context.get('request') + if not request: + return metas + + # 获取当前视图名称,用于判断页面类型 + view_name = request.resolver_match.view_name + blog_setting = get_blog_setting() + + seo_data = None + # 根据视图名称调用不同的SEO生成方法 + if view_name == 'blog:detailbyid': + seo_data = self._get_article_seo_data(context, request, blog_setting) + elif view_name == 'blog:category_detail': + seo_data = self._get_category_seo_data(context, request, blog_setting) + + # 如果没有匹配到特定页面类型,使用默认SEO数据 + if not seo_data: + seo_data = self._get_default_seo_data(context, request, blog_setting) + + # 将JSON-LD数据转换为脚本标签 + json_ld_script = f'' + + # 返回完整的SEO HTML代码 + return f""" + {seo_data.get("title", "")} + + + {seo_data.get("meta_tags", "")} + {json_ld_script} + """ + + +# 实例化插件,自动注册到系统 +plugin = SeoOptimizerPlugin() diff --git a/src/view_count/__init__.py b/src/view_count/__init__.py new file mode 100644 index 0000000..8804fdf --- /dev/null +++ b/src/view_count/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package \ No newline at end of file diff --git a/src/view_count/__pycache__/__init__.cpython-312.pyc b/src/view_count/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4729442ed75f0ad5c2a037e50ded89f6c0c326fe GIT binary patch literal 162 zcmX@j%ge<81ceMYGBkknV-N=&d}aZPOlPQM&}8&m$xy@u2KczG$)vkyYXd)vJ7lRldnHd=wiO>7fK6rS0?*iK@~Pib6eeTUWjE(K3yLOQy z4yFxBKnO=slSn8Mja0RPG^s08+9-*7Z!c5`HCl;Ny^eEAz&TYt^v&+t4MB7yKhOL7 z=FNNG?C;IZ9t3M|>7PrVa0vZHmD=K+P4y&frjU$eoJ1)sVNCZ-l1Z@=ixGoPA(!CVmSYqbl+ z6w1_n2?h*1mW;2V1kKp7=A2lJa*W7kn zTf4zx`Qb#_iZ@4#_MOe)8|K1d<<8G$VbUDC10AxV>LAAc$UsKXNJPuTqe+GIt8$LS zluSruHCn3S(v(bE9UF~6A9ms@F=Q93YO-(4# zOt>onO;bCPYAk%kqLdz{sU%7%;Ftnea)!5d09tJUmuHi&|P+)LY?Mc8Gu*hV819QDi zHs4<5k*6ME7QTStwAXbyJg2Gc{-E7m^M}RCk2C(G{`Kj6<=g8H=yuuzgDon*1k)PP zV)_w(YwP8!bl2`TZ#*h3P1+}JERUMgv*r13?8j32WxhQ9ptSPq+E=q1%Qx#dA()sz z+powXr!~Rdj0UGXgQKX1V594F>a=*R88%uYh`|G|PNdER`o458h&aXfXk zXtdoS(POv>Nk>u&A%=&LlqzR|WW;D93A9lk<}=e8+$*#aH=OnLcufL#vVuM z>OR-m*VB8x=WNLEI<|}5ednm&?C8M@=TD#Q(`X%5$@h^}fPDvnTB)F4Orgq|}j z@7ioadynQnTJ^pEnA^Yl=D~bub>E@q4zpWmRJcPQp8o@L#!x>jS$@A8PM`gA!Fg1Y(oL7(YWN do}tz);UM;nCAJX!JwJ(&$M?kj_I1I+_!qwd6H@>H literal 0 HcmV?d00001 diff --git a/src/view_count/plugin.py b/src/view_count/plugin.py new file mode 100644 index 0000000..717a2bb --- /dev/null +++ b/src/view_count/plugin.py @@ -0,0 +1,37 @@ +from djangoblog.plugin_manage.base_plugin import BasePlugin +from djangoblog.plugin_manage import hooks + + +class ViewCountPlugin(BasePlugin): + """ + 文章浏览次数统计插件 + 功能:自动记录和统计文章的浏览次数 + """ + + # 插件基本信息 + PLUGIN_NAME = '文章浏览次数统计' + PLUGIN_DESCRIPTION = '统计文章的浏览次数' + PLUGIN_VERSION = '0.1.0' + PLUGIN_AUTHOR = 'liangliangyy' + + def register_hooks(self): + """ + 注册钩子函数 + 将浏览统计方法注册到文章内容获取后的钩子 + """ + hooks.register('after_article_body_get', self.record_view) + + def record_view(self, article, *args, **kwargs): + """ + 记录文章浏览次数 + + 参数: + article: Article对象 - 需要记录浏览次数的文章 + *args, **kwargs: 其他参数(在此插件中未使用) + """ + # 调用文章的viewed()方法来增加浏览次数 + article.viewed() + + +# 实例化插件,自动注册到系统 +plugin = ViewCountPlugin() \ No newline at end of file -- 2.34.1 From f78fd877a8a30de6d813f28ce7c6871ea27012a4 Mon Sep 17 00:00:00 2001 From: hyt <691385292@qq.com> Date: Sat, 25 Oct 2025 23:26:20 +0800 Subject: [PATCH 03/13] =?UTF-8?q?hyt=5F=E7=AC=AC=E5=85=AD=E5=91=A8?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/{ => plugins}/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin src/{ => plugins}/article_copyright/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin .../__pycache__/plugin.cpython-312.pyc | Bin src/{ => plugins}/article_copyright/plugin.py | 0 src/{ => plugins}/external_links/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin .../__pycache__/plugin.cpython-312.pyc | Bin src/{ => plugins}/external_links/plugin.py | 0 src/{ => plugins}/reading_time/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin .../reading_time/__pycache__/plugin.cpython-312.pyc | Bin src/{ => plugins}/reading_time/plugin.py | 0 src/{ => plugins}/seo_optimizer/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin .../__pycache__/plugin.cpython-312.pyc | Bin src/{ => plugins}/seo_optimizer/plugin.py | 0 src/{ => plugins}/view_count/__init__.py | 0 .../view_count/__pycache__/__init__.cpython-312.pyc | Bin .../view_count/__pycache__/plugin.cpython-312.pyc | Bin src/{ => plugins}/view_count/plugin.py | 0 22 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => plugins}/__init__.py (100%) rename src/{ => plugins}/__pycache__/__init__.cpython-312.pyc (100%) rename src/{ => plugins}/article_copyright/__init__.py (100%) rename src/{ => plugins}/article_copyright/__pycache__/__init__.cpython-312.pyc (100%) rename src/{ => plugins}/article_copyright/__pycache__/plugin.cpython-312.pyc (100%) rename src/{ => plugins}/article_copyright/plugin.py (100%) rename src/{ => plugins}/external_links/__init__.py (100%) rename src/{ => plugins}/external_links/__pycache__/__init__.cpython-312.pyc (100%) rename src/{ => plugins}/external_links/__pycache__/plugin.cpython-312.pyc (100%) rename src/{ => plugins}/external_links/plugin.py (100%) rename src/{ => plugins}/reading_time/__init__.py (100%) rename src/{ => plugins}/reading_time/__pycache__/__init__.cpython-312.pyc (100%) rename src/{ => plugins}/reading_time/__pycache__/plugin.cpython-312.pyc (100%) rename src/{ => plugins}/reading_time/plugin.py (100%) rename src/{ => plugins}/seo_optimizer/__init__.py (100%) rename src/{ => plugins}/seo_optimizer/__pycache__/__init__.cpython-312.pyc (100%) rename src/{ => plugins}/seo_optimizer/__pycache__/plugin.cpython-312.pyc (100%) rename src/{ => plugins}/seo_optimizer/plugin.py (100%) rename src/{ => plugins}/view_count/__init__.py (100%) rename src/{ => plugins}/view_count/__pycache__/__init__.cpython-312.pyc (100%) rename src/{ => plugins}/view_count/__pycache__/plugin.cpython-312.pyc (100%) rename src/{ => plugins}/view_count/plugin.py (100%) diff --git a/src/__init__.py b/src/plugins/__init__.py similarity index 100% rename from src/__init__.py rename to src/plugins/__init__.py diff --git a/src/__pycache__/__init__.cpython-312.pyc b/src/plugins/__pycache__/__init__.cpython-312.pyc similarity index 100% rename from src/__pycache__/__init__.cpython-312.pyc rename to src/plugins/__pycache__/__init__.cpython-312.pyc diff --git a/src/article_copyright/__init__.py b/src/plugins/article_copyright/__init__.py similarity index 100% rename from src/article_copyright/__init__.py rename to src/plugins/article_copyright/__init__.py diff --git a/src/article_copyright/__pycache__/__init__.cpython-312.pyc b/src/plugins/article_copyright/__pycache__/__init__.cpython-312.pyc similarity index 100% rename from src/article_copyright/__pycache__/__init__.cpython-312.pyc rename to src/plugins/article_copyright/__pycache__/__init__.cpython-312.pyc diff --git a/src/article_copyright/__pycache__/plugin.cpython-312.pyc b/src/plugins/article_copyright/__pycache__/plugin.cpython-312.pyc similarity index 100% rename from src/article_copyright/__pycache__/plugin.cpython-312.pyc rename to src/plugins/article_copyright/__pycache__/plugin.cpython-312.pyc diff --git a/src/article_copyright/plugin.py b/src/plugins/article_copyright/plugin.py similarity index 100% rename from src/article_copyright/plugin.py rename to src/plugins/article_copyright/plugin.py diff --git a/src/external_links/__init__.py b/src/plugins/external_links/__init__.py similarity index 100% rename from src/external_links/__init__.py rename to src/plugins/external_links/__init__.py diff --git a/src/external_links/__pycache__/__init__.cpython-312.pyc b/src/plugins/external_links/__pycache__/__init__.cpython-312.pyc similarity index 100% rename from src/external_links/__pycache__/__init__.cpython-312.pyc rename to src/plugins/external_links/__pycache__/__init__.cpython-312.pyc diff --git a/src/external_links/__pycache__/plugin.cpython-312.pyc b/src/plugins/external_links/__pycache__/plugin.cpython-312.pyc similarity index 100% rename from src/external_links/__pycache__/plugin.cpython-312.pyc rename to src/plugins/external_links/__pycache__/plugin.cpython-312.pyc diff --git a/src/external_links/plugin.py b/src/plugins/external_links/plugin.py similarity index 100% rename from src/external_links/plugin.py rename to src/plugins/external_links/plugin.py diff --git a/src/reading_time/__init__.py b/src/plugins/reading_time/__init__.py similarity index 100% rename from src/reading_time/__init__.py rename to src/plugins/reading_time/__init__.py diff --git a/src/reading_time/__pycache__/__init__.cpython-312.pyc b/src/plugins/reading_time/__pycache__/__init__.cpython-312.pyc similarity index 100% rename from src/reading_time/__pycache__/__init__.cpython-312.pyc rename to src/plugins/reading_time/__pycache__/__init__.cpython-312.pyc diff --git a/src/reading_time/__pycache__/plugin.cpython-312.pyc b/src/plugins/reading_time/__pycache__/plugin.cpython-312.pyc similarity index 100% rename from src/reading_time/__pycache__/plugin.cpython-312.pyc rename to src/plugins/reading_time/__pycache__/plugin.cpython-312.pyc diff --git a/src/reading_time/plugin.py b/src/plugins/reading_time/plugin.py similarity index 100% rename from src/reading_time/plugin.py rename to src/plugins/reading_time/plugin.py diff --git a/src/seo_optimizer/__init__.py b/src/plugins/seo_optimizer/__init__.py similarity index 100% rename from src/seo_optimizer/__init__.py rename to src/plugins/seo_optimizer/__init__.py diff --git a/src/seo_optimizer/__pycache__/__init__.cpython-312.pyc b/src/plugins/seo_optimizer/__pycache__/__init__.cpython-312.pyc similarity index 100% rename from src/seo_optimizer/__pycache__/__init__.cpython-312.pyc rename to src/plugins/seo_optimizer/__pycache__/__init__.cpython-312.pyc diff --git a/src/seo_optimizer/__pycache__/plugin.cpython-312.pyc b/src/plugins/seo_optimizer/__pycache__/plugin.cpython-312.pyc similarity index 100% rename from src/seo_optimizer/__pycache__/plugin.cpython-312.pyc rename to src/plugins/seo_optimizer/__pycache__/plugin.cpython-312.pyc diff --git a/src/seo_optimizer/plugin.py b/src/plugins/seo_optimizer/plugin.py similarity index 100% rename from src/seo_optimizer/plugin.py rename to src/plugins/seo_optimizer/plugin.py diff --git a/src/view_count/__init__.py b/src/plugins/view_count/__init__.py similarity index 100% rename from src/view_count/__init__.py rename to src/plugins/view_count/__init__.py diff --git a/src/view_count/__pycache__/__init__.cpython-312.pyc b/src/plugins/view_count/__pycache__/__init__.cpython-312.pyc similarity index 100% rename from src/view_count/__pycache__/__init__.cpython-312.pyc rename to src/plugins/view_count/__pycache__/__init__.cpython-312.pyc diff --git a/src/view_count/__pycache__/plugin.cpython-312.pyc b/src/plugins/view_count/__pycache__/plugin.cpython-312.pyc similarity index 100% rename from src/view_count/__pycache__/plugin.cpython-312.pyc rename to src/plugins/view_count/__pycache__/plugin.cpython-312.pyc diff --git a/src/view_count/plugin.py b/src/plugins/view_count/plugin.py similarity index 100% rename from src/view_count/plugin.py rename to src/plugins/view_count/plugin.py -- 2.34.1 From 0e3fde20608d3db3bfb74a784799561a3952d760 Mon Sep 17 00:00:00 2001 From: yyd Date: Sun, 26 Oct 2025 00:33:13 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E7=AC=AC=E5=85=AD=E5=91=A8=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/servermanager/MemcacheStorage.py | 88 ++++++ src/servermanager/__init__.py | 0 .../MemcacheStorage.cpython-314.pyc | Bin 0 -> 2287 bytes .../MemcacheStorage.cpython-38.pyc | Bin 0 -> 1579 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 156 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 144 bytes .../__pycache__/admin.cpython-314.pyc | Bin 0 -> 1065 bytes .../__pycache__/admin.cpython-38.pyc | Bin 0 -> 820 bytes .../__pycache__/apps.cpython-314.pyc | Bin 0 -> 470 bytes .../__pycache__/apps.cpython-38.pyc | Bin 0 -> 378 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 2498 bytes .../__pycache__/models.cpython-38.pyc | Bin 0 -> 1690 bytes .../__pycache__/robot.cpython-314.pyc | Bin 0 -> 10469 bytes .../__pycache__/robot.cpython-38.pyc | Bin 0 -> 6117 bytes .../__pycache__/urls.cpython-314.pyc | Bin 0 -> 387 bytes .../__pycache__/urls.cpython-38.pyc | Bin 0 -> 338 bytes src/servermanager/admin.py | 63 +++++ src/servermanager/api/__init__.py | 1 + .../api/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 160 bytes .../api/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 148 bytes .../api/__pycache__/blogapi.cpython-314.pyc | Bin 0 -> 2069 bytes .../api/__pycache__/blogapi.cpython-38.pyc | Bin 0 -> 1396 bytes .../api/__pycache__/commonapi.cpython-314.pyc | Bin 0 -> 3768 bytes .../api/__pycache__/commonapi.cpython-38.pyc | Bin 0 -> 2377 bytes src/servermanager/api/blogapi.py | 78 ++++++ src/servermanager/api/commonapi.py | 129 +++++++++ src/servermanager/apps.py | 31 +++ src/servermanager/migrations/0001_initial.py | 67 +++++ ...002_alter_emailsendlog_options_and_more.py | 50 ++++ src/servermanager/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 2115 bytes .../__pycache__/0001_initial.cpython-38.pyc | Bin 0 -> 1327 bytes ...ilsendlog_options_and_more.cpython-314.pyc | Bin 0 -> 1141 bytes ...ailsendlog_options_and_more.cpython-38.pyc | Bin 0 -> 821 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 167 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 155 bytes src/servermanager/models.py | 82 ++++++ src/servermanager/robot.py | 255 ++++++++++++++++++ src/servermanager/tests.py | 121 +++++++++ src/servermanager/urls.py | 22 ++ src/servermanager/views.py | 1 + 41 files changed, 988 insertions(+) create mode 100644 src/servermanager/MemcacheStorage.py create mode 100644 src/servermanager/__init__.py create mode 100644 src/servermanager/__pycache__/MemcacheStorage.cpython-314.pyc create mode 100644 src/servermanager/__pycache__/MemcacheStorage.cpython-38.pyc create mode 100644 src/servermanager/__pycache__/__init__.cpython-314.pyc create mode 100644 src/servermanager/__pycache__/__init__.cpython-38.pyc create mode 100644 src/servermanager/__pycache__/admin.cpython-314.pyc create mode 100644 src/servermanager/__pycache__/admin.cpython-38.pyc create mode 100644 src/servermanager/__pycache__/apps.cpython-314.pyc create mode 100644 src/servermanager/__pycache__/apps.cpython-38.pyc create mode 100644 src/servermanager/__pycache__/models.cpython-314.pyc create mode 100644 src/servermanager/__pycache__/models.cpython-38.pyc create mode 100644 src/servermanager/__pycache__/robot.cpython-314.pyc create mode 100644 src/servermanager/__pycache__/robot.cpython-38.pyc create mode 100644 src/servermanager/__pycache__/urls.cpython-314.pyc create mode 100644 src/servermanager/__pycache__/urls.cpython-38.pyc create mode 100644 src/servermanager/admin.py create mode 100644 src/servermanager/api/__init__.py create mode 100644 src/servermanager/api/__pycache__/__init__.cpython-314.pyc create mode 100644 src/servermanager/api/__pycache__/__init__.cpython-38.pyc create mode 100644 src/servermanager/api/__pycache__/blogapi.cpython-314.pyc create mode 100644 src/servermanager/api/__pycache__/blogapi.cpython-38.pyc create mode 100644 src/servermanager/api/__pycache__/commonapi.cpython-314.pyc create mode 100644 src/servermanager/api/__pycache__/commonapi.cpython-38.pyc create mode 100644 src/servermanager/api/blogapi.py create mode 100644 src/servermanager/api/commonapi.py create mode 100644 src/servermanager/apps.py create mode 100644 src/servermanager/migrations/0001_initial.py create mode 100644 src/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py create mode 100644 src/servermanager/migrations/__init__.py create mode 100644 src/servermanager/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 src/servermanager/migrations/__pycache__/0001_initial.cpython-38.pyc create mode 100644 src/servermanager/migrations/__pycache__/0002_alter_emailsendlog_options_and_more.cpython-314.pyc create mode 100644 src/servermanager/migrations/__pycache__/0002_alter_emailsendlog_options_and_more.cpython-38.pyc create mode 100644 src/servermanager/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 src/servermanager/migrations/__pycache__/__init__.cpython-38.pyc create mode 100644 src/servermanager/models.py create mode 100644 src/servermanager/robot.py create mode 100644 src/servermanager/tests.py create mode 100644 src/servermanager/urls.py create mode 100644 src/servermanager/views.py diff --git a/src/servermanager/MemcacheStorage.py b/src/servermanager/MemcacheStorage.py new file mode 100644 index 0000000..5610ccd --- /dev/null +++ b/src/servermanager/MemcacheStorage.py @@ -0,0 +1,88 @@ +# 导入WeRoBot框架的会话存储基类和工具函数 +from werobot.session import SessionStorage +from werobot.utils import json_loads, json_dumps + +# 导入Django项目的缓存工具 +from djangoblog.utils import cache + + +class MemcacheStorage(SessionStorage): + """ + 基于Memcached的WeRoBot会话存储实现 + 继承自WeRoBot的SessionStorage基类,用于将会话数据存储到Memcached中 + """ + + def __init__(self, prefix='ws_'): + """ + 初始化方法 + + Args: + prefix (str): 缓存键的前缀,默认为'ws_',用于区分其他缓存数据 + """ + self.prefix = prefix # 设置缓存键前缀 + self.cache = cache # Django缓存实例(通常是Memcached) + + @property + def is_available(self): + """ + 检查缓存存储是否可用的属性 + + Returns: + bool: 如果缓存系统工作正常返回True,否则返回False + """ + value = "1" # 测试值 + # 尝试设置一个测试键值对 + self.set('checkavaliable', value=value) + # 读取测试值并比较,验证缓存系统是否正常工作 + return value == self.get('checkavaliable') + + def key_name(self, s): + """ + 生成完整的缓存键名 + + Args: + s (str): 原始会话ID + + Returns: + str: 添加前缀后的完整缓存键名 + """ + return '{prefix}{s}'.format(prefix=self.prefix, s=s) + + def get(self, id): + """ + 根据会话ID获取会话数据 + + Args: + id (str): 会话ID + + Returns: + dict: 解析后的会话数据字典,如果不存在返回空字典 + """ + id = self.key_name(id) # 生成完整缓存键 + # 从缓存获取数据,如果不存在则返回空JSON对象 + session_json = self.cache.get(id) or '{}' + # 将JSON字符串解析为Python字典 + return json_loads(session_json) + + def set(self, id, value): + """ + 设置会话数据 + + Args: + id (str): 会话ID + value (dict): 要存储的会话数据字典 + """ + id = self.key_name(id) # 生成完整缓存键 + # 将会话数据序列化为JSON字符串并存储到缓存 + self.cache.set(id, json_dumps(value)) + + def delete(self, id): + """ + 删除指定会话ID的数据 + + Args: + id (str): 要删除的会话ID + """ + id = self.key_name(id) # 生成完整缓存键 + # 从缓存中删除对应的数据 + self.cache.delete(id) \ No newline at end of file diff --git a/src/servermanager/__init__.py b/src/servermanager/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/servermanager/__pycache__/MemcacheStorage.cpython-314.pyc b/src/servermanager/__pycache__/MemcacheStorage.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..264ee583b16e0f754f7b05f2e536b720af5e4782 GIT binary patch literal 2287 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 a%}KQ@Vg(ukva1-x_{7Y}$XLV-WB~yC%P4^W literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/__init__.cpython-38.pyc b/src/servermanager/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb4faef852caa515fb7dd04669b704cac62a385d GIT binary patch literal 144 zcmWIL<>g`kg5$xjGC=fW5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Hii&czER$^Xy zK9q9G$xqkKO)M@+Es7~lEh-1ko&sCt$Mf4zOmr3o}y_Zao-1 znRqmM(wi6V{sms;1Ww|~5Q8U@HtNy$wlt7n;w1Zr0()o|2?dLBO zudt7f9yLx7HRB{a3P}j$m#xlO*xF=?XzCN4TXwYNTiW)icKjT~uubW9+H3|%q;6r5 zk7VAnjH6>MxG97^m2o4kLK#2dUf#HjB|(!jW{Qk8)2Jm-9%5{x6^KJkg|U@bDlOuK zCn>5$tTc;awJw59Q)5i&K*u2qw1%)P%@t!Z52+Tf5%(catr$Mrs9&UTD-tKLE z*nj`&$GfdX#pN?DA?;w5%f+nx#`>njE@Xg$DgeA7yVa@ZbMjPQ^KX_Kpbn1nG@z~1 zBqhELTsgoMtrMO1bGq=DXxF!Zxx5*kZ3eMe;7K%>u4e3oIf&C=*aB#++rhfp#3$fH z?_^baIb$m>R!l+ijTTp0q2t7a9EQz|tObe%QN-4v#8{~~P0aX-yBa60M!;KP>2310 zGTN&dFQ4~piDZ}p$BcDq1{Gw@Bv&n=O(~Qdx{)SK$4%}znXNnn4icwFp37XrG|@cK z-hjkcAO{hK5K0JT08@cDQJRQN=sp*bl66#7P&Le0C<3LTIMg8*f-#ue(y^Z~5=hw1 zi~?CjM}z_R6ejTJB~-Orz1yBU$T{_D`{D00b!rC$pjRkb&wGw3N7>XgFkhH0iLc8P zAEXf%S&w={l3jq@^qe!^-Rr$^z9BDx0<%$90S+um={Itr>ry)XdUj`Ye0y}fOW@FT Ui?sH}*%_PM9-I6{;E+Z83-*r!3;+NC literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/admin.cpython-38.pyc b/src/servermanager/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f7c0f7959473873b9f13f89b6ac07d5c27efe4f GIT binary patch literal 820 zcmZuvy^ho{5VjL%6ZUrRU`0tulY%V}6+-BaJD`DWRy5H`mdW_`a&nSA+l#cc+{^GJ zwA5~?;1Q^paTYkVSn`+o&CGn`chl*Z;rX)saru=q_KlR=N1$?y*F8Z12HdcgSDdrg z3=&9h7^IqCC7;qNMT>w8E!oZ@V63Gga~ z1hdmHJ?-08b>L1Y9SxapywM@A2YV<$yV^GI^`aD^kg`*)mNJZ`YgJv*86jCz2vT6EPFN0I{~c*Z=?k literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/apps.cpython-314.pyc b/src/servermanager/__pycache__/apps.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20c51d068a4a9d5ca8105c62c9a1dcedd8a5bd85 GIT binary patch literal 470 zcmY*Vu}%U(5S`@?L=cEkVuFPsHeO69jFmAaMha~xmKK<-aNrrZJNFh7I|^fGZ?w|R zhTbpm7tAJBh8V0&AlB}3N1{`_d9(B8Wp=i+nG~pat$v-^Du3u=9`T4wwiFpa11LFx zV;Owg%LwlU*a!i5N9E!HSP{X%V@2==(>W+jct5P!J-Cib+9{0n|Yd3L@4p zg+YlhX-veap?plaQnmS|&3nvc9h-+%G86oLe1?jZkV!{cuNpR4hZLTQlF19^?9s;h@%s l!kl6qLW$);ip3A9=C1qXF@z}WxLO$!G3_9(548xv*mfce3V_&@6C1FH>X;TJlx%-^oT3%~2Li{Ze_@b)-o#(x3S+F7Rn literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/models.cpython-314.pyc b/src/servermanager/__pycache__/models.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ed5a0c5a4e486f29be603e07d500c7c0b00e218 GIT binary patch literal 2498 zcmcJRU2GIp6oBvS&hAdz+1YlxW%(&v5lUK%^}$A?7BpHAL>e+QJW(dY&TYG9b_Va< z#e&4FCi0VLDv<;t#31njUK$<@DQyhA`P$S?x|zf$+v56UY!RP~=ge%!-9lqx;v_wL z@0oM&Ip^MUzG;sVZzS;iaOBsq10o?m<7D-TR0qo=FesAaL=_H@{Q?&{NE_Kk)KHqJ z;bGx0tXuo^g?$YVdzKCI71WR#emUgpd30SnQH|8t#n!cp*6k;OU9#RM&cJU>mDGm7 zZ{xaljbPUl*fptgnsC`Wx;Px2(zhCUTupH0DB%gU84jz(m9lm|uUm#wkip^NrSBJJ zzFoR;zH;+wWfz>$ZNY8K>*Jb9tx-PqC>q#QW@CiZu9=wl<^G*V-X<5WEzV3YUAbGi z^4$<@AnOHgYnJ_irW=O0Wa0kg(&c-;1>BUhYLEqw!GmKc0%>_O42t9^IUKzDXRsY2 z90VT`p5rEkf#^_k#KE;YSNcE>yn1ZlJ>43$t3QjMf3-Myv+~Wohu0>LIh38E4AR#} zDLdxZOYh0kZcNi0&NR(!UOk=Oss{60Mo}c?MC-(vi)Ut~P0KJRb#=Cy$8yFq4XP}` z!>Yi=VUb7F5Ra;1xC7CR2VM?QuCoSMbDIoy$6QI%EIm&lkVZ{|@Cqi5Wlej(pqte< z2~8WxF^8Kui&{3mhLld&4)vD0t+g}lq*-9P>9%1uI?rV_opY8uQQ*|kG}aD|*(MZi zAY9RlW(y1x@aM!qoFnCQ#|62Zd9EaF@lAJt+FLo;-ORS)1aoE`D4s!qjqEnOHKwzD zIcgdV>)ef1Q+6eTI#~#Ty72*>)1h3RdS-Aaj6#UErE$=?&8F^fJcHcGX-~s8;O3t9 z?YLu$re(p#F>+a+rKYKAPz~`KCFG3P@`jfjLlSrb2aXNm&+~Yxa&lg7pOf3K9-j)A ziC_3lJZLN?Q)`RKG89k=(wRwy;w@TUff?!ZJtkc&850-WgZx% z)WPDRa(e50x@Rukb8GOyP$~V+teE;;6e61+M?;aG#{`6bdg#5basopA1#jvImHOWZ z)eNrIJV2gkU$u&P15hWm#sH>I(5VURHa^v^Q3WCebc(CMB(8XLQh-j0fKEUq-VAhV zQCpxhlCHcrujkAo)H2?+M+?{(OPB91%-mg=o@U4*1`zToRQY5Q^gg*5BHROwuU$O% z>Eh(Q0xozs^X1al*Y^Q*Vg?=23nphxpdMn_)BgoO3=faBplAi*lgBSHEKoO9o53nY zu%{TFlvf0G_aBf0E4$|Vl&K|0uYl~}F;#?9inuLxKCo*G*s;~*CoWZrADi~*8Rhx9 zmZ~`QoW-Vh5F3byE)Nm2(w1^+$82loXVMd> zNIunT7(H}?aAOoNp4&bx8iwdN_pt!rusF52E5B*mCeA%$f2Z5pI{BQb>In4k7 literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/models.cpython-38.pyc b/src/servermanager/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b44f1b6331b81465f829e23beb67da286675205 GIT binary patch literal 1690 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 literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/robot.cpython-38.pyc b/src/servermanager/__pycache__/robot.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46f30547edbb90d58a34b0c7a7ade6c864505171 GIT binary patch literal 6117 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 literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/urls.cpython-314.pyc b/src/servermanager/__pycache__/urls.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96307d2edc49063b3ad307beab069bd92eadab3e GIT binary patch literal 387 zcmdPqch>9W>pd?t^Esn&3g800|+|*m#Ky5%fOHzyS zidQmx2C88AVgw{ytYTci=0d5by|bRKTl8|_&gZk&#h^GO24t~bLFFwDo80`A(wtPg zB0iu2Ag>l{0*MdIjEszT8D#D<=sabRc)%^y!10iUqeEh%<&4nF!pfIfR6Z~>^D{MZ J7x4g90{~B6X+Hn} literal 0 HcmV?d00001 diff --git a/src/servermanager/__pycache__/urls.cpython-38.pyc b/src/servermanager/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22ca2cb5124e1d5f2abbe01102ca3bc6c3338dbf GIT binary patch literal 338 zcmY*Uy-ve05Vjqs4K!JKhYXF>6;%kK&MXy+6{&LZDJ|G>WT&l|`!qZPPry5PWh#%r z0_T(gPP#vT_kDMMD2hvh_P+ewykY)`&0pi#+@kwA21OLr#85$LteIve5ee3b;+h*S zIM%61fvOQCz>oCE8Y)I=yd-6ILIqONz&qJ*Fkcw?46FSX4kvm>QfJq;4}}M}2WMm} z8*nZ~@V*>}iF%T4W2>Fh-Z6X>R|gmv)uU~Dw_R7~36~%^&_X7=Zq-TyVS+SV+=FZV zD{=AHL-?94uIt61{G0ByZKg(g9IgLdQpe3z_Y$(Xv1+H`Cf@C%R8Di2GtTnw9}DzZ AtN;K2 literal 0 HcmV?d00001 diff --git a/src/servermanager/admin.py b/src/servermanager/admin.py new file mode 100644 index 0000000..b8cdfe8 --- /dev/null +++ b/src/servermanager/admin.py @@ -0,0 +1,63 @@ +# 导入Django管理模块 +from django.contrib import admin +# 导入自定义模型(假设已在同一目录的models.py中定义) +from .models import commands, EmailSendLog + + +# 注册Commands模型到Django管理后台 +class CommandsAdmin(admin.ModelAdmin): + """ + 命令模型的管理界面配置类 + 用于自定义commands模型在Django admin中的显示和行为 + """ + + # 设置在管理列表页面显示的字段 + list_display = ('title', 'command', 'describe') + # 字段说明: + # - title: 命令标题 + # - command: 具体命令内容 + # - describe: 命令描述 + + +# 注册EmailSendLog模型到Django管理后台 +class EmailSendLogAdmin(admin.ModelAdmin): + """ + 邮件发送日志模型的管理界面配置类 + 用于自定义EmailSendLog模型在Django admin中的显示和行为 + """ + + # 设置在管理列表页面显示的字段 + list_display = ('title', 'emailto', 'send_result', 'creation_time') + # 字段说明: + # - title: 邮件标题 + # - emailto: 收件人 + # - send_result: 发送结果 + # - creation_time: 创建时间 + + # 设置只读字段,这些字段在编辑页面不可修改 + readonly_fields = ( + 'title', # 邮件标题(只读) + 'emailto', # 收件人(只读) + 'send_result', # 发送结果(只读) + 'creation_time', # 创建时间(只读) + 'content' # 邮件内容(只读) + ) + + def has_add_permission(self, request): + """ + 重写添加权限方法,禁止在管理后台手动添加邮件日志记录 + + Args: + request: HTTP请求对象 + + Returns: + bool: 总是返回False,禁止添加操作 + """ + return False + # 这样设计是因为邮件发送日志应该由系统自动创建 + # 而不是手动添加,保证日志的真实性和完整性 + + +# 将模型注册到Django管理后台 +admin.site.register(commands, CommandsAdmin) +admin.site.register(EmailSendLog, EmailSendLogAdmin) \ No newline at end of file diff --git a/src/servermanager/api/__init__.py b/src/servermanager/api/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/servermanager/api/__init__.py @@ -0,0 +1 @@ + diff --git a/src/servermanager/api/__pycache__/__init__.cpython-314.pyc b/src/servermanager/api/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f04b8ffa207b7c605d9c7f95c951c5e2243920c7 GIT binary patch literal 160 zcmdPqg`kg5$xjG8lpMV-N=!fCL?YxR?b`H?g=RwJ4@IwWut$C^s=LF&)TDEXa(BkI&4@EQycTE2zB1VUwGmQks)$ L2QuCGDwPa&G^EUe_Y3sgt%_MKX8yWx!E~-13Ek88nJ|{WKQ71Aoj(p;+({#Iho6Yq?-&8OX?w( zJSC=HT(OigF>_CFXbQ2m=-SL#e}Btm+lwwY#W;V3anJGHSbf*#?pmE~JE?1mLUV95 z105Uo|Cn&WB3!(dBE?Xj?f_w9vB?IOy1yHqe{FN%<1uGAyP~-eNetqrA zrsrf~F*+oSKlNxGIy+?P*fxb$XjM`>o~x3DW@@P|#Ra8xl=dw$)${_QREUB5B+U}w zFk(#RO_||jtOW@xH<6XV<#EB@;&qw~;|@wU>`y4SZ@5l}`rw@kRV*w}W;I?r0(R+&k+Dq)he%sZ4{oC*$dq0iy*M0d~lN z)){F-p*9q0vu_@C9Ft9Lex(JyABuFktRq$~i*%2&h5$cQvGM4=d4einL~LxTq047%Kt9xmC~SE<2%+V&;I$V>Q#mNwsvJ zAShcC_rH+8%#3#vOacIfM(P_hVD2e#;^k%C0uSb>Ysf9Au2fHPFoe`9QoG{mMp?GB}$E8+A zP8oY4R8US%|4=`F_x7FJkv<&i!~6P$#>n)&m8dcuR;C;JrG|Pb$=?*yo$-;+n{8Os z@RFdY6`*?7SGIiY7b%of+izNQN>@D=aNn!BwK}B?#6#Gt2>l2b5KvihH>Cl$;ZKU% zoHK8Ei@O1YgTn0ib`Y$14tHGNrxaAx-ZBYpDAKo+XT`9ZCV*us$?oq@;ld9^Nhu!| zBxU@tASji?oUC*`D+Yvmxbvh+thN05%U_m#)Q%Mkn--!8`n9p+E!pso?NZkGbdiS+I literal 0 HcmV?d00001 diff --git a/src/servermanager/api/__pycache__/blogapi.cpython-38.pyc b/src/servermanager/api/__pycache__/blogapi.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6beae7693fee46733db43888863cd139ea245574 GIT binary patch literal 1396 zcmZ`(Pfy!06t|r;4J8!V#?WA!Cbmls>uHB+nkE=XyH%R1T_PmQ#HOUA4cO_lR^179 z+;@N@pJd;`*PYl$*lF)24Jw7X@^frIzxVsSKmD?_)F3c^b^aW^bO`y4o7n+pWE-Yw zfsjPfl=NvtDSoq*^_|G+yOB%DCn6o`o)hVwv8X0%9TIxi@P>rcHakk__~`Rc=}|}J zA+z-zohNastiLOA)y?!MM%~%LV6zR=yaAy|L?wxsq>`PJ$SHkAuB=H9_BC0TKCGTx zkPTStauNIow*E2Ax;rOHOue^t6K2BHf)agyvGz%8t;laci~PX-B?tb-lnfgseU0UfVQ zX|^hb7;#nux!&;If(`H_7jyzVzq1LuV3!0}iRaD__5?Uz(Ke7p&Uyia_0vp9F49zE zwS473an}h;R{(=HWc(s+`BuO5ahux z^k)%E{o-~Ui~3>hkVefL?|dNo3ZjcC(Q6>AcbKG*{9CaNDt*+peig@gVr#b$S6Yvd z8)lEtCUs$spWVx_(!Ue+n{q)*Rn%t-q>TRz3H=x}3kLTl;34AFDpt@DmDde;QDtCr z7T=s+JM^*iF%X>F1~gbEhbevs9J)@V<&9oO1PEBKqu5086a}{3jKBibH4xZA2J6bF zehq$(?-l3m(6h}WF*3P`k6T5NmyN%80L|C}_bN4I{;>XvH#7DNcSRTY?@Op3@Gr-p IZopQYf3^rae*gdg literal 0 HcmV?d00001 diff --git a/src/servermanager/api/__pycache__/commonapi.cpython-314.pyc b/src/servermanager/api/__pycache__/commonapi.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1664c95673ed26438c532bf3e8fb543285b50d88 GIT binary patch literal 3768 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 literal 0 HcmV?d00001 diff --git a/src/servermanager/api/blogapi.py b/src/servermanager/api/blogapi.py new file mode 100644 index 0000000..d9e4a7d --- /dev/null +++ b/src/servermanager/api/blogapi.py @@ -0,0 +1,78 @@ +# 导入Haystack搜索查询集 +from haystack.query import SearchQuerySet + +# 导入博客模型 +from blog.models import Article, Category + + +class BlogApi: + """ + 博客API类 + 提供博客文章的搜索、分类获取和最近文章等功能 + """ + + def __init__(self): + """ + 初始化方法 + 创建搜索查询集实例并设置最大返回数量 + """ + # 创建搜索查询集实例 + self.searchqueryset = SearchQuerySet() + # 初始化空查询,准备后续搜索 + self.searchqueryset.auto_query('') + # 设置最大返回文章数量 + self.__max_takecount__ = 8 + + def search_articles(self, query): + """ + 搜索文章方法 + + Args: + query (str): 搜索关键词 + + Returns: + SearchQuerySet: 包含搜索结果的查询集,最多返回__max_takecount__条结果 + """ + # 使用Haystack进行自动搜索查询 + sqs = self.searchqueryset.auto_query(query) + # 加载所有相关对象(避免N+1查询问题) + sqs = sqs.load_all() + # 返回前__max_takecount__条结果 + return sqs[:self.__max_takecount__] + + def get_category_lists(self): + """ + 获取所有分类列表 + + Returns: + QuerySet: 包含所有分类的查询集 + """ + return Category.objects.all() + + def get_category_articles(self, categoryname): + """ + 根据分类名称获取该分类下的文章 + + Args: + categoryname (str): 分类名称 + + Returns: + QuerySet or None: 包含该分类文章的查询集(最多__max_takecount__条),如果分类不存在返回None + """ + # 根据分类名称过滤文章 + articles = Article.objects.filter(category__name=categoryname) + # 如果找到文章,返回前__max_takecount__条 + if articles: + return articles[:self.__max_takecount__] + # 没有找到文章返回None + return None + + def get_recent_articles(self): + """ + 获取最近的文章 + + Returns: + QuerySet: 包含最近文章的查询集,最多返回__max_takecount__条 + """ + # 获取所有文章并按时间排序(假设Article模型的默认排序是按时间倒序) + return Article.objects.all()[:self.__max_takecount__] \ No newline at end of file diff --git a/src/servermanager/api/commonapi.py b/src/servermanager/api/commonapi.py new file mode 100644 index 0000000..98fbc0e --- /dev/null +++ b/src/servermanager/api/commonapi.py @@ -0,0 +1,129 @@ +# 导入必要的模块 +import logging +import os + +import openai # OpenAI API客户端 + +# 导入自定义的Django模型 +from servermanager.models import commands + +# 获取当前模块的日志记录器 +logger = logging.getLogger(__name__) + +# 配置OpenAI API密钥,从环境变量中获取 +openai.api_key = os.environ.get('OPENAI_API_KEY') +# 如果设置了HTTP代理,配置OpenAI使用代理 +if os.environ.get('HTTP_PROXY'): + openai.proxy = os.environ.get('HTTP_PROXY') + + +class ChatGPT: + """ + ChatGPT API封装类 + 提供与OpenAI GPT模型交互的静态方法 + """ + + @staticmethod + def chat(prompt): + """ + 与ChatGPT进行对话的静态方法 + + Args: + prompt (str): 用户输入的提示词 + + Returns: + str: ChatGPT的回复内容,如果出错返回错误信息 + """ + try: + # 调用OpenAI ChatCompletion API创建对话完成 + completion = openai.ChatCompletion.create( + model="gpt-3.5-turbo", # 指定使用gpt-3.5-turbo模型 + messages=[{"role": "user", "content": prompt}] # 设置对话消息 + ) + # 返回第一个选择中的消息内容 + return completion.choices[0].message.content + except Exception as e: + # 记录错误日志 + logger.error(e) + # 返回用户友好的错误信息 + return "服务器出错了" + + +class CommandHandler: + """ + 命令处理器类 + 用于管理和执行预定义的系统命令 + """ + + def __init__(self): + """ + 初始化方法 + 从数据库加载所有预定义命令 + """ + # 从数据库获取所有命令对象 + self.commands = commands.objects.all() + + def run(self, title): + """ + 运行指定标题的命令 + + Args: + title (str): 命令标题 + + Returns: + str: 命令执行结果或帮助信息 + """ + # 使用filter和lambda函数查找标题匹配的命令(不区分大小写) + cmd = list( + filter( + lambda x: x.title.upper() == title.upper(), # 不区分大小写比较 + self.commands)) + + # 如果找到匹配的命令 + if cmd: + # 执行找到的第一个命令 + return self.__run_command__(cmd[0].command) + else: + # 未找到命令时返回帮助提示 + return "未找到相关命令,请输入helpme获得帮助。" + + def __run_command__(self, cmd): + """ + 私有方法:实际执行系统命令 + + Args: + cmd (str): 要执行的系统命令 + + Returns: + str: 命令执行结果或错误信息 + """ + try: + # 使用os.popen执行系统命令并读取输出 + res = os.popen(cmd).read() + return res + except BaseException: + # 捕获所有异常,返回错误信息 + return '命令执行出错!' + + def get_help(self): + """ + 获取所有命令的帮助信息 + + Returns: + str: 格式化的命令帮助信息,包含所有命令的标题和描述 + """ + rsp = '' + # 遍历所有命令,格式化输出 + for cmd in self.commands: + rsp += '{c}:{d}\n'.format(c=cmd.title, d=cmd.describe) + return rsp + + +# 主程序入口 +if __name__ == '__main__': + # 创建ChatGPT实例 + chatbot = ChatGPT() + # 测试提示词 + prompt = "写一篇1000字关于AI的论文" + # 调用chat方法并打印结果 + print(chatbot.chat(prompt)) \ No newline at end of file diff --git a/src/servermanager/apps.py b/src/servermanager/apps.py new file mode 100644 index 0000000..8098071 --- /dev/null +++ b/src/servermanager/apps.py @@ -0,0 +1,31 @@ +# 导入Django的应用配置基类 +from django.apps import AppConfig + + +class ServermanagerConfig(AppConfig): + """ + Servermanager应用的配置类 + 继承自Django的AppConfig基类,用于配置servermanager应用的相关设置 + + 这个类主要用于: + 1. 定义应用的配置信息 + 2. 在Django启动时执行应用初始化代码 + 3. 配置应用的元数据 + """ + + # 指定应用的Python路径(必需字段) + # 这应该与settings.INSTALLED_APPS中使用的路径匹配 + name = 'servermanager' + # 说明: + # - 'servermanager' 表示应用的Python导入路径 + # - Django使用这个名称来识别和应用配置 + + # 可选配置字段示例(当前代码中未使用): + # + # verbose_name = '服务器管理器' # 应用的可读名称 + # default_auto_field = 'django.db.models.BigAutoField' # 默认主键字段类型 + # + # 可以在ready()方法中添加应用启动时的初始化代码: + # def ready(self): + # # 应用启动时执行的初始化代码 + # import servermanager.signals # 例如:导入信号处理器 \ No newline at end of file diff --git a/src/servermanager/migrations/0001_initial.py b/src/servermanager/migrations/0001_initial.py new file mode 100644 index 0000000..0cfdd13 --- /dev/null +++ b/src/servermanager/migrations/0001_initial.py @@ -0,0 +1,67 @@ +# Generated by Django 4.1.7 on 2023-03-02 07:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + """ + Django数据库迁移类 + 迁移用于创建数据库表结构,这是初始迁移(initial=True) + """ + + initial = True # 标记这是初始迁移 + + dependencies = [ + # 依赖关系列表,此迁移不依赖其他迁移 + ] + + operations = [ + # 迁移操作列表 + + # 创建命令表 + migrations.CreateModel( + name='commands', # 模型名称 + fields=[ + # 主键字段,自增BigInteger类型 + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + # 命令标题字段,最大长度300字符 + ('title', models.CharField(max_length=300, verbose_name='命令标题')), + # 命令字段,存储具体命令内容,最大长度2000字符 + ('command', models.CharField(max_length=2000, verbose_name='命令')), + # 命令描述字段,最大长度300字符 + ('describe', models.CharField(max_length=300, verbose_name='命令描述')), + # 创建时间字段,自动设置为记录创建时的时间 + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + # 最后修改时间字段,每次保存时自动更新为当前时间 + ('last_mod_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ], + options={ + 'verbose_name': '命令', # 单数形式的可读名称 + 'verbose_name_plural': '命令', # 复数形式的可读名称 + }, + ), + + # 创建邮件发送日志表 + migrations.CreateModel( + name='EmailSendLog', # 模型名称 + fields=[ + # 主键字段,自增BigInteger类型 + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + # 收件人字段,存储收件人邮箱地址,最大长度300字符 + ('emailto', models.CharField(max_length=300, verbose_name='收件人')), + # 邮件标题字段,最大长度2000字符 + ('title', models.CharField(max_length=2000, verbose_name='邮件标题')), + # 邮件内容字段,文本类型,无长度限制 + ('content', models.TextField(verbose_name='邮件内容')), + # 发送结果字段,布尔类型,默认值为False(发送失败) + ('send_result', models.BooleanField(default=False, verbose_name='结果')), + # 创建时间字段,自动设置为记录创建时的时间 + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '邮件发送log', # 单数形式的可读名称 + 'verbose_name_plural': '邮件发送log', # 复数形式的可读名称 + 'ordering': ['-created_time'], # 默认按创建时间降序排列 + }, + ), + ] \ No newline at end of file diff --git a/src/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py b/src/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py new file mode 100644 index 0000000..67e8c70 --- /dev/null +++ b/src/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py @@ -0,0 +1,50 @@ +# Generated by Django 4.2.5 on 2023-09-06 13:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + """ + Django数据库迁移类 + 这是一个数据模型变更的迁移文件,用于修改已有表结构 + """ + + dependencies = [ + # 依赖关系:此迁移依赖于servermanager应用的0001_initial初始迁移 + ('servermanager', '0001_initial'), + ] + + operations = [ + # 迁移操作列表 + + # 修改EmailSendLog模型的元选项 + migrations.AlterModelOptions( + name='emailsendlog', # 模型名称 + options={ + 'ordering': ['-creation_time'], # 改为按creation_time字段降序排列 + 'verbose_name': '邮件发送log', # 单数形式的可读名称 + 'verbose_name_plural': '邮件发送log', # 复数形式的可读名称 + }, + ), + + # 重命名commands模型的created_time字段为creation_time + migrations.RenameField( + model_name='commands', # 模型名称 + old_name='created_time', # 原字段名 + new_name='creation_time', # 新字段名 + ), + + # 重命名commands模型的last_mod_time字段为last_modify_time + migrations.RenameField( + model_name='commands', # 模型名称 + old_name='last_mod_time', # 原字段名 + new_name='last_modify_time', # 新字段名 + ), + + # 重命名emailsendlog模型的created_time字段为creation_time + migrations.RenameField( + model_name='emailsendlog', # 模型名称 + old_name='created_time', # 原字段名 + new_name='creation_time', # 新字段名 + ), + ] \ No newline at end of file diff --git a/src/servermanager/migrations/__init__.py b/src/servermanager/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/servermanager/migrations/__pycache__/0001_initial.cpython-314.pyc b/src/servermanager/migrations/__pycache__/0001_initial.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4b8c2b04e28959202020591394dd0ecc7ba156a GIT binary patch literal 2115 zcmb7EU2M}<6t_dk6sihk)M#(lyy&$K-=q%?Q}_{7HyVdpOgEY zd(ZcsbI;C5ILN^B>zO~V#nhgMLyJkxIv%0zSo2NfNotE&7%Mc z4nhX@1IWe=ks%abgN$s5p=w)fQzk*^Pz6k zQ_}$bXI&k&wt`w)Q7_t-Vt0FMnx#B6g0|Bpv;&&=bt`acwQEN$KCNZ5qAD4dN0yFS zp5sGFpA`~wRKsbVh?GcH+(3M z-{#h>Kb}0aLe-Qom9y35ukM!@9xvZ}v~urfIK@p|)jr0eB)R8=715v=?q)4$>B;Q! z-T8lmc!w(rZ6neh! z&GPr(0Z+d~CPetx!R72JaH0cg032c0#;W>$u;Vlp~IS{5K(o#pf*WXXKNeA z28B7B#v-NA8#zi0jP(Q@^a6g&%VBs8y*W1Yfv9G*>Zknmx8>OfD?iLXzdt($Z3`uZ zP8TyoAFGY+v4MesJ-Es&HF;gPJJEUBhVcos^G)ViqHI9*lS+Irm7d(4O5_{=;rC|#aLfH*7q>I7%9ZgnZo%}G&X&- z7~hqT?*jb6LVVN|-h+Ln&lWrS^Bw(jEsKW=9T!dE{Zh1RW>c|yf4+PF(|zVysnAVK zVWJdG%xo|A9LV<^cMgWUAkSb zOt+SqcX4MSe%2Ju)pL**I}5S%rf{L2L#hxzZVD$#(assJnAn?7?427nN6r@#7fj*e z`V?x(nu$G-t-0f1Nr+8jGu~hE`|PxvAnoo%GxzxkefMfLPQzFVNKScE(zw%fPM^8; zO4u+5I{=o&zvcGyA^i<-?Xhdb;Z^anEc-Xdu*sL)4wkzeEDF893B7+Y;5gC$0MaWo ACIA2c literal 0 HcmV?d00001 diff --git a/src/servermanager/migrations/__pycache__/0001_initial.cpython-38.pyc b/src/servermanager/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39e38ec6441337364899261b40c6c59f45ec26c4 GIT binary patch literal 1327 zcmZuxO>ERg6t>6Cu6Nf?LJ4gt{o$`j+ZL2w5vpidK$Uo7xJoM{HMV1VZ42yaqd79b zvqqE1dc*@kGoHk$tV9X0FzqPO@Z%vkj&E8w4TBkN6O1+ivuy=N+h!w+73G3e7acHh z*f0W>WqY1L758f3Kn?241aU)S7rYXWmh!O@k0Y+5g&pvLKEJcX6R=C+pn{qne7H*B zqh(9`{rJ6pcb9fQDeV?b9#OI6|HPJL zEoFk!kY8fbJY4vZdZ*8t`ZEWa#23OY*6|^W0;*7=FkfitfZ@slg zO|uB1k)lOkurv=d&C&mxH~W9BVy0DK^AvaWxqJ-$6qb7{HwKrlgh_D8J3P!*)6yr! zgyP;w1YjBC;9PT5I=(KT@5{Qcc*;YDYuERG&S|K!MO5W6&#>&$1=huoSlr<(6+{_p zoX~x8R^38jsU3HU2j61{ol+#p+KB}!ilx`WhMK|Jm692DF)NntRFZ^@#s#V;T~=Q2 z`-b=mZR+Vot95j?wMgS2DL+$~=-~(p%)~4Pc^2iYGz*10FooUK;kQMdB&Y=-IcMUDG0n13UA*nfJZ-y*IO`(kTtW_;l;X z-E|qEuf7qDcnJ1p05s7uBKR7*iUrQ0EXpGyjUgg0;l)@)=&$D?mOq3gPaK{PTr9g6&iUy`K$!w(;fSBeRhq(y=ZLFvO@Vm_+bOR}17 zS}wB<%c***!wtqwyZR`7y24q|7Anjd^O6r3UvXSUZN0`CLm<8VWb@m{_q)$G+Rev4 zcVxc@ty>MQTSdu>`2=sksRu3g)QVH9>9*l|$shqUdht^S(iLU67sp^$kPc*7Mu=?o zu!mBX?g|P{J$@!K&DFJF=Pg=*>?xOV&;=RwD&t;qa&q!4HEmOvAWrjC8U&-%)2JV- zVKKl-O7Ayx%NGvT5T&aocZFrz%y#@^gVmv5%&wTs<^GL%!?TuPeBM`lGc0tFFh9T* zlUatRIdv93GA~Q1E1^^(ByZNU5 z`os5Eo8<#FmHY3v4Ao6h-Iqf5Un>opPoeKnC1<7j8ux#tU{V0M8!$aZ9R(#$c4TQ( zY2N5)C^5357Pi$wYdF`+=C+PaZRO9sTi&{Sd+ScEgHRpMO0Z-vN!_@d&^l^B7~fXM zTVwfFcA}LnbO&N^(2MlvpwP;m`1|1aenxKekg|TAAB{9Fz=KE_K|@N$O3?FO0e;td tZh1hSI@7zvi+lo144-=hrjCp;{;43G?<$9}@^o4Xc%+RG zJ%50Pl7>IPZ*U6~M@NgqW9+>n7i@VvGoHscGrpf?38VFS|NG;kkg+dLSX~hb+jPt& zBEWzvR`Hy3c85U#;Sqxn`8aqT<^e?etlycF9qV(ORAr&%v}|fKa;nu8ldw(4JRpKB z=fKFF7d#I!8h2daf1S{A5nIv5PDh_WuHrBr!}l`NIP8dOs}-`E^!^vK1utZ;UQK+a!%`1NL+FJ6*OKeTb90d-jyHl?@+jX_b%3hnt-NlesCOGWu3|JZFNz9TjsH5Fk2V^g0D z!RNBssnnDvsTx4lhK?Hr3$DgzEte^2rh<%G|FcW6e01nFd;QqP!rKaA6X8r}3W-mJ zcrug9;c^n-gzCq7RHD%Vm2A)5R8!QuF8|#H?Dc!->~EK-z$VQE7ZZNZ^aXP97I)GWfTacgp@>7%kWI_5Hw zI1K(oorniK{T)T_rv0nc{Kx(9o_o~R9(aITaNuk8`jZk`?ji-Z@%6T0H(XBR`jUo! E0fBJ!8vp>P{wCAAftgHh(Vb_lhJP_LlF~@{~09t#SuujSjD(x zCFZ5)L#d~|v!1S7^m5_O=d;(v6sH!Ir55ET<|U@57RBUdrWYlaWaj4;$Hd2H=4F<| l$LkeT-r}&y%}*)KNwq6t1)2x4wiv|t#LURZSi}ru0RS~#EhYc} literal 0 HcmV?d00001 diff --git a/src/servermanager/migrations/__pycache__/__init__.cpython-38.pyc b/src/servermanager/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a76714a744ee0c9cd773760fd4306d1f2acceb0 GIT binary patch literal 155 zcmWIL<>g`kf)l~7GC=fW5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H6i&czER$^Xy zK9q9G$xqkKO)M@+Es7~lEh= 3: + self.userinfo = WxUserInfo() + self.save_session() + return "超过验证次数" + self.userinfo.Count += 1 + self.save_session() + return "验证失败,请重新输入管理员密码:" + + # 管理员命令执行 + if self.userinfo.isAdmin and self.userinfo.isPasswordSet: + # 确认执行命令 + if self.userinfo.Command != '' and info.upper() == 'Y': + return cmd_handler.run(self.userinfo.Command) + else: + # 获取命令帮助 + if info.upper() == 'HELPME': + return cmd_handler.get_help() + # 保存命令等待确认 + self.userinfo.Command = info + self.save_session() + return "确认执行: " + info + " 命令?" + + # 默认使用ChatGPT回复 + return ChatGPT.chat(info) + + +class WxUserInfo(): + """微信用户信息类,用于存储用户会话状态""" + + def __init__(self): + self.isAdmin = False # 是否为管理员 + self.isPasswordSet = False # 是否通过密码验证 + self.Count = 0 # 密码尝试次数 + self.Command = '' # 待确认的命令 \ No newline at end of file diff --git a/src/servermanager/tests.py b/src/servermanager/tests.py new file mode 100644 index 0000000..2f57a6c --- /dev/null +++ b/src/servermanager/tests.py @@ -0,0 +1,121 @@ +# 导入Django测试相关模块 +from django.test import Client, RequestFactory, TestCase +from django.utils import timezone +# 导入WeRoBot文本消息类 +from werobot.messages.messages import TextMessage + +# 导入应用模型 +from accounts.models import BlogUser +from blog.models import Category, Article +# 导入要测试的API类 +from servermanager.api.commonapi import ChatGPT +from .models import commands +# 导入要测试的机器人处理类和方法 +from .robot import MessageHandler, CommandHandler +from .robot import search, category, recents + + +# 创建服务器管理器测试类 +class ServerManagerTest(TestCase): + """ + 服务器管理器功能测试类 + 测试servermanager应用的各项功能 + """ + + def setUp(self): + """ + 测试初始化方法 + 在每个测试方法执行前运行,用于设置测试环境 + """ + # 创建测试客户端,用于模拟HTTP请求 + self.client = Client() + # 创建请求工厂,用于构建请求对象 + self.factory = RequestFactory() + + def test_chat_gpt(self): + """ + 测试ChatGPT功能 + 验证ChatGPT API是否能正常返回响应 + """ + content = ChatGPT.chat("你好") # 发送测试消息 + self.assertIsNotNone(content) # 断言响应内容不为空 + + def test_validate_comment(self): + """ + 综合测试方法 + 测试博客系统和微信机器人的完整功能链 + """ + # 创建超级用户 + user = BlogUser.objects.create_superuser( + email="liangliangyy1@gmail.com", + username="liangliangyy1", + password="liangliangyy1") + + # 使用创建的超级用户登录 + self.client.login(username='liangliangyy1', password='liangliangyy1') + + # 创建分类 + c = Category() + c.name = "categoryccc" + c.save() + + # 创建文章 + article = Article() + article.title = "nicetitleccc" + article.body = "nicecontentccc" + article.author = user + article.category = c + article.type = 'a' # 文章类型 + article.status = 'p' # 发布状态 + article.save() + + # 测试搜索功能 + s = TextMessage([]) # 创建空的文本消息对象 + s.content = "nice" # 设置消息内容 + rsp = search(s, None) # 调用搜索函数 + # 注意:这里没有对搜索结果进行断言,可能需要补充 + + # 测试分类功能 + rsp = category(None, None) # 调用分类函数 + self.assertIsNotNone(rsp) # 断言响应不为空 + + # 测试最近文章功能 + rsp = recents(None, None) # 调用最近文章函数 + self.assertTrue(rsp != '暂时还没有文章') # 断言有文章返回 + + # 测试命令功能 + # 创建测试命令 + cmd = commands() + cmd.title = "test" + cmd.command = "ls" # Linux列表命令 + cmd.describe = "test" + cmd.save() + + # 测试命令处理器 + cmdhandler = CommandHandler() + rsp = cmdhandler.run('test') # 执行测试命令 + self.assertIsNotNone(rsp) # 断言命令执行结果不为空 + + # 测试消息处理器 + s.source = 'u' # 设置消息来源 + s.content = 'test' # 设置消息内容 + msghandler = MessageHandler(s, {}) # 创建消息处理器 + + # 注释掉的管理员权限设置 + # msghandler.userinfo.isPasswordSet = True + # msghandler.userinfo.isAdmin = True + + # 测试各种消息处理场景 + msghandler.handler() # 处理'test'消息 + s.content = 'y' # 确认执行命令 + msghandler.handler() + s.content = 'idcard:12321233' # 身份证查询(建设中功能) + msghandler.handler() + s.content = 'weather:上海' # 天气查询(建设中功能) + msghandler.handler() + s.content = 'admin' # 进入管理员模式 + msghandler.handler() + s.content = '123' # 输入管理员密码 + msghandler.handler() + s.content = 'exit' # 退出管理员模式 + msghandler.handler() \ No newline at end of file diff --git a/src/servermanager/urls.py b/src/servermanager/urls.py new file mode 100644 index 0000000..f3b73f5 --- /dev/null +++ b/src/servermanager/urls.py @@ -0,0 +1,22 @@ +# 导入Django的URL路由模块 +from django.urls import path +# 导入WeRoBot的Django视图创建工具 +from werobot.contrib.django import make_view + +# 从当前目录的robot模块导入robot实例 +from .robot import robot + +# 定义应用的命名空间,用于URL反向解析 +app_name = "servermanager" + +# 定义URL模式列表 +urlpatterns = [ + # 微信机器人消息接收接口 + # 路径: /servermanager/robot + # 使用WeRoBot的make_view将robot实例转换为Django视图 + path(r'robot', make_view(robot)), + # 说明: + # - r'robot': URL路径模式,匹配"robot"路径 + # - make_view(robot): 将WeRoBot机器人实例包装成Django视图函数 + # - 这个端点用于接收微信服务器发送的消息和事件 +] \ No newline at end of file diff --git a/src/servermanager/views.py b/src/servermanager/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/src/servermanager/views.py @@ -0,0 +1 @@ +# Create your views here. -- 2.34.1 From bfc2f8ca148ec9744c3998ec468f4704e333030d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=85=A7?= <1096877868@qq.com> Date: Sun, 26 Oct 2025 14:17:45 +0800 Subject: [PATCH 05/13] =?UTF-8?q?zh=E7=AC=AC=E5=85=AD=E5=91=A8=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/.idea/.gitignore | 5 + src/.idea/.name | 1 + .../inspectionProfiles/profiles_settings.xml | 6 + src/.idea/misc.xml | 7 + src/.idea/modules.xml | 8 + src/.idea/src.iml | 8 + src/.idea/vcs.xml | 6 + src/owntracks/__init__.py | 0 src/owntracks/admin.py | 11 ++ src/owntracks/apps.py | 10 ++ src/owntracks/models.py | 47 +++++ src/owntracks/tests.py | 105 +++++++++++ src/owntracks/urls.py | 28 +++ src/owntracks/views.py | 170 ++++++++++++++++++ 14 files changed, 412 insertions(+) create mode 100644 src/.idea/.gitignore create mode 100644 src/.idea/.name create mode 100644 src/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 src/.idea/misc.xml create mode 100644 src/.idea/modules.xml create mode 100644 src/.idea/src.iml create mode 100644 src/.idea/vcs.xml create mode 100644 src/owntracks/__init__.py create mode 100644 src/owntracks/admin.py create mode 100644 src/owntracks/apps.py create mode 100644 src/owntracks/models.py create mode 100644 src/owntracks/tests.py create mode 100644 src/owntracks/urls.py create mode 100644 src/owntracks/views.py diff --git a/src/.idea/.gitignore b/src/.idea/.gitignore new file mode 100644 index 0000000..10b731c --- /dev/null +++ b/src/.idea/.gitignore @@ -0,0 +1,5 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ diff --git a/src/.idea/.name b/src/.idea/.name new file mode 100644 index 0000000..c8d4ea1 --- /dev/null +++ b/src/.idea/.name @@ -0,0 +1 @@ +views.py \ No newline at end of file diff --git a/src/.idea/inspectionProfiles/profiles_settings.xml b/src/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/src/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/.idea/misc.xml b/src/.idea/misc.xml new file mode 100644 index 0000000..db8786c --- /dev/null +++ b/src/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/src/.idea/modules.xml b/src/.idea/modules.xml new file mode 100644 index 0000000..f669a0e --- /dev/null +++ b/src/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/.idea/src.iml b/src/.idea/src.iml new file mode 100644 index 0000000..f571432 --- /dev/null +++ b/src/.idea/src.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/.idea/vcs.xml b/src/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/src/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/owntracks/__init__.py b/src/owntracks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/owntracks/admin.py b/src/owntracks/admin.py new file mode 100644 index 0000000..31c1dba --- /dev/null +++ b/src/owntracks/admin.py @@ -0,0 +1,11 @@ +# 导入Django的admin模块,用于在管理后台注册和管理数据模型 +from django.contrib import admin + +# Register your models here. # Django自动生成的注释,提示在此处注册需要在管理后台显示的模型 + +# 定义一个管理配置类OwnTrackLogsAdmin,继承自admin.ModelAdmin +# 这个类用于配置OwnTrackLog模型在Django管理后台的显示和操作方式 +class OwnTrackLogsAdmin(admin.ModelAdmin): + # pass表示暂时不添加任何自定义配置,使用默认的管理后台设置 + # 后续可以在这里添加各种属性(如list_display、search_fields等)来自定义管理界面 + pass \ No newline at end of file diff --git a/src/owntracks/apps.py b/src/owntracks/apps.py new file mode 100644 index 0000000..7114d87 --- /dev/null +++ b/src/owntracks/apps.py @@ -0,0 +1,10 @@ +# 导入Django的AppConfig类,用于配置应用的元数据和初始化行为 +from django.apps import AppConfig + + +# 定义一个应用配置类OwntracksConfig,继承自AppConfig +# 该类用于配置名为'owntracks'的Django应用 +class OwntracksConfig(AppConfig): + # name属性指定了应用的名称,必须与应用的目录名一致 + # 这个名称会被Django用于识别和管理该应用 + name = 'owntracks' diff --git a/src/owntracks/models.py b/src/owntracks/models.py new file mode 100644 index 0000000..3326c0d --- /dev/null +++ b/src/owntracks/models.py @@ -0,0 +1,47 @@ +# 导入Django的models模块,用于定义数据模型 +from django.db import models +# 导入Django的时区工具,用于处理时间相关操作 +from django.utils.timezone import now + + +# Create your models here. # Django自动生成的注释,提示在此处创建数据模型 + +# 定义一个名为OwnTrackLog的数据模型类,继承自models.Model +# 这个模型用于存储OwnTracks(一个位置追踪应用)的位置日志信息 +class OwnTrackLog(models.Model): + # 定义tid字段,CharField表示字符串类型 + # max_length=100限制最大长度为100字符 + # null=False表示该字段不允许为空 + # verbose_name='用户'用于在admin后台显示的字段名称 + tid = models.CharField(max_length=100, null=False, verbose_name='用户') + + # 定义lat字段,FloatField表示浮点型,用于存储纬度信息 + # verbose_name='纬度'用于在admin后台显示的字段名称 + lat = models.FloatField(verbose_name='纬度') + + # 定义lon字段,FloatField表示浮点型,用于存储经度信息 + # verbose_name='经度'用于在admin后台显示的字段名称 + lon = models.FloatField(verbose_name='经度') + + # 定义creation_time字段,DateTimeField表示日期时间类型 + # '创建时间'是字段的位置参数,等同于verbose_name='创建时间' + # default=now设置默认值为当前时间(使用Django的时区设置) + creation_time = models.DateTimeField('创建时间', default=now) + + # 定义对象的字符串表示方法 + # 当打印该模型的实例时,会返回tid字段的值 + def __str__(self): + return self.tid + + # Meta类用于定义模型的元数据 + class Meta: + # ordering=['creation_time']指定查询该模型数据时的默认排序方式 + # 按creation_time字段升序排列(加负号表示降序,如['-creation_time']) + ordering = ['creation_time'] + # verbose_name定义模型在admin后台的单数显示名称 + verbose_name = "OwnTrackLogs" + # verbose_name_plural定义模型在admin后台的复数显示名称 + verbose_name_plural = verbose_name + # get_latest_by='creation_time'指定使用creation_time字段来获取最新记录 + # 可以通过模型管理器的latest()方法获取最新记录 + get_latest_by = 'creation_time' \ No newline at end of file diff --git a/src/owntracks/tests.py b/src/owntracks/tests.py new file mode 100644 index 0000000..2c63b28 --- /dev/null +++ b/src/owntracks/tests.py @@ -0,0 +1,105 @@ +# 导入json模块,用于处理JSON数据格式 +import json + +# 从Django测试框架导入必要的测试工具 +# Client用于模拟用户在视图上的请求 +# RequestFactory用于创建请求对象 +# TestCase是Django测试的基础类 +from django.test import Client, RequestFactory, TestCase + +# 导入账户模型BlogUser,用于测试用户相关功能 +from accounts.models import BlogUser +# 从当前应用导入要测试的模型OwnTrackLog +from .models import OwnTrackLog + + +# Create your tests here. # Django自动生成的注释,提示在此处编写测试代码 + +# 定义测试类OwnTrackLogTest,继承自TestCase +# 该类包含对OwnTrackLog模型及相关视图的测试用例 +class OwnTrackLogTest(TestCase): + # setUp方法在每个测试方法执行前运行,用于初始化测试环境 + def setUp(self): + # 创建一个测试客户端,用于模拟用户请求 + self.client = Client() + # 创建一个请求工厂,用于构建复杂的请求对象 + self.factory = RequestFactory() + + # 定义具体的测试方法,方法名以test_开头 + def test_own_track_log(self): + # 定义一个符合要求的测试数据字典,包含tid、lat、lon字段 + o = { + 'tid': 12, + 'lat': 123.123, + 'lon': 134.341 + } + + # 使用测试客户端发送POST请求到指定URL + # 发送JSON格式的数据,指定content_type为application/json + self.client.post( + '/owntracks/logtracks', # 请求的URL + json.dumps(o), # 将字典转换为JSON字符串 + content_type='application/json') # 指定内容类型 + + # 检查数据库中OwnTrackLog记录的数量 + length = len(OwnTrackLog.objects.all()) + # 断言记录数为1,验证第一条数据成功保存 + self.assertEqual(length, 1) + + # 定义一个不完整的测试数据字典,缺少lon字段 + o = { + 'tid': 12, + 'lat': 123.123 + } + + # 再次发送POST请求,使用不完整的数据 + self.client.post( + '/owntracks/logtracks', + json.dumps(o), + content_type='application/json') + + # 再次检查数据库中记录的数量 + length = len(OwnTrackLog.objects.all()) + # 断言记录数仍为1,验证不完整数据没有被保存 + self.assertEqual(length, 1) + + # 测试未登录状态下访问/show_maps页面 + rsp = self.client.get('/owntracks/show_maps') + # 断言返回状态码为302(重定向),验证未登录用户被重定向 + self.assertEqual(rsp.status_code, 302) + + # 创建一个超级用户,用于测试登录状态下的功能 + user = BlogUser.objects.create_superuser( + email="liangliangyy1@gmail.com", + username="liangliangyy1", + password="liangliangyy1") + + # 使用测试客户端登录刚刚创建的用户 + self.client.login(username='liangliangyy1', password='liangliangyy1') + + # 手动创建并保存一条OwnTrackLog记录 + s = OwnTrackLog() + s.tid = 12 + s.lon = 123.234 + s.lat = 34.234 + s.save() + + # 测试登录状态下访问/show_dates页面 + rsp = self.client.get('/owntracks/show_dates') + # 断言返回状态码为200(成功) + self.assertEqual(rsp.status_code, 200) + + # 测试登录状态下访问/show_maps页面 + rsp = self.client.get('/owntracks/show_maps') + # 断言返回状态码为200(成功) + self.assertEqual(rsp.status_code, 200) + + # 测试登录状态下访问/get_datas页面 + rsp = self.client.get('/owntracks/get_datas') + # 断言返回状态码为200(成功) + self.assertEqual(rsp.status_code, 200) + + # 测试登录状态下带日期参数访问/get_datas页面 + rsp = self.client.get('/owntracks/get_datas?date=2018-02-26') + # 断言返回状态码为200(成功) + self.assertEqual(rsp.status_code, 200) \ No newline at end of file diff --git a/src/owntracks/urls.py b/src/owntracks/urls.py new file mode 100644 index 0000000..ed19e92 --- /dev/null +++ b/src/owntracks/urls.py @@ -0,0 +1,28 @@ +# 导入Django的path函数,用于定义URL路径 +from django.urls import path + +# 从当前应用导入views模块,包含视图函数 +from . import views + +# 定义应用的命名空间为"owntracks" +# 用于在模板中引用URL时避免命名冲突,格式为"app_name:url_name" +app_name = "owntracks" + +# 定义URL模式列表,每个path对应一个URL路径与视图函数的映射 +urlpatterns = [ + # 定义路径'owntracks/logtracks',映射到views.manage_owntrack_log视图函数 + # name='logtracks'为该URL指定名称,用于在模板和代码中引用 + path('owntracks/logtracks', views.manage_owntrack_log, name='logtracks'), + + # 定义路径'owntracks/show_maps',映射到views.show_maps视图函数 + # name='show_maps'为该URL指定名称 + path('owntracks/show_maps', views.show_maps, name='show_maps'), + + # 定义路径'owntracks/get_datas',映射到views.get_datas视图函数 + # name='get_datas'为该URL指定名称 + path('owntracks/get_datas', views.get_datas, name='get_datas'), + + # 定义路径'owntracks/show_dates',映射到views.show_log_dates视图函数 + # name='show_dates'为该URL指定名称 + path('owntracks/show_dates', views.show_log_dates, name='show_dates') +] \ No newline at end of file diff --git a/src/owntracks/views.py b/src/owntracks/views.py new file mode 100644 index 0000000..1db80e7 --- /dev/null +++ b/src/owntracks/views.py @@ -0,0 +1,170 @@ +# Create your views here. +# 导入必要的模块 +import datetime # 处理日期时间 +import itertools # 提供迭代器相关功能 +import json # 处理JSON数据 +import logging # 日志记录 +from datetime import timezone # 时区处理 +from itertools import groupby # 用于对序列进行分组 + +import django # Django框架核心 +import requests # 发送HTTP请求 +from django.contrib.auth.decorators import login_required # 登录验证装饰器 +from django.http import HttpResponse # HTTP响应 +from django.http import JsonResponse # JSON格式响应 +from django.shortcuts import render # 渲染模板 +from django.views.decorators.csrf import csrf_exempt # 禁用CSRF验证装饰器 + +from .models import OwnTrackLog # 导入当前应用的模型 + +# 配置日志记录器 +logger = logging.getLogger(__name__) + + +# 禁用CSRF验证的视图函数,用于处理OwnTracks的日志记录 +@csrf_exempt +def manage_owntrack_log(request): + try: + # 从请求中读取并解析JSON数据 + s = json.loads(request.read().decode('utf-8')) + # 提取必要的字段 + tid = s['tid'] + lat = s['lat'] + lon = s['lon'] + + # 记录日志信息 + logger.info( + 'tid:{tid}.lat:{lat}.lon:{lon}'.format( + tid=tid, lat=lat, lon=lon)) + # 验证字段是否存在 + if tid and lat and lon: + # 创建并保存新的日志记录 + m = OwnTrackLog() + m.tid = tid + m.lat = lat + m.lon = lon + m.save() + return HttpResponse('ok') # 返回成功响应 + else: + return HttpResponse('data error') # 数据不完整错误响应 + except Exception as e: + # 记录异常信息 + logger.error(e) + return HttpResponse('error') # 异常错误响应 + + +# 需要登录才能访问的视图,用于显示地图 +@login_required +def show_maps(request): + # 仅允许超级用户访问 + if request.user.is_superuser: + # 获取当前UTC日期作为默认日期 + defaultdate = str(datetime.datetime.now(timezone.utc).date()) + # 从请求参数中获取日期,默认为当前日期 + date = request.GET.get('date', defaultdate) + # 准备上下文数据 + context = { + 'date': date + } + # 渲染模板并返回 + return render(request, 'owntracks/show_maps.html', context) + else: + # 非超级用户返回403禁止访问 + from django.http import HttpResponseForbidden + return HttpResponseForbidden() + + +# 需要登录才能访问的视图,用于显示日志日期列表 +@login_required +def show_log_dates(request): + # 获取所有记录的创建时间 + dates = OwnTrackLog.objects.values_list('creation_time', flat=True) + # 提取日期部分并去重排序 + results = list(sorted(set(map(lambda x: x.strftime('%Y-%m-%d'), dates)))) + + # 准备上下文数据 + context = { + 'results': results + } + # 渲染模板并返回 + return render(request, 'owntracks/show_log_dates.html', context) + + +# 将GPS坐标转换为高德地图坐标的函数 +def convert_to_amap(locations): + convert_result = [] + # 创建迭代器 + it = iter(locations) + + # 每次处理30个坐标(高德API限制) + item = list(itertools.islice(it, 30)) + while item: + # 格式化坐标为"经度,纬度;经度,纬度"形式 + datas = ';'.join( + set(map(lambda x: str(x.lon) + ',' + str(x.lat), item))) + + # 高德API密钥和接口地址 + key = '8440a376dfc9743d8924bf0ad141f28e' + api = 'http://restapi.amap.com/v3/assistant/coordinate/convert' + # 请求参数 + query = { + 'key': key, + 'locations': datas, + 'coordsys': 'gps' # 源坐标系统为GPS + } + # 发送转换请求 + rsp = requests.get(url=api, params=query) + result = json.loads(rsp.text) + # 处理转换结果 + if "locations" in result: + convert_result.append(result['locations']) + # 处理下一批坐标 + item = list(itertools.islice(it, 30)) + + # 合并所有转换结果并返回 + return ";".join(convert_result) + + +# 需要登录才能访问的视图,用于获取轨迹数据 +@login_required +def get_datas(request): + # 获取当前UTC时间 + now = django.utils.timezone.now().replace(tzinfo=timezone.utc) + # 默认查询日期为今天 + querydate = django.utils.timezone.datetime( + now.year, now.month, now.day, 0, 0, 0) + # 如果请求中指定了日期,则使用指定日期 + if request.GET.get('date', None): + date = list(map(lambda x: int(x), request.GET.get('date').split('-'))) + querydate = django.utils.timezone.datetime( + date[0], date[1], date[2], 0, 0, 0) + # 计算查询日期的下一天(用于范围查询) + nextdate = querydate + datetime.timedelta(days=1) + # 查询指定日期范围内的所有记录 + models = OwnTrackLog.objects.filter( + creation_time__range=(querydate, nextdate)) + result = list() + # 如果有查询结果 + if models and len(models): + # 按tid分组处理记录 + for tid, item in groupby( + sorted(models, key=lambda k: k.tid), key=lambda k: k.tid): + + # 构建返回数据结构 + d = dict() + d["name"] = tid + paths = list() + # 注释掉的代码:使用高德转换后的经纬度 + # locations = convert_to_amap( + # sorted(item, key=lambda x: x.creation_time)) + # for i in locations.split(';'): + # paths.append(i.split(',')) + + # 使用GPS原始经纬度 + # 按创建时间排序并添加到路径列表 + for location in sorted(item, key=lambda x: x.creation_time): + paths.append([str(location.lon), str(location.lat)]) + d["path"] = paths + result.append(d) + # 返回JSON格式的结果 + return JsonResponse(result, safe=False) \ No newline at end of file -- 2.34.1 From db7ac971cd81f2e64562849d7afa72c45ee8a15d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=85=A7?= <1096877868@qq.com> Date: Sun, 26 Oct 2025 14:44:18 +0800 Subject: [PATCH 06/13] =?UTF-8?q?zh=E7=AC=AC=E5=85=AD=E5=91=A8=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 5 +++++ .idea/.name | 1 + .idea/inspectionProfiles/profiles_settings.xml | 6 ++++++ .idea/misc.xml | 7 +++++++ .idea/modules.xml | 8 ++++++++ .idea/src.iml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ 7 files changed, 41 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/src.iml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..10b731c --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..35ff20d --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +admin.py \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..db8786c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f669a0e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/src.iml b/.idea/src.iml new file mode 100644 index 0000000..f571432 --- /dev/null +++ b/.idea/src.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file -- 2.34.1 From edb9e639da1825c26f56033c250ee9161dc83b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=85=A7?= <1096877868@qq.com> Date: Sun, 26 Oct 2025 14:50:36 +0800 Subject: [PATCH 07/13] =?UTF-8?q?zh=E7=AC=AC=E5=85=AD=E5=91=A8=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..80d571c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +".idea/" -- 2.34.1 From cd37e1874db1a704090fec9ef4dd47f3901383b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=85=A7?= <1096877868@qq.com> Date: Sun, 26 Oct 2025 14:54:33 +0800 Subject: [PATCH 08/13] first --- .gitignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 80d571c..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -".idea/" -- 2.34.1 From afe4f5bc68564504aa740e369308896e2bbf918f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=85=A7?= <1096877868@qq.com> Date: Sun, 26 Oct 2025 15:19:05 +0800 Subject: [PATCH 09/13] first --- src/.idea/.gitignore | 5 ----- src/.idea/.name | 1 - src/.idea/inspectionProfiles/profiles_settings.xml | 6 ------ src/.idea/misc.xml | 7 ------- src/.idea/modules.xml | 8 -------- src/.idea/src.iml | 8 -------- src/.idea/vcs.xml | 6 ------ 7 files changed, 41 deletions(-) delete mode 100644 src/.idea/.gitignore delete mode 100644 src/.idea/.name delete mode 100644 src/.idea/inspectionProfiles/profiles_settings.xml delete mode 100644 src/.idea/misc.xml delete mode 100644 src/.idea/modules.xml delete mode 100644 src/.idea/src.iml delete mode 100644 src/.idea/vcs.xml diff --git a/src/.idea/.gitignore b/src/.idea/.gitignore deleted file mode 100644 index 10b731c..0000000 --- a/src/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ diff --git a/src/.idea/.name b/src/.idea/.name deleted file mode 100644 index c8d4ea1..0000000 --- a/src/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -views.py \ No newline at end of file diff --git a/src/.idea/inspectionProfiles/profiles_settings.xml b/src/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/src/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/.idea/misc.xml b/src/.idea/misc.xml deleted file mode 100644 index db8786c..0000000 --- a/src/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/.idea/modules.xml b/src/.idea/modules.xml deleted file mode 100644 index f669a0e..0000000 --- a/src/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/.idea/src.iml b/src/.idea/src.iml deleted file mode 100644 index f571432..0000000 --- a/src/.idea/src.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/.idea/vcs.xml b/src/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/src/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file -- 2.34.1 From 6d78c1a76b9e1ac4f65fd421826614db462ab1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=85=A7?= <1096877868@qq.com> Date: Sun, 26 Oct 2025 15:25:33 +0800 Subject: [PATCH 10/13] first --- .idea/.gitignore | 5 ----- .idea/.name | 1 - .idea/inspectionProfiles/profiles_settings.xml | 6 ------ .idea/misc.xml | 7 ------- .idea/modules.xml | 8 -------- .idea/src.iml | 8 -------- .idea/vcs.xml | 6 ------ 7 files changed, 41 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/.name delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/src.iml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 10b731c..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 35ff20d..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -admin.py \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index db8786c..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index f669a0e..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/src.iml b/.idea/src.iml deleted file mode 100644 index f571432..0000000 --- a/.idea/src.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file -- 2.34.1 From 190075c0fd1f395dce6fdfc40aca9109792856d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=85=A7?= <2965967549@qq.com> Date: Sun, 26 Oct 2025 20:11:34 +0800 Subject: [PATCH 11/13] =?UTF-8?q?sh=5F=E7=AC=AC=E5=85=AD=E5=91=A8=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CACHE/css/output.64482164d913.css | 1 + .../CACHE/css/output.758e876fbda7.css | 1 + .../CACHE/css/output.ebe346e4e08e.css | 13 + .../CACHE/js/output.b8b0e63f5d49.js | 26 + .../CACHE/js/output.bc55ccd28723.js | 36 + src/collectedstatic/CACHE/manifest.json | 6 + src/collectedstatic/account/css/account.css | 9 + src/collectedstatic/account/js/account.js | 55 + .../admin/css/autocomplete.css | 279 + src/collectedstatic/admin/css/base.css | 1180 ++ src/collectedstatic/admin/css/changelists.css | 343 + src/collectedstatic/admin/css/dark_mode.css | 130 + src/collectedstatic/admin/css/dashboard.css | 29 + src/collectedstatic/admin/css/forms.css | 498 + src/collectedstatic/admin/css/login.css | 61 + src/collectedstatic/admin/css/nav_sidebar.css | 150 + src/collectedstatic/admin/css/responsive.css | 904 ++ .../admin/css/responsive_rtl.css | 89 + src/collectedstatic/admin/css/rtl.css | 293 + .../admin/css/unusable_password_field.css | 19 + .../css/vendor/select2/LICENSE-SELECT2.md | 21 + .../admin/css/vendor/select2/select2.css | 481 + .../admin/css/vendor/select2/select2.min.css | 1 + src/collectedstatic/admin/css/widgets.css | 613 + src/collectedstatic/admin/img/LICENSE | 20 + src/collectedstatic/admin/img/README.txt | 7 + .../admin/img/calendar-icons.svg | 63 + .../admin/img/gis/move_vertex_off.svg | 1 + .../admin/img/gis/move_vertex_on.svg | 1 + .../admin/img/icon-addlink.svg | 3 + src/collectedstatic/admin/img/icon-alert.svg | 3 + .../admin/img/icon-calendar.svg | 9 + .../admin/img/icon-changelink.svg | 3 + src/collectedstatic/admin/img/icon-clock.svg | 9 + .../admin/img/icon-deletelink.svg | 3 + .../admin/img/icon-hidelink.svg | 3 + src/collectedstatic/admin/img/icon-no.svg | 3 + .../admin/img/icon-unknown-alt.svg | 3 + .../admin/img/icon-unknown.svg | 3 + .../admin/img/icon-viewlink.svg | 3 + src/collectedstatic/admin/img/icon-yes.svg | 3 + .../admin/img/inline-delete.svg | 3 + src/collectedstatic/admin/img/search.svg | 3 + .../admin/img/selector-icons.svg | 34 + .../admin/img/sorting-icons.svg | 19 + src/collectedstatic/admin/img/tooltag-add.svg | 3 + .../admin/img/tooltag-arrowright.svg | 3 + src/collectedstatic/admin/js/SelectBox.js | 175 + src/collectedstatic/admin/js/SelectFilter2.js | 397 + src/collectedstatic/admin/js/actions.js | 253 + .../admin/js/admin/DateTimeShortcuts.js | 422 + .../admin/js/admin/RelatedObjectLookups.js | 325 + src/collectedstatic/admin/js/autocomplete.js | 41 + src/collectedstatic/admin/js/calendar.js | 275 + src/collectedstatic/admin/js/cancel.js | 40 + src/collectedstatic/admin/js/change_form.js | 25 + src/collectedstatic/admin/js/core.js | 224 + src/collectedstatic/admin/js/filters.js | 37 + src/collectedstatic/admin/js/inlines.js | 413 + src/collectedstatic/admin/js/jquery.init.js | 8 + src/collectedstatic/admin/js/nav_sidebar.js | 96 + .../admin/js/popup_response.js | 25 + src/collectedstatic/admin/js/prepopulate.js | 58 + .../admin/js/prepopulate_init.js | 22 + src/collectedstatic/admin/js/theme.js | 61 + .../admin/js/unusable_password_field.js | 42 + src/collectedstatic/admin/js/urlify.js | 169 + .../admin/js/vendor/jquery/LICENSE.txt | 20 + .../admin/js/vendor/jquery/jquery.js | 10716 ++++++++++++++++ .../admin/js/vendor/jquery/jquery.min.js | 2 + .../admin/js/vendor/select2/LICENSE.md | 21 + .../admin/js/vendor/select2/i18n/af.js | 3 + .../admin/js/vendor/select2/i18n/ar.js | 3 + .../admin/js/vendor/select2/i18n/az.js | 3 + .../admin/js/vendor/select2/i18n/bg.js | 3 + .../admin/js/vendor/select2/i18n/bn.js | 3 + .../admin/js/vendor/select2/i18n/bs.js | 3 + .../admin/js/vendor/select2/i18n/ca.js | 3 + .../admin/js/vendor/select2/i18n/cs.js | 3 + .../admin/js/vendor/select2/i18n/da.js | 3 + .../admin/js/vendor/select2/i18n/de.js | 3 + .../admin/js/vendor/select2/i18n/dsb.js | 3 + .../admin/js/vendor/select2/i18n/el.js | 3 + .../admin/js/vendor/select2/i18n/en.js | 3 + .../admin/js/vendor/select2/i18n/es.js | 3 + .../admin/js/vendor/select2/i18n/et.js | 3 + .../admin/js/vendor/select2/i18n/eu.js | 3 + .../admin/js/vendor/select2/i18n/fa.js | 3 + .../admin/js/vendor/select2/i18n/fi.js | 3 + .../admin/js/vendor/select2/i18n/fr.js | 3 + .../admin/js/vendor/select2/i18n/gl.js | 3 + .../admin/js/vendor/select2/i18n/he.js | 3 + .../admin/js/vendor/select2/i18n/hi.js | 3 + .../admin/js/vendor/select2/i18n/hr.js | 3 + .../admin/js/vendor/select2/i18n/hsb.js | 3 + .../admin/js/vendor/select2/i18n/hu.js | 3 + .../admin/js/vendor/select2/i18n/hy.js | 3 + .../admin/js/vendor/select2/i18n/id.js | 3 + .../admin/js/vendor/select2/i18n/is.js | 3 + .../admin/js/vendor/select2/i18n/it.js | 3 + .../admin/js/vendor/select2/i18n/ja.js | 3 + .../admin/js/vendor/select2/i18n/ka.js | 3 + .../admin/js/vendor/select2/i18n/km.js | 3 + .../admin/js/vendor/select2/i18n/ko.js | 3 + .../admin/js/vendor/select2/i18n/lt.js | 3 + .../admin/js/vendor/select2/i18n/lv.js | 3 + .../admin/js/vendor/select2/i18n/mk.js | 3 + .../admin/js/vendor/select2/i18n/ms.js | 3 + .../admin/js/vendor/select2/i18n/nb.js | 3 + .../admin/js/vendor/select2/i18n/ne.js | 3 + .../admin/js/vendor/select2/i18n/nl.js | 3 + .../admin/js/vendor/select2/i18n/pl.js | 3 + .../admin/js/vendor/select2/i18n/ps.js | 3 + .../admin/js/vendor/select2/i18n/pt-BR.js | 3 + .../admin/js/vendor/select2/i18n/pt.js | 3 + .../admin/js/vendor/select2/i18n/ro.js | 3 + .../admin/js/vendor/select2/i18n/ru.js | 3 + .../admin/js/vendor/select2/i18n/sk.js | 3 + .../admin/js/vendor/select2/i18n/sl.js | 3 + .../admin/js/vendor/select2/i18n/sq.js | 3 + .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 + .../admin/js/vendor/select2/i18n/sr.js | 3 + .../admin/js/vendor/select2/i18n/sv.js | 3 + .../admin/js/vendor/select2/i18n/th.js | 3 + .../admin/js/vendor/select2/i18n/tk.js | 3 + .../admin/js/vendor/select2/i18n/tr.js | 3 + .../admin/js/vendor/select2/i18n/uk.js | 3 + .../admin/js/vendor/select2/i18n/vi.js | 3 + .../admin/js/vendor/select2/i18n/zh-CN.js | 3 + .../admin/js/vendor/select2/i18n/zh-TW.js | 3 + .../admin/js/vendor/select2/select2.full.js | 6820 ++++++++++ .../js/vendor/select2/select2.full.min.js | 2 + .../admin/js/vendor/xregexp/LICENSE.txt | 21 + .../admin/js/vendor/xregexp/xregexp.js | 6126 +++++++++ .../admin/js/vendor/xregexp/xregexp.min.js | 17 + .../assets/css/bootstrap.min.css | 6 + src/collectedstatic/assets/css/docs.min.css | 11 + .../css/ie10-viewport-bug-workaround.css | 13 + src/collectedstatic/assets/css/signin.css | 58 + .../assets/css/todc-bootstrap.min.css | 6 + src/collectedstatic/assets/img/checkmark.png | Bin 0 -> 221 bytes .../assets/js/ie-emulation-modes-warning.js | 63 + .../assets/js/ie10-viewport-bug-workaround.js | 26 + src/collectedstatic/blog/css/ie.css | 273 + src/collectedstatic/blog/css/nprogress.css | 74 + src/collectedstatic/blog/css/oauth_style.css | 305 + src/collectedstatic/blog/css/style.css | 2504 ++++ src/collectedstatic/blog/fonts/fonts.css | 378 + .../mem5YaGs126MiZpBA-UN_r8OUehpOqc.woff2 | Bin 0 -> 14088 bytes .../fonts/mem5YaGs126MiZpBA-UN_r8OUuhp.woff2 | Bin 0 -> 27131 bytes .../mem5YaGs126MiZpBA-UN_r8OVuhpOqc.woff2 | Bin 0 -> 17304 bytes .../mem5YaGs126MiZpBA-UN_r8OX-hpOqc.woff2 | Bin 0 -> 31604 bytes .../mem5YaGs126MiZpBA-UN_r8OXOhpOqc.woff2 | Bin 0 -> 20844 bytes .../mem5YaGs126MiZpBA-UN_r8OXehpOqc.woff2 | Bin 0 -> 10957 bytes .../mem5YaGs126MiZpBA-UN_r8OXuhpOqc.woff2 | Bin 0 -> 4250 bytes .../mem5YaGs126MiZpBA-UNirkOUehpOqc.woff2 | Bin 0 -> 14269 bytes .../fonts/mem5YaGs126MiZpBA-UNirkOUuhp.woff2 | Bin 0 -> 27159 bytes .../mem5YaGs126MiZpBA-UNirkOVuhpOqc.woff2 | Bin 0 -> 17452 bytes .../mem5YaGs126MiZpBA-UNirkOX-hpOqc.woff2 | Bin 0 -> 31596 bytes .../mem5YaGs126MiZpBA-UNirkOXOhpOqc.woff2 | Bin 0 -> 21360 bytes .../mem5YaGs126MiZpBA-UNirkOXehpOqc.woff2 | Bin 0 -> 11354 bytes .../mem5YaGs126MiZpBA-UNirkOXuhpOqc.woff2 | Bin 0 -> 4181 bytes .../mem6YaGs126MiZpBA-UFUK0Udc1UAw.woff2 | Bin 0 -> 29070 bytes .../mem6YaGs126MiZpBA-UFUK0Vdc1UAw.woff2 | Bin 0 -> 4095 bytes .../mem6YaGs126MiZpBA-UFUK0Wdc1UAw.woff2 | Bin 0 -> 10790 bytes .../mem6YaGs126MiZpBA-UFUK0Xdc1UAw.woff2 | Bin 0 -> 19681 bytes .../fonts/mem6YaGs126MiZpBA-UFUK0Zdc0.woff2 | Bin 0 -> 25060 bytes .../mem6YaGs126MiZpBA-UFUK0adc1UAw.woff2 | Bin 0 -> 13133 bytes .../mem6YaGs126MiZpBA-UFUK0ddc1UAw.woff2 | Bin 0 -> 16985 bytes .../fonts/mem8YaGs126MiZpBA-UFUZ0bbck.woff2 | Bin 0 -> 16994 bytes .../blog/fonts/mem8YaGs126MiZpBA-UFVZ0b.woff2 | Bin 0 -> 26166 bytes .../fonts/mem8YaGs126MiZpBA-UFVp0bbck.woff2 | Bin 0 -> 13949 bytes .../fonts/mem8YaGs126MiZpBA-UFW50bbck.woff2 | Bin 0 -> 20653 bytes .../fonts/mem8YaGs126MiZpBA-UFWJ0bbck.woff2 | Bin 0 -> 30070 bytes .../fonts/mem8YaGs126MiZpBA-UFWZ0bbck.woff2 | Bin 0 -> 4171 bytes .../fonts/mem8YaGs126MiZpBA-UFWp0bbck.woff2 | Bin 0 -> 11091 bytes .../memnYaGs126MiZpBA-UFUKWyV9hkIqOjjg.woff2 | Bin 0 -> 10841 bytes .../memnYaGs126MiZpBA-UFUKWyV9hlIqOjjg.woff2 | Bin 0 -> 19853 bytes .../memnYaGs126MiZpBA-UFUKWyV9hmIqOjjg.woff2 | Bin 0 -> 28801 bytes .../memnYaGs126MiZpBA-UFUKWyV9hnIqOjjg.woff2 | Bin 0 -> 4247 bytes .../memnYaGs126MiZpBA-UFUKWyV9hoIqOjjg.woff2 | Bin 0 -> 13474 bytes .../memnYaGs126MiZpBA-UFUKWyV9hrIqM.woff2 | Bin 0 -> 25055 bytes .../memnYaGs126MiZpBA-UFUKWyV9hvIqOjjg.woff2 | Bin 0 -> 17036 bytes .../memnYaGs126MiZpBA-UFUKXGUdhkIqOjjg.woff2 | Bin 0 -> 11233 bytes .../memnYaGs126MiZpBA-UFUKXGUdhlIqOjjg.woff2 | Bin 0 -> 20235 bytes .../memnYaGs126MiZpBA-UFUKXGUdhmIqOjjg.woff2 | Bin 0 -> 29777 bytes .../memnYaGs126MiZpBA-UFUKXGUdhnIqOjjg.woff2 | Bin 0 -> 4096 bytes .../memnYaGs126MiZpBA-UFUKXGUdhoIqOjjg.woff2 | Bin 0 -> 13423 bytes .../memnYaGs126MiZpBA-UFUKXGUdhrIqM.woff2 | Bin 0 -> 25389 bytes .../memnYaGs126MiZpBA-UFUKXGUdhvIqOjjg.woff2 | Bin 0 -> 17652 bytes src/collectedstatic/blog/img/avatar.png | Bin 0 -> 1493 bytes src/collectedstatic/blog/img/icon-sn.svg | 1 + src/collectedstatic/blog/js/blog.js | 121 + src/collectedstatic/blog/js/html5.js | 8 + .../blog/js/jquery-3.6.0.min.js | 2 + src/collectedstatic/blog/js/navigation.js | 63 + src/collectedstatic/blog/js/nprogress.js | 564 + .../mathjax/js/mathjax-config.js | 23 + src/collectedstatic/mdeditor/css/editormd.css | 4450 +++++++ .../mdeditor/css/editormd.logo.css | 98 + .../mdeditor/css/editormd.logo.min.css | 2 + .../mdeditor/css/editormd.min.css | 5 + .../mdeditor/css/editormd.preview.css | 3554 +++++ .../mdeditor/css/editormd.preview.min.css | 5 + src/collectedstatic/mdeditor/css/style.css | 94 + .../mdeditor/fonts/FontAwesome.otf | Bin 0 -> 93888 bytes .../mdeditor/fonts/editormd-logo.eot | Bin 0 -> 1320 bytes .../mdeditor/fonts/editormd-logo.svg | 11 + .../mdeditor/fonts/editormd-logo.ttf | Bin 0 -> 1156 bytes .../mdeditor/fonts/editormd-logo.woff | Bin 0 -> 1232 bytes .../mdeditor/fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes .../mdeditor/fonts/fontawesome-webfont.svg | 565 + .../mdeditor/fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes .../mdeditor/fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes .../mdeditor/fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes .../mdeditor/images/loading.gif | Bin 0 -> 7726 bytes .../mdeditor/images/loading@2x.gif | Bin 0 -> 16166 bytes .../mdeditor/images/loading@3x.gif | Bin 0 -> 21727 bytes .../images/logos/editormd-favicon-16x16.ico | Bin 0 -> 1150 bytes .../images/logos/editormd-favicon-24x24.ico | Bin 0 -> 1150 bytes .../images/logos/editormd-favicon-32x32.ico | Bin 0 -> 5430 bytes .../images/logos/editormd-favicon-48x48.ico | Bin 0 -> 15086 bytes .../images/logos/editormd-favicon-64x64.ico | Bin 0 -> 32038 bytes .../images/logos/editormd-logo-114x114.png | Bin 0 -> 5869 bytes .../images/logos/editormd-logo-120x120.png | Bin 0 -> 6141 bytes .../images/logos/editormd-logo-144x144.png | Bin 0 -> 7545 bytes .../images/logos/editormd-logo-16x16.png | Bin 0 -> 1448 bytes .../images/logos/editormd-logo-180x180.png | Bin 0 -> 7963 bytes .../images/logos/editormd-logo-240x240.png | Bin 0 -> 10470 bytes .../images/logos/editormd-logo-24x24.png | Bin 0 -> 1790 bytes .../images/logos/editormd-logo-320x320.png | Bin 0 -> 14714 bytes .../images/logos/editormd-logo-32x32.png | Bin 0 -> 2064 bytes .../images/logos/editormd-logo-48x48.png | Bin 0 -> 2701 bytes .../images/logos/editormd-logo-57x57.png | Bin 0 -> 3054 bytes .../images/logos/editormd-logo-64x64.png | Bin 0 -> 3408 bytes .../images/logos/editormd-logo-72x72.png | Bin 0 -> 3691 bytes .../images/logos/editormd-logo-96x96.png | Bin 0 -> 4857 bytes .../mdeditor/images/logos/vi.png | Bin 0 -> 46203 bytes src/collectedstatic/mdeditor/js/editormd.js | 4598 +++++++ .../mdeditor/js/editormd.min.js | 2 + src/collectedstatic/mdeditor/js/jquery.min.js | 4 + .../mdeditor/js/lib/codemirror/AUTHORS | 436 + .../mdeditor/js/lib/codemirror/LICENSE | 19 + .../mdeditor/js/lib/codemirror/README.md | 12 + .../lib/codemirror/addon/comment/comment.js | 201 + .../addon/comment/continuecomment.js | 89 + .../js/lib/codemirror/addon/dialog/dialog.css | 32 + .../js/lib/codemirror/addon/dialog/dialog.js | 191 + .../codemirror/addon/display/fullscreen.css | 6 + .../codemirror/addon/display/fullscreen.js | 57 + .../js/lib/codemirror/addon/display/panel.js | 123 + .../codemirror/addon/display/placeholder.js | 83 + .../js/lib/codemirror/addon/display/rulers.js | 82 + .../codemirror/addon/edit/closebrackets.js | 200 + .../js/lib/codemirror/addon/edit/closetag.js | 202 + .../lib/codemirror/addon/edit/continuelist.js | 60 + .../codemirror/addon/edit/matchbrackets.js | 151 + .../js/lib/codemirror/addon/edit/matchtags.js | 87 + .../codemirror/addon/edit/trailingspace.js | 36 + .../lib/codemirror/addon/fold/brace-fold.js | 130 + .../lib/codemirror/addon/fold/comment-fold.js | 71 + .../js/lib/codemirror/addon/fold/foldcode.js | 173 + .../lib/codemirror/addon/fold/foldgutter.css | 20 + .../lib/codemirror/addon/fold/foldgutter.js | 184 + .../lib/codemirror/addon/fold/indent-fold.js | 53 + .../codemirror/addon/fold/markdown-fold.js | 58 + .../js/lib/codemirror/addon/fold/xml-fold.js | 221 + .../lib/codemirror/addon/hint/anyword-hint.js | 50 + .../js/lib/codemirror/addon/hint/css-hint.js | 60 + .../js/lib/codemirror/addon/hint/html-hint.js | 352 + .../codemirror/addon/hint/javascript-hint.js | 170 + .../lib/codemirror/addon/hint/show-hint.css | 38 + .../js/lib/codemirror/addon/hint/show-hint.js | 416 + .../js/lib/codemirror/addon/hint/sql-hint.js | 296 + .../js/lib/codemirror/addon/hint/xml-hint.js | 119 + .../addon/lint/coffeescript-lint.js | 49 + .../js/lib/codemirror/addon/lint/css-lint.js | 43 + .../codemirror/addon/lint/javascript-lint.js | 155 + .../js/lib/codemirror/addon/lint/json-lint.js | 39 + .../js/lib/codemirror/addon/lint/lint.css | 73 + .../js/lib/codemirror/addon/lint/lint.js | 237 + .../js/lib/codemirror/addon/lint/yaml-lint.js | 37 + .../js/lib/codemirror/addon/merge/merge.css | 112 + .../js/lib/codemirror/addon/merge/merge.js | 743 ++ .../js/lib/codemirror/addon/mode/loadmode.js | 73 + .../js/lib/codemirror/addon/mode/multiplex.js | 134 + .../codemirror/addon/mode/multiplex_test.js | 34 + .../js/lib/codemirror/addon/mode/overlay.js | 95 + .../js/lib/codemirror/addon/mode/simple.js | 222 + .../lib/codemirror/addon/runmode/colorize.js | 44 + .../addon/runmode/runmode-standalone.js | 165 + .../lib/codemirror/addon/runmode/runmode.js | 86 + .../codemirror/addon/runmode/runmode.node.js | 131 + .../addon/scroll/annotatescrollbar.js | 118 + .../codemirror/addon/scroll/scrollpastend.js | 50 + .../addon/scroll/simplescrollbars.css | 66 + .../addon/scroll/simplescrollbars.js | 150 + .../addon/search/match-highlighter.js | 132 + .../addon/search/matchesonscrollbar.css | 8 + .../addon/search/matchesonscrollbar.js | 114 + .../js/lib/codemirror/addon/search/search.js | 170 + .../codemirror/addon/search/searchcursor.js | 193 + .../codemirror/addon/selection/active-line.js | 79 + .../addon/selection/mark-selection.js | 128 + .../addon/selection/selection-pointer.js | 108 + .../js/lib/codemirror/addon/tern/tern.css | 86 + .../js/lib/codemirror/addon/tern/tern.js | 708 + .../js/lib/codemirror/addon/tern/worker.js | 51 + .../js/lib/codemirror/addon/wrap/hardwrap.js | 151 + .../mdeditor/js/lib/codemirror/addons.min.js | 4 + .../mdeditor/js/lib/codemirror/bower.json | 16 + .../js/lib/codemirror/codemirror.min.css | 3 + .../js/lib/codemirror/codemirror.min.js | 54 + .../js/lib/codemirror/lib/codemirror.css | 331 + .../js/lib/codemirror/lib/codemirror.js | 8648 +++++++++++++ .../js/lib/codemirror/mode/apl/apl.js | 182 + .../js/lib/codemirror/mode/apl/index.html | 72 + .../lib/codemirror/mode/asterisk/asterisk.js | 198 + .../lib/codemirror/mode/asterisk/index.html | 154 + .../js/lib/codemirror/mode/clike/clike.js | 493 + .../js/lib/codemirror/mode/clike/index.html | 251 + .../js/lib/codemirror/mode/clike/scala.html | 767 ++ .../js/lib/codemirror/mode/clojure/clojure.js | 243 + .../js/lib/codemirror/mode/clojure/index.html | 88 + .../js/lib/codemirror/mode/cobol/cobol.js | 255 + .../js/lib/codemirror/mode/cobol/index.html | 210 + .../mode/coffeescript/coffeescript.js | 369 + .../codemirror/mode/coffeescript/index.html | 740 ++ .../codemirror/mode/commonlisp/commonlisp.js | 122 + .../lib/codemirror/mode/commonlisp/index.html | 177 + .../js/lib/codemirror/mode/css/css.js | 766 ++ .../js/lib/codemirror/mode/css/index.html | 75 + .../js/lib/codemirror/mode/css/less.html | 152 + .../js/lib/codemirror/mode/css/less_test.js | 51 + .../js/lib/codemirror/mode/css/scss.html | 157 + .../js/lib/codemirror/mode/css/scss_test.js | 110 + .../js/lib/codemirror/mode/css/test.js | 195 + .../js/lib/codemirror/mode/cypher/cypher.js | 146 + .../js/lib/codemirror/mode/cypher/index.html | 63 + .../mdeditor/js/lib/codemirror/mode/d/d.js | 218 + .../js/lib/codemirror/mode/d/index.html | 273 + .../js/lib/codemirror/mode/dart/dart.js | 50 + .../js/lib/codemirror/mode/dart/index.html | 71 + .../js/lib/codemirror/mode/diff/diff.js | 47 + .../js/lib/codemirror/mode/diff/index.html | 117 + .../js/lib/codemirror/mode/django/django.js | 67 + .../js/lib/codemirror/mode/django/index.html | 63 + .../codemirror/mode/dockerfile/dockerfile.js | 76 + .../lib/codemirror/mode/dockerfile/index.html | 73 + .../js/lib/codemirror/mode/dtd/dtd.js | 142 + .../js/lib/codemirror/mode/dtd/index.html | 89 + .../js/lib/codemirror/mode/dylan/dylan.js | 299 + .../js/lib/codemirror/mode/dylan/index.html | 407 + .../js/lib/codemirror/mode/ebnf/ebnf.js | 195 + .../js/lib/codemirror/mode/ebnf/index.html | 102 + .../js/lib/codemirror/mode/ecl/ecl.js | 207 + .../js/lib/codemirror/mode/ecl/index.html | 52 + .../js/lib/codemirror/mode/eiffel/eiffel.js | 162 + .../js/lib/codemirror/mode/eiffel/index.html | 429 + .../js/lib/codemirror/mode/erlang/erlang.js | 622 + .../js/lib/codemirror/mode/erlang/index.html | 76 + .../js/lib/codemirror/mode/forth/forth.js | 180 + .../js/lib/codemirror/mode/forth/index.html | 75 + .../js/lib/codemirror/mode/fortran/fortran.js | 188 + .../js/lib/codemirror/mode/fortran/index.html | 81 + .../js/lib/codemirror/mode/gas/gas.js | 345 + .../js/lib/codemirror/mode/gas/index.html | 68 + .../js/lib/codemirror/mode/gfm/gfm.js | 123 + .../js/lib/codemirror/mode/gfm/index.html | 93 + .../js/lib/codemirror/mode/gfm/test.js | 213 + .../js/lib/codemirror/mode/gherkin/gherkin.js | 178 + .../js/lib/codemirror/mode/gherkin/index.html | 48 + .../mdeditor/js/lib/codemirror/mode/go/go.js | 185 + .../js/lib/codemirror/mode/go/index.html | 85 + .../js/lib/codemirror/mode/groovy/groovy.js | 226 + .../js/lib/codemirror/mode/groovy/index.html | 84 + .../js/lib/codemirror/mode/haml/haml.js | 159 + .../js/lib/codemirror/mode/haml/index.html | 79 + .../js/lib/codemirror/mode/haml/test.js | 97 + .../js/lib/codemirror/mode/haskell/haskell.js | 267 + .../js/lib/codemirror/mode/haskell/index.html | 73 + .../js/lib/codemirror/mode/haxe/haxe.js | 518 + .../js/lib/codemirror/mode/haxe/index.html | 124 + .../mode/htmlembedded/htmlembedded.js | 86 + .../codemirror/mode/htmlembedded/index.html | 58 + .../codemirror/mode/htmlmixed/htmlmixed.js | 121 + .../lib/codemirror/mode/htmlmixed/index.html | 89 + .../js/lib/codemirror/mode/http/http.js | 113 + .../js/lib/codemirror/mode/http/index.html | 45 + .../js/lib/codemirror/mode/idl/idl.js | 290 + .../js/lib/codemirror/mode/idl/index.html | 64 + .../js/lib/codemirror/mode/index.html | 134 + .../js/lib/codemirror/mode/jade/index.html | 70 + .../js/lib/codemirror/mode/jade/jade.js | 590 + .../lib/codemirror/mode/javascript/index.html | 114 + .../codemirror/mode/javascript/javascript.js | 692 + .../codemirror/mode/javascript/json-ld.html | 72 + .../js/lib/codemirror/mode/javascript/test.js | 200 + .../mode/javascript/typescript.html | 61 + .../js/lib/codemirror/mode/jinja2/index.html | 54 + .../js/lib/codemirror/mode/jinja2/jinja2.js | 142 + .../js/lib/codemirror/mode/julia/index.html | 195 + .../js/lib/codemirror/mode/julia/julia.js | 301 + .../js/lib/codemirror/mode/kotlin/index.html | 89 + .../js/lib/codemirror/mode/kotlin/kotlin.js | 280 + .../lib/codemirror/mode/livescript/index.html | 459 + .../codemirror/mode/livescript/livescript.js | 280 + .../js/lib/codemirror/mode/lua/index.html | 85 + .../js/lib/codemirror/mode/lua/lua.js | 159 + .../lib/codemirror/mode/markdown/index.html | 359 + .../lib/codemirror/mode/markdown/markdown.js | 765 ++ .../js/lib/codemirror/mode/markdown/test.js | 754 ++ .../mdeditor/js/lib/codemirror/mode/meta.js | 177 + .../js/lib/codemirror/mode/mirc/index.html | 160 + .../js/lib/codemirror/mode/mirc/mirc.js | 193 + .../js/lib/codemirror/mode/mllike/index.html | 179 + .../js/lib/codemirror/mode/mllike/mllike.js | 205 + .../lib/codemirror/mode/modelica/index.html | 67 + .../lib/codemirror/mode/modelica/modelica.js | 245 + .../js/lib/codemirror/mode/nginx/index.html | 181 + .../js/lib/codemirror/mode/nginx/nginx.js | 178 + .../lib/codemirror/mode/ntriples/index.html | 45 + .../lib/codemirror/mode/ntriples/ntriples.js | 186 + .../js/lib/codemirror/mode/octave/index.html | 83 + .../js/lib/codemirror/mode/octave/octave.js | 135 + .../js/lib/codemirror/mode/pascal/index.html | 61 + .../js/lib/codemirror/mode/pascal/pascal.js | 109 + .../js/lib/codemirror/mode/pegjs/index.html | 66 + .../js/lib/codemirror/mode/pegjs/pegjs.js | 114 + .../js/lib/codemirror/mode/perl/index.html | 75 + .../js/lib/codemirror/mode/perl/perl.js | 837 ++ .../js/lib/codemirror/mode/php/index.html | 64 + .../js/lib/codemirror/mode/php/php.js | 226 + .../js/lib/codemirror/mode/php/test.js | 154 + .../js/lib/codemirror/mode/pig/index.html | 55 + .../js/lib/codemirror/mode/pig/pig.js | 188 + .../lib/codemirror/mode/properties/index.html | 53 + .../codemirror/mode/properties/properties.js | 78 + .../js/lib/codemirror/mode/puppet/index.html | 121 + .../js/lib/codemirror/mode/puppet/puppet.js | 220 + .../js/lib/codemirror/mode/python/index.html | 198 + .../js/lib/codemirror/mode/python/python.js | 359 + .../js/lib/codemirror/mode/q/index.html | 144 + .../mdeditor/js/lib/codemirror/mode/q/q.js | 139 + .../js/lib/codemirror/mode/r/index.html | 85 + .../mdeditor/js/lib/codemirror/mode/r/r.js | 162 + .../codemirror/mode/rpm/changes/index.html | 66 + .../js/lib/codemirror/mode/rpm/index.html | 149 + .../js/lib/codemirror/mode/rpm/rpm.js | 101 + .../js/lib/codemirror/mode/rst/index.html | 535 + .../js/lib/codemirror/mode/rst/rst.js | 557 + .../js/lib/codemirror/mode/ruby/index.html | 183 + .../js/lib/codemirror/mode/ruby/ruby.js | 285 + .../js/lib/codemirror/mode/ruby/test.js | 14 + .../js/lib/codemirror/mode/rust/index.html | 60 + .../js/lib/codemirror/mode/rust/rust.js | 451 + .../js/lib/codemirror/mode/sass/index.html | 66 + .../js/lib/codemirror/mode/sass/sass.js | 414 + .../js/lib/codemirror/mode/scheme/index.html | 77 + .../js/lib/codemirror/mode/scheme/scheme.js | 248 + .../js/lib/codemirror/mode/shell/index.html | 66 + .../js/lib/codemirror/mode/shell/shell.js | 139 + .../js/lib/codemirror/mode/shell/test.js | 58 + .../js/lib/codemirror/mode/sieve/index.html | 93 + .../js/lib/codemirror/mode/sieve/sieve.js | 193 + .../js/lib/codemirror/mode/slim/index.html | 96 + .../js/lib/codemirror/mode/slim/slim.js | 575 + .../js/lib/codemirror/mode/slim/test.js | 96 + .../lib/codemirror/mode/smalltalk/index.html | 68 + .../codemirror/mode/smalltalk/smalltalk.js | 168 + .../js/lib/codemirror/mode/smarty/index.html | 136 + .../js/lib/codemirror/mode/smarty/smarty.js | 221 + .../codemirror/mode/smartymixed/index.html | 114 + .../mode/smartymixed/smartymixed.js | 197 + .../js/lib/codemirror/mode/solr/index.html | 57 + .../js/lib/codemirror/mode/solr/solr.js | 104 + .../js/lib/codemirror/mode/soy/index.html | 68 + .../js/lib/codemirror/mode/soy/soy.js | 198 + .../js/lib/codemirror/mode/sparql/index.html | 61 + .../js/lib/codemirror/mode/sparql/sparql.js | 174 + .../codemirror/mode/spreadsheet/index.html | 42 + .../mode/spreadsheet/spreadsheet.js | 109 + .../js/lib/codemirror/mode/sql/index.html | 84 + .../js/lib/codemirror/mode/sql/sql.js | 391 + .../js/lib/codemirror/mode/stex/index.html | 110 + .../js/lib/codemirror/mode/stex/stex.js | 251 + .../js/lib/codemirror/mode/stex/test.js | 123 + .../js/lib/codemirror/mode/stylus/index.html | 104 + .../js/lib/codemirror/mode/stylus/stylus.js | 444 + .../js/lib/codemirror/mode/tcl/index.html | 142 + .../js/lib/codemirror/mode/tcl/tcl.js | 147 + .../js/lib/codemirror/mode/textile/index.html | 191 + .../js/lib/codemirror/mode/textile/test.js | 417 + .../js/lib/codemirror/mode/textile/textile.js | 469 + .../lib/codemirror/mode/tiddlywiki/index.html | 154 + .../codemirror/mode/tiddlywiki/tiddlywiki.css | 14 + .../codemirror/mode/tiddlywiki/tiddlywiki.js | 369 + .../js/lib/codemirror/mode/tiki/index.html | 95 + .../js/lib/codemirror/mode/tiki/tiki.css | 26 + .../js/lib/codemirror/mode/tiki/tiki.js | 323 + .../js/lib/codemirror/mode/toml/index.html | 73 + .../js/lib/codemirror/mode/toml/toml.js | 88 + .../js/lib/codemirror/mode/tornado/index.html | 63 + .../js/lib/codemirror/mode/tornado/tornado.js | 68 + .../js/lib/codemirror/mode/turtle/index.html | 50 + .../js/lib/codemirror/mode/turtle/turtle.js | 162 + .../js/lib/codemirror/mode/vb/index.html | 102 + .../mdeditor/js/lib/codemirror/mode/vb/vb.js | 274 + .../lib/codemirror/mode/vbscript/index.html | 55 + .../lib/codemirror/mode/vbscript/vbscript.js | 350 + .../lib/codemirror/mode/velocity/index.html | 118 + .../lib/codemirror/mode/velocity/velocity.js | 201 + .../js/lib/codemirror/mode/verilog/index.html | 120 + .../js/lib/codemirror/mode/verilog/test.js | 273 + .../js/lib/codemirror/mode/verilog/verilog.js | 537 + .../js/lib/codemirror/mode/xml/index.html | 57 + .../js/lib/codemirror/mode/xml/test.js | 51 + .../js/lib/codemirror/mode/xml/xml.js | 384 + .../js/lib/codemirror/mode/xquery/index.html | 210 + .../js/lib/codemirror/mode/xquery/test.js | 67 + .../js/lib/codemirror/mode/xquery/xquery.js | 447 + .../js/lib/codemirror/mode/yaml/index.html | 80 + .../js/lib/codemirror/mode/yaml/yaml.js | 117 + .../js/lib/codemirror/mode/z80/index.html | 52 + .../js/lib/codemirror/mode/z80/z80.js | 100 + .../mdeditor/js/lib/codemirror/modes.min.js | 10 + .../mdeditor/js/lib/codemirror/package.json | 22 + .../js/lib/codemirror/theme/3024-day.css | 40 + .../js/lib/codemirror/theme/3024-night.css | 39 + .../lib/codemirror/theme/ambiance-mobile.css | 5 + .../js/lib/codemirror/theme/ambiance.css | 75 + .../js/lib/codemirror/theme/base16-dark.css | 38 + .../js/lib/codemirror/theme/base16-light.css | 38 + .../js/lib/codemirror/theme/blackboard.css | 32 + .../js/lib/codemirror/theme/cobalt.css | 25 + .../js/lib/codemirror/theme/colorforth.css | 33 + .../js/lib/codemirror/theme/eclipse.css | 23 + .../js/lib/codemirror/theme/elegant.css | 13 + .../js/lib/codemirror/theme/erlang-dark.css | 34 + .../js/lib/codemirror/theme/lesser-dark.css | 47 + .../mdeditor/js/lib/codemirror/theme/mbo.css | 37 + .../js/lib/codemirror/theme/mdn-like.css | 46 + .../js/lib/codemirror/theme/midnight.css | 47 + .../js/lib/codemirror/theme/monokai.css | 33 + .../mdeditor/js/lib/codemirror/theme/neat.css | 12 + .../mdeditor/js/lib/codemirror/theme/neo.css | 43 + .../js/lib/codemirror/theme/night.css | 28 + .../js/lib/codemirror/theme/paraiso-dark.css | 38 + .../js/lib/codemirror/theme/paraiso-light.css | 38 + .../lib/codemirror/theme/pastel-on-dark.css | 53 + .../js/lib/codemirror/theme/rubyblue.css | 25 + .../js/lib/codemirror/theme/solarized.css | 165 + .../js/lib/codemirror/theme/the-matrix.css | 30 + .../theme/tomorrow-night-bright.css | 35 + .../theme/tomorrow-night-eighties.css | 38 + .../js/lib/codemirror/theme/twilight.css | 32 + .../js/lib/codemirror/theme/vibrant-ink.css | 34 + .../js/lib/codemirror/theme/xq-dark.css | 53 + .../js/lib/codemirror/theme/xq-light.css | 43 + .../js/lib/codemirror/theme/zenburn.css | 37 + .../mdeditor/js/lib/flowchart.min.js | 5 + .../mdeditor/js/lib/jquery.flowchart.min.js | 2 + .../mdeditor/js/lib/marked.min.js | 9 + .../mdeditor/js/lib/prettify.min.js | 15 + .../mdeditor/js/lib/raphael.min.js | 11 + .../mdeditor/js/lib/sequence-diagram.min.js | 7 + .../mdeditor/js/lib/underscore.min.js | 5 + .../code-block-dialog/code-block-dialog.js | 237 + .../js/plugins/emoji-dialog/emoji-dialog.js | 337 + .../js/plugins/emoji-dialog/emoji.json | 28 + .../goto-line-dialog/goto-line-dialog.js | 169 + .../js/plugins/help-dialog/help-dialog.js | 102 + .../mdeditor/js/plugins/help-dialog/help.md | 77 + .../html-entities-dialog.js | 173 + .../html-entities-dialog/html-entities.json | 936 ++ .../js/plugins/image-dialog/image-dialog.js | 221 + .../js/plugins/link-dialog/link-dialog.js | 133 + .../mdeditor/js/plugins/plugin-template.js | 111 + .../preformatted-text-dialog.js | 172 + .../reference-link-dialog.js | 153 + .../js/plugins/table-dialog/table-dialog.js | 218 + .../js/plugins/test-plugin/test-plugin.js | 66 + src/collectedstatic/mdeditor/languages/de.js | 129 + src/collectedstatic/mdeditor/languages/en.js | 129 + src/collectedstatic/mdeditor/languages/es.js | 129 + .../mdeditor/languages/pt_BR.js | 129 + src/collectedstatic/pygments/default.css | 293 + 587 files changed, 113832 insertions(+) create mode 100644 src/collectedstatic/CACHE/css/output.64482164d913.css create mode 100644 src/collectedstatic/CACHE/css/output.758e876fbda7.css create mode 100644 src/collectedstatic/CACHE/css/output.ebe346e4e08e.css create mode 100644 src/collectedstatic/CACHE/js/output.b8b0e63f5d49.js create mode 100644 src/collectedstatic/CACHE/js/output.bc55ccd28723.js create mode 100644 src/collectedstatic/CACHE/manifest.json create mode 100644 src/collectedstatic/account/css/account.css create mode 100644 src/collectedstatic/account/js/account.js create mode 100644 src/collectedstatic/admin/css/autocomplete.css create mode 100644 src/collectedstatic/admin/css/base.css create mode 100644 src/collectedstatic/admin/css/changelists.css create mode 100644 src/collectedstatic/admin/css/dark_mode.css create mode 100644 src/collectedstatic/admin/css/dashboard.css create mode 100644 src/collectedstatic/admin/css/forms.css create mode 100644 src/collectedstatic/admin/css/login.css create mode 100644 src/collectedstatic/admin/css/nav_sidebar.css create mode 100644 src/collectedstatic/admin/css/responsive.css create mode 100644 src/collectedstatic/admin/css/responsive_rtl.css create mode 100644 src/collectedstatic/admin/css/rtl.css create mode 100644 src/collectedstatic/admin/css/unusable_password_field.css create mode 100644 src/collectedstatic/admin/css/vendor/select2/LICENSE-SELECT2.md create mode 100644 src/collectedstatic/admin/css/vendor/select2/select2.css create mode 100644 src/collectedstatic/admin/css/vendor/select2/select2.min.css create mode 100644 src/collectedstatic/admin/css/widgets.css create mode 100644 src/collectedstatic/admin/img/LICENSE create mode 100644 src/collectedstatic/admin/img/README.txt create mode 100644 src/collectedstatic/admin/img/calendar-icons.svg create mode 100644 src/collectedstatic/admin/img/gis/move_vertex_off.svg create mode 100644 src/collectedstatic/admin/img/gis/move_vertex_on.svg create mode 100644 src/collectedstatic/admin/img/icon-addlink.svg create mode 100644 src/collectedstatic/admin/img/icon-alert.svg create mode 100644 src/collectedstatic/admin/img/icon-calendar.svg create mode 100644 src/collectedstatic/admin/img/icon-changelink.svg create mode 100644 src/collectedstatic/admin/img/icon-clock.svg create mode 100644 src/collectedstatic/admin/img/icon-deletelink.svg create mode 100644 src/collectedstatic/admin/img/icon-hidelink.svg create mode 100644 src/collectedstatic/admin/img/icon-no.svg create mode 100644 src/collectedstatic/admin/img/icon-unknown-alt.svg create mode 100644 src/collectedstatic/admin/img/icon-unknown.svg create mode 100644 src/collectedstatic/admin/img/icon-viewlink.svg create mode 100644 src/collectedstatic/admin/img/icon-yes.svg create mode 100644 src/collectedstatic/admin/img/inline-delete.svg create mode 100644 src/collectedstatic/admin/img/search.svg create mode 100644 src/collectedstatic/admin/img/selector-icons.svg create mode 100644 src/collectedstatic/admin/img/sorting-icons.svg create mode 100644 src/collectedstatic/admin/img/tooltag-add.svg create mode 100644 src/collectedstatic/admin/img/tooltag-arrowright.svg create mode 100644 src/collectedstatic/admin/js/SelectBox.js create mode 100644 src/collectedstatic/admin/js/SelectFilter2.js create mode 100644 src/collectedstatic/admin/js/actions.js create mode 100644 src/collectedstatic/admin/js/admin/DateTimeShortcuts.js create mode 100644 src/collectedstatic/admin/js/admin/RelatedObjectLookups.js create mode 100644 src/collectedstatic/admin/js/autocomplete.js create mode 100644 src/collectedstatic/admin/js/calendar.js create mode 100644 src/collectedstatic/admin/js/cancel.js create mode 100644 src/collectedstatic/admin/js/change_form.js create mode 100644 src/collectedstatic/admin/js/core.js create mode 100644 src/collectedstatic/admin/js/filters.js create mode 100644 src/collectedstatic/admin/js/inlines.js create mode 100644 src/collectedstatic/admin/js/jquery.init.js create mode 100644 src/collectedstatic/admin/js/nav_sidebar.js create mode 100644 src/collectedstatic/admin/js/popup_response.js create mode 100644 src/collectedstatic/admin/js/prepopulate.js create mode 100644 src/collectedstatic/admin/js/prepopulate_init.js create mode 100644 src/collectedstatic/admin/js/theme.js create mode 100644 src/collectedstatic/admin/js/unusable_password_field.js create mode 100644 src/collectedstatic/admin/js/urlify.js create mode 100644 src/collectedstatic/admin/js/vendor/jquery/LICENSE.txt create mode 100644 src/collectedstatic/admin/js/vendor/jquery/jquery.js create mode 100644 src/collectedstatic/admin/js/vendor/jquery/jquery.min.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/LICENSE.md create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/af.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ar.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/az.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/bg.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/bn.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/bs.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ca.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/cs.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/da.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/de.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/dsb.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/el.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/en.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/es.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/et.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/eu.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/fa.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/fi.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/fr.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/gl.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/he.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/hi.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/hr.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/hsb.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/hu.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/hy.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/id.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/is.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/it.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ja.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ka.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/km.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ko.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/lt.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/lv.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/mk.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ms.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/nb.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ne.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/nl.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/pl.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ps.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/pt-BR.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/pt.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ro.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/ru.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/sk.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/sl.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/sq.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/sr-Cyrl.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/sr.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/sv.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/th.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/tk.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/tr.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/uk.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/vi.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/zh-CN.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/i18n/zh-TW.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/select2.full.js create mode 100644 src/collectedstatic/admin/js/vendor/select2/select2.full.min.js create mode 100644 src/collectedstatic/admin/js/vendor/xregexp/LICENSE.txt create mode 100644 src/collectedstatic/admin/js/vendor/xregexp/xregexp.js create mode 100644 src/collectedstatic/admin/js/vendor/xregexp/xregexp.min.js create mode 100644 src/collectedstatic/assets/css/bootstrap.min.css create mode 100644 src/collectedstatic/assets/css/docs.min.css create mode 100644 src/collectedstatic/assets/css/ie10-viewport-bug-workaround.css create mode 100644 src/collectedstatic/assets/css/signin.css create mode 100644 src/collectedstatic/assets/css/todc-bootstrap.min.css create mode 100644 src/collectedstatic/assets/img/checkmark.png create mode 100644 src/collectedstatic/assets/js/ie-emulation-modes-warning.js create mode 100644 src/collectedstatic/assets/js/ie10-viewport-bug-workaround.js create mode 100644 src/collectedstatic/blog/css/ie.css create mode 100644 src/collectedstatic/blog/css/nprogress.css create mode 100644 src/collectedstatic/blog/css/oauth_style.css create mode 100644 src/collectedstatic/blog/css/style.css create mode 100644 src/collectedstatic/blog/fonts/fonts.css create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UN_r8OUehpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UN_r8OUuhp.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UN_r8OVuhpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UN_r8OX-hpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UN_r8OXOhpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UN_r8OXehpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UN_r8OXuhpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UNirkOUehpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UNirkOUuhp.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UNirkOVuhpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UNirkOX-hpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UNirkOXOhpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UNirkOXehpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem5YaGs126MiZpBA-UNirkOXuhpOqc.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem6YaGs126MiZpBA-UFUK0Udc1UAw.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem6YaGs126MiZpBA-UFUK0Vdc1UAw.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem6YaGs126MiZpBA-UFUK0Wdc1UAw.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem6YaGs126MiZpBA-UFUK0Xdc1UAw.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem6YaGs126MiZpBA-UFUK0Zdc0.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem6YaGs126MiZpBA-UFUK0adc1UAw.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem6YaGs126MiZpBA-UFUK0ddc1UAw.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem8YaGs126MiZpBA-UFUZ0bbck.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem8YaGs126MiZpBA-UFVZ0b.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem8YaGs126MiZpBA-UFVp0bbck.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem8YaGs126MiZpBA-UFW50bbck.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem8YaGs126MiZpBA-UFWJ0bbck.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem8YaGs126MiZpBA-UFWZ0bbck.woff2 create mode 100644 src/collectedstatic/blog/fonts/mem8YaGs126MiZpBA-UFWp0bbck.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKWyV9hkIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKWyV9hlIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKWyV9hmIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKWyV9hnIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKWyV9hoIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKWyV9hrIqM.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKWyV9hvIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKXGUdhkIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKXGUdhlIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKXGUdhmIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKXGUdhnIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKXGUdhoIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKXGUdhrIqM.woff2 create mode 100644 src/collectedstatic/blog/fonts/memnYaGs126MiZpBA-UFUKXGUdhvIqOjjg.woff2 create mode 100644 src/collectedstatic/blog/img/avatar.png create mode 100644 src/collectedstatic/blog/img/icon-sn.svg create mode 100644 src/collectedstatic/blog/js/blog.js create mode 100644 src/collectedstatic/blog/js/html5.js create mode 100644 src/collectedstatic/blog/js/jquery-3.6.0.min.js create mode 100644 src/collectedstatic/blog/js/navigation.js create mode 100644 src/collectedstatic/blog/js/nprogress.js create mode 100644 src/collectedstatic/mathjax/js/mathjax-config.js create mode 100644 src/collectedstatic/mdeditor/css/editormd.css create mode 100644 src/collectedstatic/mdeditor/css/editormd.logo.css create mode 100644 src/collectedstatic/mdeditor/css/editormd.logo.min.css create mode 100644 src/collectedstatic/mdeditor/css/editormd.min.css create mode 100644 src/collectedstatic/mdeditor/css/editormd.preview.css create mode 100644 src/collectedstatic/mdeditor/css/editormd.preview.min.css create mode 100644 src/collectedstatic/mdeditor/css/style.css create mode 100644 src/collectedstatic/mdeditor/fonts/FontAwesome.otf create mode 100644 src/collectedstatic/mdeditor/fonts/editormd-logo.eot create mode 100644 src/collectedstatic/mdeditor/fonts/editormd-logo.svg create mode 100644 src/collectedstatic/mdeditor/fonts/editormd-logo.ttf create mode 100644 src/collectedstatic/mdeditor/fonts/editormd-logo.woff create mode 100644 src/collectedstatic/mdeditor/fonts/fontawesome-webfont.eot create mode 100644 src/collectedstatic/mdeditor/fonts/fontawesome-webfont.svg create mode 100644 src/collectedstatic/mdeditor/fonts/fontawesome-webfont.ttf create mode 100644 src/collectedstatic/mdeditor/fonts/fontawesome-webfont.woff create mode 100644 src/collectedstatic/mdeditor/fonts/fontawesome-webfont.woff2 create mode 100644 src/collectedstatic/mdeditor/images/loading.gif create mode 100644 src/collectedstatic/mdeditor/images/loading@2x.gif create mode 100644 src/collectedstatic/mdeditor/images/loading@3x.gif create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-favicon-16x16.ico create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-favicon-24x24.ico create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-favicon-32x32.ico create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-favicon-48x48.ico create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-favicon-64x64.ico create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-114x114.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-120x120.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-144x144.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-16x16.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-180x180.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-240x240.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-24x24.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-320x320.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-32x32.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-48x48.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-57x57.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-64x64.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-72x72.png create mode 100644 src/collectedstatic/mdeditor/images/logos/editormd-logo-96x96.png create mode 100644 src/collectedstatic/mdeditor/images/logos/vi.png create mode 100644 src/collectedstatic/mdeditor/js/editormd.js create mode 100644 src/collectedstatic/mdeditor/js/editormd.min.js create mode 100644 src/collectedstatic/mdeditor/js/jquery.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/AUTHORS create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/LICENSE create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/README.md create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/comment/comment.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/comment/continuecomment.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/dialog/dialog.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/dialog/dialog.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/display/fullscreen.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/display/fullscreen.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/display/panel.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/display/placeholder.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/display/rulers.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/edit/closebrackets.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/edit/closetag.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/edit/continuelist.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/edit/matchbrackets.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/edit/matchtags.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/edit/trailingspace.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/brace-fold.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/comment-fold.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/foldcode.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/foldgutter.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/foldgutter.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/indent-fold.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/markdown-fold.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/fold/xml-fold.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/anyword-hint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/css-hint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/html-hint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/javascript-hint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/show-hint.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/show-hint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/sql-hint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/hint/xml-hint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/lint/coffeescript-lint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/lint/css-lint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/lint/javascript-lint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/lint/json-lint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/lint/lint.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/lint/lint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/lint/yaml-lint.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/merge/merge.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/merge/merge.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/loadmode.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/multiplex.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/multiplex_test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/overlay.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/simple.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/colorize.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode-standalone.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.node.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/annotatescrollbar.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/scrollpastend.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/match-highlighter.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/search.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/searchcursor.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/active-line.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/mark-selection.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/selection-pointer.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/worker.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addon/wrap/hardwrap.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/addons.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/bower.json create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/codemirror.min.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/codemirror.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/lib/codemirror.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/lib/codemirror.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/apl/apl.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/apl/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/asterisk/asterisk.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/asterisk/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/clike/clike.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/clike/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/clike/scala.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/clojure/clojure.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/clojure/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/cobol/cobol.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/cobol/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/coffeescript/coffeescript.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/coffeescript/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/commonlisp/commonlisp.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/commonlisp/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/css/css.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/css/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/css/less.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/css/less_test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/css/scss.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/css/scss_test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/css/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/cypher/cypher.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/cypher/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/d/d.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/d/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dart/dart.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dart/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/diff/diff.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/diff/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/django/django.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/django/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dockerfile/dockerfile.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dockerfile/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dtd/dtd.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dtd/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dylan/dylan.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/dylan/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ebnf/ebnf.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ebnf/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ecl/ecl.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ecl/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/eiffel/eiffel.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/eiffel/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/erlang/erlang.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/erlang/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/forth/forth.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/forth/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/fortran/fortran.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/fortran/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/gas/gas.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/gas/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/gfm/gfm.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/gfm/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/gfm/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/gherkin/gherkin.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/gherkin/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/go/go.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/go/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/groovy/groovy.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/groovy/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/haml/haml.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/haml/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/haml/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/haskell/haskell.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/haskell/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/haxe/haxe.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/haxe/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/htmlembedded/htmlembedded.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/htmlembedded/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/htmlmixed/htmlmixed.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/htmlmixed/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/http/http.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/http/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/idl/idl.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/idl/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/jade/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/jade/jade.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/javascript/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/javascript/javascript.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/javascript/json-ld.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/javascript/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/javascript/typescript.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/jinja2/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/jinja2/jinja2.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/julia/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/julia/julia.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/kotlin/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/kotlin/kotlin.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/livescript/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/livescript/livescript.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/lua/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/lua/lua.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/markdown/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/markdown/markdown.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/markdown/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/meta.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/mirc.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/mllike.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/modelica.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/nginx/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/nginx/nginx.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/ntriples.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/octave.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/pascal.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/pegjs.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/perl.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/php.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/pig/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/pig/pig.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/properties.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/puppet.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/python.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/q.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/r.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/changes/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/rpm.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/rst.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/ruby.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/rust.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/sass.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/scheme.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/shell.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/sieve.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/slim.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/smalltalk.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/smarty.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/smartymixed/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/smartymixed/smartymixed.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/solr.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/soy.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/sparql.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/spreadsheet.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/sql.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/stex.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/stylus.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/tcl.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/textile.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/toml.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/tornado.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/turtle.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/vb.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/vbscript.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/velocity.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/verilog.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/xml.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/test.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/xquery.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/yaml.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/index.html create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/z80.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/modes.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/package.json create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-day.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-night.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance-mobile.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-dark.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-light.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/blackboard.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/cobalt.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/colorforth.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/eclipse.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/elegant.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/erlang-dark.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/lesser-dark.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/mbo.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/mdn-like.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/midnight.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/monokai.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/neat.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/neo.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/night.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-dark.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-light.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/pastel-on-dark.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/rubyblue.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/solarized.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/the-matrix.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-bright.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-eighties.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/twilight.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/vibrant-ink.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-dark.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-light.css create mode 100644 src/collectedstatic/mdeditor/js/lib/codemirror/theme/zenburn.css create mode 100644 src/collectedstatic/mdeditor/js/lib/flowchart.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/jquery.flowchart.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/marked.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/prettify.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/raphael.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/sequence-diagram.min.js create mode 100644 src/collectedstatic/mdeditor/js/lib/underscore.min.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/code-block-dialog/code-block-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji.json create mode 100644 src/collectedstatic/mdeditor/js/plugins/goto-line-dialog/goto-line-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/help-dialog/help-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/help-dialog/help.md create mode 100644 src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities.json create mode 100644 src/collectedstatic/mdeditor/js/plugins/image-dialog/image-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/link-dialog/link-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/plugin-template.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/preformatted-text-dialog/preformatted-text-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/reference-link-dialog/reference-link-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/table-dialog/table-dialog.js create mode 100644 src/collectedstatic/mdeditor/js/plugins/test-plugin/test-plugin.js create mode 100644 src/collectedstatic/mdeditor/languages/de.js create mode 100644 src/collectedstatic/mdeditor/languages/en.js create mode 100644 src/collectedstatic/mdeditor/languages/es.js create mode 100644 src/collectedstatic/mdeditor/languages/pt_BR.js create mode 100644 src/collectedstatic/pygments/default.css diff --git a/src/collectedstatic/CACHE/css/output.64482164d913.css b/src/collectedstatic/CACHE/css/output.64482164d913.css new file mode 100644 index 0000000..6844eb4 --- /dev/null +++ b/src/collectedstatic/CACHE/css/output.64482164d913.css @@ -0,0 +1 @@ +.icon-sn-google{background-position:0 -28px}.icon-sn-bg-google{background-color:#4285f4;background-position:0 0}.fa-sn-google{color:#4285f4}.icon-sn-github{background-position:-28px -28px}.icon-sn-bg-github{background-color:#333;background-position:-28px 0}.fa-sn-github{color:#333}.icon-sn-weibo{background-position:-56px -28px}.icon-sn-bg-weibo{background-color:#e90d24;background-position:-56px 0}.fa-sn-weibo{color:#e90d24}.icon-sn-qq{background-position:-84px -28px}.icon-sn-bg-qq{background-color:#0098e6;background-position:-84px 0}.fa-sn-qq{color:#0098e6}.icon-sn-twitter{background-position:-112px -28px}.icon-sn-bg-twitter{background-color:#50abf1;background-position:-112px 0}.fa-sn-twitter{color:#50abf1}.icon-sn-facebook{background-position:-140px -28px}.icon-sn-bg-facebook{background-color:#4862a3;background-position:-140px 0}.fa-sn-facebook{color:#4862a3}.icon-sn-renren{background-position:-168px -28px}.icon-sn-bg-renren{background-color:#197bc8;background-position:-168px 0}.fa-sn-renren{color:#197bc8}.icon-sn-tqq{background-position:-196px -28px}.icon-sn-bg-tqq{background-color:#1f9ed2;background-position:-196px 0}.fa-sn-tqq{color:#1f9ed2}.icon-sn-douban{background-position:-224px -28px}.icon-sn-bg-douban{background-color:#279738;background-position:-224px 0}.fa-sn-douban{color:#279738}.icon-sn-weixin{background-position:-252px -28px}.icon-sn-bg-weixin{background-color:#00b500;background-position:-252px 0}.fa-sn-weixin{color:#00b500}.icon-sn-dotted{background-position:-280px -28px}.icon-sn-bg-dotted{background-color:#eee;background-position:-280px 0}.fa-sn-dotted{color:#eee}.icon-sn-site{background-position:-308px -28px}.icon-sn-bg-site{background-color:#00b500;background-position:-308px 0}.fa-sn-site{color:#00b500}.icon-sn-linkedin{background-position:-336px -28px}.icon-sn-bg-linkedin{background-color:#0077b9;background-position:-336px 0}.fa-sn-linkedin{color:#0077b9}[class*=icon-sn-]{display:inline-block;background-image:url('/static/blog/img/icon-sn.svg?446a7ff2e4eb');background-repeat:no-repeat;width:28px;height:28px;vertical-align:middle;background-size:auto 56px}[class*=icon-sn-]:hover{opacity:.8;filter:alpha(opacity=80)}.btn-sn-google{background:#4285f4}.btn-sn-google:active,.btn-sn-google:focus,.btn-sn-google:hover{background:#2a75f3}.btn-sn-github{background:#333}.btn-sn-github:active,.btn-sn-github:focus,.btn-sn-github:hover{background:#262626}.btn-sn-weibo{background:#e90d24}.btn-sn-weibo:active,.btn-sn-weibo:focus,.btn-sn-weibo:hover{background:#d10c20}.btn-sn-qq{background:#0098e6}.btn-sn-qq:active,.btn-sn-qq:focus,.btn-sn-qq:hover{background:#0087cd}.btn-sn-twitter{background:#50abf1}.btn-sn-twitter:active,.btn-sn-twitter:focus,.btn-sn-twitter:hover{background:#38a0ef}.btn-sn-facebook{background:#4862a3}.btn-sn-facebook:active,.btn-sn-facebook:focus,.btn-sn-facebook:hover{background:#405791}.btn-sn-renren{background:#197bc8}.btn-sn-renren:active,.btn-sn-renren:focus,.btn-sn-renren:hover{background:#166db1}.btn-sn-tqq{background:#1f9ed2}.btn-sn-tqq:active,.btn-sn-tqq:focus,.btn-sn-tqq:hover{background:#1c8dbc}.btn-sn-douban{background:#279738}.btn-sn-douban:active,.btn-sn-douban:focus,.btn-sn-douban:hover{background:#228330}.btn-sn-weixin{background:#00b500}.btn-sn-weixin:active,.btn-sn-weixin:focus,.btn-sn-weixin:hover{background:#009c00}.btn-sn-dotted{background:#eee}.btn-sn-dotted:active,.btn-sn-dotted:focus,.btn-sn-dotted:hover{background:#e1e1e1}.btn-sn-site{background:#00b500}.btn-sn-site:active,.btn-sn-site:focus,.btn-sn-site:hover{background:#009c00}.btn-sn-linkedin{background:#0077b9}.btn-sn-linkedin:active,.btn-sn-linkedin:focus,.btn-sn-linkedin:hover{background:#0067a0}[class*=btn-sn-],[class*=btn-sn-]:active,[class*=btn-sn-]:focus,[class*=btn-sn-]:hover{border:none;color:#fff}.btn-sn-more{padding:0}.btn-sn-more,.btn-sn-more:active,.btn-sn-more:hover{box-shadow:none}[class*=btn-sn-] [class*=icon-sn-]{background-color:transparent}.codehilite .hll{background-color:#ffffcc}.codehilite{background:#ffffff}.codehilite .c{color:#177500}.codehilite .err{color:#000000}.codehilite .k{color:#A90D91}.codehilite .l{color:#1C01CE}.codehilite .n{color:#000000}.codehilite .o{color:#000000}.codehilite .ch{color:#177500}.codehilite .cm{color:#177500}.codehilite .cp{color:#633820}.codehilite .cpf{color:#177500}.codehilite .c1{color:#177500}.codehilite .cs{color:#177500}.codehilite .kc{color:#A90D91}.codehilite .kd{color:#A90D91}.codehilite .kn{color:#A90D91}.codehilite .kp{color:#A90D91}.codehilite .kr{color:#A90D91}.codehilite .kt{color:#A90D91}.codehilite .ld{color:#1C01CE}.codehilite .m{color:#1C01CE}.codehilite .s{color:#C41A16}.codehilite .na{color:#836C28}.codehilite .nb{color:#A90D91}.codehilite .nc{color:#3F6E75}.codehilite .no{color:#000000}.codehilite .nd{color:#000000}.codehilite .ni{color:#000000}.codehilite .ne{color:#000000}.codehilite .nf{color:#000000}.codehilite .nl{color:#000000}.codehilite .nn{color:#000000}.codehilite .nx{color:#000000}.codehilite .py{color:#000000}.codehilite .nt{color:#000000}.codehilite .nv{color:#000000}.codehilite .ow{color:#000000}.codehilite .mb{color:#1C01CE}.codehilite .mf{color:#1C01CE}.codehilite .mh{color:#1C01CE}.codehilite .mi{color:#1C01CE}.codehilite .mo{color:#1C01CE}.codehilite .sb{color:#C41A16}.codehilite .sc{color:#2300CE}.codehilite .sd{color:#C41A16}.codehilite .s2{color:#C41A16}.codehilite .se{color:#C41A16}.codehilite .sh{color:#C41A16}.codehilite .si{color:#C41A16}.codehilite .sx{color:#C41A16}.codehilite .sr{color:#C41A16}.codehilite .s1{color:#C41A16}.codehilite .ss{color:#C41A16}.codehilite .bp{color:#5B269A}.codehilite .vc{color:#000000}.codehilite .vg{color:#000000}.codehilite .vi{color:#000000}.codehilite .il{color:#1C01CE}#nprogress{pointer-events:none}#nprogress .bar{background:red;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1.0;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translate(0px,-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:red;border-left-color:red;border-radius:50%;-webkit-animation:nprogress-spinner 400ms linear infinite;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/src/collectedstatic/CACHE/css/output.758e876fbda7.css b/src/collectedstatic/CACHE/css/output.758e876fbda7.css new file mode 100644 index 0000000..42a671f --- /dev/null +++ b/src/collectedstatic/CACHE/css/output.758e876fbda7.css @@ -0,0 +1 @@ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;vertical-align:baseline}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{font-weight:normal;text-align:left}h1,h2,h3,h4,h5,h6{clear:both}html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}del{color:#333}ins{background:#fff9c0;text-decoration:none}hr{background-color:#ccc;border:0;height:1px;margin:24px;margin-bottom:1.714285714rem}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}small{font-size:smaller}img{border:0;-ms-interpolation-mode:bicubic}.clear:after,.wrapper:after,.format-status .entry-header:after{clear:both}.clear:before,.clear:after,.wrapper:before,.wrapper:after,.format-status .entry-header:before,.format-status .entry-header:after{display:table;content:""}.archive-title,.page-title,.widget-title,.entry-content th,.comment-content th{font-size:11px;font-size:0.785714286rem;line-height:2.181818182;font-weight:bold;text-transform:uppercase;color:#636363}article.format-quote footer.entry-meta,article.format-link footer.entry-meta,article.format-status footer.entry-meta{font-size:11px;font-size:0.785714286rem;line-height:2.181818182}button,input,select,textarea{border:1px solid #ccc;border-radius:3px;font-family:inherit;padding:6px;padding:0.428571429rem}button,input{line-height:normal}textarea{font-size:100%;overflow:auto;vertical-align:top}input[type="checkbox"],input[type="radio"],input[type="file"],input[type="hidden"],input[type="image"],input[type="color"]{border:0;border-radius:0;padding:0}.menu-toggle,input[type="submit"],input[type="button"],input[type="reset"],article.post-password-required input[type=submit],.bypostauthor cite span{padding:6px 10px;padding:0.428571429rem 0.714285714rem;font-size:11px;font-size:0.785714286rem;line-height:1.428571429;font-weight:normal;color:#7c7c7c;background-color:#e6e6e6;background-repeat:repeat-x;background-image:-moz-linear-gradient(top,#f4f4f4,#e6e6e6);background-image:-ms-linear-gradient(top,#f4f4f4,#e6e6e6);background-image:-webkit-linear-gradient(top,#f4f4f4,#e6e6e6);background-image:-o-linear-gradient(top,#f4f4f4,#e6e6e6);background-image:linear-gradient(to bottom,#f4f4f4,#e6e6e6);border:1px solid #d2d2d2;border-radius:3px;box-shadow:0 1px 2px rgba(64,64,64,0.1)}.menu-toggle,button,input[type="submit"],input[type="button"],input[type="reset"]{cursor:pointer}button[disabled],input[disabled]{cursor:default}.menu-toggle:hover,.menu-toggle:focus,button:hover,input[type="submit"]:hover,input[type="button"]:hover,input[type="reset"]:hover,article.post-password-required input[type=submit]:hover{color:#5e5e5e;background-color:#ebebeb;background-repeat:repeat-x;background-image:-moz-linear-gradient(top,#f9f9f9,#ebebeb);background-image:-ms-linear-gradient(top,#f9f9f9,#ebebeb);background-image:-webkit-linear-gradient(top,#f9f9f9,#ebebeb);background-image:-o-linear-gradient(top,#f9f9f9,#ebebeb);background-image:linear-gradient(to bottom,#f9f9f9,#ebebeb)}.menu-toggle:active,.menu-toggle.toggled-on,button:active,input[type="submit"]:active,input[type="button"]:active,input[type="reset"]:active{color:#757575;background-color:#e1e1e1;background-repeat:repeat-x;background-image:-moz-linear-gradient(top,#ebebeb,#e1e1e1);background-image:-ms-linear-gradient(top,#ebebeb,#e1e1e1);background-image:-webkit-linear-gradient(top,#ebebeb,#e1e1e1);background-image:-o-linear-gradient(top,#ebebeb,#e1e1e1);background-image:linear-gradient(to bottom,#ebebeb,#e1e1e1);box-shadow:inset 0 0 8px 2px #c6c6c6,0 1px 0 0 #f4f4f4;border-color:transparent}.bypostauthor cite span{color:#fff;background-color:#21759b;background-image:none;border:1px solid #1f6f93;border-radius:2px;box-shadow:none;padding:0}.entry-content img,.comment-content img,.widget img{max-width:100%}img[class*="align"],img[class*="wp-image-"],img[class*="attachment-"]{height:auto}img.size-full,img.size-large,img.header-image,img.wp-post-image{max-width:100%;height:auto}embed,iframe,object,video{max-width:100%}.entry-content .twitter-tweet-rendered{max-width:100%!important}.alignleft{float:left}.alignright{float:right}.aligncenter{display:block;margin-left:auto;margin-right:auto}.entry-content img,.comment-content img,.widget img,img.header-image,.author-avatar img,img.wp-post-image{border-radius:3px;box-shadow:0 1px 4px rgba(0,0,0,0.2)}.wp-caption{max-width:100%;padding:4px}.wp-caption .wp-caption-text,.gallery-caption,.entry-caption{font-style:italic;font-size:12px;font-size:0.857142857rem;line-height:2;color:#757575}img.wp-smiley,.rsswidget img{border:0;border-radius:0;box-shadow:none;margin-bottom:0;margin-top:0;padding:0}.entry-content dl.gallery-item{margin:0}.gallery-item a,.gallery-caption{width:90%}.gallery-item a{display:block}.gallery-caption a{display:inline}.gallery-columns-1 .gallery-item a{max-width:100%;width:auto}.gallery .gallery-icon img{height:auto;max-width:90%;padding:5%}.gallery-columns-1 .gallery-icon img{padding:3%}.site-content nav{clear:both;line-height:2;overflow:hidden}#nav-above{padding:24px 0;padding:1.714285714rem 0}#nav-above{display:none}.paged #nav-above{display:block}.nav-previous,.previous-image{float:left;width:50%}.nav-next,.next-image{float:right;text-align:right;width:50%}.nav-single + .comments-area,#comment-nav-above{margin:48px 0;margin:3.428571429rem 0}.author .archive-header{margin-bottom:24px;margin-bottom:1.714285714rem}.author-info{border-top:1px solid #ededed;margin:24px 0;margin:1.714285714rem 0;padding-top:24px;padding-top:1.714285714rem;overflow:hidden}.author-description p{color:#757575;font-size:13px;font-size:0.928571429rem;line-height:1.846153846}.author.archive .author-info{border-top:0;margin:0 0 48px;margin:0 0 3.428571429rem}.author.archive .author-avatar{margin-top:0}html{font-size:87.5%}body{font-size:14px;font-size:1rem;font-family:Helvetica,Arial,sans-serif;text-rendering:optimizeLegibility;color:#444}body.custom-font-enabled{font-family:"Open Sans",Helvetica,Arial,sans-serif}a{outline:none;color:#21759b}a:hover{color:#0f3647}.assistive-text,.site .screen-reader-text{position:absolute!important;clip:rect(1px,1px,1px,1px);overflow:hidden;height:1px;width:1px}.main-navigation .assistive-text:focus,.site .screen-reader-text:hover,.site .screen-reader-text:active,.site .screen-reader-text:focus{background:#fff;border:2px solid #333;border-radius:3px;clip:auto!important;color:#000;display:block;font-size:12px;height:auto;padding:12px;position:absolute;top:5px;left:5px;width:auto;z-index:100000}.site{padding:0 24px;padding:0 1.714285714rem;background-color:#fff}.site-content{margin:24px 0 0;margin:1.714285714rem 0 0}.widget-area{margin:24px 0 0;margin:1.714285714rem 0 0}.site-header{padding:24px 0;padding:1.714285714rem 0}.site-header h1,.site-header h2{text-align:center}.site-header h1 a,.site-header h2 a{color:#515151;display:inline-block;text-decoration:none}.site-header h1 a:hover,.site-header h2 a:hover{color:#21759b}.site-header h1{font-size:24px;font-size:1.714285714rem;line-height:1.285714286;margin-bottom:14px;margin-bottom:1rem}.site-header h2{font-weight:normal;font-size:13px;font-size:0.928571429rem;line-height:1.846153846;color:#757575}.header-image{margin-top:24px;margin-top:1.714285714rem}.main-navigation{margin-top:24px;margin-top:1.714285714rem;text-align:center}.main-navigation li{margin-top:24px;margin-top:1.714285714rem;font-size:12px;font-size:0.857142857rem;line-height:1.42857143}.main-navigation a{color:#5e5e5e}.main-navigation a:hover,.main-navigation a:focus{color:#21759b}.main-navigation ul.nav-menu,.main-navigation div.nav-menu>ul{display:none}.main-navigation ul.nav-menu.toggled-on,.menu-toggle{display:inline-block}section[role="banner"]{margin-bottom:48px;margin-bottom:3.428571429rem}.widget-area .widget{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;margin-bottom:48px;margin-bottom:3.428571429rem;word-wrap:break-word}.widget-area .widget h3{margin-bottom:24px;margin-bottom:1.714285714rem}.widget-area .widget p,.widget-area .widget li,.widget-area .widget .textwidget{font-size:13px;font-size:0.928571429rem;line-height:1.846153846}.widget-area .widget p{margin-bottom:24px;margin-bottom:1.714285714rem}.widget-area .textwidget ul,.widget-area .textwidget ol{list-style:disc outside;margin:0 0 24px;margin:0 0 1.714285714rem}.widget-area .textwidget li>ul,.widget-area .textwidget li>ol{margin-bottom:0}.widget-area .textwidget ol{list-style:decimal}.widget-area .textwidget li{margin-left:36px;margin-left:2.571428571rem}.widget-area .widget a{color:#757575}.widget-area .widget a:hover{color:#21759b}.widget-area .widget a:visited{color:#9f9f9f}.widget-area #s{width:53.66666666666%}footer[role="contentinfo"]{border-top:1px solid #ededed;clear:both;font-size:12px;font-size:0.857142857rem;line-height:2;max-width:960px;max-width:68.571428571rem;margin-top:24px;margin-top:1.714285714rem;margin-left:auto;margin-right:auto;padding:24px 0;padding:1.714285714rem 0}footer[role="contentinfo"] a{color:#686868}footer[role="contentinfo"] a:hover{color:#21759b}.site-info span[role=separator]{padding:0 0.3em 0 0.6em}.site-info span[role=separator]::before{content:'\002f'}.entry-meta{clear:both}.entry-header{margin-bottom:24px;margin-bottom:1.714285714rem}.entry-header img.wp-post-image{margin-bottom:24px;margin-bottom:1.714285714rem}.entry-header .entry-title{font-size:20px;font-size:1.428571429rem;line-height:1.2;font-weight:normal}.entry-header .entry-title a{text-decoration:none}.entry-header .entry-format{margin-top:24px;margin-top:1.714285714rem;font-weight:normal}.entry-header .comments-link{margin-top:24px;margin-top:1.714285714rem;font-size:13px;font-size:0.928571429rem;line-height:1.846153846;color:#757575}.comments-link a,.entry-meta a{color:#757575}.comments-link a:hover,.entry-meta a:hover{color:#21759b}article.sticky .featured-post{border-top:4px double #ededed;border-bottom:4px double #ededed;color:#757575;font-size:13px;font-size:0.928571429rem;line-height:3.692307692;margin-bottom:24px;margin-bottom:1.714285714rem;text-align:center}.entry-content,.entry-summary,.mu_register{line-height:1.714285714}.entry-content h1,.comment-content h1,.entry-content h2,.comment-content h2,.entry-content h3,.comment-content h3,.entry-content h4,.comment-content h4,.entry-content h5,.comment-content h5,.entry-content h6,.comment-content h6{margin:24px 0;margin:1.714285714rem 0;line-height:1.714285714}.entry-content h1,.comment-content h1{font-size:21px;font-size:1.5rem;line-height:1.5}.entry-content h2,.comment-content h2,.mu_register h2{font-size:18px;font-size:1.285714286rem;line-height:1.6}.entry-content h3,.comment-content h3{font-size:16px;font-size:1.142857143rem;line-height:1.846153846}.entry-content h4,.comment-content h4{font-size:14px;font-size:1rem;line-height:1.846153846}.entry-content h5,.comment-content h5{font-size:13px;font-size:0.928571429rem;line-height:1.846153846}.entry-content h6,.comment-content h6{font-size:12px;font-size:0.857142857rem;line-height:1.846153846}.entry-content p,.entry-summary p,.comment-content p,.mu_register p{margin:0 0 24px;margin:0 0 1.714285714rem;line-height:1.714285714}.entry-content a:visited,.comment-content a:visited{color:#9f9f9f}.entry-content .more-link{white-space:nowrap}.entry-content ol,.comment-content ol,.entry-content ul,.comment-content ul,.mu_register ul{margin:0 0 24px;margin:0 0 1.714285714rem;line-height:1.714285714}.entry-content ul ul,.comment-content ul ul,.entry-content ol ol,.comment-content ol ol,.entry-content ul ol,.comment-content ul ol,.entry-content ol ul,.comment-content ol ul{margin-bottom:0}.entry-content ul,.comment-content ul,.mu_register ul{list-style:disc outside}.entry-content ol,.comment-content ol{list-style:decimal outside}.entry-content li,.comment-content li,.mu_register li{margin:0 0 0 36px;margin:0 0 0 2.571428571rem}.entry-content blockquote,.comment-content blockquote{margin-bottom:24px;margin-bottom:1.714285714rem;padding:24px;padding:1.714285714rem;font-style:italic}.entry-content blockquote p:last-child,.comment-content blockquote p:last-child{margin-bottom:0}.entry-content code,.comment-content code{font-family:Consolas,Monaco,Lucida Console,monospace;font-size:12px;font-size:0.857142857rem;line-height:2}.entry-content pre,.comment-content pre{border:1px solid #ededed;color:#666;font-family:Consolas,Monaco,Lucida Console,monospace;font-size:12px;font-size:0.857142857rem;line-height:1.714285714;margin:24px 0;margin:1.714285714rem 0;overflow:auto;padding:24px;padding:1.714285714rem}.entry-content pre code,.comment-content pre code{display:block}.entry-content abbr,.comment-content abbr,.entry-content dfn,.comment-content dfn,.entry-content acronym,.comment-content acronym{border-bottom:1px dotted #666;cursor:help}.entry-content address,.comment-content address{display:block;line-height:1.714285714;margin:0 0 24px;margin:0 0 1.714285714rem}img.alignleft,.wp-caption.alignleft{margin:12px 24px 12px 0;margin:0.857142857rem 1.714285714rem 0.857142857rem 0}img.alignright,.wp-caption.alignright{margin:12px 0 12px 24px;margin:0.857142857rem 0 0.857142857rem 1.714285714rem}img.aligncenter,.wp-caption.aligncenter{clear:both;margin-top:12px;margin-top:0.857142857rem;margin-bottom:12px;margin-bottom:0.857142857rem}.entry-content embed,.entry-content iframe,.entry-content object,.entry-content video{margin-bottom:24px;margin-bottom:1.714285714rem}.entry-content dl,.comment-content dl{margin:0 24px;margin:0 1.714285714rem}.entry-content dt,.comment-content dt{font-weight:bold;line-height:1.714285714}.entry-content dd,.comment-content dd{line-height:1.714285714;margin-bottom:24px;margin-bottom:1.714285714rem}.entry-content table,.comment-content table{border-bottom:1px solid #ededed;color:#757575;font-size:12px;font-size:0.857142857rem;line-height:2;margin:0 0 24px;margin:0 0 1.714285714rem;width:100%}.entry-content table caption,.comment-content table caption{font-size:16px;font-size:1.142857143rem;margin:24px 0;margin:1.714285714rem 0}.entry-content td,.comment-content td{border-top:1px solid #ededed;padding:6px 10px 6px 0}.site-content article{border-bottom:4px double #ededed;margin-bottom:72px;margin-bottom:5.142857143rem;padding-bottom:24px;padding-bottom:1.714285714rem;word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto}.page-links{clear:both;line-height:1.714285714}footer.entry-meta{margin-top:24px;margin-top:1.714285714rem;font-size:13px;font-size:0.928571429rem;line-height:1.846153846;color:#757575}.single-author .entry-meta .by-author{display:none}.mu_register h2{color:#757575;font-weight:normal}.archive-header,.page-header{margin-bottom:48px;margin-bottom:3.428571429rem;padding-bottom:22px;padding-bottom:1.571428571rem;border-bottom:1px solid #ededed}.archive-meta{color:#757575;font-size:12px;font-size:0.857142857rem;line-height:2;margin-top:22px;margin-top:1.571428571rem}.attachment .entry-content .mejs-audio{max-width:400px}.attachment .entry-content .mejs-container{margin-bottom:24px}.article.attachment{overflow:hidden}.image-attachment div.attachment{text-align:center}.image-attachment div.attachment p{text-align:center}.image-attachment div.attachment img{display:block;height:auto;margin:0 auto;max-width:100%}.image-attachment .entry-caption{margin-top:8px;margin-top:0.571428571rem}article.format-aside h1{margin-bottom:24px;margin-bottom:1.714285714rem}article.format-aside h1 a{text-decoration:none;color:#4d525a}article.format-aside h1 a:hover{color:#2e3542}article.format-aside .aside{padding:24px 24px 0;padding:1.714285714rem;background:#d2e0f9;border-left:22px solid #a8bfe8}article.format-aside p{font-size:13px;font-size:0.928571429rem;line-height:1.846153846;color:#4a5466}article.format-aside blockquote:last-child,article.format-aside p:last-child{margin-bottom:0}article.format-image footer h1{font-size:13px;font-size:0.928571429rem;line-height:1.846153846;font-weight:normal}article.format-image footer h2{font-size:11px;font-size:0.785714286rem;line-height:2.181818182}article.format-image footer a h2{font-weight:normal}article.format-link header{padding:0 10px;padding:0 0.714285714rem;float:right;font-size:11px;font-size:0.785714286rem;line-height:2.181818182;font-weight:bold;font-style:italic;text-transform:uppercase;color:#848484;background-color:#ebebeb;border-radius:3px}article.format-link .entry-content{max-width:80%;float:left}article.format-link .entry-content a{font-size:22px;font-size:1.571428571rem;line-height:1.090909091;text-decoration:none}article.format-quote .entry-content p{margin:0;padding-bottom:24px;padding-bottom:1.714285714rem}article.format-quote .entry-content blockquote{display:block;padding:24px 24px 0;padding:1.714285714rem 1.714285714rem 0;font-size:15px;font-size:1.071428571rem;line-height:1.6;font-style:normal;color:#6a6a6a;background:#efefef}.format-status .entry-header{margin-bottom:24px;margin-bottom:1.714285714rem}.format-status .entry-header header{display:inline-block}.format-status .entry-header h1{font-size:15px;font-size:1.071428571rem;font-weight:normal;line-height:1.6;margin:0}.format-status .entry-header h2{font-size:12px;font-size:0.857142857rem;font-weight:normal;line-height:2;margin:0}.format-status .entry-header header a{color:#757575}.format-status .entry-header header a:hover{color:#21759b}.format-status .entry-header img{float:left;margin-right:21px;margin-right:1.5rem}.comments-title{margin-bottom:48px;margin-bottom:3.428571429rem;font-size:16px;font-size:1.142857143rem;line-height:1.5;font-weight:normal}.comments-area article{margin:24px 0;margin:1.714285714rem 0}.comments-area article header{margin:0 0 48px;margin:0 0 3.428571429rem;overflow:hidden;position:relative}.comments-area article header img{float:left;padding:0;line-height:0}.comments-area article header cite,.comments-area article header time{display:block;margin-left:85px;margin-left:6.071428571rem}.comments-area article header cite{font-style:normal;font-size:15px;font-size:1.071428571rem;line-height:1.42857143}.comments-area cite b{font-weight:normal}.comments-area article header time{line-height:1.714285714;text-decoration:none;font-size:12px;font-size:0.857142857rem;color:#5e5e5e}.comments-area article header a{text-decoration:none;color:#5e5e5e}.comments-area article header a:hover{color:#21759b}.comments-area article header cite a{color:#444}.comments-area article header cite a:hover{text-decoration:underline}.comments-area article header h4{position:absolute;top:0;right:0;padding:6px 12px;padding:0.428571429rem 0.857142857rem;font-size:12px;font-size:0.857142857rem;font-weight:normal;color:#fff;background-color:#0088d0;background-repeat:repeat-x;background-image:-moz-linear-gradient(top,#009cee,#0088d0);background-image:-ms-linear-gradient(top,#009cee,#0088d0);background-image:-webkit-linear-gradient(top,#009cee,#0088d0);background-image:-o-linear-gradient(top,#009cee,#0088d0);background-image:linear-gradient(to bottom,#009cee,#0088d0);border-radius:3px;border:1px solid #007cbd}.comments-area .bypostauthor cite span{position:absolute;margin-left:5px;margin-left:0.357142857rem;padding:2px 5px;padding:0.142857143rem 0.357142857rem;font-size:10px;font-size:0.714285714rem}.comments-area .bypostauthor cite b{font-weight:bold}a.comment-reply-link,a.comment-edit-link{color:#686868;font-size:13px;font-size:0.928571429rem;line-height:1.846153846}a.comment-reply-link:hover,a.comment-edit-link:hover{color:#21759b}.commentlist .pingback{line-height:1.714285714;margin-bottom:24px;margin-bottom:1.714285714rem}#respond{margin-top:48px;margin-top:3.428571429rem}#respond h3#reply-title{font-size:16px;font-size:1.142857143rem;line-height:1.5}#respond h3#reply-title #cancel-comment-reply-link{margin-left:10px;margin-left:0.714285714rem;font-weight:normal;font-size:12px;font-size:0.857142857rem}#respond form{margin:24px 0;margin:1.714285714rem 0}#respond form p{margin:11px 0;margin:0.785714286rem 0}#respond form p.logged-in-as{margin-bottom:24px;margin-bottom:1.714285714rem}#respond form label{display:block;line-height:1.714285714}#respond form input[type="text"],#respond form textarea{-moz-box-sizing:border-box;box-sizing:border-box;font-size:12px;font-size:0.857142857rem;line-height:1.714285714;padding:10px;padding:0.714285714rem;width:100%}#respond form p.form-allowed-tags{margin:0;font-size:12px;font-size:0.857142857rem;line-height:2;color:#5e5e5e}#respond #wp-comment-cookies-consent{margin:0 10px 0 0}#respond .comment-form-cookies-consent label{display:inline}.required{color:red}.entry-page-image{margin-bottom:14px;margin-bottom:1rem}.template-front-page .site-content article{border:0;margin-bottom:0}.template-front-page .widget-area{clear:both;float:none;width:auto;padding-top:24px;padding-top:1.714285714rem;border-top:1px solid #ededed}.template-front-page .widget-area .widget li{margin:8px 0 0;margin:0.571428571rem 0 0;font-size:13px;font-size:0.928571429rem;line-height:1.714285714;list-style-type:square;list-style-position:inside}.template-front-page .widget-area .widget li a{color:#757575}.template-front-page .widget-area .widget li a:hover{color:#21759b}.template-front-page .widget-area .widget_text img{float:left;margin:8px 24px 8px 0;margin:0.571428571rem 1.714285714rem 0.571428571rem 0}.widget select{max-width:100%}.widget-area .widget ul ul{margin-left:12px;margin-left:0.857142857rem}.widget_rss li{margin:12px 0;margin:0.857142857rem 0}.widget_recent_entries .post-date,.widget_rss .rss-date{color:#aaa;font-size:11px;font-size:0.785714286rem;margin-left:12px;margin-left:0.857142857rem}.wp-calendar-nav,#wp-calendar{margin:0;width:100%;font-size:13px;font-size:0.928571429rem;line-height:1.846153846;color:#686868}#wp-calendar th,#wp-calendar td,#wp-calendar caption{text-align:left}.wp-calendar-nav{display:table}.wp-calendar-nav span{display:table-cell}.wp-calendar-nav-next,#wp-calendar #next{padding-right:24px;padding-right:1.714285714rem;text-align:right}.widget_search label{display:block;font-size:13px;font-size:0.928571429rem;line-height:1.846153846}.widget_twitter li{list-style-type:none}.widget_twitter .timesince{display:block;text-align:right}.tagcloud ul{list-style-type:none}.tagcloud ul li{display:inline-block}.widget-area .widget.widget_tag_cloud li{line-height:1}.template-front-page .widget-area .widget.widget_tag_cloud li{margin:0}.widget-area .gallery-columns-2.gallery-size-full .gallery-icon img,.widget-area .gallery-columns-3.gallery-size-full .gallery-icon img,.widget-area .gallery-columns-4.gallery-size-full .gallery-icon img,.widget-area .gallery-columns-5.gallery-size-full .gallery-icon img,.widget-area .gallery-columns-6 .gallery-icon img,.widget-area .gallery-columns-7 .gallery-icon img,.widget-area .gallery-columns-8 .gallery-icon img,.widget-area .gallery-columns-9 .gallery-icon img{height:auto;max-width:80%}img#wpstats{display:block;margin:0 auto 24px;margin:0 auto 1.714285714rem}@-ms-viewport{width:device-width}@viewport{width:device-width}@media screen and (min-width:600px){.author-avatar{float:left;margin-top:8px;margin-top:0.571428571rem}.author-description{float:right;width:80%}.site{margin:0 auto;max-width:960px;max-width:68.571428571rem;overflow:hidden}.site-content{float:left;width:65.104166667%}body.template-front-page .site-content,body.attachment .site-content,body.full-width .site-content{width:100%}.widget-area{float:right;width:26.041666667%}.site-header h1,.site-header h2{text-align:left}.site-header h1{font-size:26px;font-size:1.857142857rem;line-height:1.846153846;margin-bottom:0}.main-navigation ul.nav-menu,.main-navigation div.nav-menu>ul{border-bottom:1px solid #ededed;border-top:1px solid #ededed;display:inline-block!important;text-align:left;width:100%}.main-navigation ul{margin:0;text-indent:0}.main-navigation li a,.main-navigation li{display:inline-block;text-decoration:none}.main-navigation li a{border-bottom:0;color:#6a6a6a;line-height:3.692307692;text-transform:uppercase;white-space:nowrap}.main-navigation li a:hover,.main-navigation li a:focus{color:#000}.main-navigation li{margin:0 40px 0 0;margin:0 2.857142857rem 0 0;position:relative}.main-navigation li ul{margin:0;padding:0;position:absolute;top:100%;z-index:1;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}.main-navigation li ul ul{top:0;left:100%}.main-navigation ul li:hover>ul,.main-navigation ul li:focus>ul,.main-navigation .focus>ul{border-left:0;clip:inherit;overflow:inherit;height:inherit;width:inherit}.main-navigation li ul li a{background:#efefef;border-bottom:1px solid #ededed;display:block;font-size:11px;font-size:0.785714286rem;line-height:2.181818182;padding:8px 10px;padding:0.571428571rem 0.714285714rem;width:180px;width:12.85714286rem;white-space:normal}.main-navigation li ul li a:hover,.main-navigation li ul li a:focus{background:#e3e3e3;color:#444}.main-navigation .current-menu-item>a,.main-navigation .current-menu-ancestor>a,.main-navigation .current_page_item>a,.main-navigation .current_page_ancestor>a{color:#636363;font-weight:bold}.menu-toggle{display:none}.entry-header .entry-title{font-size:22px;font-size:1.571428571rem}#respond form input[type="text"]{width:46.333333333%}#respond form textarea.blog-textarea{width:79.666666667%}.template-front-page .site-content,.template-front-page article{overflow:hidden}.template-front-page.has-post-thumbnail article{float:left;width:47.916666667%}.entry-page-image{float:right;margin-bottom:0;width:47.916666667%}.template-front-page .widget-area .widget,.template-front-page.two-sidebars .widget-area .front-widgets{float:left;width:51.875%;margin-bottom:24px;margin-bottom:1.714285714rem}.template-front-page .widget-area .widget:nth-child(odd){clear:right}.template-front-page .widget-area .widget:nth-child(even),.template-front-page.two-sidebars .widget-area .front-widgets + .front-widgets{float:right;width:39.0625%;margin:0 0 24px;margin:0 0 1.714285714rem}.template-front-page.two-sidebars .widget,.template-front-page.two-sidebars .widget:nth-child(even){float:none;width:auto}.commentlist .children{margin-left:48px;margin-left:3.428571429rem}}@media screen and (min-width:960px){body{background-color:#e6e6e6}body .site{padding:0 40px;padding:0 2.857142857rem;margin-top:48px;margin-top:3.428571429rem;margin-bottom:48px;margin-bottom:3.428571429rem;box-shadow:0 2px 6px rgba(100,100,100,0.3)}body.custom-background-empty{background-color:#fff}body.custom-background-empty .site,body.custom-background-white .site{padding:0;margin-top:0;margin-bottom:0;box-shadow:none}}@media print{body{background:none!important;color:#000;font-size:10pt}footer a[rel=bookmark]:link:after,footer a[rel=bookmark]:visited:after{content:" [" attr(href) "] "}a{text-decoration:none}.entry-content img,.comment-content img,.author-avatar img,img.wp-post-image{border-radius:0;box-shadow:none}.site{clear:both!important;display:block!important;float:none!important;max-width:100%;position:relative!important}.site-header{margin-bottom:72px;margin-bottom:5.142857143rem;text-align:left}.site-header h1{font-size:21pt;line-height:1;text-align:left}.site-header h2{color:#000;font-size:10pt;text-align:left}.site-header h1 a,.site-header h2 a{color:#000}.author-avatar,#colophon,#respond,.commentlist .comment-edit-link,.commentlist .reply,.entry-header .comments-link,.entry-meta .edit-link a,.page-link,.site-content nav,.widget-area,img.header-image,.main-navigation{display:none}.wrapper{border-top:none;box-shadow:none}.site-content{margin:0;width:auto}.entry-header .entry-title,.entry-title{font-size:21pt}footer.entry-meta,footer.entry-meta a{color:#444;font-size:10pt}.author-description{float:none;width:auto}.commentlist>li.comment{background:none;position:relative;width:auto}.commentlist .avatar{height:39px;left:2.2em;top:2.2em;width:39px}.comments-area article header cite,.comments-area article header time{margin-left:50px;margin-left:3.57142857rem}}.breadcrumb div{display:inline;font-size:13px;margin-left:-3px}#wp-auto-top{position:fixed;top:45%;right:50%;display:block;margin-right:-540px;z-index:9999}#wp-auto-top-top,#wp-auto-top-comment,#wp-auto-top-bottom{background:url(https://www.lylinux.org/wp-content/plugins/wp-auto-top/img/1.png) no-repeat;position:relative;cursor:pointer;height:25px;width:29px;margin:10px 0 0}#wp-auto-top-comment{background-position:left -30px;height:32px}#wp-auto-top-bottom{background-position:left -68px}#wp-auto-top-comment:hover{background-position:right -30px}#wp-auto-top-top:hover{background-position:right 0}#wp-auto-top-bottom:hover{background-position:right -68px}.widget-login{margin-top:15px!important}#comments{margin-top:20px}#pinglist-container{display:none}.comment-tabs{margin-bottom:20px;font-size:15px;border-bottom:2px solid #e5e5e5}.comment-tabs li{float:left;margin-bottom:-2px}.comment-tabs li a{display:block;padding:0 10px 10px;font-weight:600;color:#aaa;border-bottom:2px solid #e5e5e5}.comment-tabs li a:hover{color:#444;border-color:#ccc}.comment-tabs li span{margin-left:8px;padding:0 6px;border-radius:4px;background-color:#e5e5e5}.comment-tabs li i{margin-right:6px}.comment-tabs li.active a{color:#e8554e;border-bottom-color:#e8554e}.commentlist,.pinglist{margin-bottom:20px}.commentlist li,.pinglist li{padding-left:60px;font-size:14px;line-height:22px;font-weight:400}.commentlist .comment-body,.pinglist li{position:relative;padding-bottom:20px;clear:both;word-break:break-all}.commentlist .comment-author,.commentlist .comment-meta,.commentlist .comment-awaiting-moderation{float:left;display:block;font-size:13px;line-height:22px}.commentlist .comment-author{margin-right:6px}.commentlist .fn,.pinglist .ping-link{color:#444;font-size:13px;font-style:normal;font-weight:600}.commentlist .says{display:none}.commentlist .avatar{position:absolute;left:-60px;top:0;width:48px;height:48px;border-radius:100%}.commentlist .comment-meta:before,.pinglist .ping-meta:before{vertical-align:4%;margin-right:3px;font-size:10px;font-family:FontAwesome;color:#ccc}.commentlist .comment-meta a,.pinglist .ping-meta{color:#aaa}.commentlist .reply{font-size:13px;line-height:16px}.commentlist .reply a,.commentlist .comment-reply-chain{color:#aaa}.commentlist .reply a:hover,.commentlist .comment-reply-chain:hover{color:#444}.comment-awaiting-moderation{color:#e8554e;font-style:normal}.pinglist li{padding-left:0}.commentlist .comment-body p{margin-bottom:8px;color:#777;clear:both}.commentlist .comment-body strong{font-weight:600}.commentlist .comment-body ol li{margin-left:2em;padding:0;list-style:decimal}.commentlist .comment-body ul li{margin-left:2em;padding:0;list-style:square}.commentlist li.bypostauthor>.comment-body:after,.commentlist li.comment-author-admin>.comment-body:after{display:block;position:absolute;content:"\f040";width:12px;line-height:12px;font-style:normal;font-family:FontAwesome;text-align:center;color:#fff;background-color:#e8554e}.commentlist li.comment-author-admin>.comment-body:after{content:"\f005"}.commentlist li.bypostauthor>.comment-body:after,.commentlist li.comment-author-admin>.comment-body:after{padding:3px;top:32px;left:-28px;font-size:12px;border-radius:100%}.commentlist li li.bypostauthor>.comment-body:after,.commentlist li li.comment-author-admin>.comment-body:after{padding:2px;top:22px;left:-26px;font-size:10px;border-radius:100%}.commentlist li ul{}.commentlist li li{margin:0;padding-left:48px}.commentlist li li .avatar{top:0;left:-48px;width:36px;height:36px}.commentlist li li .comment-meta{left:70px}.comments-nav{margin-bottom:20px}.comments-nav a{font-weight:600}.comments-nav .nav-previous{float:left}.comments-nav .nav-next{float:right}.logged-in-as,.comment-notes,.form-allowed-tags{display:none}#respond{position:relative}#reply-title{margin-bottom:20px}li #reply-title{margin:0!important;padding:0;height:0;font-size:0;border-top:0}#cancel-comment-reply-link{float:right;bottom:26px;right:20px;font-size:12px;color:#999}#cancel-comment-reply-link:hover{color:#777}#commentform{margin-bottom:20px;padding:10px 20px 20px;border-radius:4px;background-color:#e5e5e5}#commentform p.comment-form-author{float:left;width:48%}#commentform p.comment-form-email{float:right;width:48%}#commentform p.comment-form-url,#commentform p.comment-form-comment{clear:both}#commentform label{display:block;padding:6px 0;font-weight:600}#commentform input[type="text"],#commentform textarea{max-width:100%;width:100%}#commentform textarea{height:100px}#commentform p.form-submit{margin-top:10px}.logged-in #reply-title{margin-bottom:20px}.logged-in #commentform p.comment-form-comment{margin-top:10px}.logged-in #commentform p.comment-form-comment label{display:none}.heading,#reply-title{margin-bottom:1em;font-size:18px;font-weight:600;text-transform:uppercase;color:#222}.heading i{margin-right:6px;font-size:22px}.group:before{content:"";display:table}.group:after{content:"";display:table;clear:both}.cancel-comment{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}#rocket{position:fixed;right:50px;bottom:50px;display:block;visibility:hidden;width:26px;height:48px;background:url("data:image/png;base64,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") no-repeat 50% 0;cursor:pointer;-webkit-transition:all 0s;transition:all 0s}#rocket:hover{background-position:50% -62px}#rocket.show{visibility:visible;opacity:1}#rocket.move{background-position:50% -62px;-webkit-animation:toTop .8s ease-in;animation:toTop .8s ease-in;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.comment-markdown{float:right;font-size:small}.breadcrumb{margin-bottom:20px;list-style:none;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li + li:before{color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.break_line{height:1px;border:none} \ No newline at end of file diff --git a/src/collectedstatic/CACHE/css/output.ebe346e4e08e.css b/src/collectedstatic/CACHE/css/output.ebe346e4e08e.css new file mode 100644 index 0000000..7a60f74 --- /dev/null +++ b/src/collectedstatic/CACHE/css/output.ebe346e4e08e.css @@ -0,0 +1,13 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(/static/assets/fonts/glyphicons-halflings-regular.eot);src:url(/static/assets/fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(/static/assets/fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(/static/assets/fonts/glyphicons-halflings-regular.woff) format('woff'),url(/static/assets/fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(/static/assets/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}.icon-sn-google{background-position:0 -28px}.icon-sn-bg-google{background-color:#4285f4;background-position:0 0}.fa-sn-google{color:#4285f4}.icon-sn-github{background-position:-28px -28px}.icon-sn-bg-github{background-color:#333;background-position:-28px 0}.fa-sn-github{color:#333}.icon-sn-weibo{background-position:-56px -28px}.icon-sn-bg-weibo{background-color:#e90d24;background-position:-56px 0}.fa-sn-weibo{color:#e90d24}.icon-sn-qq{background-position:-84px -28px}.icon-sn-bg-qq{background-color:#0098e6;background-position:-84px 0}.fa-sn-qq{color:#0098e6}.icon-sn-twitter{background-position:-112px -28px}.icon-sn-bg-twitter{background-color:#50abf1;background-position:-112px 0}.fa-sn-twitter{color:#50abf1}.icon-sn-facebook{background-position:-140px -28px}.icon-sn-bg-facebook{background-color:#4862a3;background-position:-140px 0}.fa-sn-facebook{color:#4862a3}.icon-sn-renren{background-position:-168px -28px}.icon-sn-bg-renren{background-color:#197bc8;background-position:-168px 0}.fa-sn-renren{color:#197bc8}.icon-sn-tqq{background-position:-196px -28px}.icon-sn-bg-tqq{background-color:#1f9ed2;background-position:-196px 0}.fa-sn-tqq{color:#1f9ed2}.icon-sn-douban{background-position:-224px -28px}.icon-sn-bg-douban{background-color:#279738;background-position:-224px 0}.fa-sn-douban{color:#279738}.icon-sn-weixin{background-position:-252px -28px}.icon-sn-bg-weixin{background-color:#00b500;background-position:-252px 0}.fa-sn-weixin{color:#00b500}.icon-sn-dotted{background-position:-280px -28px}.icon-sn-bg-dotted{background-color:#eee;background-position:-280px 0}.fa-sn-dotted{color:#eee}.icon-sn-site{background-position:-308px -28px}.icon-sn-bg-site{background-color:#00b500;background-position:-308px 0}.fa-sn-site{color:#00b500}.icon-sn-linkedin{background-position:-336px -28px}.icon-sn-bg-linkedin{background-color:#0077b9;background-position:-336px 0}.fa-sn-linkedin{color:#0077b9}[class*=icon-sn-]{display:inline-block;background-image:url('/static/blog/img/icon-sn.svg?446a7ff2e4eb');background-repeat:no-repeat;width:28px;height:28px;vertical-align:middle;background-size:auto 56px}[class*=icon-sn-]:hover{opacity:.8;filter:alpha(opacity=80)}.btn-sn-google{background:#4285f4}.btn-sn-google:active,.btn-sn-google:focus,.btn-sn-google:hover{background:#2a75f3}.btn-sn-github{background:#333}.btn-sn-github:active,.btn-sn-github:focus,.btn-sn-github:hover{background:#262626}.btn-sn-weibo{background:#e90d24}.btn-sn-weibo:active,.btn-sn-weibo:focus,.btn-sn-weibo:hover{background:#d10c20}.btn-sn-qq{background:#0098e6}.btn-sn-qq:active,.btn-sn-qq:focus,.btn-sn-qq:hover{background:#0087cd}.btn-sn-twitter{background:#50abf1}.btn-sn-twitter:active,.btn-sn-twitter:focus,.btn-sn-twitter:hover{background:#38a0ef}.btn-sn-facebook{background:#4862a3}.btn-sn-facebook:active,.btn-sn-facebook:focus,.btn-sn-facebook:hover{background:#405791}.btn-sn-renren{background:#197bc8}.btn-sn-renren:active,.btn-sn-renren:focus,.btn-sn-renren:hover{background:#166db1}.btn-sn-tqq{background:#1f9ed2}.btn-sn-tqq:active,.btn-sn-tqq:focus,.btn-sn-tqq:hover{background:#1c8dbc}.btn-sn-douban{background:#279738}.btn-sn-douban:active,.btn-sn-douban:focus,.btn-sn-douban:hover{background:#228330}.btn-sn-weixin{background:#00b500}.btn-sn-weixin:active,.btn-sn-weixin:focus,.btn-sn-weixin:hover{background:#009c00}.btn-sn-dotted{background:#eee}.btn-sn-dotted:active,.btn-sn-dotted:focus,.btn-sn-dotted:hover{background:#e1e1e1}.btn-sn-site{background:#00b500}.btn-sn-site:active,.btn-sn-site:focus,.btn-sn-site:hover{background:#009c00}.btn-sn-linkedin{background:#0077b9}.btn-sn-linkedin:active,.btn-sn-linkedin:focus,.btn-sn-linkedin:hover{background:#0067a0}[class*=btn-sn-],[class*=btn-sn-]:active,[class*=btn-sn-]:focus,[class*=btn-sn-]:hover{border:none;color:#fff}.btn-sn-more{padding:0}.btn-sn-more,.btn-sn-more:active,.btn-sn-more:hover{box-shadow:none}[class*=btn-sn-] [class*=icon-sn-]{background-color:transparent}/*! + * IE10 viewport hack for Surface/desktop Windows 8 bug + * Copyright 2014-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */@-ms-viewport{width:device-width}@-o-viewport{width:device-width}@viewport{width:device-width}/*! + * TODC Bootstrap v3.3.7-3.3.7 (http://todc.github.com/todc-bootstrap/) + * Copyright 2011-2016 Tim O'Donnell + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license + */.panel-group .panel-heading a.collapsed:before,.panel-group .panel-heading a:before{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.caret-left,.caret-right,.collapse-caret.collapsed:before,.collapse-caret:before,.dropdown-submenu>a:after{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}body{font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:1.4;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#15c}a:focus,a:hover{color:#15c}.img-rounded{border-radius:1px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:0;line-height:1.4;background-color:#fff;border:3px solid #fff;border-radius:0;-webkit-box-shadow:0 0 0 1px #aaa;box-shadow:0 0 0 1px #aaa;-webkit-transition:none;-o-transition:none;transition:none}.caret-left,.caret-right,.collapse-caret.collapsed:before,.dropdown-submenu>a:after{vertical-align:baseline;border-top:4px solid transparent;border-right:0 dotted;border-bottom:4px solid transparent;border-left:4px solid}.caret-left{margin-right:2px;margin-left:0;border-right:4px solid;border-left:0 dotted}.scrollable-shadow{background:-webkit-gradient(linear,left top,left bottom,color-stop(30%,#fff),to(rgba(255,255,255,0))),-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),color-stop(70%,#fff)) 0 100%,radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:-webkit-linear-gradient(white 30%,rgba(255,255,255,0)),-webkit-linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,-webkit-radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),-webkit-radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:-o-linear-gradient(white 30%,rgba(255,255,255,0)),-o-linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,-o-radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),-o-radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:linear-gradient(white 30%,rgba(255,255,255,0)),linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:-webkit-gradient(linear,left top,left bottom,color-stop(30%,#fff),to(rgba(255,255,255,0))),-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),color-stop(70%,#fff)) 0 100%,radial-gradient(farthest-side at 50% 0,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(farthest-side at 50% 100%,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:linear-gradient(white 30%,rgba(255,255,255,0)),linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,radial-gradient(farthest-side at 50% 0,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(farthest-side at 50% 100%,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background-repeat:no-repeat;background-attachment:local,local,scroll,scroll;-webkit-background-size:100% 40px,100% 40px,100% 6px,100% 6px;background-size:100% 40px,100% 40px,100% 6px,100% 6px}.mark,mark{background-color:#f9edbe}.text-primary{color:#4d90fe}a.text-primary:focus,a.text-primary:hover{color:#1a70fe}.text-warning{color:#333}a.text-warning:focus,a.text-warning:hover{color:#1a1a1a}.bg-primary{color:#fff;background-color:#4d90fe}a.bg-primary:focus,a.bg-primary:hover{background-color:#1a70fe}.bg-warning{background-color:#f9edbe}a.bg-warning:focus,a.bg-warning:hover{background-color:#f5e08f}code{padding:2px 4px;border-radius:0}kbd{border-radius:1px}pre{padding:9px;margin:0 0 9px;font-size:12px;line-height:1.4;border-radius:0}table{background-color:transparent}caption{color:#999}.table{margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{line-height:1.4;border-top:1px solid #ddd}.table>thead>tr>th{border-bottom:2px solid #ddd}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#ffc}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#f9edbe}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f7e7a7}@media screen and (max-width:767px){.table-responsive{margin-bottom:13.5px;border:1px solid #ddd}}legend{margin-bottom:18px;font-size:19.5px}input[type=radio],input[type=checkbox]{margin:2px 0 0}output{padding-top:6px;font-size:13px;line-height:1.4;color:#555}.form-control{height:30px;-webkit-appearance:none;padding:5px 8px;font-size:13px;line-height:1.4;background-color:#fff;border:1px solid #d9d9d9;border-top-color:silver;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:none;-o-transition:none;transition:none}.form-control:hover{border:1px solid #b9b9b9;border-top-color:#a0a0a0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.form-control:focus{border-color:#4d90fe;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(77,144,254,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(77,144,254,.6)}.form-control:focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.form-control::-ms-expand{background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f1f1f1;border:1px solid #e5e5e5}.form-control[disabled]:active,.form-control[disabled]:focus,.form-control[disabled]:hover,.form-control[readonly]:active,.form-control[readonly]:focus,.form-control[readonly]:hover,fieldset[disabled] .form-control:active,fieldset[disabled] .form-control:focus,fieldset[disabled] .form-control:hover{border:1px solid #e5e5e5;-webkit-box-shadow:none;box-shadow:none}.form-control[readonly] .form-control{border:1px solid #d9d9d9}.form-control[readonly] .form-control:active,.form-control[readonly] .form-control:focus,.form-control[readonly] .form-control:hover{border:1px solid #d9d9d9}textarea.form-control{padding-right:4px}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:30px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:38px}}.checkbox label,.radio label{min-height:18px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio],input[type=radio],input[type=checkbox]{position:relative;width:13px;width:16px\9;height:13px;height:16px\9;-webkit-appearance:none;background:#fff;border:1px solid #dcdcdc;border:1px solid transparent\9;border-radius:1px}.checkbox input[type=checkbox]:focus,.checkbox-inline input[type=checkbox]:focus,.radio input[type=radio]:focus,.radio-inline input[type=radio]:focus,input[type=radio]:focus,input[type=checkbox]:focus{border-color:#4d90fe;outline:0}.checkbox input[type=checkbox]:active,.checkbox-inline input[type=checkbox]:active,.radio input[type=radio]:active,.radio-inline input[type=radio]:active,input[type=radio]:active,input[type=checkbox]:active{background-color:#ebebeb;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffffffff',GradientType=0);border-color:#c6c6c6}.checkbox input[type=checkbox]:checked,.checkbox-inline input[type=checkbox]:checked,.radio input[type=radio]:checked,.radio-inline input[type=radio]:checked,input[type=radio]:checked,input[type=checkbox]:checked{background:#fff}.radio input[type=radio],.radio-inline input[type=radio],input[type=radio]{width:15px;width:18px\9;height:15px;height:18px\9;border-radius:1em}.radio input[type=radio]:checked::after,.radio-inline input[type=radio]:checked::after,input[type=radio]:checked::after{position:relative;top:3px;left:3px;display:block;width:7px;height:7px;content:'';background:#666;border-radius:1em}.checkbox input[type=checkbox]:hover,.checkbox-inline input[type=checkbox]:hover,input[type=checkbox]:hover{border-color:#c6c6c6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-webkit-box-shadow:none\9;box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:none\9}.checkbox input[type=checkbox]:checked::after,.checkbox-inline input[type=checkbox]:checked::after,input[type=checkbox]:checked::after{position:absolute;top:-6px;left:-5px;display:block;content:url(/static/assets/img/checkmark.png?446a7ff2e4eb)}.form-control-static{min-height:31px;padding-top:6px;padding-bottom:6px}.input-sm{height:26px;padding:3px 8px;font-size:12px;line-height:1.5;border-radius:1px}select.input-sm{height:26px;line-height:26px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:3px 8px;font-size:12px;line-height:1.5;border-radius:1px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm .form-control-static{height:26px;min-height:30px;padding:4px 8px;font-size:12px;line-height:1.5}.input-lg{height:38px;padding:9px 14px;font-size:14px;line-height:1.3;border-radius:1px}select.input-lg{height:38px;line-height:38px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:38px;padding:9px 14px;font-size:14px;line-height:1.3;border-radius:1px}.form-group-lg select.form-control{height:38px;line-height:38px}.form-group-lg .form-control-static{height:38px;min-height:32px;padding:10px 14px;font-size:14px;line-height:1.3}.has-feedback .form-control{padding-right:37.5px}.form-control-feedback{top:23px;width:30px;height:30px;line-height:30px}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:38px;height:38px;line-height:38px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-success .form-control{-webkit-box-shadow:none;box-shadow:none}.has-success .form-control:hover{border-color:#3c763d;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;box-shadow:0 1px 2px rgba(0,0,0,.1) inset}.has-success .form-control:focus{border-color:#3c763d;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3) inset;box-shadow:0 1px 2px rgba(0,0,0,.3) inset}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e09b17}.has-warning .form-control{border-color:#e09b17;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#b27b12;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f0c36d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f0c36d}.has-warning .input-group-addon{color:#e09b17;background-color:#f9edbe;border-color:#e09b17}.has-warning .form-control-feedback{color:#e09b17}.has-warning .form-control{-webkit-box-shadow:none;box-shadow:none}.has-warning .form-control:hover{border-color:#e09b17;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;box-shadow:0 1px 2px rgba(0,0,0,.1) inset}.has-warning .form-control:focus{border-color:#e09b17;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3) inset;box-shadow:0 1px 2px rgba(0,0,0,.3) inset}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#dd4b39}.has-error .form-control{border-color:#dd4b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#c23321;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ec9a90;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ec9a90}.has-error .input-group-addon{color:#dd4b39;background-color:#f2dede;border-color:#dd4b39}.has-error .form-control-feedback{color:#dd4b39}.has-error .form-control{-webkit-box-shadow:none;box-shadow:none}.has-error .form-control:hover{border-color:#dd4b39;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;box-shadow:0 1px 2px rgba(0,0,0,.1) inset}.has-error .form-control:focus{border-color:#dd4b39;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3) inset;box-shadow:0 1px 2px rgba(0,0,0,.3) inset}.has-feedback label~.form-control-feedback{top:23px}.help-block{color:#777}.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio-inline{padding-top:5px}@media (min-width:768px){.form-inline .form-group,.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static,.navbar-form .form-control-static{display:inline-block}.form-inline .input-group,.navbar-form .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control,.navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio,.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label,.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-bottom:-2px;margin-left:0}.form-inline .has-feedback .form-control-feedback,.navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:6px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:24px}@media (min-width:768px){.form-horizontal .control-label{padding-top:6px}.form-horizontal .has-feedback .form-control-feedback{top:0}}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:10px;font-size:14px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:4px;font-size:12px}}.btn{padding:5px 12px;font-size:13px;font-weight:700;line-height:18px;cursor:default;-webkit-background-clip:border-box;background-clip:border-box;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.btn:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.btn.active,.btn:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-default{color:#333;text-shadow:0 1px rgba(0,0,0,.1);text-shadow:0 1px 0 #fff;background-color:#f3f3f3;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:linear-gradient(to bottom,#f5f5f5 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff1f1f1',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #dcdcdc}.btn-default:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e4e4e4;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e4e4e4 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e4e4e4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e4e4e4));background-image:linear-gradient(to bottom,#f5f5f5 0,#e4e4e4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe4e4e4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #cfcfcf}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#f5f5f5 0,#d8d8d8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#d8d8d8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#d8d8d8));background-image:linear-gradient(to bottom,#f5f5f5 0,#d8d8d8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffd8d8d8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #c3c3c3;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-default.focus,.btn-default:focus{border:1px solid #dcdcdc;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:linear-gradient(to bottom,#f5f5f5 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff1f1f1',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #dcdcdc;-webkit-box-shadow:none;box-shadow:none}.btn-default .badge{color:#dcdcdc;background-color:#333}.btn-default:hover{text-shadow:none;background-image:-webkit-linear-gradient(top,#f8f8f8 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f8f8f8 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#f1f1f1));background-image:linear-gradient(to bottom,#f8f8f8 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8',endColorstr='#fff1f1f1',GradientType=0);background-repeat:repeat-x;background-position:0 0;border-color:#c6c6c6;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);-webkit-transition:none;-o-transition:none;transition:none}.btn-default.active,.btn-default:active,.open .dropdown-toggle.btn-default{text-shadow:0 1px 0 #fff;background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f6f6f6),to(#f1f1f1));background-image:linear-gradient(to bottom,#f6f6f6 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f6f6',endColorstr='#fff1f1f1',GradientType=0);background-repeat:repeat-x;border:1px solid #dcdcdc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-default.focus,.btn-default:focus{background-color:#f3f3f3;border-color:#4d90fe;outline-style:none}.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{text-shadow:none;background-color:#f3f3f3}.btn-default .badge{color:#f3f3f3;text-shadow:none}.btn-primary{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#4787ed));background-image:linear-gradient(to bottom,#4d90fe 0,#4787ed 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe',endColorstr='#ff4787ed',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #3079ed}.btn-primary:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3078eb;background-image:-webkit-linear-gradient(top,#4d90fe 0,#3078eb 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#3078eb 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#3078eb));background-image:linear-gradient(to bottom,#4d90fe 0,#3078eb 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe',endColorstr='#ff3078eb',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #196aeb}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#4d90fe 0,#1969e8 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#1969e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#1969e8));background-image:linear-gradient(to bottom,#4d90fe 0,#1969e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe',endColorstr='#ff1969e8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #135fd7;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-primary.focus,.btn-primary:focus{border:1px solid #3079ed;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#4787ed));background-image:linear-gradient(to bottom,#4d90fe 0,#4787ed 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe',endColorstr='#ff4787ed',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #3079ed;-webkit-box-shadow:none;box-shadow:none}.btn-primary .badge{color:#3079ed;background-color:#fff}.btn-success{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-o-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#35aa47));background-image:linear-gradient(to bottom,#35aa47 0,#35aa47 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47',endColorstr='#ff35aa47',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #359947}.btn-success:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#2f973f;background-image:-webkit-linear-gradient(top,#35aa47 0,#2f973f 100%);background-image:-o-linear-gradient(top,#35aa47 0,#2f973f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#2f973f));background-image:linear-gradient(to bottom,#35aa47 0,#2f973f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47',endColorstr='#ff2f973f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #2e863e}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#35aa47 0,#298337 100%);background-image:-o-linear-gradient(top,#35aa47 0,#298337 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#298337));background-image:linear-gradient(to bottom,#35aa47 0,#298337 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47',endColorstr='#ff298337',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #287335;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-success.focus,.btn-success:focus{border:1px solid #359947;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#35aa47;background-image:-webkit-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-o-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#35aa47));background-image:linear-gradient(to bottom,#35aa47 0,#35aa47 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47',endColorstr='#ff35aa47',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #359947;-webkit-box-shadow:none;box-shadow:none}.btn-success .badge{color:#359947;background-color:#fff}.btn-info{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#5bc0de));background-image:linear-gradient(to bottom,#5bc0de 0,#5bc0de 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff5bc0de',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #46b8da}.btn-info:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#46b8da;background-image:-webkit-linear-gradient(top,#5bc0de 0,#46b8da 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#46b8da 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#46b8da));background-image:linear-gradient(to bottom,#5bc0de 0,#46b8da 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff46b8da',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #31b0d5}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #28a1c5;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-info.focus,.btn-info:focus{border:1px solid #46b8da;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;background-image:-webkit-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#5bc0de));background-image:linear-gradient(to bottom,#5bc0de 0,#5bc0de 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff5bc0de',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #46b8da;-webkit-box-shadow:none;box-shadow:none}.btn-info .badge{color:#46b8da;background-color:#fff}.btn-warning{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-o-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#faa937));background-image:linear-gradient(to bottom,#fbb450 0,#faa937 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fffaa937',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #faa328}.btn-warning:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#f99e1e;background-image:-webkit-linear-gradient(top,#fbb450 0,#f99e1e 100%);background-image:-o-linear-gradient(top,#fbb450 0,#f99e1e 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f99e1e));background-image:linear-gradient(to bottom,#fbb450 0,#f99e1e 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff99e1e',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #f9980f}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#fbb450 0,#f89306 100%);background-image:-o-linear-gradient(top,#fbb450 0,#f89306 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f89306));background-image:linear-gradient(to bottom,#fbb450 0,#f89306 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89306',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #e98b06;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-warning.focus,.btn-warning:focus{border:1px solid #faa328;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#fbb450;background-image:-webkit-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-o-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#faa937));background-image:linear-gradient(to bottom,#fbb450 0,#faa937 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fffaa937',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #faa328;-webkit-box-shadow:none;box-shadow:none}.btn-warning .badge{color:#faa328;background-color:#fff}.btn-danger{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#d14836));background-image:linear-gradient(to bottom,#dd4b39 0,#d14836 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39',endColorstr='#ffd14836',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #c6322a}.btn-danger:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c13e2c;background-image:-webkit-linear-gradient(top,#dd4b39 0,#c13e2c 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#c13e2c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#c13e2c));background-image:linear-gradient(to bottom,#dd4b39 0,#c13e2c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39',endColorstr='#ffc13e2c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #b12d26}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#dd4b39 0,#ad3727 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#ad3727 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#ad3727));background-image:linear-gradient(to bottom,#dd4b39 0,#ad3727 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39',endColorstr='#ffad3727',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #9c2721;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-danger.focus,.btn-danger:focus{border:1px solid #c6322a;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#dd4b39;background-image:-webkit-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#d14836));background-image:linear-gradient(to bottom,#dd4b39 0,#d14836 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39',endColorstr='#ffd14836',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #c6322a;-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge{color:#c6322a;background-color:#fff}.btn-link{color:#15c}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link.focus,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link.focus,.btn-link:focus,.btn-link:hover{color:#15c;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link[disabled]:focus .btn-link[disabled].focus,.btn-link[disabled]:focus fieldset[disabled] .btn-link.focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus .btn-link[disabled].focus,fieldset[disabled] .btn-link:focus fieldset[disabled] .btn-link.focus,fieldset[disabled] .btn-link:hover{color:#333}.btn-group-lg>.btn,.btn-lg{padding:9px 14px;font-size:14px;line-height:1.3;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:3px 8px;font-size:12px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 6px;font-size:11px;line-height:1.25;border-radius:1px}.dropdown-menu{padding:6px 0;margin:1px 0 0;font-size:13px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:0;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2)}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#ebebeb}.dropdown-menu>li>a{position:relative;padding:3px 30px}.dropdown-menu>li>a .glyphicon{position:absolute;top:4px;left:7px}.dropdown-menu li>a:focus,.dropdown-menu li>a:hover,.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#333;background-color:#eee;background-image:-webkit-linear-gradient(top,#eee 0,#eee 100%);background-image:-o-linear-gradient(top,#eee 0,#eee 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#eee));background-image:linear-gradient(to bottom,#eee 0,#eee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee',endColorstr='#ffeeeeee',GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#333;background-color:#eee;background-image:-webkit-linear-gradient(top,#eee 0,#eee 100%);background-image:-o-linear-gradient(top,#eee 0,#eee 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#eee));background-image:linear-gradient(to bottom,#eee 0,#eee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee',endColorstr='#ffeeeeee',GradientType=0);background-repeat:repeat-x}.dropdown-header{color:#999}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-left:-1px;border-radius:0}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;border-radius:0}.dropdown-submenu>a:after{position:absolute;right:10px;margin-top:5px;content:""}.dropdown-submenu.dropdown-menu-left,.dropdown-submenu.pull-left{float:none!important}.dropdown-submenu.dropdown-menu-left>.dropdown-menu,.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:18px;border-radius:0}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{z-index:3}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:16px}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.btn-group>.dropdown-toggle:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.btn-group>.btn-danger.dropdown-toggle:hover,.btn-group>.btn-info.dropdown-toggle:hover,.btn-group>.btn-primary.dropdown-toggle:hover,.btn-group>.btn-success.dropdown-toggle:hover,.btn-group>.btn-warning.dropdown-toggle:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-group>.btn.dropdown-toggle.active,.btn-group>.btn.dropdown-toggle:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-group>.btn-danger.dropdown-toggle.active,.btn-group>.btn-danger.dropdown-toggle:active,.btn-group>.btn-info.dropdown-toggle.active,.btn-group>.btn-info.dropdown-toggle:active,.btn-group>.btn-primary.dropdown-toggle.active,.btn-group>.btn-primary.dropdown-toggle:active,.btn-group>.btn-success.dropdown-toggle.active,.btn-group>.btn-success.dropdown-toggle:active,.btn-group>.btn-warning.dropdown-toggle.active,.btn-group>.btn-warning.dropdown-toggle:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group>.btn-sm.dropdown-toggle{padding:5px 7px}.btn-group>.btn-lg.dropdown-toggle{padding:9px 9px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 1px 6px rgba(0,0,0,.15);box-shadow:inset 0 1px 6px rgba(0,0,0,.15)}.btn-group.open .btn.dropdown-toggle{background-color:#f3f3f3;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-group.open .btn-primary.dropdown-toggle{background-color:#4d90fe;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-warning.dropdown-toggle{background-color:#faa937;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-danger.dropdown-toggle{background-color:#d84a38;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-success.dropdown-toggle{background-color:#35aa47;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-info.dropdown-toggle{background-color:#5bc0de;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:2px;border-top-right-radius:2px}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-right-radius:2px;border-bottom-left-radius:2px}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:38px;padding:9px 14px;font-size:14px;line-height:1.3;border-radius:1px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:38px;line-height:38px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:26px;padding:3px 8px;font-size:12px;line-height:1.5;border-radius:1px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:26px;line-height:26px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{margin:0;border-radius:0}.input-group-addon{padding:5px 8px;font-size:13px;color:#555;border:1px solid #d9d9d9;border-top-color:silver;border-radius:2px}.input-group-addon.input-sm{padding:3px 8px;font-size:12px;border-radius:1px}.input-group-addon.input-lg{padding:9px 14px;font-size:14px;border-radius:1px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-bottom:-3px}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#999}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{color:#fff;background-color:#999;border-color:#999}.nav-tabs>li>a{color:#666;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{font-weight:700;color:#333}.nav-tabs-google>li{margin:0 -1px 0 0}.nav-tabs-google>li>a{padding:12px 8px;margin:0 8px;line-height:1.4;color:#777;border:3px solid transparent;border-width:3px 0;border-radius:0}.nav-tabs-google>li>a:first-of-type{margin-left:0}.nav-tabs-google>li>a:focus,.nav-tabs-google>li>a:hover{background-color:transparent;border-top-color:transparent}.nav-tabs-google>li>a:hover{color:#000;border-bottom-color:transparent}.nav-tabs-google>li>a:active{color:#dd4b39}.nav-tabs-google>li>a:focus{color:#000;outline:0}.nav-tabs-google>li.active>a,.nav-tabs-google>li.active>a:focus,.nav-tabs-google>li.active>a:hover{color:#dd4b39;border:3px solid transparent;border-width:3px 0;border-bottom-color:#dd4b39}.nav-pills>li>a{border-radius:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#4d90fe}.navbar{min-height:28px;margin-bottom:18px}@media (min-width:768px){.navbar{border-radius:2px}}.navbar-brand{height:28px;padding:5px 15px;font-size:14px;line-height:18px}.navbar-brand>.glyphicon{margin-top:0}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{padding:5px 10px;margin-top:1px;margin-right:15px;margin-bottom:1px;border-radius:2px}.navbar-nav{margin:2px -15px}.navbar-nav>li>a{padding-top:5px;padding-bottom:5px;line-height:18px}@media (max-width:767px){.navbar-nav .open .dropdown-menu>li>a{line-height:18px}}@media (min-width:768px){.navbar-nav{margin:0}.navbar-nav>li>a{padding-top:5px;padding-bottom:5px}}.navbar-form{padding:10px 15px;margin-top:0;margin-right:-15px;margin-bottom:0;margin-left:-15px;-webkit-box-shadow:none;box-shadow:none}.navbar-form>.input-group .form-control{margin-top:1px;margin-bottom:1px}@media (min-width:768px){.navbar-form{padding-top:0;padding-bottom:0;margin-right:0;margin-left:0}}.navbar-form .form-control{height:26px;padding:3px 8px}.navbar .btn,.navbar-btn{padding:3px 8px;margin-top:1px;margin-bottom:1px}.navbar .btn.btn-sm,.navbar-btn.btn-sm{margin-top:1px;margin-bottom:1px}.navbar .btn.btn-xs,.navbar-btn.btn-xs{padding:2px 6px;margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:5px;margin-bottom:5px}.navbar-default{background-color:#2d2d2d;border-color:#000}.navbar-default .navbar-brand{color:#999}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-default .navbar-brand>.caret{border-top-color:#999;border-bottom-color:#999}.navbar-default .navbar-text{color:#999}.navbar-default .navbar-nav>li>a{color:#999}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#fff;background-color:#141414}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#555;background-color:transparent}.navbar-default .navbar-toggle{border-color:#222}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#333}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#000}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#fff;background-color:#141414}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#141414}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#555;background-color:transparent}}.navbar-default .navbar-link{color:#999}.navbar-default .navbar-link:hover{color:#fff}.navbar-default .btn-link{color:#999}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#fff}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#555}.navbar-inverse{background-color:#fafafa;border-color:#dbdbdb}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:grey;background-color:transparent}.navbar-inverse .navbar-brand>.caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#333;background-color:#e1e1e1}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#ddd}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#ddd}.navbar-inverse .navbar-toggle .icon-bar{background-color:#888}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#e8e8e8}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#333;background-color:#e1e1e1}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#dbdbdb}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#dbdbdb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#333;background-color:#e1e1e1}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#333}.navbar-inverse .btn-link{color:#999}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#333}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#ccc}.navbar-masthead{min-height:44px;margin-bottom:18px}@media (min-width:768px){.navbar-masthead{border-radius:2px}}.navbar-masthead .navbar-static-top{z-index:1005}.navbar-masthead .navbar-fixed-bottom,.navbar-masthead .navbar-fixed-top{z-index:1029}.navbar-masthead .navbar-brand{height:44px;padding:13px 15px;font-size:20px}.navbar-masthead .navbar-brand>.glyphicon{margin-top:-3px}@media (min-width:768px){.navbar>.container .navbar-masthead .navbar-brand,.navbar>.container-fluid .navbar-masthead .navbar-brand{margin-left:-15px}}.navbar-masthead .navbar-toggle{margin-top:7px;margin-right:15px;margin-bottom:7px}.navbar-masthead .navbar-nav{margin:6px -15px}@media (min-width:768px){.navbar-masthead .navbar-nav{margin:6px 0}.navbar-masthead .navbar-nav>li>a{padding-top:8px;padding-bottom:6px}}.navbar-masthead .navbar-form{padding:10px 15px;margin-top:0;margin-right:-15px;margin-bottom:0;margin-left:-15px}.navbar-masthead .navbar-form>.input-group .form-control{margin-top:7px;margin-bottom:7px}@media (max-width:767px){.navbar-masthead .navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-masthead .navbar-form{padding-top:0;padding-bottom:0;margin-right:0;margin-left:0}}.navbar-masthead .navbar-form .form-control{height:30px;padding:5px 8px}.navbar-masthead.navbar .btn,.navbar-masthead.navbar-btn{padding:5px 8px;margin-top:7px;margin-bottom:7px}.navbar-masthead.navbar .btn.btn-sm,.navbar-masthead.navbar-btn.btn-sm{padding:3px 8px;margin-top:9px;margin-bottom:9px}.navbar-masthead.navbar .btn.btn-xs,.navbar-masthead.navbar-btn.btn-xs{padding:2px 6px;margin-top:12px;margin-bottom:12px}.navbar-masthead .navbar-text{margin-top:13px;margin-bottom:13px}.navbar-masthead.navbar-default{background-color:#f1f1f1;border-color:#e5e5e5}.navbar-masthead.navbar-default .navbar-brand{color:#777}.navbar-masthead.navbar-default .navbar-brand:focus,.navbar-masthead.navbar-default .navbar-brand:hover{color:#777;background-color:transparent}.navbar-masthead.navbar-default .navbar-brand>.caret{border-top-color:#777;border-bottom-color:#777}.navbar-masthead.navbar-default .navbar-text{color:#777}.navbar-masthead.navbar-default .navbar-nav>li>a{color:#777}.navbar-masthead.navbar-default .navbar-nav>li>a:focus,.navbar-masthead.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-masthead.navbar-default .navbar-nav>.active>a,.navbar-masthead.navbar-default .navbar-nav>.active>a:focus,.navbar-masthead.navbar-default .navbar-nav>.active>a:hover{color:#333;background-color:#f1f1f1}.navbar-masthead.navbar-default .navbar-nav>.disabled>a,.navbar-masthead.navbar-default .navbar-nav>.disabled>a:focus,.navbar-masthead.navbar-default .navbar-nav>.disabled>a:hover{color:#bbb;background-color:transparent}.navbar-masthead.navbar-default .navbar-toggle{border-color:#dcdcdc}.navbar-masthead.navbar-default .navbar-toggle:focus,.navbar-masthead.navbar-default .navbar-toggle:hover{background-color:#e4e4e4}.navbar-masthead.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-masthead.navbar-default .navbar-collapse,.navbar-masthead.navbar-default .navbar-form{border-color:#dfdfdf}.navbar-masthead.navbar-default .navbar-nav>.open>a,.navbar-masthead.navbar-default .navbar-nav>.open>a:focus,.navbar-masthead.navbar-default .navbar-nav>.open>a:hover{color:#333;background-color:#f1f1f1}@media (max-width:767px){.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#333;background-color:#f1f1f1}.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#bbb;background-color:transparent}}.navbar-masthead.navbar-default .navbar-link{color:#777}.navbar-masthead.navbar-default .navbar-link:hover{color:#333}.navbar-masthead.navbar-default .btn-link{color:#777}.navbar-masthead.navbar-default .btn-link:focus,.navbar-masthead.navbar-default .btn-link:hover{color:#333}.navbar-masthead.navbar-default .btn-link[disabled]:focus,.navbar-masthead.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-masthead.navbar-default .btn-link:focus,fieldset[disabled] .navbar-masthead.navbar-default .btn-link:hover{color:#bbb}.navbar-masthead.navbar-inverse{background-color:#444;border-color:#333}.navbar-masthead.navbar-inverse .navbar-brand{color:#fff}.navbar-masthead.navbar-inverse .navbar-brand:focus,.navbar-masthead.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-brand>.caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-masthead.navbar-inverse .navbar-text{color:#999}.navbar-masthead.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-masthead.navbar-inverse .navbar-nav>li>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>li>a:hover{color:#bbb;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-nav>.active>a,.navbar-masthead.navbar-inverse .navbar-nav>.active>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>.active>a:hover{color:#bbb;background-color:#444}.navbar-masthead.navbar-inverse .navbar-nav>.disabled>a,.navbar-masthead.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>.disabled>a:hover{color:#777;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-toggle{border-color:#222}.navbar-masthead.navbar-inverse .navbar-toggle:focus,.navbar-masthead.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-masthead.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-masthead.navbar-inverse .navbar-collapse,.navbar-masthead.navbar-inverse .navbar-form{border-color:#323232}.navbar-masthead.navbar-inverse .navbar-nav>.open>a,.navbar-masthead.navbar-inverse .navbar-nav>.open>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>.open>a:hover{color:#bbb;background-color:#444}@media (max-width:767px){.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#333}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#333}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#bbb;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#bbb;background-color:#444}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#777;background-color:transparent}}.navbar-masthead.navbar-inverse .navbar-link{color:#fff}.navbar-masthead.navbar-inverse .navbar-link:hover{color:#bbb}.navbar-masthead.navbar-inverse .btn-link{color:#fff}.navbar-masthead.navbar-inverse .btn-link:focus,.navbar-masthead.navbar-inverse .btn-link:hover{color:#bbb}.navbar-masthead.navbar-inverse .btn-link[disabled]:focus,.navbar-masthead.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-masthead.navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-masthead.navbar-inverse .btn-link:hover{color:#777}.navbar-toolbar{min-height:36px;margin-bottom:18px}@media (min-width:768px){.navbar-toolbar{border-radius:2px}}.navbar-toolbar .navbar-static-top{z-index:1008}.navbar-toolbar .navbar-fixed-bottom,.navbar-toolbar .navbar-fixed-top{z-index:1028}.navbar-toolbar .navbar-brand{height:36px;padding:9px 15px;font-size:16px;font-weight:700}@media (min-width:768px){.navbar>.container .navbar-toolbar .navbar-brand,.navbar>.container-fluid .navbar-toolbar .navbar-brand{margin-left:-15px}}.navbar-toolbar .navbar-toggle{margin-top:3px;margin-right:15px;margin-bottom:3px}.navbar-toolbar .navbar-nav{margin:4px -15px}.navbar-toolbar .navbar-nav>li{position:relative}.navbar-toolbar .navbar-nav>li>a{padding:9px 15px}.navbar-toolbar .navbar-nav>li>a:focus,.navbar-toolbar .navbar-nav>li>a:hover{text-decoration:underline}.navbar-toolbar .navbar-nav>li>.dropdown-menu{margin-top:1px}.navbar-toolbar .navbar-nav>.active>a{font-weight:700}.navbar-toolbar .navbar-nav>.active>a:before{position:absolute;bottom:-1px;left:50%;display:inline-block;margin-left:-8px;content:'';border-right:8px solid transparent;border-bottom:8px solid transparent;border-left:8px solid transparent}.navbar-toolbar .navbar-nav>.active>a:after{position:absolute;bottom:-1px;left:50%;display:inline-block;margin-left:-7px;content:'';border-right:7px solid transparent;border-bottom:7px solid transparent;border-left:7px solid transparent}@media (min-width:768px){.navbar-toolbar .navbar-nav{margin:0}.navbar-toolbar .navbar-nav>li>a{padding-top:9px;padding-bottom:9px}}.navbar-toolbar .navbar-form{padding:10px 15px;margin-top:0;margin-right:-15px;margin-bottom:0;margin-left:-15px}.navbar-toolbar .navbar-form>.input-group .form-control{margin-top:3px;margin-bottom:3px}@media (max-width:767px){.navbar-toolbar .navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-toolbar .navbar-form{padding-top:0;padding-bottom:0;margin-right:0;margin-left:0}}.navbar-toolbar .navbar-form .form-control{height:30px;padding:5px 8px}.navbar-toolbar .dropdown-menu{border-top:1px none}.navbar-toolbar.navbar .btn,.navbar-toolbar.navbar-btn{padding:5px 8px;margin-top:3px;margin-bottom:3px}.navbar-toolbar.navbar .btn.btn-sm,.navbar-toolbar.navbar-btn.btn-sm{padding:3px 8px;margin-top:5px;margin-bottom:5px}.navbar-toolbar.navbar .btn.btn-xs,.navbar-toolbar.navbar-btn.btn-xs{padding:2px 6px;margin-top:8px;margin-bottom:8px}.navbar-toolbar .navbar-text{margin-top:9px;margin-bottom:9px}.navbar-toolbar.navbar-default{background-color:#fff;border-color:#ebebeb}.navbar-toolbar.navbar-default .navbar-brand{color:#dd4b39}.navbar-toolbar.navbar-default .navbar-brand:focus,.navbar-toolbar.navbar-default .navbar-brand:hover{color:#dd4b39;background-color:transparent}.navbar-toolbar.navbar-default .navbar-brand>.caret{border-top-color:#dd4b39;border-bottom-color:#dd4b39}.navbar-toolbar.navbar-default .navbar-text{color:#777}.navbar-toolbar.navbar-default .navbar-nav>li>a{color:#777}.navbar-toolbar.navbar-default .navbar-nav>li>a:focus,.navbar-toolbar.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-toolbar.navbar-default .navbar-nav>.active>a,.navbar-toolbar.navbar-default .navbar-nav>.active>a:focus,.navbar-toolbar.navbar-default .navbar-nav>.active>a:hover{color:#333;background-color:#f2f2f2}.navbar-toolbar.navbar-default .navbar-nav>.active>a:before{border-bottom:8px solid #ebebeb}.navbar-toolbar.navbar-default .navbar-nav>.active>a:after{border-bottom:7px solid #fff}.navbar-toolbar.navbar-default .navbar-nav>.disabled>a,.navbar-toolbar.navbar-default .navbar-nav>.disabled>a:focus,.navbar-toolbar.navbar-default .navbar-nav>.disabled>a:hover{color:#bbb;background-color:transparent}.navbar-toolbar.navbar-default .navbar-toggle{border-color:#dcdcdc}.navbar-toolbar.navbar-default .navbar-toggle:focus,.navbar-toolbar.navbar-default .navbar-toggle:hover{background-color:#e4e4e4}.navbar-toolbar.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-toolbar.navbar-default .navbar-collapse,.navbar-toolbar.navbar-default .navbar-form{border-color:#ededed}.navbar-toolbar.navbar-default .navbar-nav>.open>a,.navbar-toolbar.navbar-default .navbar-nav>.open>a:focus,.navbar-toolbar.navbar-default .navbar-nav>.open>a:hover{color:#333;background-color:#f2f2f2}@media (max-width:767px){.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#333;background-color:#f2f2f2}.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#bbb;background-color:transparent}}.navbar-toolbar.navbar-default .navbar-link{color:#777}.navbar-toolbar.navbar-default .navbar-link:hover{color:#333}.navbar-toolbar.navbar-default .btn-link{color:#777}.navbar-toolbar.navbar-default .btn-link:focus,.navbar-toolbar.navbar-default .btn-link:hover{color:#333}.navbar-toolbar.navbar-default .btn-link[disabled]:focus,.navbar-toolbar.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-toolbar.navbar-default .btn-link:focus,fieldset[disabled] .navbar-toolbar.navbar-default .btn-link:hover{color:#bbb}.navbar-toolbar.navbar-inverse{background-color:#444;border-color:#333}.navbar-toolbar.navbar-inverse .navbar-brand{color:#fff}.navbar-toolbar.navbar-inverse .navbar-brand:focus,.navbar-toolbar.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-brand>.caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-toolbar.navbar-inverse .navbar-text{color:#999}.navbar-toolbar.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-toolbar.navbar-inverse .navbar-nav>li>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-nav>.active>a,.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#444}.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:before{border-bottom:8px solid #333}.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:after{border-bottom:7px solid #fff}.navbar-toolbar.navbar-inverse .navbar-nav>.disabled>a,.navbar-toolbar.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>.disabled>a:hover{color:#777;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-toggle{border-color:#222}.navbar-toolbar.navbar-inverse .navbar-toggle:focus,.navbar-toolbar.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-toolbar.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-toolbar.navbar-inverse .navbar-collapse,.navbar-toolbar.navbar-inverse .navbar-form{border-color:#323232}.navbar-toolbar.navbar-inverse .navbar-nav>.open>a,.navbar-toolbar.navbar-inverse .navbar-nav>.open>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#444}@media (max-width:767px){.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#333}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#333}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#444}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#777;background-color:transparent}}.navbar-toolbar.navbar-inverse .navbar-link{color:#fff}.navbar-toolbar.navbar-inverse .navbar-link:hover{color:#fff}.navbar-toolbar.navbar-inverse .btn-link{color:#fff}.navbar-toolbar.navbar-inverse .btn-link:focus,.navbar-toolbar.navbar-inverse .btn-link:hover{color:#fff}.navbar-toolbar.navbar-inverse .btn-link[disabled]:focus,.navbar-toolbar.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-toolbar.navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-toolbar.navbar-inverse .btn-link:hover{color:#777}.navbar-static-top{border-radius:0}.navbar-fixed-top,.navbar-static-top{border-width:1px 0}.navbar-fixed-bottom{border-width:1px 0}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-btn{padding:3px 8px;margin-top:1px}.btn.navbar-masthead-btn{margin-top:7px}.btn.navbar-toolbar-btn{margin-top:3px}.navbar-link{color:#999}.navbar-link:hover{color:#fff}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#333}.navbar-form .checkbox-inline,.navbar-form .radio-inline{color:#999}.breadcrumb{padding:13px 15px;margin-bottom:18px;background-color:#f3f3f3;border-radius:2px}.breadcrumb>li+li{position:relative;display:inline-block;margin-left:20px}.breadcrumb>li+li:before{border-radius:5px}.breadcrumb>li+li:after,.breadcrumb>li+li:before{position:absolute;width:0;height:0;content:""}.breadcrumb>li+li:before{border:7px solid transparent}.breadcrumb>li+li:after{border:5px solid transparent}.breadcrumb>li+li:after,.breadcrumb>li+li:before{top:9px;left:100%}.breadcrumb>li+li:before{margin-top:-7px;border-left:7px solid;border-left-color:#777}.breadcrumb>li+li:after{margin-top:-5px;border-left:5px solid #f3f3f3}.breadcrumb>li+li:after,.breadcrumb>li+li:before{left:-16px}.breadcrumb>li+li:before{color:#999;content:""}.breadcrumb>li>a{color:#999}.breadcrumb>li>a:hover{color:#000}.breadcrumb>.active,.breadcrumb>.active>a{color:#000}.breadcrumb-inverse{background-color:#393832}.breadcrumb-inverse>li+li{position:relative;display:inline-block}.breadcrumb-inverse>li+li:before{border-radius:5px}.breadcrumb-inverse>li+li:after,.breadcrumb-inverse>li+li:before{position:absolute;width:0;height:0;content:""}.breadcrumb-inverse>li+li:before{border:7px solid transparent}.breadcrumb-inverse>li+li:after{border:5px solid transparent}.breadcrumb-inverse>li+li:after,.breadcrumb-inverse>li+li:before{top:9px;left:100%}.breadcrumb-inverse>li+li:before{margin-top:-7px;border-left:7px solid;border-left-color:#666}.breadcrumb-inverse>li+li:after{margin-top:-5px;border-left:5px solid #393832}.breadcrumb-inverse>li+li:after,.breadcrumb-inverse>li+li:before{left:-16px}.breadcrumb-inverse>li>a{color:#999}.breadcrumb-inverse>li>a:hover{color:#fff}.breadcrumb-inverse>.active,.breadcrumb-inverse>.active>a{color:#fff}.breadcrumb-sm{padding:4px 15px;background-color:#fff;border-bottom:1px solid #ebebeb}.breadcrumb-sm.breadcrumb-inverse{background-color:#393832}.pagination{margin:18px 0;border-radius:2px}.pagination>li>a,.pagination>li>span{padding:5px 12px;line-height:1.4;color:#333;background-color:#f3f3f3;border:1px solid #dcdcdc}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:2px;border-bottom-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:2px;border-bottom-right-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#333;background-color:#f5f5f5;border-color:#c6c6c6;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.pagination>li>a:active{background-color:#f4f4f4;background-image:-webkit-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f6f6f6),to(#f1f1f1));background-image:linear-gradient(to bottom,#f6f6f6 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f6f6',endColorstr='#fff1f1f1',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{color:#4d90fe;background-color:#f5f5f5;border-color:#c6c6c6;-webkit-box-shadow:none;box-shadow:none}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#b3b3b3;text-shadow:none;background-color:#f3f3f3;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:linear-gradient(to bottom,#f5f5f5 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff1f1f1',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#d9d9d9;-webkit-box-shadow:none;box-shadow:none}.pagination-lg>li>a,.pagination-lg>li>span{padding:9px 14px;font-size:14px;line-height:1.3}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:1px;border-bottom-left-radius:1px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:1px;border-bottom-right-radius:1px}.pagination-sm>li>a,.pagination-sm>li>span{padding:3px 8px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:1px;border-bottom-left-radius:1px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:1px;border-bottom-right-radius:1px}.pager{margin:18px 0}.pager li>a,.pager li>span{padding:11px 24px;overflow:visible;font-size:14px;color:#777;text-decoration:none;white-space:nowrap;cursor:default;background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #5b5b5b;border:1px solid rgba(0,0,0,.1);border-radius:2px;outline:0;-webkit-box-shadow:0 2px 1px rgba(0,0,0,.1),0 0 1px rgba(0,0,0,.1);box-shadow:0 2px 1px rgba(0,0,0,.1),0 0 1px rgba(0,0,0,.1)}.pager li>a:focus,.pager li>a:hover{color:#444;background-color:#fff}.pager li>a:active{color:#444;background-color:#fff}.pager li .icon-prev{position:relative;display:inline-block;padding-right:8px}.pager li .icon-prev:before{border-radius:5px}.pager li .icon-prev:after,.pager li .icon-prev:before{position:absolute;width:0;height:0;content:""}.pager li .icon-prev:before{border:7px solid transparent}.pager li .icon-prev:after{border:4px solid transparent}.pager li .icon-prev:after,.pager li .icon-prev:before{top:-5px;right:100%}.pager li .icon-prev:before{margin-top:-7px;border-right:7px solid;border-right-color:inherit}.pager li .icon-prev:after{margin-top:-4px;border-right:4px solid #fff}.pager li .icon-next{position:relative;display:inline-block;padding-left:8px}.pager li .icon-next:before{border-radius:5px}.pager li .icon-next:after,.pager li .icon-next:before{position:absolute;width:0;height:0;content:""}.pager li .icon-next:before{border:7px solid transparent}.pager li .icon-next:after{border:4px solid transparent}.pager li .icon-next:after,.pager li .icon-next:before{top:-5px;left:100%}.pager li .icon-next:before{margin-top:-7px;border-left:7px solid;border-left-color:inherit}.pager li .icon-next:after{margin-top:-4px;border-left:4px solid #fff}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#b3b3b3;background-color:#fafafa;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-color:#d9d9d9;-webkit-box-shadow:none;box-shadow:none}.pager .disabled .icon-prev{position:relative;display:inline-block;padding-right:8px}.pager .disabled .icon-prev:before{border-radius:5px}.pager .disabled .icon-prev:after,.pager .disabled .icon-prev:before{position:absolute;width:0;height:0;content:""}.pager .disabled .icon-prev:before{border:7px solid transparent}.pager .disabled .icon-prev:after{border:4px solid transparent}.pager .disabled .icon-prev:after,.pager .disabled .icon-prev:before{top:-5px;right:100%}.pager .disabled .icon-prev:before{margin-top:-7px;border-right:7px solid;border-right-color:#b3b3b3}.pager .disabled .icon-prev:after{margin-top:-4px;border-right:4px solid #fafafa}.pager .disabled .icon-next{position:relative;display:inline-block;padding-left:8px}.pager .disabled .icon-next:before{border-radius:5px}.pager .disabled .icon-next:after,.pager .disabled .icon-next:before{position:absolute;width:0;height:0;content:""}.pager .disabled .icon-next:before{border:7px solid transparent}.pager .disabled .icon-next:after{border:4px solid transparent}.pager .disabled .icon-next:after,.pager .disabled .icon-next:before{top:-5px;left:100%}.pager .disabled .icon-next:before{margin-top:-7px;border-left:7px solid;border-left-color:#b3b3b3}.pager .disabled .icon-next:after{margin-top:-4px;border-left:4px solid #fafafa}.label{font-size:80%;border-radius:0}.label-default{background-color:#999}.label-default[href]:focus,.label-default[href]:hover{background-color:grey}.label-primary{background-color:#4d90fe}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#1a70fe}.label-success{background-color:#35aa47}.label-success[href]:focus,.label-success[href]:hover{background-color:#298337}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#faa937}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#f89306}.label-danger{background-color:#d84a38}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#b93524}.badge{font-size:12px}.btn-group-xs>.btn .badge,.btn-xs .badge{font-size:11px}.list-group-item.active>.badge,li.list-group-item.active a>.badge{color:#fff;background-color:#dd4b39}.nav-pills>.active>a>.badge{color:#15c;background-color:#fff}.jumbotron{color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{font-size:20px}.container .jumbotron,.container-fluid .jumbotron{border-radius:1px}@media screen and (min-width:768px){.jumbotron .h1,.jumbotron h1{font-size:59px}}.thumbnail{display:block;padding:0;margin-bottom:18px;line-height:1.4;background-color:#fff;border:1px solid #fff;border-radius:0}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#fff;-webkit-box-shadow:0 0 0 1px #dedede;box-shadow:0 0 0 1px #dedede}.thumbnail .caption{padding:9px 4px;color:#000}.alert{padding:8px;margin-bottom:18px;border-radius:2px}.alert .alert-link{font-weight:700}.alert-dismissable,.alert-dismissible{padding-right:28px}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#a3d48e}.alert-success hr{border-top-color:#93cd7c}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#85c5e5}.alert-info hr{border-top-color:#70bbe1}.alert-info .alert-link{color:#245269}.alert-warning{color:#333;background-color:#f9edbe;border-color:#f0c36d}.alert-warning hr{border-top-color:#eeb956}.alert-warning .alert-link{color:#1a1a1a}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#d59595}.alert-danger hr{border-top-color:#ce8383}.alert-danger .alert-link{color:#843534}.alert-danger,.alert-info,.alert-success,.alert-warning{text-shadow:0 1px 0 rgba(255,255,255,.5)}.progress{height:14px;height:18px;padding:1px;margin-bottom:18px;font-size:12px;background-color:transparent;background-image:none;border:1px solid #999;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.progress-bar{line-height:1.25;background-color:#6188f5;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar-success{background-color:#2f973f}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#53bddc}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#fbb450}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c13e2c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group-item{color:#222;background-color:#fff;border:1px solid #e5e5e5}.list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group-item:last-child{border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item .dropdown{display:none}.list-group-item .dropdown-toggle{display:inline-block;padding:5px 6px 5px 5px;color:#222}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{font-weight:700;color:#dd4b39;background-color:transparent;border-color:#e5e5e5;border-left:4px solid #dd4b39;border-left-color:#dd4b39}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{font-weight:400;color:#888}.list-group-item.active:focus,.list-group-item.active:hover{background-color:#eee}a.list-group-item:focus,a.list-group-item:hover,li.list-group-item a:focus,li.list-group-item a:hover{color:#555;text-decoration:none;background-color:#eee}li.list-group-item{padding:0;margin-bottom:0;border:0 none}li.list-group-item>a{display:block;padding:5px 17px;margin:0 0 0 14px;color:#222}li.list-group-item.active,li.list-group-item.active:focus,li.list-group-item.active:hover{background-color:transparent}li.list-group-item.active:focus>a,li.list-group-item.active:hover>a,li.list-group-item.active>a{margin-left:10px;color:#dd4b39}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#333;background-color:#f9edbe}a.list-group-item-warning,button.list-group-item-warning{color:#333}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#333;background-color:#f7e7a7}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#333;border-color:#333}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-wrapper{margin-left:14px}.list-group-item-wrapper:hover>.dropdown{display:block}.list-group-item-wrapper>a{display:block;padding:5px 17px;margin:0;color:#222}.list-group-item-wrapper>.dropdown:hover+a{background-color:#eee}.list-group-item-wrapper>.dropdown.open{display:block}.list-group-item-wrapper>.dropdown.open+a{background-color:#eee}.list-group-item-wrapper>.dropdown>.dropdown-menu{margin-top:0}.list-group-header{display:block;padding:10px 30px 10px 15px;font-size:11px;font-weight:700;line-height:1.4;color:#999;text-shadow:0 1px 0 rgba(255,255,255,.5);text-transform:uppercase}li.list-group-header{padding:3px 15px}.list-group .list-group-header{margin-top:9px}.list-group-item-menu{padding:0;margin:0;border:0 none;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.list-group-item-menu .list-group-item-wrapper>a{padding-left:30px}.list-group-item-menu .list-group-item-menu .list-group-item-wrapper>a{padding-left:44px}.list-group-item-menu>.list-group-item .collapse-caret{margin-left:28px}.collapse-caret{position:absolute;z-index:1;display:inline-block;width:17px;height:28px;margin-left:14px}.collapse-caret:before{position:absolute;top:12px;left:5px;margin-left:0;content:'';border-bottom:0 dotted}.collapse-caret:hover{background-color:#eee}.collapse-caret.collapsed:before{top:10px;left:6px}.list-group .divider{height:1px;margin:8px 0;margin-right:15px;margin-left:15px;overflow:hidden;background-color:#e5e5e5}.panel{word-wrap:break-word;background-color:#fff;border:1px solid transparent;border-bottom-width:2px;border-radius:3px;-webkit-box-shadow:none;box-shadow:none}.panel-body{padding:15px 20px}.panel-heading{padding:15px 20px;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{font-size:16px}.panel-footer{padding:15px 20px;background-color:#f8f8f8;border-top:1px solid #e5e5e5;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{padding:15px 20px;padding-top:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px 20px;padding-left:15px 20px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:2px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:2px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel-default{border-color:#d8d8d8}.panel-default>.panel-heading{color:#333;background-color:#fff;border-color:#fff}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d8d8d8}.panel-default>.panel-heading .badge{color:#fff;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d8d8d8}.panel-primary{border-color:#4d90fe}.panel-primary>.panel-heading{color:#fff;background-color:#4d90fe;border-color:#4d90fe}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#4d90fe}.panel-primary>.panel-heading .badge{color:#4d90fe;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#4d90fe}.panel-success{border-color:#a3d48e}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#a3d48e}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#a3d48e}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#a3d48e}.panel-info{border-color:#85c5e5}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#85c5e5}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#85c5e5}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#85c5e5}.panel-warning{border-color:#f0c36d}.panel-warning>.panel-heading{color:#333;background-color:#f9edbe;border-color:#f0c36d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f0c36d}.panel-warning>.panel-heading .badge{color:#f9edbe;background-color:#333}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f0c36d}.panel-danger{border-color:#d59595}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#d59595}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d59595}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d59595}.panel-group{margin-bottom:18px}.panel-group .panel{border-color:transparent;border-radius:0}.panel-group .panel+.panel{margin-top:-3px}.panel-group .panel-heading{padding:0 15px;background-color:#fafafa;border-top:1px dashed #ccc;border-bottom:1px dashed #ccc}.panel-group .panel-heading a{display:block;padding:10px 0 9px;color:#444;text-decoration:none}.panel-group .panel-heading a:before{margin-right:7px;content:"\e082"}.panel-group .panel-heading a:hover{background-color:#f5f5f5}.panel-group .panel-heading a:focus{outline:0}.panel-group .panel-heading a.collapsed:before{margin-right:7px;content:"\e081"}.panel-group .panel-heading .panel-title{font-size:13px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:0 none}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:0 none}.well{background-color:#f1f1f1;border:1px solid #e5e5e5;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.well-lg{border-radius:0}.well-sm{border-radius:0}.scrollable::-webkit-scrollbar{width:10px;height:16px}.scrollable::-webkit-scrollbar:hover{background-color:#f3f3f3;border:1px solid #dbdbdb}.scrollable::-webkit-scrollbar-button:end:increment,.scrollable::-webkit-scrollbar-button:start:decrement{display:block;height:0;background-color:transparent}.scrollable::-webkit-scrollbar-track{-webkit-background-clip:padding-box;background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}.scrollable::-webkit-scrollbar-track-piece{background-color:transparent;border-radius:0}.scrollable::-webkit-scrollbar-thumb{background-color:#515151;background-color:rgba(0,0,0,.2);-webkit-background-clip:padding-box;background-clip:padding-box;border:solid transparent;border-width:0;-webkit-box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07);box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}.scrollable::-webkit-scrollbar-thumb:hover{background-color:#949494}.scrollable::-webkit-scrollbar-thumb:active{background-color:#3b3b3b;background-color:rgba(0,0,0,.5);-webkit-box-shadow:inset 1px 1px 3px rgba(0,0,0,.35);box-shadow:inset 1px 1px 3px rgba(0,0,0,.35)}.scrollable::-webkit-scrollbar-thumb:horizontal,.scrollable::-webkit-scrollbar-thumb:vertical{background-color:#c6c6c6;border-radius:0}.modal-content{color:#222;border:1px solid #aaa;border:1px solid rgba(0,0,0,.333);border-radius:0;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2)}.modal-backdrop{background-color:#fff}.modal-header .close{font-weight:400;filter:alpha(opacity=40);opacity:.4}.modal-body{padding:15px}.tooltip{font-family:Arial,Helvetica,sans-serif;font-size:11px;font-style:normal;font-weight:400;font-weight:700;line-height:1.4;line-height:1.25;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-break:break-word;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto}.tooltip.in{filter:alpha(opacity=100);opacity:1}.tooltip-inner{padding:7px 9px;background-color:#2a2a2a;border:1px solid #fff;border-radius:0}.tooltip-arrow:before{position:absolute;z-index:-1;content:" ";border:7px solid transparent}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:1px;border-top-color:#2a2a2a}.tooltip.top .tooltip-arrow:before,.tooltip.top-left .tooltip-arrow:before,.tooltip.top-right .tooltip-arrow:before{top:-5px;left:-7px;border-top-color:#fff;border-bottom:0 dotted}.tooltip.right .tooltip-arrow{left:1px;border-right-color:#2a2a2a}.tooltip.right .tooltip-arrow:before{top:-7px;right:-5px;border-right-color:#fff;border-left:0 dotted}.tooltip.left .tooltip-arrow{right:1px;border-left-color:#2a2a2a}.tooltip.left .tooltip-arrow:before{top:-7px;left:-5px;border-right:0 dotted;border-left-color:#fff}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{top:1px;border-bottom-color:#2a2a2a}.tooltip.bottom .tooltip-arrow:before,.tooltip.bottom-left .tooltip-arrow:before,.tooltip.bottom-right .tooltip-arrow:before{bottom:-5px;left:-7px;border-top:0 dotted;border-bottom-color:#fff}.popover{padding:0;font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-weight:400;line-height:1.4;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;border-radius:2px;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.2);box-shadow:0 2px 10px rgba(0,0,0,.2);line-break:auto}.popover-footer,.popover-title{padding:10px;font-size:13px;background-color:#f5f5f5;border-bottom:1px solid #ccc;border-bottom:1px solid rgba(0,0,0,.2);border-radius:0}.popover-footer{border-top:1px solid #ccc;border-top:1px solid rgba(0,0,0,.2);border-bottom:none}.popover-content{padding:10px}.carousel{width:100%;padding:50px;overflow:hidden;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#eee 0,#f5f5f5 100%),-webkit-linear-gradient(bottom,#eee 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#eee 0,#f5f5f5 100%),-o-linear-gradient(bottom,#eee 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#f5f5f5)),-webkit-gradient(linear,left bottom,left top,from(#eee),to(#f5f5f5));background-image:linear-gradient(to bottom,#eee 0,#f5f5f5 100%),linear-gradient(to top,#eee 0,#f5f5f5 100%);background-repeat:no-repeat;background-position:0 0,0 100%;-webkit-background-size:100% 10px;background-size:100% 10px}.carousel-control{width:100px;color:#777;text-shadow:none;filter:alpha(opacity=33);opacity:.33}.carousel-control.left{background-image:none}.carousel-control.right{background-image:none}.carousel-control:focus,.carousel-control:hover{color:#777}.carousel-control .icon-next:before,.carousel-control .icon-prev:before{content:''}.carousel-control .icon-prev{position:relative;position:absolute;right:0;display:inline-block}.carousel-control .icon-prev:before{border-radius:20px}.carousel-control .icon-prev:after,.carousel-control .icon-prev:before{position:absolute;width:0;height:0;content:""}.carousel-control .icon-prev:before{border:22px solid transparent}.carousel-control .icon-prev:after{border:19px solid transparent}.carousel-control .icon-prev:after,.carousel-control .icon-prev:before{top:8px;right:100%}.carousel-control .icon-prev:before{margin-top:-22px;border-right:22px solid;border-right-color:#777}.carousel-control .icon-prev:after{margin-top:-19px;border-right:19px solid #f5f5f5}.carousel-control .icon-next{position:relative;position:absolute;right:0;left:50%;display:inline-block}.carousel-control .icon-next:before{border-radius:20px}.carousel-control .icon-next:after,.carousel-control .icon-next:before{position:absolute;width:0;height:0;content:""}.carousel-control .icon-next:before{border:22px solid transparent}.carousel-control .icon-next:after{border:19px solid transparent}.carousel-control .icon-next:after,.carousel-control .icon-next:before{top:8px;left:100%}.carousel-control .icon-next:before{margin-top:-22px;border-left:22px solid;border-left-color:#777}.carousel-control .icon-next:after{margin-top:-19px;border-left:19px solid #f5f5f5}.carousel-control .icon-next:after,.carousel-control .icon-next:before{left:50%}.carousel-indicators{bottom:5px;left:0;width:100%;margin-left:0}.carousel-indicators li{background-color:#c2c2c2;border:1px solid #c2c2c2}.carousel-indicators .active{width:10px;height:10px;margin:1px;background-color:#444;border:1px solid #444}.carousel-caption{right:0;bottom:0;left:0;padding:10px;color:#fff;text-shadow:none;background-color:#262626;background-color:rgba(0,0,0,.55)}body{padding-top:40px;padding-bottom:40px;background-color:#fff}.form-signin{max-width:330px;padding:15px;margin:0 auto}.form-signin-heading{margin:0 0 15px;font-size:18px;font-weight:400;color:#555}.form-signin .checkbox{margin-bottom:10px;font-weight:normal}.form-signin .form-control{position:relative;height:auto;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px;font-size:16px}.form-signin .form-control:focus{z-index:2}.form-signin input[type="email"]{margin-bottom:10px}.form-signin input[type="password"]{margin-bottom:10px}.card{width:304px;padding:20px 25px 30px;margin:0 auto 25px;background-color:#f7f7f7;border-radius:2px;-webkit-box-shadow:0 2px 2px rgba(0,0,0,.3);box-shadow:0 2px 2px rgba(0,0,0,.3)}.card-signin{width:354px;padding:40px}.card-signin .profile-img{display:block;width:96px;height:96px;margin:0 auto 10px} \ No newline at end of file diff --git a/src/collectedstatic/CACHE/js/output.b8b0e63f5d49.js b/src/collectedstatic/CACHE/js/output.b8b0e63f5d49.js new file mode 100644 index 0000000..02b1c1d --- /dev/null +++ b/src/collectedstatic/CACHE/js/output.b8b0e63f5d49.js @@ -0,0 +1,26 @@ +/*! + * IE10 viewport hack for Surface/desktop Windows 8 bug + * Copyright 2014-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */(function(){'use strict';if(navigator.userAgent.match(/IEMobile\/10\.0/)){var msViewportStyle=document.createElement('style') +msViewportStyle.appendChild(document.createTextNode('@-ms-viewport{width:auto!important}')) +document.querySelector('head').appendChild(msViewportStyle)}})();;/*! + * Copyright 2014-2015 Twitter, Inc. + * + * Licensed under the Creative Commons Attribution 3.0 Unported License. For + * details, see https://creativecommons.org/licenses/by/3.0/. + */(function(){'use strict';function emulatedIEMajorVersion(){var groups=/MSIE ([0-9.]+)/.exec(window.navigator.userAgent) +if(groups===null){return null} +var ieVersionNum=parseInt(groups[1],10) +var ieMajorVersion=Math.floor(ieVersionNum) +return ieMajorVersion} +function actualNonEmulatedIEMajorVersion(){var jscriptVersion=new Function('/*@cc_on return @_jscript_version; @*/')() +if(jscriptVersion===undefined){return 11} +if(jscriptVersion<9){return 8} +return jscriptVersion} +var ua=window.navigator.userAgent +if(ua.indexOf('Opera')>-1||ua.indexOf('Presto')>-1){return} +var emulated=emulatedIEMajorVersion() +if(emulated===null){return} +var nonEmulated=actualNonEmulatedIEMajorVersion() +if(emulated!==nonEmulated){window.alert('WARNING: You appear to be using IE'+nonEmulated+' in IE'+emulated+' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!')}})();; \ No newline at end of file diff --git a/src/collectedstatic/CACHE/js/output.bc55ccd28723.js b/src/collectedstatic/CACHE/js/output.bc55ccd28723.js new file mode 100644 index 0000000..7bb9905 --- /dev/null +++ b/src/collectedstatic/CACHE/js/output.bc55ccd28723.js @@ -0,0 +1,36 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
'};NProgress.configure=function(options){var key,value;for(key in options){value=options[key];if(value!==undefined&&options.hasOwnProperty(key))Settings[key]=value;} +return this;};NProgress.status=null;NProgress.set=function(n){var started=NProgress.isStarted();n=clamp(n,Settings.minimum,1);NProgress.status=(n===1?null:n);var progress=NProgress.render(!started),bar=progress.querySelector(Settings.barSelector),speed=Settings.speed,ease=Settings.easing;progress.offsetWidth;queue(function(next){if(Settings.positionUsing==='')Settings.positionUsing=NProgress.getPositioningCSS();css(bar,barPositionCSS(n,speed,ease));if(n===1){css(progress,{transition:'none',opacity:1});progress.offsetWidth;setTimeout(function(){css(progress,{transition:'all '+speed+'ms linear',opacity:0});setTimeout(function(){NProgress.remove();next();},speed);},speed);}else{setTimeout(next,speed);}});return this;};NProgress.isStarted=function(){return typeof NProgress.status==='number';};NProgress.start=function(){if(!NProgress.status)NProgress.set(0);var work=function(){setTimeout(function(){if(!NProgress.status)return;NProgress.trickle();work();},Settings.trickleSpeed);};if(Settings.trickle)work();return this;};NProgress.done=function(force){if(!force&&!NProgress.status)return this;return NProgress.inc(0.3+0.5*Math.random()).set(1);};NProgress.inc=function(amount){var n=NProgress.status;if(!n){return NProgress.start();}else if(n>1){}else{if(typeof amount!=='number'){if(n>=0&&n<0.2){amount=0.1;} +else if(n>=0.2&&n<0.5){amount=0.04;} +else if(n>=0.5&&n<0.8){amount=0.02;} +else if(n>=0.8&&n<0.99){amount=0.005;} +else{amount=0;}} +n=clamp(n+amount,0,0.994);return NProgress.set(n);}};NProgress.trickle=function(){return NProgress.inc();};(function(){var initial=0,current=0;NProgress.promise=function($promise){if(!$promise||$promise.state()==="resolved"){return this;} +if(current===0){NProgress.start();} +initial++;current++;$promise.always(function(){current--;if(current===0){initial=0;NProgress.done();}else{NProgress.set((initial-current)/initial);}});return this;};})();NProgress.render=function(fromStart){if(NProgress.isRendered())return document.getElementById('nprogress');addClass(document.documentElement,'nprogress-busy');var progress=document.createElement('div');progress.id='nprogress';progress.innerHTML=Settings.template;var bar=progress.querySelector(Settings.barSelector),perc=fromStart?'-100':toBarPerc(NProgress.status||0),parent=document.querySelector(Settings.parent),spinner;css(bar,{transition:'all 0 linear',transform:'translate3d('+perc+'%,0,0)'});if(!Settings.showSpinner){spinner=progress.querySelector(Settings.spinnerSelector);spinner&&removeElement(spinner);} +if(parent!=document.body){addClass(parent,'nprogress-custom-parent');} +parent.appendChild(progress);return progress;};NProgress.remove=function(){removeClass(document.documentElement,'nprogress-busy');removeClass(document.querySelector(Settings.parent),'nprogress-custom-parent');var progress=document.getElementById('nprogress');progress&&removeElement(progress);};NProgress.isRendered=function(){return!!document.getElementById('nprogress');};NProgress.getPositioningCSS=function(){var bodyStyle=document.body.style;var vendorPrefix=('WebkitTransform'in bodyStyle)?'Webkit':('MozTransform'in bodyStyle)?'Moz':('msTransform'in bodyStyle)?'ms':('OTransform'in bodyStyle)?'O':'';if(vendorPrefix+'Perspective'in bodyStyle){return'translate3d';}else if(vendorPrefix+'Transform'in bodyStyle){return'translate';}else{return'margin';}};function clamp(n,min,max){if(nmax)return max;return n;} +function toBarPerc(n){return(-1+n)*100;} +function barPositionCSS(n,speed,ease){var barCSS;if(Settings.positionUsing==='translate3d'){barCSS={transform:'translate3d('+toBarPerc(n)+'%,0,0)'};}else if(Settings.positionUsing==='translate'){barCSS={transform:'translate('+toBarPerc(n)+'%,0)'};}else{barCSS={'margin-left':toBarPerc(n)+'%'};} +barCSS.transition='all '+speed+'ms '+ease;return barCSS;} +var queue=(function(){var pending=[];function next(){var fn=pending.shift();if(fn){fn(next);}} +return function(fn){pending.push(fn);if(pending.length==1)next();};})();var css=(function(){var cssPrefixes=['Webkit','O','Moz','ms'],cssProps={};function camelCase(string){return string.replace(/^-ms-/,'ms-').replace(/-([\da-z])/gi,function(match,letter){return letter.toUpperCase();});} +function getVendorProp(name){var style=document.body.style;if(name in style)return name;var i=cssPrefixes.length,capName=name.charAt(0).toUpperCase()+name.slice(1),vendorName;while(i--){vendorName=cssPrefixes[i]+capName;if(vendorName in style)return vendorName;} +return name;} +function getStyleProp(name){name=camelCase(name);return cssProps[name]||(cssProps[name]=getVendorProp(name));} +function applyCss(element,prop,value){prop=getStyleProp(prop);element.style[prop]=value;} +return function(element,properties){var args=arguments,prop,value;if(args.length==2){for(prop in properties){value=properties[prop];if(value!==undefined&&properties.hasOwnProperty(prop))applyCss(element,prop,value);}}else{applyCss(element,args[1],args[2]);}}})();function hasClass(element,name){var list=typeof element=='string'?element:classList(element);return list.indexOf(' '+name+' ')>=0;} +function addClass(element,name){var oldList=classList(element),newList=oldList+name;if(hasClass(oldList,name))return;element.className=newList.substring(1);} +function removeClass(element,name){var oldList=classList(element),newList;if(!hasClass(element,name))return;newList=oldList.replace(' '+name+' ',' ');element.className=newList.substring(1,newList.length-1);} +function classList(element){return(' '+(element&&element.className||'')+' ').replace(/\s+/gi,' ');} +function removeElement(element){element&&element.parentNode&&element.parentNode.removeChild(element);} +return NProgress;});;function do_reply(parentid){console.log(parentid);$("#id_parent_comment_id").val(parentid) +$("#commentform").appendTo($("#div-comment-"+parentid));$("#reply-title").hide();$("#cancel_comment").show();} +function cancel_reply(){$("#reply-title").show();$("#cancel_comment").hide();$("#id_parent_comment_id").val('') +$("#commentform").appendTo($("#respond"));} +NProgress.start();NProgress.set(0.4);var interval=setInterval(function(){NProgress.inc();},1000);$(document).ready(function(){NProgress.done();clearInterval(interval);});var rocket=$('#rocket');$(window).on('scroll',debounce(slideTopSet,300));function debounce(func,wait){var timeout;return function(){clearTimeout(timeout);timeout=setTimeout(func,wait);};} +function slideTopSet(){var top=$(document).scrollTop();if(top>200){rocket.addClass('show');}else{rocket.removeClass('show');}} +$(document).on('click','#rocket',function(event){rocket.addClass('move');$('body, html').animate({scrollTop:0},800);});$(document).on('animationEnd',function(){setTimeout(function(){rocket.removeClass('move');},400);});$(document).on('webkitAnimationEnd',function(){setTimeout(function(){rocket.removeClass('move');},400);});window.onload=function(){var replyLinks=document.querySelectorAll(".comment-reply-link");for(var i=0;i a, .page_item_has_children > a',function(e){var el=$(this).parent('li');if(!el.hasClass('focus')){e.preventDefault();el.toggleClass('focus');el.siblings('.focus').removeClass('focus');}});}})(jQuery);;$(function(){MathJax.Hub.Config({showProcessingMessages:false,messageStyle:"none",extensions:["tex2jax.js"],jax:["input/TeX","output/HTML-CSS"],displayAlign:"left",tex2jax:{inlineMath:[["$","$"]],displayMath:[["$$","$$"]],skipTags:['script','noscript','style','textarea','pre','code','a'],},"HTML-CSS":{availableFonts:["STIX","TeX"],showMathMenu:false}});const contentId=document.getElementById("content");const commentId=document.getElementById("comments");MathJax.Hub.Queue(["Typeset",MathJax.Hub,contentId,commentId]);}); \ No newline at end of file diff --git a/src/collectedstatic/CACHE/manifest.json b/src/collectedstatic/CACHE/manifest.json new file mode 100644 index 0000000..71afea6 --- /dev/null +++ b/src/collectedstatic/CACHE/manifest.json @@ -0,0 +1,6 @@ +{ + "e33c03e5cececc24214f8c70d7bfaf0079144308b8384c2b99378574a030b9a3": "", + "602f536ee15494b2c004d9caae6d729f444aeae603707972c22cb7085ef69aa8": "", + "8efb09bae7df3f7f0c86c3573cd92622e620c23d356cee88d602cc06cd8ba0a5": "", + "2e8e3574500075700cfa894c402675e08c87a3b71b31ed7d0002d493a526bcc8": "" +} \ No newline at end of file diff --git a/src/collectedstatic/account/css/account.css b/src/collectedstatic/account/css/account.css new file mode 100644 index 0000000..7d4cec7 --- /dev/null +++ b/src/collectedstatic/account/css/account.css @@ -0,0 +1,9 @@ +.button { + border: none; + padding: 4px 80px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 16px; + margin: 4px 2px; +} \ No newline at end of file diff --git a/src/collectedstatic/account/js/account.js b/src/collectedstatic/account/js/account.js new file mode 100644 index 0000000..51eea35 --- /dev/null +++ b/src/collectedstatic/account/js/account.js @@ -0,0 +1,55 @@ +let wait = 60; // 倒计时总时长(60秒) + +function time(o) { + if (wait == 0) { + // 倒计时结束:恢复按钮状态 + o.removeAttribute("disabled"); + o.value = "获取验证码"; + wait = 60 + return false + } else { + o.setAttribute("disabled", true); + o.value = "重新发送(" + wait + ")"; + wait--; + // 1秒后再次调用time函数,实现倒计时循环 + setTimeout(function () { + time(o) + }, + 1000) + } +} +// 给id为"btn"的按钮绑定点击事件 +document.getElementById("btn").onclick = function () { + let id_email = $("#id_email") // 获取输入邮箱的DOM元素(jQuery选择器) + let token = $("*[name='csrfmiddlewaretoken']").val() + let ts = this // 保存当前按钮的引用(后续传给倒计时函数) + let myErr = $("#myErr") // 获取错误提示元素 + // 发送AJAX请求到后端 + $.ajax( + { + url: "/forget_password_code/", + type: "POST", + data: { + "email": id_email.val(), + "csrfmiddlewaretoken": token + }, + success: function (result) { + // 后端响应成功的处理 + if (result != "ok") { + // 后端返回错误信息(如邮箱格式错误) + myErr.remove() + id_email.after("
  • " + result + "
") + // 在邮箱输入框后添加新的错误提示 + return + } + // 后端返回"ok"(验证码发送成功) + myErr.remove() // 清除可能存在的错误提示 + time(ts) // 调用倒计时函数,让按钮进入倒计时状态 + }, + error: function (e) { + // 请求失败的处理(如网络错误) + alert("发送失败,请重试") + } + } + ); +} diff --git a/src/collectedstatic/admin/css/autocomplete.css b/src/collectedstatic/admin/css/autocomplete.css new file mode 100644 index 0000000..7478c2c --- /dev/null +++ b/src/collectedstatic/admin/css/autocomplete.css @@ -0,0 +1,279 @@ +select.admin-autocomplete { + width: 20em; +} + +.select2-container--admin-autocomplete.select2-container { + min-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single, +.select2-container--admin-autocomplete .select2-selection--multiple { + min-height: 30px; + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection, +.select2-container--admin-autocomplete.select2-container--open .select2-selection { + border-color: var(--body-quiet-color); + min-height: 30px; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-selection--single { + background-color: var(--body-bg); + border: 1px solid var(--border-color); + border-radius: 4px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { + color: var(--body-fg); + line-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { + color: var(--body-quiet-color); +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { + background-color: var(--darkened-bg); + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple { + background-color: var(--body-bg); + border: 1px solid var(--border-color); + border-radius: 4px; + cursor: text; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 10px 5px 5px; + width: 100%; + display: flex; + flex-wrap: wrap; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { + color: var(--body-quiet-color); + margin-top: 5px; + float: left; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin: 5px; + position: absolute; + right: 0; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { + background-color: var(--darkened-bg); + border: 1px solid var(--border-color); + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { + color: var(--body-quiet-color); + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { + color: var(--body-fg); +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { + border: solid var(--body-quiet-color) 1px; + outline: 0; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { + background-color: var(--darkened-bg); + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--admin-autocomplete .select2-search--dropdown { + background: var(--darkened-bg); +} + +.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { + background: var(--body-bg); + color: var(--body-fg); + border: 1px solid var(--border-color); + border-radius: 4px; +} + +.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { + background: transparent; + color: var(--body-fg); + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; +} + +.select2-container--admin-autocomplete .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; + color: var(--body-fg); + background: var(--body-bg); +} + +.select2-container--admin-autocomplete .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { + color: var(--body-quiet-color); +} + +.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { + background-color: var(--selected-bg); + color: var(--body-fg); +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { + background-color: var(--primary); + color: var(--primary-fg); +} + +.select2-container--admin-autocomplete .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.errors .select2-selection { + border: 1px solid var(--error-fg); +} diff --git a/src/collectedstatic/admin/css/base.css b/src/collectedstatic/admin/css/base.css new file mode 100644 index 0000000..3791043 --- /dev/null +++ b/src/collectedstatic/admin/css/base.css @@ -0,0 +1,1180 @@ +/* + DJANGO Admin styles +*/ + +/* VARIABLE DEFINITIONS */ +html[data-theme="light"], +:root { + --primary: #79aec8; + --secondary: #417690; + --accent: #f5dd5d; + --primary-fg: #fff; + + --body-fg: #333; + --body-bg: #fff; + --body-quiet-color: #666; + --body-medium-color: #444; + --body-loud-color: #000; + + --header-color: #ffc; + --header-branding-color: var(--accent); + --header-bg: var(--secondary); + --header-link-color: var(--primary-fg); + + --breadcrumbs-fg: #c4dce8; + --breadcrumbs-link-fg: var(--body-bg); + --breadcrumbs-bg: #264b5d; + + --link-fg: #417893; + --link-hover-color: #036; + --link-selected-fg: var(--secondary); + + --hairline-color: #e8e8e8; + --border-color: #ccc; + + --error-fg: #ba2121; + + --message-success-bg: #dfd; + --message-warning-bg: #ffc; + --message-error-bg: #ffefef; + + --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */ + --selected-bg: #e4e4e4; /* E.g. selected table cells */ + --selected-row: #ffc; + + --button-fg: #fff; + --button-bg: var(--secondary); + --button-hover-bg: #205067; + --default-button-bg: #205067; + --default-button-hover-bg: var(--secondary); + --close-button-bg: #747474; + --close-button-hover-bg: #333; + --delete-button-bg: #ba2121; + --delete-button-hover-bg: #a41515; + + --object-tools-fg: var(--button-fg); + --object-tools-bg: var(--close-button-bg); + --object-tools-hover-bg: var(--close-button-hover-bg); + + --font-family-primary: + "Segoe UI", + system-ui, + Roboto, + "Helvetica Neue", + Arial, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji"; + --font-family-monospace: + ui-monospace, + Menlo, + Monaco, + "Cascadia Mono", + "Segoe UI Mono", + "Roboto Mono", + "Oxygen Mono", + "Ubuntu Monospace", + "Source Code Pro", + "Fira Mono", + "Droid Sans Mono", + "Courier New", + monospace, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji"; + + color-scheme: light; +} + +html, body { + height: 100%; +} + +body { + margin: 0; + padding: 0; + font-size: 0.875rem; + font-family: var(--font-family-primary); + color: var(--body-fg); + background: var(--body-bg); +} + +/* LINKS */ + +a:link, a:visited { + color: var(--link-fg); + text-decoration: none; + transition: color 0.15s, background 0.15s; +} + +a:focus, a:hover { + color: var(--link-hover-color); +} + +a:focus { + text-decoration: underline; +} + +a img { + border: none; +} + +a.section:link, a.section:visited { + color: var(--header-link-color); + text-decoration: none; +} + +a.section:focus, a.section:hover { + text-decoration: underline; +} + +/* GLOBAL DEFAULTS */ + +p, ol, ul, dl { + margin: .2em 0 .8em 0; +} + +p { + padding: 0; + line-height: 140%; +} + +h1,h2,h3,h4,h5 { + font-weight: bold; +} + +h1 { + margin: 0 0 20px; + font-weight: 300; + font-size: 1.25rem; +} + +h2 { + font-size: 1rem; + margin: 1em 0 .5em 0; +} + +h2.subhead { + font-weight: normal; + margin-top: 0; +} + +h3 { + font-size: 0.875rem; + margin: .8em 0 .3em 0; + color: var(--body-medium-color); + font-weight: bold; +} + +h4 { + font-size: 0.75rem; + margin: 1em 0 .8em 0; + padding-bottom: 3px; + color: var(--body-medium-color); +} + +h5 { + font-size: 0.625rem; + margin: 1.5em 0 .5em 0; + color: var(--body-quiet-color); + text-transform: uppercase; + letter-spacing: 1px; +} + +ul > li { + list-style-type: square; + padding: 1px 0; +} + +li ul { + margin-bottom: 0; +} + +li, dt, dd { + font-size: 0.8125rem; + line-height: 1.25rem; +} + +dt { + font-weight: bold; + margin-top: 4px; +} + +dd { + margin-left: 0; +} + +form { + margin: 0; + padding: 0; +} + +fieldset { + margin: 0; + min-width: 0; + padding: 0; + border: none; + border-top: 1px solid var(--hairline-color); +} + +details summary { + cursor: pointer; +} + +blockquote { + font-size: 0.6875rem; + color: #777; + margin-left: 2px; + padding-left: 10px; + border-left: 5px solid #ddd; +} + +code, pre { + font-family: var(--font-family-monospace); + color: var(--body-quiet-color); + font-size: 0.75rem; + overflow-x: auto; +} + +pre.literal-block { + margin: 10px; + background: var(--darkened-bg); + padding: 6px 8px; +} + +code strong { + color: #930; +} + +hr { + clear: both; + color: var(--hairline-color); + background-color: var(--hairline-color); + height: 1px; + border: none; + margin: 0; + padding: 0; + line-height: 1px; +} + +/* TEXT STYLES & MODIFIERS */ + +.small { + font-size: 0.6875rem; +} + +.mini { + font-size: 0.625rem; +} + +.help, p.help, form p.help, div.help, form div.help, div.help li { + font-size: 0.6875rem; + color: var(--body-quiet-color); +} + +div.help ul { + margin-bottom: 0; +} + +.help-tooltip { + cursor: help; +} + +p img, h1 img, h2 img, h3 img, h4 img, td img { + vertical-align: middle; +} + +.quiet, a.quiet:link, a.quiet:visited { + color: var(--body-quiet-color); + font-weight: normal; +} + +.clear { + clear: both; +} + +.nowrap { + white-space: nowrap; +} + +.hidden { + display: none !important; +} + +/* TABLES */ + +table { + border-collapse: collapse; + border-color: var(--border-color); +} + +td, th { + font-size: 0.8125rem; + line-height: 1rem; + border-bottom: 1px solid var(--hairline-color); + vertical-align: top; + padding: 8px; +} + +th { + font-weight: 500; + text-align: left; +} + +thead th, +tfoot td { + color: var(--body-quiet-color); + padding: 5px 10px; + font-size: 0.6875rem; + background: var(--body-bg); + border: none; + border-top: 1px solid var(--hairline-color); + border-bottom: 1px solid var(--hairline-color); +} + +tfoot td { + border-bottom: none; + border-top: 1px solid var(--hairline-color); +} + +thead th.required { + font-weight: bold; +} + +tr.alt { + background: var(--darkened-bg); +} + +tr:nth-child(odd), .row-form-errors { + background: var(--body-bg); +} + +tr:nth-child(even), +tr:nth-child(even) .errorlist, +tr:nth-child(odd) + .row-form-errors, +tr:nth-child(odd) + .row-form-errors .errorlist { + background: var(--darkened-bg); +} + +/* SORTABLE TABLES */ + +thead th { + padding: 5px 10px; + line-height: normal; + text-transform: uppercase; + background: var(--darkened-bg); +} + +thead th a:link, thead th a:visited { + color: var(--body-quiet-color); +} + +thead th.sorted { + background: var(--selected-bg); +} + +thead th.sorted .text { + padding-right: 42px; +} + +table thead th .text span { + padding: 8px 10px; + display: block; +} + +table thead th .text a { + display: block; + cursor: pointer; + padding: 8px 10px; +} + +table thead th .text a:focus, table thead th .text a:hover { + background: var(--selected-bg); +} + +thead th.sorted a.sortremove { + visibility: hidden; +} + +table thead th.sorted:hover a.sortremove { + visibility: visible; +} + +table thead th.sorted .sortoptions { + display: block; + padding: 9px 5px 0 5px; + float: right; + text-align: right; +} + +table thead th.sorted .sortpriority { + font-size: .8em; + min-width: 12px; + text-align: center; + vertical-align: 3px; + margin-left: 2px; + margin-right: 2px; +} + +table thead th.sorted .sortoptions a { + position: relative; + width: 14px; + height: 14px; + display: inline-block; + background: url(../img/sorting-icons.svg) 0 0 no-repeat; + background-size: 14px auto; +} + +table thead th.sorted .sortoptions a.sortremove { + background-position: 0 0; +} + +table thead th.sorted .sortoptions a.sortremove:after { + content: '\\'; + position: absolute; + top: -6px; + left: 3px; + font-weight: 200; + font-size: 1.125rem; + color: var(--body-quiet-color); +} + +table thead th.sorted .sortoptions a.sortremove:focus:after, +table thead th.sorted .sortoptions a.sortremove:hover:after { + color: var(--link-fg); +} + +table thead th.sorted .sortoptions a.sortremove:focus, +table thead th.sorted .sortoptions a.sortremove:hover { + background-position: 0 -14px; +} + +table thead th.sorted .sortoptions a.ascending { + background-position: 0 -28px; +} + +table thead th.sorted .sortoptions a.ascending:focus, +table thead th.sorted .sortoptions a.ascending:hover { + background-position: 0 -42px; +} + +table thead th.sorted .sortoptions a.descending { + top: 1px; + background-position: 0 -56px; +} + +table thead th.sorted .sortoptions a.descending:focus, +table thead th.sorted .sortoptions a.descending:hover { + background-position: 0 -70px; +} + +/* FORM DEFAULTS */ + +input, textarea, select, .form-row p, form .button { + margin: 2px 0; + padding: 2px 3px; + vertical-align: middle; + font-family: var(--font-family-primary); + font-weight: normal; + font-size: 0.8125rem; +} +.form-row div.help { + padding: 2px 3px; +} + +textarea { + vertical-align: top; +} + +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]), input[type=text], input[type=password], input[type=email], +input[type=url], input[type=number], input[type=tel], textarea, select, +.vTextField { + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 5px 6px; + margin-top: 0; + color: var(--body-fg); + background-color: var(--body-bg); +} + +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, +input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, +input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { + border-color: var(--body-quiet-color); +} + +select { + height: 1.875rem; +} + +select[multiple] { + /* Allow HTML size attribute to override the height in the rule above. */ + height: auto; + min-height: 150px; +} + +/* FORM BUTTONS */ + +.button, input[type=submit], input[type=button], .submit-row input, a.button { + background: var(--button-bg); + padding: 10px 15px; + border: none; + border-radius: 4px; + color: var(--button-fg); + cursor: pointer; + transition: background 0.15s; +} + +a.button { + padding: 4px 5px; +} + +.button:active, input[type=submit]:active, input[type=button]:active, +.button:focus, input[type=submit]:focus, input[type=button]:focus, +.button:hover, input[type=submit]:hover, input[type=button]:hover { + background: var(--button-hover-bg); +} + +.button[disabled], input[type=submit][disabled], input[type=button][disabled] { + opacity: 0.4; +} + +.button.default, input[type=submit].default, .submit-row input.default { + border: none; + font-weight: 400; + background: var(--default-button-bg); +} + +.button.default:active, input[type=submit].default:active, +.button.default:focus, input[type=submit].default:focus, +.button.default:hover, input[type=submit].default:hover { + background: var(--default-button-hover-bg); +} + +.button[disabled].default, +input[type=submit][disabled].default, +input[type=button][disabled].default { + opacity: 0.4; +} + + +/* MODULES */ + +.module { + border: none; + margin-bottom: 30px; + background: var(--body-bg); +} + +.module p, .module ul, .module h3, .module h4, .module dl, .module pre { + padding-left: 10px; + padding-right: 10px; +} + +.module blockquote { + margin-left: 12px; +} + +.module ul, .module ol { + margin-left: 1.5em; +} + +.module h3 { + margin-top: .6em; +} + +.module h2, .module caption, .inline-group h2 { + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 0.8125rem; + text-align: left; + background: var(--header-bg); + color: var(--header-link-color); +} + +.module caption, +.inline-group h2 { + font-size: 0.75rem; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +.module table { + border-collapse: collapse; +} + +/* MESSAGES & ERRORS */ + +ul.messagelist { + padding: 0; + margin: 0; +} + +ul.messagelist li { + display: block; + font-weight: 400; + font-size: 0.8125rem; + padding: 10px 10px 10px 65px; + margin: 0 0 10px 0; + background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; + background-size: 16px auto; + color: var(--body-fg); + word-break: break-word; +} + +ul.messagelist li.warning { + background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat; + background-size: 14px auto; +} + +ul.messagelist li.error { + background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat; + background-size: 16px auto; +} + +.errornote { + font-size: 0.875rem; + font-weight: 700; + display: block; + padding: 10px 12px; + margin: 0 0 10px 0; + color: var(--error-fg); + border: 1px solid var(--error-fg); + border-radius: 4px; + background-color: var(--body-bg); + background-position: 5px 12px; + overflow-wrap: break-word; +} + +ul.errorlist { + margin: 0 0 4px; + padding: 0; + color: var(--error-fg); + background: var(--body-bg); +} + +ul.errorlist li { + font-size: 0.8125rem; + display: block; + margin-bottom: 4px; + overflow-wrap: break-word; +} + +ul.errorlist li:first-child { + margin-top: 0; +} + +ul.errorlist li a { + color: inherit; + text-decoration: underline; +} + +td ul.errorlist { + margin: 0; + padding: 0; +} + +td ul.errorlist li { + margin: 0; +} + +.form-row.errors { + margin: 0; + border: none; + border-bottom: 1px solid var(--hairline-color); + background: none; +} + +.form-row.errors ul.errorlist li { + padding-left: 0; +} + +.errors input, .errors select, .errors textarea, +td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { + border: 1px solid var(--error-fg); +} + +.description { + font-size: 0.75rem; + padding: 5px 0 0 12px; +} + +/* BREADCRUMBS */ + +div.breadcrumbs { + background: var(--breadcrumbs-bg); + padding: 10px 40px; + border: none; + color: var(--breadcrumbs-fg); + text-align: left; +} + +div.breadcrumbs a { + color: var(--breadcrumbs-link-fg); +} + +div.breadcrumbs a:focus, div.breadcrumbs a:hover { + color: var(--breadcrumbs-fg); +} + +/* ACTION ICONS */ + +.viewlink, .inlineviewlink { + padding-left: 16px; + background: url(../img/icon-viewlink.svg) 0 1px no-repeat; +} + +.hidelink { + padding-left: 16px; + background: url(../img/icon-hidelink.svg) 0 1px no-repeat; +} + +.addlink { + padding-left: 16px; + background: url(../img/icon-addlink.svg) 0 1px no-repeat; +} + +.changelink, .inlinechangelink { + padding-left: 16px; + background: url(../img/icon-changelink.svg) 0 1px no-repeat; +} + +.deletelink { + padding-left: 16px; + background: url(../img/icon-deletelink.svg) 0 1px no-repeat; +} + +a.deletelink:link, a.deletelink:visited { + color: #CC3434; /* XXX Probably unused? */ +} + +a.deletelink:focus, a.deletelink:hover { + color: #993333; /* XXX Probably unused? */ + text-decoration: none; +} + +/* OBJECT TOOLS */ + +.object-tools { + font-size: 0.625rem; + font-weight: bold; + padding-left: 0; + float: right; + position: relative; + margin-top: -48px; +} + +.object-tools li { + display: block; + float: left; + margin-left: 5px; + height: 1rem; +} + +.object-tools a { + border-radius: 15px; +} + +.object-tools a:link, .object-tools a:visited { + display: block; + float: left; + padding: 3px 12px; + background: var(--object-tools-bg); + color: var(--object-tools-fg); + font-weight: 400; + font-size: 0.6875rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.object-tools a:focus, .object-tools a:hover { + background-color: var(--object-tools-hover-bg); +} + +.object-tools a:focus{ + text-decoration: none; +} + +.object-tools a.viewsitelink, .object-tools a.addlink { + background-repeat: no-repeat; + background-position: right 7px center; + padding-right: 26px; +} + +.object-tools a.viewsitelink { + background-image: url(../img/tooltag-arrowright.svg); +} + +.object-tools a.addlink { + background-image: url(../img/tooltag-add.svg); +} + +/* OBJECT HISTORY */ + +#change-history table { + width: 100%; +} + +#change-history table tbody th { + width: 16em; +} + +#change-history .paginator { + color: var(--body-quiet-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--body-bg); + overflow: hidden; +} + +/* PAGE STRUCTURE */ + +#container { + position: relative; + width: 100%; + min-width: 980px; + padding: 0; + display: flex; + flex-direction: column; + height: 100%; +} + +#container > .main { + display: flex; + flex: 1 0 auto; +} + +.main > .content { + flex: 1 0; + max-width: 100%; +} + +.skip-to-content-link { + position: absolute; + top: -999px; + margin: 5px; + padding: 5px; + background: var(--body-bg); + z-index: 1; +} + +.skip-to-content-link:focus { + left: 0px; + top: 0px; +} + +#content { + padding: 20px 40px; +} + +.dashboard #content { + width: 600px; +} + +#content-main { + float: left; + width: 100%; +} + +#content-related { + float: right; + width: 260px; + position: relative; + margin-right: -300px; +} + +@media (forced-colors: active) { + #content-related { + border: 1px solid; + } +} + +/* COLUMN TYPES */ + +.colMS { + margin-right: 300px; +} + +.colSM { + margin-left: 300px; +} + +.colSM #content-related { + float: left; + margin-right: 0; + margin-left: -300px; +} + +.colSM #content-main { + float: right; +} + +.popup .colM { + width: auto; +} + +/* HEADER */ + +#header { + width: auto; + height: auto; + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 40px; + background: var(--header-bg); + color: var(--header-color); +} + +#header a:link, #header a:visited, #logout-form button { + color: var(--header-link-color); +} + +#header a:focus , #header a:hover { + text-decoration: underline; +} + +@media (forced-colors: active) { + #header { + border-bottom: 1px solid; + } +} + +#branding { + display: flex; +} + +#site-name { + padding: 0; + margin: 0; + margin-inline-end: 20px; + font-weight: 300; + font-size: 1.5rem; + color: var(--header-branding-color); +} + +#site-name a:link, #site-name a:visited { + color: var(--accent); +} + +#branding h2 { + padding: 0 10px; + font-size: 0.875rem; + margin: -8px 0 8px 0; + font-weight: normal; + color: var(--header-color); +} + +#branding a:hover { + text-decoration: none; +} + +#logout-form { + display: inline; +} + +#logout-form button { + background: none; + border: 0; + cursor: pointer; + font-family: var(--font-family-primary); +} + +#user-tools { + float: right; + margin: 0 0 0 20px; + text-align: right; +} + +#user-tools, #logout-form button{ + padding: 0; + font-weight: 300; + font-size: 0.6875rem; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +#user-tools a, #logout-form button { + border-bottom: 1px solid rgba(255, 255, 255, 0.25); +} + +#user-tools a:focus, #user-tools a:hover, +#logout-form button:active, #logout-form button:hover { + text-decoration: none; + border-bottom: 0; +} + +#logout-form button:active, #logout-form button:hover { + margin-bottom: 1px; +} + +/* SIDEBAR */ + +#content-related { + background: var(--darkened-bg); +} + +#content-related .module { + background: none; +} + +#content-related h3 { + color: var(--body-quiet-color); + padding: 0 16px; + margin: 0 0 16px; +} + +#content-related h4 { + font-size: 0.8125rem; +} + +#content-related p { + padding-left: 16px; + padding-right: 16px; +} + +#content-related .actionlist { + padding: 0; + margin: 16px; +} + +#content-related .actionlist li { + line-height: 1.2; + margin-bottom: 10px; + padding-left: 18px; +} + +#content-related .module h2 { + background: none; + padding: 16px; + margin-bottom: 16px; + border-bottom: 1px solid var(--hairline-color); + font-size: 1.125rem; + color: var(--body-fg); +} + +.delete-confirmation form input[type="submit"] { + background: var(--delete-button-bg); + border-radius: 4px; + padding: 10px 15px; + color: var(--button-fg); +} + +.delete-confirmation form input[type="submit"]:active, +.delete-confirmation form input[type="submit"]:focus, +.delete-confirmation form input[type="submit"]:hover { + background: var(--delete-button-hover-bg); +} + +.delete-confirmation form .cancel-link { + display: inline-block; + vertical-align: middle; + height: 0.9375rem; + line-height: 0.9375rem; + border-radius: 4px; + padding: 10px 15px; + color: var(--button-fg); + background: var(--close-button-bg); + margin: 0 0 0 10px; +} + +.delete-confirmation form .cancel-link:active, +.delete-confirmation form .cancel-link:focus, +.delete-confirmation form .cancel-link:hover { + background: var(--close-button-hover-bg); +} + +/* POPUP */ +.popup #content { + padding: 20px; +} + +.popup #container { + min-width: 0; +} + +.popup #header { + padding: 10px 20px; +} + +/* PAGINATOR */ + +.paginator { + display: flex; + align-items: center; + gap: 4px; + font-size: 0.8125rem; + padding-top: 10px; + padding-bottom: 10px; + line-height: 22px; + margin: 0; + border-top: 1px solid var(--hairline-color); + width: 100%; + box-sizing: border-box; +} + +.paginator a:link, .paginator a:visited { + padding: 2px 6px; + background: var(--button-bg); + text-decoration: none; + color: var(--button-fg); +} + +.paginator a.showall { + border: none; + background: none; + color: var(--link-fg); +} + +.paginator a.showall:focus, .paginator a.showall:hover { + background: none; + color: var(--link-hover-color); +} + +.paginator .end { + margin-right: 6px; +} + +.paginator .this-page { + padding: 2px 6px; + font-weight: bold; + font-size: 0.8125rem; + vertical-align: top; +} + +.paginator a:focus, .paginator a:hover { + color: white; + background: var(--link-hover-color); +} + +.paginator input { + margin-left: auto; +} + +.base-svgs { + display: none; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; + color: var(--body-fg); + background-color: var(--body-bg); +} diff --git a/src/collectedstatic/admin/css/changelists.css b/src/collectedstatic/admin/css/changelists.css new file mode 100644 index 0000000..005b776 --- /dev/null +++ b/src/collectedstatic/admin/css/changelists.css @@ -0,0 +1,343 @@ +/* CHANGELISTS */ + +#changelist { + display: flex; + align-items: flex-start; + justify-content: space-between; +} + +#changelist .changelist-form-container { + flex: 1 1 auto; + min-width: 0; +} + +#changelist table { + width: 100%; +} + +.change-list .hiddenfields { display:none; } + +.change-list .filtered table { + border-right: none; +} + +.change-list .filtered { + min-height: 400px; +} + +.change-list .filtered .results, .change-list .filtered .paginator, +.filtered #toolbar, .filtered div.xfull { + width: auto; +} + +.change-list .filtered table tbody th { + padding-right: 1em; +} + +#changelist-form .results { + overflow-x: auto; + width: 100%; +} + +#changelist .toplinks { + border-bottom: 1px solid var(--hairline-color); +} + +#changelist .paginator { + color: var(--body-quiet-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--body-bg); + overflow: hidden; +} + +/* CHANGELIST TABLES */ + +#changelist table thead th { + padding: 0; + white-space: nowrap; + vertical-align: middle; +} + +#changelist table thead th.action-checkbox-column { + width: 1.5em; + text-align: center; +} + +#changelist table tbody td.action-checkbox { + text-align: center; +} + +#changelist table tfoot { + color: var(--body-quiet-color); +} + +/* TOOLBAR */ + +#toolbar { + padding: 8px 10px; + margin-bottom: 15px; + border-top: 1px solid var(--hairline-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--darkened-bg); + color: var(--body-quiet-color); +} + +#toolbar form input { + border-radius: 4px; + font-size: 0.875rem; + padding: 5px; + color: var(--body-fg); +} + +#toolbar #searchbar { + height: 1.1875rem; + border: 1px solid var(--border-color); + padding: 2px 5px; + margin: 0; + vertical-align: top; + font-size: 0.8125rem; + max-width: 100%; +} + +#toolbar #searchbar:focus { + border-color: var(--body-quiet-color); +} + +#toolbar form input[type="submit"] { + border: 1px solid var(--border-color); + font-size: 0.8125rem; + padding: 4px 8px; + margin: 0; + vertical-align: middle; + background: var(--body-bg); + box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; + cursor: pointer; + color: var(--body-fg); +} + +#toolbar form input[type="submit"]:focus, +#toolbar form input[type="submit"]:hover { + border-color: var(--body-quiet-color); +} + +#changelist-search img { + vertical-align: middle; + margin-right: 4px; +} + +#changelist-search .help { + word-break: break-word; +} + +/* FILTER COLUMN */ + +#changelist-filter { + flex: 0 0 240px; + order: 1; + background: var(--darkened-bg); + border-left: none; + margin: 0 0 0 30px; +} + +@media (forced-colors: active) { + #changelist-filter { + border: 1px solid; + } +} + +#changelist-filter h2 { + font-size: 0.875rem; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 5px 15px; + margin-bottom: 12px; + border-bottom: none; +} + +#changelist-filter h3, +#changelist-filter details summary { + font-weight: 400; + padding: 0 15px; + margin-bottom: 10px; +} + +#changelist-filter details summary > * { + display: inline; +} + +#changelist-filter details > summary { + list-style-type: none; +} + +#changelist-filter details > summary::-webkit-details-marker { + display: none; +} + +#changelist-filter details > summary::before { + content: '→'; + font-weight: bold; + color: var(--link-hover-color); +} + +#changelist-filter details[open] > summary::before { + content: '↓'; +} + +#changelist-filter ul { + margin: 5px 0; + padding: 0 15px 15px; + border-bottom: 1px solid var(--hairline-color); +} + +#changelist-filter ul:last-child { + border-bottom: none; +} + +#changelist-filter li { + list-style-type: none; + margin-left: 0; + padding-left: 0; +} + +#changelist-filter a { + display: block; + color: var(--body-quiet-color); + word-break: break-word; +} + +#changelist-filter li.selected { + border-left: 5px solid var(--hairline-color); + padding-left: 10px; + margin-left: -15px; +} + +#changelist-filter li.selected a { + color: var(--link-selected-fg); +} + +#changelist-filter a:focus, #changelist-filter a:hover, +#changelist-filter li.selected a:focus, +#changelist-filter li.selected a:hover { + color: var(--link-hover-color); +} + +#changelist-filter #changelist-filter-extra-actions { + font-size: 0.8125rem; + margin-bottom: 10px; + border-bottom: 1px solid var(--hairline-color); +} + +/* DATE DRILLDOWN */ + +.change-list .toplinks { + display: flex; + padding-bottom: 5px; + flex-wrap: wrap; + gap: 3px 17px; + font-weight: bold; +} + +.change-list .toplinks a { + font-size: 0.8125rem; +} + +.change-list .toplinks .date-back { + color: var(--body-quiet-color); +} + +.change-list .toplinks .date-back:focus, +.change-list .toplinks .date-back:hover { + color: var(--link-hover-color); +} + +/* ACTIONS */ + +.filtered .actions { + border-right: none; +} + +#changelist table input { + margin: 0; + vertical-align: baseline; +} + +/* Once the :has() pseudo-class is supported by all browsers, the tr.selected + selector and the JS adding the class can be removed. */ +#changelist tbody tr.selected { + background-color: var(--selected-row); +} + +#changelist tbody tr:has(.action-select:checked) { + background-color: var(--selected-row); +} + +@media (forced-colors: active) { + #changelist tbody tr.selected { + background-color: SelectedItem; + } + #changelist tbody tr:has(.action-select:checked) { + background-color: SelectedItem; + } +} + +#changelist .actions { + padding: 10px; + background: var(--body-bg); + border-top: none; + border-bottom: none; + line-height: 1.5rem; + color: var(--body-quiet-color); + width: 100%; +} + +#changelist .actions span.all, +#changelist .actions span.action-counter, +#changelist .actions span.clear, +#changelist .actions span.question { + font-size: 0.8125rem; + margin: 0 0.5em; +} + +#changelist .actions:last-child { + border-bottom: none; +} + +#changelist .actions select { + vertical-align: top; + height: 1.5rem; + color: var(--body-fg); + border: 1px solid var(--border-color); + border-radius: 4px; + font-size: 0.875rem; + padding: 0 0 0 4px; + margin: 0; + margin-left: 10px; +} + +#changelist .actions select:focus { + border-color: var(--body-quiet-color); +} + +#changelist .actions label { + display: inline-block; + vertical-align: middle; + font-size: 0.8125rem; +} + +#changelist .actions .button { + font-size: 0.8125rem; + border: 1px solid var(--border-color); + border-radius: 4px; + background: var(--body-bg); + box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; + cursor: pointer; + height: 1.5rem; + line-height: 1; + padding: 4px 8px; + margin: 0; + color: var(--body-fg); +} + +#changelist .actions .button:focus, #changelist .actions .button:hover { + border-color: var(--body-quiet-color); +} diff --git a/src/collectedstatic/admin/css/dark_mode.css b/src/collectedstatic/admin/css/dark_mode.css new file mode 100644 index 0000000..65b58d0 --- /dev/null +++ b/src/collectedstatic/admin/css/dark_mode.css @@ -0,0 +1,130 @@ +@media (prefers-color-scheme: dark) { + :root { + --primary: #264b5d; + --primary-fg: #f7f7f7; + + --body-fg: #eeeeee; + --body-bg: #121212; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; + --body-loud-color: #ffffff; + + --breadcrumbs-link-fg: #e0e0e0; + --breadcrumbs-bg: var(--primary); + + --link-fg: #81d4fa; + --link-hover-color: #4ac1f7; + --link-selected-fg: #6f94c6; + + --hairline-color: #272727; + --border-color: #353535; + + --error-fg: #e35f5f; + --message-success-bg: #006b1b; + --message-warning-bg: #583305; + --message-error-bg: #570808; + + --darkened-bg: #212121; + --selected-bg: #1b1b1b; + --selected-row: #00363a; + + --close-button-bg: #333333; + --close-button-hover-bg: #666666; + + color-scheme: dark; + } + } + + +html[data-theme="dark"] { + --primary: #264b5d; + --primary-fg: #f7f7f7; + + --body-fg: #eeeeee; + --body-bg: #121212; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; + --body-loud-color: #ffffff; + + --breadcrumbs-link-fg: #e0e0e0; + --breadcrumbs-bg: var(--primary); + + --link-fg: #81d4fa; + --link-hover-color: #4ac1f7; + --link-selected-fg: #6f94c6; + + --hairline-color: #272727; + --border-color: #353535; + + --error-fg: #e35f5f; + --message-success-bg: #006b1b; + --message-warning-bg: #583305; + --message-error-bg: #570808; + + --darkened-bg: #212121; + --selected-bg: #1b1b1b; + --selected-row: #00363a; + + --close-button-bg: #333333; + --close-button-hover-bg: #666666; + + color-scheme: dark; +} + +/* THEME SWITCH */ +.theme-toggle { + cursor: pointer; + border: none; + padding: 0; + background: transparent; + vertical-align: middle; + margin-inline-start: 5px; + margin-top: -1px; +} + +.theme-toggle svg { + vertical-align: middle; + height: 1.5rem; + width: 1.5rem; + display: none; +} + +/* +Fully hide screen reader text so we only show the one matching the current +theme. +*/ +.theme-toggle .visually-hidden { + display: none; +} + +html[data-theme="auto"] .theme-toggle .theme-label-when-auto { + display: block; +} + +html[data-theme="dark"] .theme-toggle .theme-label-when-dark { + display: block; +} + +html[data-theme="light"] .theme-toggle .theme-label-when-light { + display: block; +} + +/* ICONS */ +.theme-toggle svg.theme-icon-when-auto, +.theme-toggle svg.theme-icon-when-dark, +.theme-toggle svg.theme-icon-when-light { + fill: var(--header-link-color); + color: var(--header-bg); +} + +html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto { + display: block; +} + +html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { + display: block; +} + +html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { + display: block; +} diff --git a/src/collectedstatic/admin/css/dashboard.css b/src/collectedstatic/admin/css/dashboard.css new file mode 100644 index 0000000..242b81a --- /dev/null +++ b/src/collectedstatic/admin/css/dashboard.css @@ -0,0 +1,29 @@ +/* DASHBOARD */ +.dashboard td, .dashboard th { + word-break: break-word; +} + +.dashboard .module table th { + width: 100%; +} + +.dashboard .module table td { + white-space: nowrap; +} + +.dashboard .module table td a { + display: block; + padding-right: .6em; +} + +/* RECENT ACTIONS MODULE */ + +.module ul.actionlist { + margin-left: 0; +} + +ul.actionlist li { + list-style-type: none; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/src/collectedstatic/admin/css/forms.css b/src/collectedstatic/admin/css/forms.css new file mode 100644 index 0000000..c6ce788 --- /dev/null +++ b/src/collectedstatic/admin/css/forms.css @@ -0,0 +1,498 @@ +@import url('widgets.css'); + +/* FORM ROWS */ + +.form-row { + overflow: hidden; + padding: 10px; + font-size: 0.8125rem; + border-bottom: 1px solid var(--hairline-color); +} + +.form-row img, .form-row input { + vertical-align: middle; +} + +.form-row label input[type="checkbox"] { + margin-top: 0; + vertical-align: 0; +} + +form .form-row p { + padding-left: 0; +} + +.flex-container { + display: flex; +} + +.form-multiline { + flex-wrap: wrap; +} + +.form-multiline > div { + padding-bottom: 10px; +} + +/* FORM LABELS */ + +label { + font-weight: normal; + color: var(--body-quiet-color); + font-size: 0.8125rem; +} + +.required label, label.required { + font-weight: bold; +} + +/* RADIO BUTTONS */ + +form div.radiolist div { + padding-right: 7px; +} + +form div.radiolist.inline div { + display: inline-block; +} + +form div.radiolist label { + width: auto; +} + +form div.radiolist input[type="radio"] { + margin: -2px 4px 0 0; + padding: 0; +} + +form ul.inline { + margin-left: 0; + padding: 0; +} + +form ul.inline li { + float: left; + padding-right: 7px; +} + +/* FIELDSETS */ + +fieldset .fieldset-heading, +fieldset .inline-heading, +:not(.inline-related) .collapse summary { + border: 1px solid var(--header-bg); + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 0.8125rem; + background: var(--header-bg); + color: var(--header-link-color); +} + +/* ALIGNED FIELDSETS */ + +.aligned label { + display: block; + padding: 4px 10px 0 0; + min-width: 160px; + width: 160px; + word-wrap: break-word; +} + +.aligned label:not(.vCheckboxLabel):after { + content: ''; + display: inline-block; + vertical-align: middle; +} + +.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { + padding: 6px 0; + margin-top: 0; + margin-bottom: 0; + margin-left: 0; + overflow-wrap: break-word; +} + +.aligned ul label { + display: inline; + float: none; + width: auto; +} + +.aligned .form-row input { + margin-bottom: 0; +} + +.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { + width: 350px; +} + +form .aligned ul { + margin-left: 160px; + padding-left: 10px; +} + +form .aligned div.radiolist { + display: inline-block; + margin: 0; + padding: 0; +} + +form .aligned p.help, +form .aligned div.help { + margin-top: 0; + margin-left: 160px; + padding-left: 10px; +} + +form .aligned p.date div.help.timezonewarning, +form .aligned p.datetime div.help.timezonewarning, +form .aligned p.time div.help.timezonewarning { + margin-left: 0; + padding-left: 0; + font-weight: normal; +} + +form .aligned p.help:last-child, +form .aligned div.help:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +form .aligned input + p.help, +form .aligned textarea + p.help, +form .aligned select + p.help, +form .aligned input + div.help, +form .aligned textarea + div.help, +form .aligned select + div.help { + margin-left: 160px; + padding-left: 10px; +} + +form .aligned select option:checked { + background-color: var(--selected-row); +} + +form .aligned ul li { + list-style: none; +} + +form .aligned table p { + margin-left: 0; + padding-left: 0; +} + +.aligned .vCheckboxLabel { + padding: 1px 0 0 5px; +} + +.aligned .vCheckboxLabel + p.help, +.aligned .vCheckboxLabel + div.help { + margin-top: -4px; +} + +.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { + width: 610px; +} + +fieldset .fieldBox { + margin-right: 20px; +} + +/* WIDE FIELDSETS */ + +.wide label { + width: 200px; +} + +form .wide p.help, +form .wide ul.errorlist, +form .wide div.help { + padding-left: 50px; +} + +form div.help ul { + padding-left: 0; + margin-left: 0; +} + +.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { + width: 450px; +} + +/* COLLAPSIBLE FIELDSETS */ + +.collapse summary .fieldset-heading, +.collapse summary .inline-heading { + background: transparent; + border: none; + color: currentColor; + display: inline; + margin: 0; + padding: 0; +} + +/* MONOSPACE TEXTAREAS */ + +fieldset.monospace textarea { + font-family: var(--font-family-monospace); +} + +/* SUBMIT ROW */ + +.submit-row { + padding: 12px 14px 12px; + margin: 0 0 20px; + background: var(--darkened-bg); + border: 1px solid var(--hairline-color); + border-radius: 4px; + overflow: hidden; + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +body.popup .submit-row { + overflow: auto; +} + +.submit-row input { + height: 2.1875rem; + line-height: 0.9375rem; +} + +.submit-row input, .submit-row a { + margin: 0; +} + +.submit-row input.default { + text-transform: uppercase; +} + +.submit-row a.deletelink { + margin-left: auto; +} + +.submit-row a.deletelink { + display: block; + background: var(--delete-button-bg); + border-radius: 4px; + padding: 0.625rem 0.9375rem; + height: 0.9375rem; + line-height: 0.9375rem; + color: var(--button-fg); +} + +.submit-row a.closelink { + display: inline-block; + background: var(--close-button-bg); + border-radius: 4px; + padding: 10px 15px; + height: 0.9375rem; + line-height: 0.9375rem; + color: var(--button-fg); +} + +.submit-row a.deletelink:focus, +.submit-row a.deletelink:hover, +.submit-row a.deletelink:active { + background: var(--delete-button-hover-bg); + text-decoration: none; +} + +.submit-row a.closelink:focus, +.submit-row a.closelink:hover, +.submit-row a.closelink:active { + background: var(--close-button-hover-bg); + text-decoration: none; +} + +/* CUSTOM FORM FIELDS */ + +.vSelectMultipleField { + vertical-align: top; +} + +.vCheckboxField { + border: none; +} + +.vDateField, .vTimeField { + margin-right: 2px; + margin-bottom: 4px; +} + +.vDateField { + min-width: 6.85em; +} + +.vTimeField { + min-width: 4.7em; +} + +.vURLField { + width: 30em; +} + +.vLargeTextField, .vXMLLargeTextField { + width: 48em; +} + +.flatpages-flatpage #id_content { + height: 40.2em; +} + +.module table .vPositiveSmallIntegerField { + width: 2.2em; +} + +.vIntegerField { + width: 5em; +} + +.vBigIntegerField { + width: 10em; +} + +.vForeignKeyRawIdAdminField { + width: 5em; +} + +.vTextField, .vUUIDField { + width: 20em; +} + +/* INLINES */ + +.inline-group { + padding: 0; + margin: 0 0 30px; +} + +.inline-group thead th { + padding: 8px 10px; +} + +.inline-group .aligned label { + width: 160px; +} + +.inline-related { + position: relative; +} + +.inline-related h4, +.inline-related:not(.tabular) .collapse summary { + margin: 0; + color: var(--body-medium-color); + padding: 5px; + font-size: 0.8125rem; + background: var(--darkened-bg); + border: 1px solid var(--hairline-color); + border-left-color: var(--darkened-bg); + border-right-color: var(--darkened-bg); +} + +.inline-related h3 span.delete { + float: right; +} + +.inline-related h3 span.delete label { + margin-left: 2px; + font-size: 0.6875rem; +} + +.inline-related fieldset { + margin: 0; + background: var(--body-bg); + border: none; + width: 100%; +} + +.inline-group .tabular fieldset.module { + border: none; +} + +.inline-related.tabular fieldset.module table { + width: 100%; + overflow-x: scroll; +} + +.last-related fieldset { + border: none; +} + +.inline-group .tabular tr.has_original td { + padding-top: 2em; +} + +.inline-group .tabular tr td.original { + padding: 2px 0 0 0; + width: 0; + _position: relative; +} + +.inline-group .tabular th.original { + width: 0px; + padding: 0; +} + +.inline-group .tabular td.original p { + position: absolute; + left: 0; + height: 1.1em; + padding: 2px 9px; + overflow: hidden; + font-size: 0.5625rem; + font-weight: bold; + color: var(--body-quiet-color); + _width: 700px; +} + +.inline-group div.add-row, +.inline-group .tabular tr.add-row td { + color: var(--body-quiet-color); + background: var(--darkened-bg); + padding: 8px 10px; + border-bottom: 1px solid var(--hairline-color); +} + +.inline-group .tabular tr.add-row td { + padding: 8px 10px; + border-bottom: 1px solid var(--hairline-color); +} + +.inline-group div.add-row a, +.inline-group .tabular tr.add-row td a { + font-size: 0.75rem; +} + +.empty-form { + display: none; +} + +/* RELATED FIELD ADD ONE / LOOKUP */ + +.related-lookup { + margin-left: 5px; + display: inline-block; + vertical-align: middle; + background-repeat: no-repeat; + background-size: 14px; +} + +.related-lookup { + width: 1rem; + height: 1rem; + background-image: url(../img/search.svg); +} + +form .related-widget-wrapper ul { + display: inline-block; + margin-left: 0; + padding-left: 0; +} + +.clearable-file-input input { + margin-top: 0; +} diff --git a/src/collectedstatic/admin/css/login.css b/src/collectedstatic/admin/css/login.css new file mode 100644 index 0000000..805a34b --- /dev/null +++ b/src/collectedstatic/admin/css/login.css @@ -0,0 +1,61 @@ +/* LOGIN FORM */ + +.login { + background: var(--darkened-bg); + height: auto; +} + +.login #header { + height: auto; + padding: 15px 16px; + justify-content: center; +} + +.login #header h1 { + font-size: 1.125rem; + margin: 0; +} + +.login #header h1 a { + color: var(--header-link-color); +} + +.login #content { + padding: 20px; +} + +.login #container { + background: var(--body-bg); + border: 1px solid var(--hairline-color); + border-radius: 4px; + overflow: hidden; + width: 28em; + min-width: 300px; + margin: 100px auto; + height: auto; +} + +.login .form-row { + padding: 4px 0; +} + +.login .form-row label { + display: block; + line-height: 2em; +} + +.login .form-row #id_username, .login .form-row #id_password { + padding: 8px; + width: 100%; + box-sizing: border-box; +} + +.login .submit-row { + padding: 1em 0 0 0; + margin: 0; + text-align: center; +} + +.login .password-reset-link { + text-align: center; +} diff --git a/src/collectedstatic/admin/css/nav_sidebar.css b/src/collectedstatic/admin/css/nav_sidebar.css new file mode 100644 index 0000000..7eb0de9 --- /dev/null +++ b/src/collectedstatic/admin/css/nav_sidebar.css @@ -0,0 +1,150 @@ +.sticky { + position: sticky; + top: 0; + max-height: 100vh; +} + +.toggle-nav-sidebar { + z-index: 20; + left: 0; + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 23px; + width: 23px; + border: 0; + border-right: 1px solid var(--hairline-color); + background-color: var(--body-bg); + cursor: pointer; + font-size: 1.25rem; + color: var(--link-fg); + padding: 0; +} + +[dir="rtl"] .toggle-nav-sidebar { + border-left: 1px solid var(--hairline-color); + border-right: 0; +} + +.toggle-nav-sidebar:hover, +.toggle-nav-sidebar:focus { + background-color: var(--darkened-bg); +} + +#nav-sidebar { + z-index: 15; + flex: 0 0 275px; + left: -276px; + margin-left: -276px; + border-top: 1px solid transparent; + border-right: 1px solid var(--hairline-color); + background-color: var(--body-bg); + overflow: auto; +} + +[dir="rtl"] #nav-sidebar { + border-left: 1px solid var(--hairline-color); + border-right: 0; + left: 0; + margin-left: 0; + right: -276px; + margin-right: -276px; +} + +.toggle-nav-sidebar::before { + content: '\00BB'; +} + +.main.shifted .toggle-nav-sidebar::before { + content: '\00AB'; +} + +.main > #nav-sidebar { + visibility: hidden; +} + +.main.shifted > #nav-sidebar { + margin-left: 0; + visibility: visible; +} + +[dir="rtl"] .main.shifted > #nav-sidebar { + margin-right: 0; +} + +#nav-sidebar .module th { + width: 100%; + overflow-wrap: anywhere; +} + +#nav-sidebar .module th, +#nav-sidebar .module caption { + padding-left: 16px; +} + +#nav-sidebar .module td { + white-space: nowrap; +} + +[dir="rtl"] #nav-sidebar .module th, +[dir="rtl"] #nav-sidebar .module caption { + padding-left: 8px; + padding-right: 16px; +} + +#nav-sidebar .current-app .section:link, +#nav-sidebar .current-app .section:visited { + color: var(--header-color); + font-weight: bold; +} + +#nav-sidebar .current-model { + background: var(--selected-row); +} + +@media (forced-colors: active) { + #nav-sidebar .current-model { + background-color: SelectedItem; + } +} + +.main > #nav-sidebar + .content { + max-width: calc(100% - 23px); +} + +.main.shifted > #nav-sidebar + .content { + max-width: calc(100% - 299px); +} + +@media (max-width: 767px) { + #nav-sidebar, #toggle-nav-sidebar { + display: none; + } + + .main > #nav-sidebar + .content, + .main.shifted > #nav-sidebar + .content { + max-width: 100%; + } +} + +#nav-filter { + width: 100%; + box-sizing: border-box; + padding: 2px 5px; + margin: 5px 0; + border: 1px solid var(--border-color); + background-color: var(--darkened-bg); + color: var(--body-fg); +} + +#nav-filter:focus { + border-color: var(--body-quiet-color); +} + +#nav-filter.no-results { + background: var(--message-error-bg); +} + +#nav-sidebar table { + width: 100%; +} diff --git a/src/collectedstatic/admin/css/responsive.css b/src/collectedstatic/admin/css/responsive.css new file mode 100644 index 0000000..f0fcade --- /dev/null +++ b/src/collectedstatic/admin/css/responsive.css @@ -0,0 +1,904 @@ +/* Tablets */ + +input[type="submit"], button { + -webkit-appearance: none; + appearance: none; +} + +@media (max-width: 1024px) { + /* Basic */ + + html { + -webkit-text-size-adjust: 100%; + } + + td, th { + padding: 10px; + font-size: 0.875rem; + } + + .small { + font-size: 0.75rem; + } + + /* Layout */ + + #container { + min-width: 0; + } + + #content { + padding: 15px 20px 20px; + } + + div.breadcrumbs { + padding: 10px 30px; + } + + /* Header */ + + #header { + flex-direction: column; + padding: 15px 30px; + justify-content: flex-start; + } + + #site-name { + margin: 0 0 8px; + line-height: 1.2; + } + + #user-tools { + margin: 0; + font-weight: 400; + line-height: 1.85; + text-align: left; + } + + #user-tools a { + display: inline-block; + line-height: 1.4; + } + + /* Dashboard */ + + .dashboard #content { + width: auto; + } + + #content-related { + margin-right: -290px; + } + + .colSM #content-related { + margin-left: -290px; + } + + .colMS { + margin-right: 290px; + } + + .colSM { + margin-left: 290px; + } + + .dashboard .module table td a { + padding-right: 0; + } + + td .changelink, td .addlink { + font-size: 0.8125rem; + } + + /* Changelist */ + + #toolbar { + border: none; + padding: 15px; + } + + #changelist-search > div { + display: flex; + flex-wrap: nowrap; + max-width: 480px; + } + + #changelist-search label { + line-height: 1.375rem; + } + + #toolbar form #searchbar { + flex: 1 0 auto; + width: 0; + height: 1.375rem; + margin: 0 10px 0 6px; + } + + #toolbar form input[type=submit] { + flex: 0 1 auto; + } + + #changelist-search .quiet { + width: 0; + flex: 1 0 auto; + margin: 5px 0 0 25px; + } + + #changelist .actions { + display: flex; + flex-wrap: wrap; + padding: 15px 0; + } + + #changelist .actions label { + display: flex; + } + + #changelist .actions select { + background: var(--body-bg); + } + + #changelist .actions .button { + min-width: 48px; + margin: 0 10px; + } + + #changelist .actions span.all, + #changelist .actions span.clear, + #changelist .actions span.question, + #changelist .actions span.action-counter { + font-size: 0.6875rem; + margin: 0 10px 0 0; + } + + #changelist-filter { + flex-basis: 200px; + } + + .change-list .filtered .results, + .change-list .filtered .paginator, + .filtered #toolbar, + .filtered .actions, + + #changelist .paginator { + border-top-color: var(--hairline-color); /* XXX Is this used at all? */ + } + + #changelist .results + .paginator { + border-top: none; + } + + /* Forms */ + + label { + font-size: 1rem; + } + + /* + Minifiers remove the default (text) "type" attribute from "input" HTML + tags. Add input:not([type]) to make the CSS stylesheet work the same. + */ + .form-row input:not([type]), + .form-row input[type=text], + .form-row input[type=password], + .form-row input[type=email], + .form-row input[type=url], + .form-row input[type=tel], + .form-row input[type=number], + .form-row textarea, + .form-row select, + .form-row .vTextField { + box-sizing: border-box; + margin: 0; + padding: 6px 8px; + min-height: 2.25rem; + font-size: 1rem; + } + + .form-row select { + height: 2.25rem; + } + + .form-row select[multiple] { + height: auto; + min-height: 0; + } + + fieldset .fieldBox + .fieldBox { + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid var(--hairline-color); + } + + textarea { + max-width: 100%; + max-height: 120px; + } + + .aligned label { + padding-top: 6px; + } + + .aligned .related-lookup, + .aligned .datetimeshortcuts, + .aligned .related-lookup + strong { + align-self: center; + margin-left: 15px; + } + + form .aligned div.radiolist { + margin-left: 2px; + } + + .submit-row { + padding: 8px; + } + + .submit-row a.deletelink { + padding: 10px 7px; + } + + .button, input[type=submit], input[type=button], .submit-row input, a.button { + padding: 7px; + } + + /* Selector */ + + .selector { + display: flex; + width: 100%; + } + + .selector .selector-filter { + display: flex; + align-items: center; + } + + .selector .selector-filter input { + width: 100%; + min-height: 0; + flex: 1 1; + } + + .selector-available, .selector-chosen { + width: auto; + flex: 1 1; + display: flex; + flex-direction: column; + } + + .selector select { + width: 100%; + flex: 1 0 auto; + margin-bottom: 5px; + } + + .selector-chooseall, .selector-clearall { + align-self: center; + } + + .stacked { + flex-direction: column; + max-width: 480px; + } + + .stacked > * { + flex: 0 1 auto; + } + + .stacked select { + margin-bottom: 0; + } + + .stacked .selector-available, .stacked .selector-chosen { + width: auto; + } + + .stacked ul.selector-chooser { + padding: 0 2px; + transform: none; + } + + .stacked .selector-chooser li { + padding: 3px; + } + + .help-tooltip, .selector .help-icon { + display: none; + } + + .datetime input { + width: 50%; + max-width: 120px; + } + + .datetime span { + font-size: 0.8125rem; + } + + .datetime .timezonewarning { + display: block; + font-size: 0.6875rem; + color: var(--body-quiet-color); + } + + .datetimeshortcuts { + color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */ + } + + .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { + width: 75%; + } + + .inline-group { + overflow: auto; + } + + /* Messages */ + + ul.messagelist li { + padding-left: 55px; + background-position: 30px 12px; + } + + ul.messagelist li.error { + background-position: 30px 12px; + } + + ul.messagelist li.warning { + background-position: 30px 14px; + } + + /* Login */ + + .login #header { + padding: 15px 20px; + } + + .login #site-name { + margin: 0; + } + + /* GIS */ + + div.olMap { + max-width: calc(100vw - 30px); + max-height: 300px; + } + + .olMap + .clear_features { + display: block; + margin-top: 10px; + } + + /* Docs */ + + .module table.xfull { + width: 100%; + } + + pre.literal-block { + overflow: auto; + } +} + +/* Mobile */ + +@media (max-width: 767px) { + /* Layout */ + + #header, #content { + padding: 15px; + } + + div.breadcrumbs { + padding: 10px 15px; + } + + /* Dashboard */ + + .colMS, .colSM { + margin: 0; + } + + #content-related, .colSM #content-related { + width: 100%; + margin: 0; + } + + #content-related .module { + margin-bottom: 0; + } + + #content-related .module h2 { + padding: 10px 15px; + font-size: 1rem; + } + + /* Changelist */ + + #changelist { + align-items: stretch; + flex-direction: column; + } + + #toolbar { + padding: 10px; + } + + #changelist-filter { + margin-left: 0; + } + + #changelist .actions label { + flex: 1 1; + } + + #changelist .actions select { + flex: 1 0; + width: 100%; + } + + #changelist .actions span { + flex: 1 0 100%; + } + + #changelist-filter { + position: static; + width: auto; + margin-top: 30px; + } + + .object-tools { + float: none; + margin: 0 0 15px; + padding: 0; + overflow: hidden; + } + + .object-tools li { + height: auto; + margin-left: 0; + } + + .object-tools li + li { + margin-left: 15px; + } + + /* Forms */ + + .form-row { + padding: 15px 0; + } + + .aligned .form-row, + .aligned .form-row > div { + max-width: 100vw; + } + + .aligned .form-row > div { + width: calc(100vw - 30px); + } + + .flex-container { + flex-flow: column; + } + + .flex-container.checkbox-row { + flex-flow: row; + } + + textarea { + max-width: none; + } + + .vURLField { + width: auto; + } + + fieldset .fieldBox + .fieldBox { + margin-top: 15px; + padding-top: 15px; + } + + .aligned label { + width: 100%; + min-width: auto; + padding: 0 0 10px; + } + + .aligned label:after { + max-height: 0; + } + + .aligned .form-row input, + .aligned .form-row select, + .aligned .form-row textarea { + flex: 1 1 auto; + max-width: 100%; + } + + .aligned .checkbox-row input { + flex: 0 1 auto; + margin: 0; + } + + .aligned .vCheckboxLabel { + flex: 1 0; + padding: 1px 0 0 5px; + } + + .aligned label + p, + .aligned label + div.help, + .aligned label + div.readonly { + padding: 0; + margin-left: 0; + } + + .aligned p.file-upload { + font-size: 0.8125rem; + } + + span.clearable-file-input { + margin-left: 15px; + } + + span.clearable-file-input label { + font-size: 0.8125rem; + padding-bottom: 0; + } + + .aligned .timezonewarning { + flex: 1 0 100%; + margin-top: 5px; + } + + form .aligned .form-row div.help { + width: 100%; + margin: 5px 0 0; + padding: 0; + } + + form .aligned ul, + form .aligned ul.errorlist { + margin-left: 0; + padding-left: 0; + } + + form .aligned div.radiolist { + margin-top: 5px; + margin-right: 15px; + margin-bottom: -3px; + } + + form .aligned div.radiolist:not(.inline) div + div { + margin-top: 5px; + } + + /* Related widget */ + + .related-widget-wrapper { + width: 100%; + display: flex; + align-items: flex-start; + } + + .related-widget-wrapper .selector { + order: 1; + flex: 1 0 auto; + } + + .related-widget-wrapper > a { + order: 2; + } + + .related-widget-wrapper .radiolist ~ a { + align-self: flex-end; + } + + .related-widget-wrapper > select ~ a { + align-self: center; + } + + /* Selector */ + + .selector { + flex-direction: column; + gap: 10px 0; + } + + .selector-available, .selector-chosen { + flex: 1 1 auto; + } + + .selector select { + max-height: 96px; + } + + .selector ul.selector-chooser { + display: flex; + width: 60px; + height: 30px; + padding: 0 2px; + transform: none; + } + + .selector ul.selector-chooser li { + float: left; + } + + .selector-remove { + background-position: 0 0; + } + + :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; + } + + .selector-add { + background-position: 0 -48px; + } + + :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; + } + + /* Inlines */ + + .inline-group[data-inline-type="stacked"] .inline-related { + border: 1px solid var(--hairline-color); + border-radius: 4px; + margin-top: 15px; + overflow: auto; + } + + .inline-group[data-inline-type="stacked"] .inline-related > * { + box-sizing: border-box; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module { + padding: 0 10px; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row { + border-top: 1px solid var(--hairline-color); + border-bottom: none; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { + border-top: none; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 { + padding: 10px; + border-top-width: 0; + border-bottom-width: 2px; + display: flex; + flex-wrap: wrap; + align-items: center; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { + margin-right: auto; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { + float: none; + flex: 1 1 100%; + margin-top: 5px; + } + + .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { + width: 100%; + } + + .inline-group[data-inline-type="stacked"] .aligned label { + width: 100%; + } + + .inline-group[data-inline-type="stacked"] div.add-row { + margin-top: 15px; + border: 1px solid var(--hairline-color); + border-radius: 4px; + } + + .inline-group div.add-row, + .inline-group .tabular tr.add-row td { + padding: 0; + } + + .inline-group div.add-row a, + .inline-group .tabular tr.add-row td a { + display: block; + padding: 8px 10px 8px 26px; + background-position: 8px 9px; + } + + /* Submit row */ + + .submit-row { + padding: 10px; + margin: 0 0 15px; + flex-direction: column; + gap: 8px; + } + + .submit-row input, .submit-row input.default, .submit-row a { + text-align: center; + } + + .submit-row a.closelink { + padding: 10px 0; + text-align: center; + } + + .submit-row a.deletelink { + margin: 0; + } + + /* Messages */ + + ul.messagelist li { + padding-left: 40px; + background-position: 15px 12px; + } + + ul.messagelist li.error { + background-position: 15px 12px; + } + + ul.messagelist li.warning { + background-position: 15px 14px; + } + + /* Paginator */ + + .paginator .this-page, .paginator a:link, .paginator a:visited { + padding: 4px 10px; + } + + /* Login */ + + body.login { + padding: 0 15px; + } + + .login #container { + width: auto; + max-width: 480px; + margin: 50px auto; + } + + .login #header, + .login #content { + padding: 15px; + } + + .login #content-main { + float: none; + } + + .login .form-row { + padding: 0; + } + + .login .form-row + .form-row { + margin-top: 15px; + } + + .login .form-row label { + margin: 0 0 5px; + line-height: 1.2; + } + + .login .submit-row { + padding: 15px 0 0; + } + + .login br { + display: none; + } + + .login .submit-row input { + margin: 0; + text-transform: uppercase; + } + + .errornote { + margin: 0 0 20px; + padding: 8px 12px; + font-size: 0.8125rem; + } + + /* Calendar and clock */ + + .calendarbox, .clockbox { + position: fixed !important; + top: 50% !important; + left: 50% !important; + transform: translate(-50%, -50%); + margin: 0; + border: none; + overflow: visible; + } + + .calendarbox:before, .clockbox:before { + content: ''; + position: fixed; + top: 50%; + left: 50%; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.75); + transform: translate(-50%, -50%); + } + + .calendarbox > *, .clockbox > * { + position: relative; + z-index: 1; + } + + .calendarbox > div:first-child { + z-index: 2; + } + + .calendarbox .calendar, .clockbox h2 { + border-radius: 4px 4px 0 0; + overflow: hidden; + } + + .calendarbox .calendar-cancel, .clockbox .calendar-cancel { + border-radius: 0 0 4px 4px; + overflow: hidden; + } + + .calendar-shortcuts { + padding: 10px 0; + font-size: 0.75rem; + line-height: 0.75rem; + } + + .calendar-shortcuts a { + margin: 0 4px; + } + + .timelist a { + background: var(--body-bg); + padding: 4px; + } + + .calendar-cancel { + padding: 8px 10px; + } + + .clockbox h2 { + padding: 8px 15px; + } + + .calendar caption { + padding: 10px; + } + + .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { + z-index: 1; + top: 10px; + } + + /* History */ + + table#change-history tbody th, table#change-history tbody td { + font-size: 0.8125rem; + word-break: break-word; + } + + table#change-history tbody th { + width: auto; + } + + /* Docs */ + + table.model tbody th, table.model tbody td { + font-size: 0.8125rem; + word-break: break-word; + } +} diff --git a/src/collectedstatic/admin/css/responsive_rtl.css b/src/collectedstatic/admin/css/responsive_rtl.css new file mode 100644 index 0000000..5e8f5c5 --- /dev/null +++ b/src/collectedstatic/admin/css/responsive_rtl.css @@ -0,0 +1,89 @@ +/* TABLETS */ + +@media (max-width: 1024px) { + [dir="rtl"] .colMS { + margin-right: 0; + } + + [dir="rtl"] #user-tools { + text-align: right; + } + + [dir="rtl"] #changelist .actions label { + padding-left: 10px; + padding-right: 0; + } + + [dir="rtl"] #changelist .actions select { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .change-list .filtered .results, + [dir="rtl"] .change-list .filtered .paginator, + [dir="rtl"] .filtered #toolbar, + [dir="rtl"] .filtered div.xfull, + [dir="rtl"] .filtered .actions, + [dir="rtl"] #changelist-filter { + margin-left: 0; + } + + [dir="rtl"] .inline-group div.add-row a, + [dir="rtl"] .inline-group .tabular tr.add-row td a { + padding: 8px 26px 8px 10px; + background-position: calc(100% - 8px) 9px; + } + + [dir="rtl"] .object-tools li { + float: right; + } + + [dir="rtl"] .object-tools li + li { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .dashboard .module table td a { + padding-left: 0; + padding-right: 16px; + } +} + +/* MOBILE */ + +@media (max-width: 767px) { + [dir="rtl"] .aligned .related-lookup, + [dir="rtl"] .aligned .datetimeshortcuts { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .aligned ul, + [dir="rtl"] form .aligned ul.errorlist { + margin-right: 0; + } + + [dir="rtl"] #changelist-filter { + margin-left: 0; + margin-right: 0; + } + [dir="rtl"] .aligned .vCheckboxLabel { + padding: 1px 5px 0 0; + } + + [dir="rtl"] .selector-remove { + background-position: 0 0; + } + + [dir="rtl"] :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; + } + + [dir="rtl"] .selector-add { + background-position: 0 -48px; + } + + [dir="rtl"] :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; + } +} diff --git a/src/collectedstatic/admin/css/rtl.css b/src/collectedstatic/admin/css/rtl.css new file mode 100644 index 0000000..a2556d0 --- /dev/null +++ b/src/collectedstatic/admin/css/rtl.css @@ -0,0 +1,293 @@ +/* GLOBAL */ + +th { + text-align: right; +} + +.module h2, .module caption { + text-align: right; +} + +.module ul, .module ol { + margin-left: 0; + margin-right: 1.5em; +} + +.viewlink, .addlink, .changelink, .hidelink { + padding-left: 0; + padding-right: 16px; + background-position: 100% 1px; +} + +.deletelink { + padding-left: 0; + padding-right: 16px; + background-position: 100% 1px; +} + +.object-tools { + float: left; +} + +thead th:first-child, +tfoot td:first-child { + border-left: none; +} + +/* LAYOUT */ + +#user-tools { + right: auto; + left: 0; + text-align: left; +} + +div.breadcrumbs { + text-align: right; +} + +#content-main { + float: right; +} + +#content-related { + float: left; + margin-left: -300px; + margin-right: auto; +} + +.colMS { + margin-left: 300px; + margin-right: 0; +} + +/* SORTABLE TABLES */ + +table thead th.sorted .sortoptions { + float: left; +} + +thead th.sorted .text { + padding-right: 0; + padding-left: 42px; +} + +/* dashboard styles */ + +.dashboard .module table td a { + padding-left: .6em; + padding-right: 16px; +} + +/* changelists styles */ + +.change-list .filtered table { + border-left: none; + border-right: 0px none; +} + +#changelist-filter { + border-left: none; + border-right: none; + margin-left: 0; + margin-right: 30px; +} + +#changelist-filter li.selected { + border-left: none; + padding-left: 10px; + margin-left: 0; + border-right: 5px solid var(--hairline-color); + padding-right: 10px; + margin-right: -15px; +} + +#changelist table tbody td:first-child, #changelist table tbody th:first-child { + border-right: none; + border-left: none; +} + +.paginator .end { + margin-left: 6px; + margin-right: 0; +} + +.paginator input { + margin-left: 0; + margin-right: auto; +} + +/* FORMS */ + +.aligned label { + padding: 0 0 3px 1em; +} + +.submit-row a.deletelink { + margin-left: 0; + margin-right: auto; +} + +.vDateField, .vTimeField { + margin-left: 2px; +} + +.aligned .form-row input { + margin-left: 5px; +} + +form .aligned ul { + margin-right: 163px; + padding-right: 10px; + margin-left: 0; + padding-left: 0; +} + +form ul.inline li { + float: right; + padding-right: 0; + padding-left: 7px; +} + +form .aligned p.help, +form .aligned div.help { + margin-left: 0; + margin-right: 160px; + padding-right: 10px; +} + +form div.help ul, +form .aligned .checkbox-row + .help, +form .aligned p.date div.help.timezonewarning, +form .aligned p.datetime div.help.timezonewarning, +form .aligned p.time div.help.timezonewarning { + margin-right: 0; + padding-right: 0; +} + +form .wide p.help, +form .wide ul.errorlist, +form .wide div.help { + padding-left: 0; + padding-right: 50px; +} + +.submit-row { + text-align: right; +} + +fieldset .fieldBox { + margin-left: 20px; + margin-right: 0; +} + +.errorlist li { + background-position: 100% 12px; + padding: 0; +} + +.errornote { + background-position: 100% 12px; + padding: 10px 12px; +} + +/* WIDGETS */ + +.calendarnav-previous { + top: 0; + left: auto; + right: 10px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; +} + +.calendarnav-next { + top: 0; + right: auto; + left: 10px; + background: url(../img/calendar-icons.svg) 0 0 no-repeat; +} + +.calendar caption, .calendarbox h2 { + text-align: center; +} + +.selector { + float: right; +} + +.selector .selector-filter { + text-align: right; +} + +.selector-add { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -120px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -168px; +} + +.selector-chooseall { + background: url(../img/selector-icons.svg) right -128px no-repeat; +} + +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { + background-position: 100% -144px; +} + +.selector-clearall { + background: url(../img/selector-icons.svg) 0 -160px no-repeat; +} + +:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { + background-position: 0 -176px; +} + +.inline-deletelink { + float: left; +} + +form .form-row p.datetime { + overflow: hidden; +} + +.related-widget-wrapper { + float: right; +} + +/* MISC */ + +.inline-related h2, .inline-group h2 { + text-align: right +} + +.inline-related h3 span.delete { + padding-right: 20px; + padding-left: inherit; + left: 10px; + right: inherit; + float:left; +} + +.inline-related h3 span.delete label { + margin-left: inherit; + margin-right: 2px; +} + +.inline-group .tabular td.original p { + right: 0; +} + +.selector .selector-chooser { + margin: 0; +} diff --git a/src/collectedstatic/admin/css/unusable_password_field.css b/src/collectedstatic/admin/css/unusable_password_field.css new file mode 100644 index 0000000..d46eb03 --- /dev/null +++ b/src/collectedstatic/admin/css/unusable_password_field.css @@ -0,0 +1,19 @@ +/* Hide warnings fields if usable password is selected */ +form:has(#id_usable_password input[value="true"]:checked) .messagelist { + display: none; +} + +/* Hide password fields if unusable password is selected */ +form:has(#id_usable_password input[value="false"]:checked) .field-password1, +form:has(#id_usable_password input[value="false"]:checked) .field-password2 { + display: none; +} + +/* Select appropriate submit button */ +form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { + display: none; +} + +form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { + display: none; +} diff --git a/src/collectedstatic/admin/css/vendor/select2/LICENSE-SELECT2.md b/src/collectedstatic/admin/css/vendor/select2/LICENSE-SELECT2.md new file mode 100644 index 0000000..8cb8a2b --- /dev/null +++ b/src/collectedstatic/admin/css/vendor/select2/LICENSE-SELECT2.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/collectedstatic/admin/css/vendor/select2/select2.css b/src/collectedstatic/admin/css/vendor/select2/select2.css new file mode 100644 index 0000000..750b320 --- /dev/null +++ b/src/collectedstatic/admin/css/vendor/select2/select2.css @@ -0,0 +1,481 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + position: relative; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; + padding: 1px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option[role=group] { + padding: 0; } + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/src/collectedstatic/admin/css/vendor/select2/select2.min.css b/src/collectedstatic/admin/css/vendor/select2/select2.min.css new file mode 100644 index 0000000..7c18ad5 --- /dev/null +++ b/src/collectedstatic/admin/css/vendor/select2/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/src/collectedstatic/admin/css/widgets.css b/src/collectedstatic/admin/css/widgets.css new file mode 100644 index 0000000..538af2e --- /dev/null +++ b/src/collectedstatic/admin/css/widgets.css @@ -0,0 +1,613 @@ +/* SELECTOR (FILTER INTERFACE) */ + +.selector { + display: flex; + flex: 1; + gap: 0 10px; +} + +.selector select { + height: 17.2em; + flex: 1 0 auto; + overflow: scroll; + width: 100%; +} + +.selector-available, .selector-chosen { + display: flex; + flex-direction: column; + flex: 1 1; +} + +.selector-available-title, .selector-chosen-title { + border: 1px solid var(--border-color); + border-radius: 4px 4px 0 0; +} + +.selector .helptext { + font-size: 0.6875rem; +} + +.selector-chosen .list-footer-display { + border: 1px solid var(--border-color); + border-top: none; + border-radius: 0 0 4px 4px; + margin: 0 0 10px; + padding: 8px; + text-align: center; + background: var(--primary); + color: var(--header-link-color); + cursor: pointer; +} +.selector-chosen .list-footer-display__clear { + color: var(--breadcrumbs-fg); +} + +.selector-chosen-title { + background: var(--secondary); + color: var(--header-link-color); + padding: 8px; +} + +.aligned .selector-chosen-title label { + color: var(--header-link-color); + width: 100%; +} + +.selector-available-title { + background: var(--darkened-bg); + color: var(--body-quiet-color); + padding: 8px; +} + +.aligned .selector-available-title label { + width: 100%; +} + +.selector .selector-filter { + border: 1px solid var(--border-color); + border-width: 0 1px; + padding: 8px; + color: var(--body-quiet-color); + font-size: 0.625rem; + margin: 0; + text-align: left; + display: flex; + gap: 8px; +} + +.selector .selector-filter label, +.inline-group .aligned .selector .selector-filter label { + float: left; + margin: 7px 0 0; + width: 18px; + height: 18px; + padding: 0; + overflow: hidden; + line-height: 1; + min-width: auto; +} + +.selector-filter input { + flex-grow: 1; +} + +.selector ul.selector-chooser { + align-self: center; + width: 30px; + background-color: var(--selected-bg); + border-radius: 10px; + margin: 0; + padding: 0; + transform: translateY(-17px); +} + +.selector-chooser li { + margin: 0; + padding: 3px; + list-style-type: none; +} + +.selector select { + padding: 0 10px; + margin: 0 0 10px; + border-radius: 0 0 4px 4px; +} +.selector .selector-chosen--with-filtered select { + margin: 0; + border-radius: 0; + height: 14em; +} + +.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display { + display: none; +} + +.selector-add, .selector-remove { + width: 24px; + height: 24px; + display: block; + text-indent: -3000px; + overflow: hidden; + cursor: default; + opacity: 0.55; + border: none; +} + +:enabled.selector-add, :enabled.selector-remove { + opacity: 1; +} + +:enabled.selector-add:hover, :enabled.selector-remove:hover { + cursor: pointer; +} + +.selector-add { + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -168px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -120px; +} + +.selector-chooseall, .selector-clearall { + display: inline-block; + height: 16px; + text-align: left; + margin: 0 auto; + overflow: hidden; + font-weight: bold; + line-height: 16px; + color: var(--body-quiet-color); + text-decoration: none; + opacity: 0.55; + border: none; +} + +:enabled.selector-chooseall:focus, :enabled.selector-clearall:focus, +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { + color: var(--link-fg); +} + +:enabled.selector-chooseall, :enabled.selector-clearall { + opacity: 1; +} + +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { + cursor: pointer; +} + +.selector-chooseall { + padding: 0 18px 0 0; + background: url(../img/selector-icons.svg) right -160px no-repeat; + cursor: default; +} + +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { + background-position: 100% -176px; +} + +.selector-clearall { + padding: 0 0 0 18px; + background: url(../img/selector-icons.svg) 0 -128px no-repeat; + cursor: default; +} + +:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { + background-position: 0 -144px; +} + +/* STACKED SELECTORS */ + +.stacked { + float: left; + width: 490px; + display: block; +} + +.stacked select { + width: 480px; + height: 10.1em; +} + +.stacked .selector-available, .stacked .selector-chosen { + width: 480px; +} + +.stacked .selector-available { + margin-bottom: 0; +} + +.stacked .selector-available input { + width: 422px; +} + +.stacked ul.selector-chooser { + display: flex; + height: 30px; + width: 64px; + margin: 0 0 10px 40%; + background-color: #eee; + border-radius: 10px; + transform: none; +} + +.stacked .selector-chooser li { + float: left; + padding: 3px 3px 3px 5px; +} + +.stacked .selector-chooseall, .stacked .selector-clearall { + display: none; +} + +.stacked .selector-add { + background: url(../img/selector-icons.svg) 0 -48px no-repeat; + background-size: 24px auto; + cursor: default; +} + +.stacked :enabled.selector-add { + background-position: 0 -48px; + cursor: pointer; +} + +.stacked :enabled.selector-add:focus, .stacked :enabled.selector-add:hover { + background-position: 0 -72px; + cursor: pointer; +} + +.stacked .selector-remove { + background: url(../img/selector-icons.svg) 0 0 no-repeat; + background-size: 24px auto; + cursor: default; +} + +.stacked :enabled.selector-remove { + background-position: 0 0px; + cursor: pointer; +} + +.stacked :enabled.selector-remove:focus, .stacked :enabled.selector-remove:hover { + background-position: 0 -24px; + cursor: pointer; +} + +.selector .help-icon { + background: url(../img/icon-unknown.svg) 0 0 no-repeat; + display: inline-block; + vertical-align: middle; + margin: -2px 0 0 2px; + width: 13px; + height: 13px; +} + +.selector .selector-chosen .help-icon { + background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; +} + +.selector .search-label-icon { + background: url(../img/search.svg) 0 0 no-repeat; + display: inline-block; + height: 1.125rem; + width: 1.125rem; +} + +/* DATE AND TIME */ + +p.datetime { + line-height: 20px; + margin: 0; + padding: 0; + color: var(--body-quiet-color); + font-weight: bold; +} + +.datetime span { + white-space: nowrap; + font-weight: normal; + font-size: 0.6875rem; + color: var(--body-quiet-color); +} + +.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { + margin-left: 5px; + margin-bottom: 4px; +} + +table p.datetime { + font-size: 0.6875rem; + margin-left: 0; + padding-left: 0; +} + +.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { + position: relative; + display: inline-block; + vertical-align: middle; + height: 24px; + width: 24px; + overflow: hidden; +} + +.datetimeshortcuts .clock-icon { + background: url(../img/icon-clock.svg) 0 0 no-repeat; + background-size: 24px auto; +} + +.datetimeshortcuts a:focus .clock-icon, +.datetimeshortcuts a:hover .clock-icon { + background-position: 0 -24px; +} + +.datetimeshortcuts .date-icon { + background: url(../img/icon-calendar.svg) 0 0 no-repeat; + background-size: 24px auto; + top: -1px; +} + +.datetimeshortcuts a:focus .date-icon, +.datetimeshortcuts a:hover .date-icon { + background-position: 0 -24px; +} + +.timezonewarning { + font-size: 0.6875rem; + color: var(--body-quiet-color); +} + +/* URL */ + +p.url { + line-height: 20px; + margin: 0; + padding: 0; + color: var(--body-quiet-color); + font-size: 0.6875rem; + font-weight: bold; +} + +.url a { + font-weight: normal; +} + +/* FILE UPLOADS */ + +p.file-upload { + line-height: 20px; + margin: 0; + padding: 0; + color: var(--body-quiet-color); + font-size: 0.6875rem; + font-weight: bold; +} + +.file-upload a { + font-weight: normal; +} + +.file-upload .deletelink { + margin-left: 5px; +} + +span.clearable-file-input label { + color: var(--body-fg); + font-size: 0.6875rem; + display: inline; + float: none; +} + +/* CALENDARS & CLOCKS */ + +.calendarbox, .clockbox { + margin: 5px auto; + font-size: 0.75rem; + width: 19em; + text-align: center; + background: var(--body-bg); + color: var(--body-fg); + border: 1px solid var(--hairline-color); + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); + overflow: hidden; + position: relative; +} + +.clockbox { + width: auto; +} + +.calendar { + margin: 0; + padding: 0; +} + +.calendar table { + margin: 0; + padding: 0; + border-collapse: collapse; + background: white; + width: 100%; +} + +.calendar caption, .calendarbox h2 { + margin: 0; + text-align: center; + border-top: none; + font-weight: 700; + font-size: 0.75rem; + color: #333; + background: var(--accent); +} + +.calendar th { + padding: 8px 5px; + background: var(--darkened-bg); + border-bottom: 1px solid var(--border-color); + font-weight: 400; + font-size: 0.75rem; + text-align: center; + color: var(--body-quiet-color); +} + +.calendar td { + font-weight: 400; + font-size: 0.75rem; + text-align: center; + padding: 0; + border-top: 1px solid var(--hairline-color); + border-bottom: none; +} + +.calendar td.selected a { + background: var(--secondary); + color: var(--button-fg); +} + +.calendar td.nonday { + background: var(--darkened-bg); +} + +.calendar td.today a { + font-weight: 700; +} + +.calendar td a, .timelist a { + display: block; + font-weight: 400; + padding: 6px; + text-decoration: none; + color: var(--body-quiet-color); +} + +.calendar td a:focus, .timelist a:focus, +.calendar td a:hover, .timelist a:hover { + background: var(--primary); + color: white; +} + +.calendar td a:active, .timelist a:active { + background: var(--header-bg); + color: white; +} + +.calendarnav { + font-size: 0.625rem; + text-align: center; + color: #ccc; + margin: 0; + padding: 1px 3px; +} + +.calendarnav a:link, #calendarnav a:visited, +#calendarnav a:focus, #calendarnav a:hover { + color: var(--body-quiet-color); +} + +.calendar-shortcuts { + background: var(--body-bg); + color: var(--body-quiet-color); + font-size: 0.6875rem; + line-height: 0.6875rem; + border-top: 1px solid var(--hairline-color); + padding: 8px 0; +} + +.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { + display: block; + position: absolute; + top: 8px; + width: 15px; + height: 15px; + text-indent: -9999px; + padding: 0; +} + +.calendarnav-previous { + left: 10px; + background: url(../img/calendar-icons.svg) 0 0 no-repeat; +} + +.calendarnav-next { + right: 10px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; +} + +.calendar-cancel { + margin: 0; + padding: 4px 0; + font-size: 0.75rem; + background: var(--close-button-bg); + border-top: 1px solid var(--border-color); + color: var(--button-fg); +} + +.calendar-cancel:focus, .calendar-cancel:hover { + background: var(--close-button-hover-bg); +} + +.calendar-cancel a { + color: var(--button-fg); + display: block; +} + +ul.timelist, .timelist li { + list-style-type: none; + margin: 0; + padding: 0; +} + +.timelist a { + padding: 2px; +} + +/* EDIT INLINE */ + +.inline-deletelink { + float: right; + text-indent: -9999px; + background: url(../img/inline-delete.svg) 0 0 no-repeat; + width: 1.5rem; + height: 1.5rem; + border: 0px none; + margin-bottom: .25rem; +} + +.inline-deletelink:focus, .inline-deletelink:hover { + cursor: pointer; +} + +/* RELATED WIDGET WRAPPER */ +.related-widget-wrapper { + display: flex; + gap: 0 10px; + flex-grow: 1; + flex-wrap: wrap; + margin-bottom: 5px; +} + +.related-widget-wrapper-link { + opacity: .6; + filter: grayscale(1); +} + +.related-widget-wrapper-link:link { + opacity: 1; + filter: grayscale(0); +} + +/* GIS MAPS */ +.dj_map { + width: 600px; + height: 400px; +} diff --git a/src/collectedstatic/admin/img/LICENSE b/src/collectedstatic/admin/img/LICENSE new file mode 100644 index 0000000..a4faaa1 --- /dev/null +++ b/src/collectedstatic/admin/img/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Code Charm Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/collectedstatic/admin/img/README.txt b/src/collectedstatic/admin/img/README.txt new file mode 100644 index 0000000..bf81f35 --- /dev/null +++ b/src/collectedstatic/admin/img/README.txt @@ -0,0 +1,7 @@ +All icons are taken from Font Awesome (https://fontawesome.com/) project. +The Font Awesome font is licensed under the SIL OFL 1.1: +- https://scripts.sil.org/OFL + +SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG +Font-Awesome-SVG-PNG is licensed under the MIT license (see file license +in current folder). diff --git a/src/collectedstatic/admin/img/calendar-icons.svg b/src/collectedstatic/admin/img/calendar-icons.svg new file mode 100644 index 0000000..04c0274 --- /dev/null +++ b/src/collectedstatic/admin/img/calendar-icons.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + diff --git a/src/collectedstatic/admin/img/gis/move_vertex_off.svg b/src/collectedstatic/admin/img/gis/move_vertex_off.svg new file mode 100644 index 0000000..228854f --- /dev/null +++ b/src/collectedstatic/admin/img/gis/move_vertex_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/collectedstatic/admin/img/gis/move_vertex_on.svg b/src/collectedstatic/admin/img/gis/move_vertex_on.svg new file mode 100644 index 0000000..96b87fd --- /dev/null +++ b/src/collectedstatic/admin/img/gis/move_vertex_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/collectedstatic/admin/img/icon-addlink.svg b/src/collectedstatic/admin/img/icon-addlink.svg new file mode 100644 index 0000000..8d5c6a3 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-addlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-alert.svg b/src/collectedstatic/admin/img/icon-alert.svg new file mode 100644 index 0000000..e51ea83 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-alert.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-calendar.svg b/src/collectedstatic/admin/img/icon-calendar.svg new file mode 100644 index 0000000..97910a9 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/collectedstatic/admin/img/icon-changelink.svg b/src/collectedstatic/admin/img/icon-changelink.svg new file mode 100644 index 0000000..592b093 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-changelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-clock.svg b/src/collectedstatic/admin/img/icon-clock.svg new file mode 100644 index 0000000..bf9985d --- /dev/null +++ b/src/collectedstatic/admin/img/icon-clock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/collectedstatic/admin/img/icon-deletelink.svg b/src/collectedstatic/admin/img/icon-deletelink.svg new file mode 100644 index 0000000..4059b15 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-deletelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-hidelink.svg b/src/collectedstatic/admin/img/icon-hidelink.svg new file mode 100644 index 0000000..2a8b404 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-hidelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-no.svg b/src/collectedstatic/admin/img/icon-no.svg new file mode 100644 index 0000000..2e0d383 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-no.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-unknown-alt.svg b/src/collectedstatic/admin/img/icon-unknown-alt.svg new file mode 100644 index 0000000..1c6b99f --- /dev/null +++ b/src/collectedstatic/admin/img/icon-unknown-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-unknown.svg b/src/collectedstatic/admin/img/icon-unknown.svg new file mode 100644 index 0000000..50b4f97 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-unknown.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-viewlink.svg b/src/collectedstatic/admin/img/icon-viewlink.svg new file mode 100644 index 0000000..a1ca1d3 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-viewlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/icon-yes.svg b/src/collectedstatic/admin/img/icon-yes.svg new file mode 100644 index 0000000..5883d87 --- /dev/null +++ b/src/collectedstatic/admin/img/icon-yes.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/inline-delete.svg b/src/collectedstatic/admin/img/inline-delete.svg new file mode 100644 index 0000000..8751150 --- /dev/null +++ b/src/collectedstatic/admin/img/inline-delete.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/search.svg b/src/collectedstatic/admin/img/search.svg new file mode 100644 index 0000000..c8c69b2 --- /dev/null +++ b/src/collectedstatic/admin/img/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/selector-icons.svg b/src/collectedstatic/admin/img/selector-icons.svg new file mode 100644 index 0000000..926b8e2 --- /dev/null +++ b/src/collectedstatic/admin/img/selector-icons.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/collectedstatic/admin/img/sorting-icons.svg b/src/collectedstatic/admin/img/sorting-icons.svg new file mode 100644 index 0000000..7c31ec9 --- /dev/null +++ b/src/collectedstatic/admin/img/sorting-icons.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/collectedstatic/admin/img/tooltag-add.svg b/src/collectedstatic/admin/img/tooltag-add.svg new file mode 100644 index 0000000..1ca64ae --- /dev/null +++ b/src/collectedstatic/admin/img/tooltag-add.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/img/tooltag-arrowright.svg b/src/collectedstatic/admin/img/tooltag-arrowright.svg new file mode 100644 index 0000000..b664d61 --- /dev/null +++ b/src/collectedstatic/admin/img/tooltag-arrowright.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/collectedstatic/admin/js/SelectBox.js b/src/collectedstatic/admin/js/SelectBox.js new file mode 100644 index 0000000..e0815ac --- /dev/null +++ b/src/collectedstatic/admin/js/SelectBox.js @@ -0,0 +1,175 @@ +'use strict'; +{ + const SelectBox = { + // 缓存所有下拉框的选项数据(键:下拉框ID,值:选项数组) + cache: {}, + /** + * 初始化下拉框缓存 + * 将下拉框的所有选项保存到缓存中,用于后续操作(过滤、移动等) + * @param {string} id - 下拉框元素的ID + */ + init: function(id) { + const box = document.getElementById(id); + SelectBox.cache[id] = []; + const cache = SelectBox.cache[id]; + for (const node of box.options) { + cache.push({value: node.value, text: node.text, displayed: 1}); + } + }, + /** + * 根据缓存重新渲染下拉框 + * 只显示缓存中标记为“displayed: 1”的选项,保持滚动位置 + * @param {string} id - 下拉框元素的ID + */ + redisplay: function(id) { + // Repopulate HTML select box from cache + const box = document.getElementById(id); + const scroll_value_from_top = box.scrollTop; + box.innerHTML = ''; + for (const node of SelectBox.cache[id]) { + if (node.displayed) { + const new_option = new Option(node.text, node.value, false, false); + // Shows a tooltip when hovering over the option + new_option.title = node.text; + box.appendChild(new_option); + } + } + box.scrollTop = scroll_value_from_top; + }, + /** + * 过滤下拉框选项 + * 根据输入文本筛选选项,只显示包含所有关键词的选项(AND逻辑) + * @param {string} id - 下拉框元素的ID + * @param {string} text - 过滤文本(多个关键词用空格分隔) + */ + filter: function(id, text) { + // Redisplay the HTML select box, displaying only the choices containing ALL + // the words in text. (It's an AND search.) + const tokens = text.toLowerCase().split(/\s+/); + for (const node of SelectBox.cache[id]) { + node.displayed = 1; + const node_text = node.text.toLowerCase(); + for (const token of tokens) { + if (!node_text.includes(token)) { + node.displayed = 0; + break; // Once the first token isn't found we're done + } + } + } + SelectBox.redisplay(id); + }, + /** + * 获取隐藏的选项数量 + * @param {string} id - 下拉框元素的ID + * @return {number} 隐藏选项的数量 + */ + get_hidden_node_count(id) { + const cache = SelectBox.cache[id] || []; + return cache.filter(node => node.displayed === 0).length; + }, + /** + * 从缓存中删除指定值的选项 + * @param {string} id - 下拉框元素的ID + * @param {string} value - 要删除的选项值 + */ + delete_from_cache: function(id, value) { + let delete_index = null; + const cache = SelectBox.cache[id]; + for (const [i, node] of cache.entries()) { + if (node.value === value) { + delete_index = i; + break; + } + } + cache.splice(delete_index, 1); + }, + /** + * 向缓存中添加选项 + * @param {string} id - 下拉框元素的ID + * @param {Object} option - 要添加的选项(含value和text) + */ + add_to_cache: function(id, option) { + SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); + }, + /** + * 检查缓存中是否包含指定值的选项 + * @param {string} id - 下拉框元素的ID + * @param {string} value - 要检查的选项值 + * @return {boolean} 存在返回true,否则返回false + */ + cache_contains: function(id, value) { + // Check if an item is contained in the cache + for (const node of SelectBox.cache[id]) { + if (node.value === value) { + return true; + } + } + return false; + }, + /** + * 将选中的选项从一个下拉框移动到另一个下拉框 + * @param {string} from - 源下拉框ID + * @param {string} to - 目标下拉框ID + */ + move: function(from, to) { + const from_box = document.getElementById(from); + // 遍历源下拉框的所有选项 + for (const option of from_box.options) { + const option_value = option.value; + if (option.selected && SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + // 重新渲染两个下拉框 + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + /** + * 将所有选项从一个下拉框移动到另一个下拉框 + * @param {string} from - 源下拉框ID + * @param {string} to - 目标下拉框ID + */ + move_all: function(from, to) { + const from_box = document.getElementById(from); + for (const option of from_box.options) { + const option_value = option.value; + if (SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + /** + * 对下拉框的选项按文本进行排序(忽略大小写) + * @param {string} id - 下拉框元素的ID + */ + sort: function(id) { + SelectBox.cache[id].sort(function(a, b) { + a = a.text.toLowerCase(); + b = b.text.toLowerCase(); + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + return 0; + } ); + }, + /** + * 选中下拉框中的所有选项 + * @param {string} id - 下拉框元素的ID + */ + select_all: function(id) { + const box = document.getElementById(id); + for (const option of box.options) { + option.selected = true; + } + } + }; + // 暴露到window全局,供外部调用 + window.SelectBox = SelectBox; +} diff --git a/src/collectedstatic/admin/js/SelectFilter2.js b/src/collectedstatic/admin/js/SelectFilter2.js new file mode 100644 index 0000000..f6ee643 --- /dev/null +++ b/src/collectedstatic/admin/js/SelectFilter2.js @@ -0,0 +1,397 @@ +/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ +/* +SelectFilter2 - Turns a multiple-select box into a filter interface. + +Requires core.js and SelectBox.js. +*/ +'use strict'; +{ + window.SelectFilter = { + /** + * 初始化双栏选择器 + * 生成“可选”“已选”双栏布局,绑定交互事件,初始化选项数据 + * @param {string} field_id - 原始多选框ID + * @param {string} field_name - 字段名称(用于显示文本,如“文章”“标签”) + * @param {boolean} is_stacked - 是否为堆叠布局(true=垂直堆叠,false=水平并列) + */ + init: function(field_id, field_name, is_stacked) { + // 跳过表单集模板中的字段(ID含__prefix__,未实际渲染) + if (field_id.match(/__prefix__/)) { + // Don't initialize on empty forms. + return; + } + // 1. 处理原始多选框(转为“可选”栏) + const from_box = document.getElementById(field_id); + from_box.id += '_from'; // change its ID + from_box.className = 'filtered'; + from_box.setAttribute('aria-labelledby', field_id + '_from_title'); + // 处理原始父容器中的文本(移除info文本,移动help文本到顶部) + for (const p of from_box.parentNode.getElementsByTagName('p')) { + if (p.classList.contains("info")) { + // Remove

, because it just gets in the way. + from_box.parentNode.removeChild(p); + } else if (p.classList.contains("help")) { + // Move help text up to the top so it isn't below the select + // boxes or wrapped off on the side to the right of the add + // button: + // 移动help文本到父容器最顶部(避免被遮挡) + from_box.parentNode.insertBefore(p, from_box.parentNode.firstChild); + } + } + + //

or
+ // 2. 生成核心容器结构 + // 2.1 主选择器容器(含双栏和操作按钮) + const selector_div = quickElement('div', from_box.parentNode); + // Make sure the selector div is at the beginning so that the + // add link would be displayed to the right of the widget. + from_box.parentNode.prepend(selector_div); + selector_div.className = is_stacked ? 'selector stacked' : 'selector'; + + //
+ // 2.2 “可选”栏容器(左侧/上方,未选择的选项) + const selector_available = quickElement('div', selector_div); + selector_available.className = 'selector-available'; + // “可选”栏标题区(含字段名称和帮助文本) + const selector_available_title = quickElement('div', selector_available); + selector_available_title.id = field_id + '_from_title'; + selector_available_title.className = 'selector-available-title'; + quickElement('label', selector_available_title, interpolate(gettext('Available %s') + ' ', [field_name]), 'for', field_id + '_from'); + quickElement( + 'p', + selector_available_title, + interpolate(gettext('Choose %s by selecting them and then select the "Choose" arrow button.'), [field_name]), + 'class', 'helptext' + ); + // “可选”栏过滤输入框 + const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); + filter_p.className = 'selector-filter'; + + const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); + // 过滤图标(带悬浮提示) + quickElement( + 'span', search_filter_label, '', + 'class', 'help-tooltip search-label-icon', + 'aria-label', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) + ); + + filter_p.appendChild(document.createTextNode(' ')); + + const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); + filter_input.id = field_id + '_input'; + + selector_available.appendChild(from_box); + const choose_all = quickElement( + 'button', + selector_available, + interpolate(gettext('Choose all %s'), [field_name]), + 'id', field_id + '_add_all', + 'class', 'selector-chooseall', + 'type', 'button' + ); + + //
    + // 2.3 操作按钮容器(中间,转移选项的按钮) + const selector_chooser = quickElement('ul', selector_div); + selector_chooser.className = 'selector-chooser'; + // “选择选中项”按钮(可选→已选) + const add_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Choose selected %s'), [field_name]), + 'id', field_id + '_add', + 'class', 'selector-add', + 'type', 'button' + ); + const remove_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Remove selected %s'), [field_name]), + 'id', field_id + '_remove', + 'class', 'selector-remove', + 'type', 'button' + ); + + //
    + // 2.4 “已选”栏容器(右侧/下方,已选择的选项) + const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen'); + selector_chosen.className = 'selector-chosen'; + + const selector_chosen_title = quickElement('div', selector_chosen); + selector_chosen_title.className = 'selector-chosen-title'; + selector_chosen_title.id = field_id + '_to_title'; + quickElement('label', selector_chosen_title, interpolate(gettext('Chosen %s') + ' ', [field_name]), 'for', field_id + '_to'); + quickElement( + 'p', + selector_chosen_title, + interpolate(gettext('Remove %s by selecting them and then select the "Remove" arrow button.'), [field_name]), + 'class', 'helptext' + ); + + const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected'); + filter_selected_p.className = 'selector-filter'; + + const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input'); + + quickElement( + 'span', search_filter_selected_label, '', + 'class', 'help-tooltip search-label-icon', + 'aria-label', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name]) + ); + + filter_selected_p.appendChild(document.createTextNode(' ')); + + const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter")); + filter_selected_input.id = field_id + '_selected_input'; + // 生成“已选”栏的多选框(最终提交给后端的字段) + quickElement( + 'select', + selector_chosen, + '', + 'id', field_id + '_to', + 'multiple', '', + 'size', from_box.size, + 'name', from_box.name, + 'aria-labelledby', field_id + '_to_title', + 'class', 'filtered' + ); + // “已选”栏隐藏选项提示区(过滤时显示隐藏的已选项数量) + const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display'); + quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text'); + quickElement('span', warning_footer, ' ' + gettext('(click to clear)'), 'class', 'list-footer-display__clear'); + const clear_all = quickElement( + 'button', + selector_chosen, + interpolate(gettext('Remove all %s'), [field_name]), + 'id', field_id + '_remove_all', + 'class', 'selector-clearall', + 'type', 'button' + ); + // 3. 调整原始多选框的名称(避免提交冲突) + from_box.name = from_box.name + '_old'; + + // Set up the JavaScript event handlers for the select box filter interface + // 4. 绑定核心交互事件 + /** + * 选项转移通用函数 + * @param {Event} e - 事件对象 + * @param {HTMLElement} elem - 触发事件的按钮 + * @param {Function} move_func - 转移函数(SelectBox.move/move_all) + * @param {string} from - 源栏ID + * @param {string} to - 目标栏ID + */ + const move_selection = function(e, elem, move_func, from, to) { + if (!elem.hasAttribute('disabled')) { + move_func(from, to); + SelectFilter.refresh_icons(field_id); + SelectFilter.refresh_filtered_selects(field_id); + SelectFilter.refresh_filtered_warning(field_id); + } + e.preventDefault(); + }; + // 绑定“全选”按钮(可选→已选) + choose_all.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); + }); + // 绑定“选择选中项”按钮(可选→已选) + add_button.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); + }); + // 绑定“移除选中项”按钮(已选→可选) + remove_button.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); + }); + // 绑定“全部移除”按钮(已选→可选) + clear_all.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); + }); + // 绑定“已选”栏过滤提示区点击事件(清空过滤) + warning_footer.addEventListener('click', function(e) { + filter_selected_input.value = ''; + SelectBox.filter(field_id + '_to', ''); + SelectFilter.refresh_filtered_warning(field_id); + SelectFilter.refresh_icons(field_id); + }); + // 绑定过滤输入框按键事件(可选栏) + filter_input.addEventListener('keypress', function(e) { + SelectFilter.filter_key_press(e, field_id, '_from', '_to'); + }); + filter_input.addEventListener('keyup', function(e) { + SelectFilter.filter_key_up(e, field_id, '_from'); + }); + filter_input.addEventListener('keydown', function(e) { + SelectFilter.filter_key_down(e, field_id, '_from', '_to'); + }); + // 绑定过滤输入框按键事件(已选栏) + filter_selected_input.addEventListener('keypress', function(e) { + SelectFilter.filter_key_press(e, field_id, '_to', '_from'); + }); + filter_selected_input.addEventListener('keyup', function(e) { + SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input'); + }); + filter_selected_input.addEventListener('keydown', function(e) { + SelectFilter.filter_key_down(e, field_id, '_to', '_from'); + }); + selector_div.addEventListener('change', function(e) { + if (e.target.tagName === 'SELECT') { + SelectFilter.refresh_icons(field_id); + } + }); + // 双击选项直接转移(可选→已选 或 已选→可选) + selector_div.addEventListener('dblclick', function(e) { + if (e.target.tagName === 'OPTION') { + if (e.target.closest('select').id === field_id + '_to') { + SelectBox.move(field_id + '_to', field_id + '_from'); + } else { + SelectBox.move(field_id + '_from', field_id + '_to'); + } + SelectFilter.refresh_icons(field_id); + } + }); + // 表单提交前处理:清空已选栏过滤,全选已选项(确保所有已选项提交) + from_box.closest('form').addEventListener('submit', function() { + SelectBox.filter(field_id + '_to', ''); + SelectBox.select_all(field_id + '_to'); + }); + // 5. 初始化SelectBox缓存(可选栏和已选栏 + SelectBox.init(field_id + '_from'); + SelectBox.init(field_id + '_to'); + // Move selected from_box options to to_box + SelectBox.move(field_id + '_from', field_id + '_to'); + + // Initial icon refresh + // 6. 初始刷新按钮状态 + SelectFilter.refresh_icons(field_id); + }, + /** + * 判断选择框是否有选中项 + * @param {HTMLElement} field - 选择框元素 + * @return {boolean} true=有选中项,false=无选中项 + */ + any_selected: function(field) { + // Temporarily add the required attribute and check validity. + field.required = true; + const any_selected = field.checkValidity(); + field.required = false; + return any_selected; + }, + /** + * 刷新“已选”栏的隐藏选项提示 + * 显示过滤后隐藏的已选项数量,无隐藏项则隐藏提示 + * @param {string} field_id - 字段ID前缀 + */ + refresh_filtered_warning: function(field_id) { + const count = SelectBox.get_hidden_node_count(field_id + '_to'); + const selector = document.getElementById(field_id + '_selector_chosen'); + const warning = document.getElementById(field_id + '_list-footer-display-text'); + // 移除“有隐藏项”样式 + selector.className = selector.className.replace('selector-chosen--with-filtered', ''); + warning.textContent = interpolate(ngettext( + '%s selected option not visible', + '%s selected options not visible', + count + ), [count]); + if(count > 0) { + selector.className += ' selector-chosen--with-filtered'; + } + }, + /** + * 刷新双栏的过滤状态 + * 同步两个栏的过滤输入值到SelectBox + * @param {string} field_id - 字段ID前缀 + */ + refresh_filtered_selects: function(field_id) { + // 同步可选栏过滤值 + SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value); + // 同步已选栏过滤值 + SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value); + }, + /** + * 刷新操作按钮的禁用状态 + * 根据选择框是否有选项/选中项,启用或禁用按钮 + * @param {string} field_id - 字段ID前缀 + */ + refresh_icons: function(field_id) { + const from = document.getElementById(field_id + '_from'); + const to = document.getElementById(field_id + '_to'); + // Disabled if no items are selected. + document.getElementById(field_id + '_add').disabled = !SelectFilter.any_selected(from); + document.getElementById(field_id + '_remove').disabled = !SelectFilter.any_selected(to); + // Disabled if the corresponding box is empty. + document.getElementById(field_id + '_add_all').disabled = !from.querySelector('option'); + document.getElementById(field_id + '_remove_all').disabled = !to.querySelector('option'); + }, + /** + * 过滤输入框按键按下事件(Enter键处理) + * 按下Enter时,转移当前选中项 + * @param {Event} event - 事件对象 + * @param {string} field_id - 字段ID前缀 + * @param {string} source - 源栏后缀(_from/_to) + * @param {string} target - 目标栏后缀(_to/_from) + */ + filter_key_press: function(event, field_id, source, target) { + const source_box = document.getElementById(field_id + source); + // don't submit form if user pressed Enter + if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { + source_box.selectedIndex = 0; + SelectBox.move(field_id + source, field_id + target); + source_box.selectedIndex = 0; + event.preventDefault(); + } + }, + /** + * 过滤输入框按键抬起事件(实时过滤) + * 输入内容变化时,实时过滤选项 + * @param {Event} event - 事件对象 + * @param {string} field_id - 字段ID前缀 + * @param {string} source - 源栏后缀(_from/_to) + * @param {string} [filter_input] - 过滤输入框后缀(默认_input) + */ + filter_key_up: function(event, field_id, source, filter_input) { + const input = filter_input || '_input'; + const source_box = document.getElementById(field_id + source); + const temp = source_box.selectedIndex; + SelectBox.filter(field_id + source, document.getElementById(field_id + input).value); + source_box.selectedIndex = temp; + SelectFilter.refresh_filtered_warning(field_id); + SelectFilter.refresh_icons(field_id); + }, + /** + * 过滤输入框按键按下事件(方向键处理) + * 支持方向键转移选项、上下键切换选中项 + * @param {Event} event - 事件对象 + * @param {string} field_id - 字段ID前缀 + * @param {string} source - 源栏后缀(_from/_to) + * @param {string} target - 目标栏后缀(_to/_from) + */ + filter_key_down: function(event, field_id, source, target) { + const source_box = document.getElementById(field_id + source); + // right key (39) or left key (37) + const direction = source === '_from' ? 39 : 37; + // right arrow -- move across + if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) { + const old_index = source_box.selectedIndex; + SelectBox.move(field_id + source, field_id + target); + SelectFilter.refresh_filtered_selects(field_id); + SelectFilter.refresh_filtered_warning(field_id); + source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index; + return; + } + // down arrow -- wrap around + if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { + source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1; + } + // up arrow -- wrap around + if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { + source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1; + } + } + }; + // 页面加载完成后,初始化所有SelectFilter组件 + window.addEventListener('load', function(e) { + document.querySelectorAll('select.selectfilter, select.selectfilterstacked').forEach(function(el) { + const data = el.dataset; + SelectFilter.init(el.id, data.fieldName, parseInt(data.isStacked, 10)); + }); + }); +} diff --git a/src/collectedstatic/admin/js/actions.js b/src/collectedstatic/admin/js/actions.js new file mode 100644 index 0000000..178ef1a --- /dev/null +++ b/src/collectedstatic/admin/js/actions.js @@ -0,0 +1,253 @@ +/*global gettext, interpolate, ngettext, Actions*/ +'use strict'; +{ + /** + * 显示元素 + * 移除指定选择器匹配元素的"hidden"类,使其可见 + * @param {string} selector - CSS选择器 + */ + function show(selector) { + document.querySelectorAll(selector).forEach(function(el) { + el.classList.remove('hidden'); + }); + } + /** + * 隐藏元素 + * 给指定选择器匹配元素添加"hidden"类,使其隐藏 + * @param {string} selector - CSS选择器 + */ + function hide(selector) { + document.querySelectorAll(selector).forEach(function(el) { + el.classList.add('hidden'); + }); + } + /** + * 显示“跨页选择”确认问题 + * 当选择“全选”时,显示是否跨页选择的提示 + * @param {Object} options - 配置参数(包含各类元素选择器) + */ + function showQuestion(options) { + hide(options.acrossClears); + show(options.acrossQuestions); + hide(options.allContainer); + } + /** + * 显示“清除跨页选择”区域 + * 确认跨页选择后,切换到清除选择的展示状态 + * @param {Object} options - 配置参数 + */ + function showClear(options) { + show(options.acrossClears); + hide(options.acrossQuestions); + document.querySelector(options.actionContainer).classList.remove(options.selectedClass); + show(options.allContainer); + hide(options.counterContainer); + } + /** + * 重置选择状态 + * 恢复到初始状态:隐藏跨页相关区域,显示选择计数器 + * @param {Object} options - 配置参数 + */ + function reset(options) { + hide(options.acrossClears); + hide(options.acrossQuestions); + hide(options.allContainer); + show(options.counterContainer); + } + /** + * 清除跨页选择状态 + * 重置选择状态,清空跨页选择的输入框值,移除选中样式 + * @param {Object} options - 配置参数 + */ + function clearAcross(options) { + reset(options); + const acrossInputs = document.querySelectorAll(options.acrossInput); + acrossInputs.forEach(function(acrossInput) { + acrossInput.value = 0; + }); + document.querySelector(options.actionContainer).classList.remove(options.selectedClass); + } + /** + * 统一设置复选框状态 + * 批量设置一组复选框的勾选状态,并同步其所在行的“选中”样式 + * @param {NodeList} actionCheckboxes - 要操作的复选框列表 + * @param {Object} options - 配置参数 + * @param {boolean} checked - 目标勾选状态(true=勾选,false=取消勾选) + */ + function checker(actionCheckboxes, options, checked) { + if (checked) { + showQuestion(options); + } else { + reset(options); + } + actionCheckboxes.forEach(function(el) { + el.checked = checked; + el.closest('tr').classList.toggle(options.selectedClass, checked); + }); + } + /** + * 更新选择计数器 + * 计算已勾选的复选框数量,更新计数器文本,并同步“全选”框状态 + * @param {NodeList} actionCheckboxes - 所有操作复选框 + * @param {Object} options - 配置参数 + */ + function updateCounter(actionCheckboxes, options) { + const sel = Array.from(actionCheckboxes).filter(function(el) { + return el.checked; + }).length; + const counter = document.querySelector(options.counterContainer); + // data-actions-icnt is defined in the generated HTML + // and contains the total amount of objects in the queryset + const actions_icnt = Number(counter.dataset.actionsIcnt); + counter.textContent = interpolate( + ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { + sel: sel, + cnt: actions_icnt + }, true); + const allToggle = document.getElementById(options.allToggleId); + allToggle.checked = sel === actionCheckboxes.length; + if (allToggle.checked) { + showQuestion(options); + } else { + clearAcross(options); + } + } + /** + * 默认配置参数 + * 存储各类元素的选择器和样式类名,可通过传入options覆盖 + */ + const defaults = { + actionContainer: "div.actions", + counterContainer: "span.action-counter", + allContainer: "div.actions span.all", + acrossInput: "div.actions input.select-across", + acrossQuestions: "div.actions span.question", + acrossClears: "div.actions span.clear", + allToggleId: "action-toggle", + selectedClass: "selected" + }; + /** + * 批量操作核心类 + * 初始化批量操作的所有交互逻辑 + * @param {NodeList} actionCheckboxes - 列表中所有操作复选框 + * @param {Object} options - 自定义配置参数(覆盖默认值) + */ + window.Actions = function(actionCheckboxes, options) { + options = Object.assign({}, defaults, options); + let list_editable_changed = false; + let lastChecked = null; + let shiftPressed = false; + + document.addEventListener('keydown', (event) => { + shiftPressed = event.shiftKey; + }); + + document.addEventListener('keyup', (event) => { + shiftPressed = event.shiftKey; + }); + + document.getElementById(options.allToggleId).addEventListener('click', function(event) { + checker(actionCheckboxes, options, this.checked); + updateCounter(actionCheckboxes, options); + }); + + document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { + el.addEventListener('click', function(event) { + event.preventDefault(); + const acrossInputs = document.querySelectorAll(options.acrossInput); + acrossInputs.forEach(function(acrossInput) { + acrossInput.value = 1; + }); + showClear(options); + }); + }); + + document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { + el.addEventListener('click', function(event) { + event.preventDefault(); + document.getElementById(options.allToggleId).checked = false; + clearAcross(options); + checker(actionCheckboxes, options, false); + updateCounter(actionCheckboxes, options); + }); + }); + /** + * 计算受影响的复选框(支持Shift键范围选择) + * @param {HTMLElement} target - 当前点击的复选框 + * @param {boolean} withModifier - 是否按下了Shift键 + * @return {Array} 受影响的复选框数组 + */ + function affectedCheckboxes(target, withModifier) { + const multiSelect = (lastChecked && withModifier && lastChecked !== target); + if (!multiSelect) { + return [target]; + } + const checkboxes = Array.from(actionCheckboxes); + const targetIndex = checkboxes.findIndex(el => el === target); + const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); + const startIndex = Math.min(targetIndex, lastCheckedIndex); + const endIndex = Math.max(targetIndex, lastCheckedIndex); + const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); + return filtered; + }; + // 给列表的tbody绑定change事件(监听复选框状态变化) + Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { + el.addEventListener('change', function(event) { + const target = event.target; + if (target.classList.contains('action-select')) { + const checkboxes = affectedCheckboxes(target, shiftPressed); + checker(checkboxes, options, target.checked); + updateCounter(actionCheckboxes, options); + lastChecked = target; + } else { + list_editable_changed = true; + } + }); + }); + // 绑定“执行操作”按钮(name=index)的点击事件 + document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { + if (list_editable_changed) { + const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); + if (!confirmed) { + event.preventDefault(); + } + } + }); + + const el = document.querySelector('#changelist-form input[name=_save]'); + // The button does not exist if no fields are editable. + if (el) { + el.addEventListener('click', function(event) { + if (document.querySelector('[name=action]').value) { + const text = list_editable_changed + ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") + : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); + if (!confirm(text)) { + event.preventDefault(); + } + } + }); + } + // Sync counter when navigating to the page, such as through the back + // button. + window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); + }; + + // Call function fn when the DOM is loaded and ready. If it is already + // loaded, call the function now. + // http://youmightnotneedjquery.com/#ready + function ready(fn) { + if (document.readyState !== 'loading') { + fn(); + } else { + document.addEventListener('DOMContentLoaded', fn); + } + } + + ready(function() { + const actionsEls = document.querySelectorAll('tr input.action-select'); + if (actionsEls.length > 0) { + Actions(actionsEls); + } + }); +} diff --git a/src/collectedstatic/admin/js/admin/DateTimeShortcuts.js b/src/collectedstatic/admin/js/admin/DateTimeShortcuts.js new file mode 100644 index 0000000..048e542 --- /dev/null +++ b/src/collectedstatic/admin/js/admin/DateTimeShortcuts.js @@ -0,0 +1,422 @@ +/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ +// Inserts shortcut buttons after all of the following: +// +// +'use strict'; +{ + // 定义日期时间快捷操作核心对象 + const DateTimeShortcuts = { + // 存储日历实例的数组(每个日期输入框对应一个日历实例) + calendars: [], + // 存储日期输入框DOM元素的数组 + calendarInputs: [], + // 存储日期输入框DOM元素的数组 + clockInputs: [], + // 时间快捷选项配置:默认包含“现在、午夜、早上6点、中午、下午6点” + clockHours: { + default_: [ + [gettext_noop('Now'), -1], + [gettext_noop('Midnight'), 0], + [gettext_noop('6 a.m.'), 6], + [gettext_noop('Noon'), 12], + [gettext_noop('6 p.m.'), 18] + ] + }, + // 存储时钟弹窗关闭函数的数组(每个时钟弹窗对应一个关闭函数) + dismissClockFunc: [], + // 存储日历弹窗关闭函数的数组(每个日历弹窗对应一个关闭函数) + dismissCalendarFunc: [], + // 日历弹窗相关DOM元素的ID前缀 + calendarDivName1: 'calendarbox', // 日历弹窗外层div的ID前缀(如calendarbox0) + calendarDivName2: 'calendarin', // 日历内容容器div的ID前缀(如calendarin0) + calendarLinkName: 'calendarlink', // 日历触发链接的ID前缀(如calendarlink0) + // 日历触发链接的ID前缀(如calendarlink0) + clockDivName: 'clockbox', // name of clock
    that gets toggled + clockLinkName: 'clocklink', // name of the link that is used to toggle + shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts + timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch + timezoneOffset: 0, + /** + * 初始化函数:页面加载完成后执行 + * 1. 计算浏览器与服务器的时区偏移 + * 2. 给所有日期/时间输入框添加对应的快捷功能 + */ + init: function() { + const serverOffset = document.body.dataset.adminUtcOffset; + if (serverOffset) { + const localOffset = new Date().getTimezoneOffset() * -60; + DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; + } + // 遍历页面所有input元素 + for (const inp of document.getElementsByTagName('input')) { + if (inp.type === 'text' && inp.classList.contains('vTimeField')) { + DateTimeShortcuts.addClock(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + else if (inp.type === 'text' && inp.classList.contains('vDateField')) { + DateTimeShortcuts.addCalendar(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + } + }, + // Return the current time while accounting for the server timezone. + now: function() { + const serverOffset = document.body.dataset.adminUtcOffset; + if (serverOffset) { + const localNow = new Date(); + const localOffset = localNow.getTimezoneOffset() * -60; + localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); + return localNow; + } else { + return new Date(); + } + }, + // Add a warning when the time zone in the browser and backend do not match. + addTimezoneWarning: function(inp) { + const warningClass = DateTimeShortcuts.timezoneWarningClass; + let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; + + // Only warn if there is a time zone mismatch. + if (!timezoneOffset) { + return; + } + + // Check if warning is already there. + if (inp.parentNode.querySelectorAll('.' + warningClass).length) { + return; + } + + let message; + if (timezoneOffset > 0) { + message = ngettext( + 'Note: You are %s hour ahead of server time.', + 'Note: You are %s hours ahead of server time.', + timezoneOffset + ); + } + else { + timezoneOffset *= -1; + message = ngettext( + 'Note: You are %s hour behind server time.', + 'Note: You are %s hours behind server time.', + timezoneOffset + ); + } + message = interpolate(message, [timezoneOffset]); + + const warning = document.createElement('div'); + warning.classList.add('help', warningClass); + warning.textContent = message; + inp.parentNode.appendChild(warning); + }, + // Add clock widget to a given field + addClock: function(inp) { + const num = DateTimeShortcuts.clockInputs.length; + DateTimeShortcuts.clockInputs[num] = inp; + DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; + + // Shortcut links (clock icon and "Now" link) + const shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + const now_link = document.createElement('a'); + now_link.href = "#"; + now_link.textContent = gettext('Now'); + now_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, -1); + }); + const clock_link = document.createElement('a'); + clock_link.href = '#'; + clock_link.id = DateTimeShortcuts.clockLinkName + num; + clock_link.addEventListener('click', function(e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the clock + e.stopPropagation(); + DateTimeShortcuts.openClock(num); + }); + + quickElement( + 'span', clock_link, '', + 'class', 'clock-icon', + 'title', gettext('Choose a Time') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(now_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(clock_link); + + // Create clock link div + // + // Markup looks like: + //
    + //

    Choose a time

    + // + //

    Cancel

    + //
    + + const clock_box = document.createElement('div'); + clock_box.style.display = 'none'; + clock_box.style.position = 'absolute'; + clock_box.className = 'clockbox module'; + clock_box.id = DateTimeShortcuts.clockDivName + num; + document.body.appendChild(clock_box); + clock_box.addEventListener('click', function(e) { e.stopPropagation(); }); + + quickElement('h2', clock_box, gettext('Choose a time')); + const time_list = quickElement('ul', clock_box); + time_list.className = 'timelist'; + // The list of choices can be overridden in JavaScript like this: + // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]]; + // where name is the name attribute of the . + const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; + DateTimeShortcuts.clockHours[name].forEach(function(element) { + const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); + time_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, element[1]); + }); + }); + + const cancel_p = quickElement('p', clock_box); + cancel_p.className = 'calendar-cancel'; + const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.dismissClock(num); + }); + + document.addEventListener('keyup', function(event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissClock(num); + event.preventDefault(); + } + }); + }, + openClock: function(num) { + const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); + const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (window.getComputedStyle(document.body).direction !== 'rtl') { + clock_box.style.left = findPosX(clock_link) + 17 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + clock_box.style.left = findPosX(clock_link) - 110 + 'px'; + } + clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; + + // Show the clock box + clock_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + dismissClock: function(num) { + document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + handleClockQuicklink: function(num, val) { + let d; + if (val === -1) { + d = DateTimeShortcuts.now(); + } + else { + d = new Date(1970, 1, 1, val, 0, 0, 0); + } + DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); + DateTimeShortcuts.clockInputs[num].focus(); + DateTimeShortcuts.dismissClock(num); + }, + // Add calendar widget to a given field. + addCalendar: function(inp) { + const num = DateTimeShortcuts.calendars.length; + + DateTimeShortcuts.calendarInputs[num] = inp; + DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; + + // Shortcut links (calendar icon and "Today" link) + const shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + const today_link = document.createElement('a'); + today_link.href = '#'; + today_link.appendChild(document.createTextNode(gettext('Today'))); + today_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + const cal_link = document.createElement('a'); + cal_link.href = '#'; + cal_link.id = DateTimeShortcuts.calendarLinkName + num; + cal_link.addEventListener('click', function(e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the calendar + e.stopPropagation(); + DateTimeShortcuts.openCalendar(num); + }); + quickElement( + 'span', cal_link, '', + 'class', 'date-icon', + 'title', gettext('Choose a Date') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(today_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(cal_link); + + // Create calendarbox div. + // + // Markup looks like: + // + //
    + //

    + // + // February 2003 + //

    + //
    + // + //
    + //
    + // Yesterday | Today | Tomorrow + //
    + //

    Cancel

    + //
    + const cal_box = document.createElement('div'); + cal_box.style.display = 'none'; + cal_box.style.position = 'absolute'; + cal_box.className = 'calendarbox module'; + cal_box.id = DateTimeShortcuts.calendarDivName1 + num; + document.body.appendChild(cal_box); + cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); + + // next-prev links + const cal_nav = quickElement('div', cal_box); + const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); + cal_nav_prev.className = 'calendarnav-previous'; + cal_nav_prev.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.drawPrev(num); + }); + + const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); + cal_nav_next.className = 'calendarnav-next'; + cal_nav_next.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.drawNext(num); + }); + + // main box + const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); + cal_main.className = 'calendar'; + DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); + DateTimeShortcuts.calendars[num].drawCurrent(); + + // calendar shortcuts + const shortcuts = quickElement('div', cal_box); + shortcuts.className = 'calendar-shortcuts'; + let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, -1); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, +1); + }); + + // cancel bar + const cancel_p = quickElement('p', cal_box); + cancel_p.className = 'calendar-cancel'; + const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.dismissCalendar(num); + }); + document.addEventListener('keyup', function(event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissCalendar(num); + event.preventDefault(); + } + }); + }, + openCalendar: function(num) { + const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); + const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); + const inp = DateTimeShortcuts.calendarInputs[num]; + + // Determine if the current value in the input has a valid date. + // If so, draw the calendar with that date's year and month. + if (inp.value) { + const format = get_format('DATE_INPUT_FORMATS')[0]; + const selected = inp.value.strptime(format); + const year = selected.getUTCFullYear(); + const month = selected.getUTCMonth() + 1; + const re = /\d{4}/; + if (re.test(year.toString()) && month >= 1 && month <= 12) { + DateTimeShortcuts.calendars[num].drawDate(month, year, selected); + } + } + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (window.getComputedStyle(document.body).direction !== 'rtl') { + cal_box.style.left = findPosX(cal_link) + 17 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + cal_box.style.left = findPosX(cal_link) - 180 + 'px'; + } + cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; + + cal_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + dismissCalendar: function(num) { + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + drawPrev: function(num) { + DateTimeShortcuts.calendars[num].drawPreviousMonth(); + }, + drawNext: function(num) { + DateTimeShortcuts.calendars[num].drawNextMonth(); + }, + handleCalendarCallback: function(num) { + const format = get_format('DATE_INPUT_FORMATS')[0]; + return function(y, m, d) { + DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); + DateTimeShortcuts.calendarInputs[num].focus(); + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + }; + }, + handleCalendarQuickLink: function(num, offset) { + const d = DateTimeShortcuts.now(); + d.setDate(d.getDate() + offset); + DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); + DateTimeShortcuts.calendarInputs[num].focus(); + DateTimeShortcuts.dismissCalendar(num); + } + }; + + window.addEventListener('load', DateTimeShortcuts.init); + window.DateTimeShortcuts = DateTimeShortcuts; +} diff --git a/src/collectedstatic/admin/js/admin/RelatedObjectLookups.js b/src/collectedstatic/admin/js/admin/RelatedObjectLookups.js new file mode 100644 index 0000000..1db48dd --- /dev/null +++ b/src/collectedstatic/admin/js/admin/RelatedObjectLookups.js @@ -0,0 +1,325 @@ +/*global SelectBox, interpolate*/ +// Handles related-objects functionality: lookup link for raw_id_fields +// and Add Another links. +'use strict'; +{ + // 引入Django封装的jQuery + const $ = django.jQuery; + // 弹窗索引:用于区分多个层级的弹窗 + let popupIndex = 0; + // 存储已打开的关联对象弹窗窗口 + const relatedWindows = []; + /** + * 关闭所有子弹窗 + * 递归关闭当前窗口打开的所有关联弹窗,避免窗口残留 + */ + function dismissChildPopups() { + relatedWindows.forEach(function(win) { + if(!win.closed) { + win.dismissChildPopups(); + win.close(); + } + }); + } + /** + * 设置弹窗索引 + * 根据当前窗口名称判断是否为弹窗,提取并设置popupIndex + * 用于区分多层级弹窗(如弹窗中再打开弹窗) + */ + function setPopupIndex() { + if(document.getElementsByName("_popup").length > 0) { + const index = window.name.lastIndexOf("__") + 2; + popupIndex = parseInt(window.name.substring(index)); + } else { + popupIndex = 0; + } + } + /** + * 给名称添加弹窗索引 + * 用于生成子弹窗的唯一名称(避免窗口名称冲突) + * @param {string} name - 基础名称 + * @return {string} 添加索引后的名称(如"name__2") + */ + function addPopupIndex(name) { + return name + "__" + (popupIndex + 1); + } + /** + * 从名称中移除弹窗索引 + * 关闭弹窗时恢复原始名称,用于定位关联的表单元素 + * @param {string} name - 带索引的名称 + * @return {string} 移除索引后的原始名称 + */ + function removePopupIndex(name) { + return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); + } + /** + * 显示管理员弹窗(基础方法) + * 打开新窗口展示关联对象的添加/编辑/查找页面 + * @param {HTMLElement} triggeringLink - 触发弹窗的链接元素 + * @param {RegExp} name_regexp - 用于提取基础名称的正则表达式 + * @param {boolean} add_popup - 是否添加_popup参数(标记为弹窗模式) + * @return {boolean} false - 阻止链接默认跳转行为 + */ + function showAdminPopup(triggeringLink, name_regexp, add_popup) { + const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); + const href = new URL(triggeringLink.href); + if (add_popup) { + href.searchParams.set('_popup', 1); + } + const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); + relatedWindows.push(win); + win.focus(); + return false; + } + /** + * 显示关联对象查找弹窗 + * 用于raw_id_fields类型的字段,点击查找图标打开弹窗选择对象 + * @param {HTMLElement} triggeringLink - 触发链接(通常是查找图标) + * @return {boolean} 调用showAdminPopup的返回值 + */ + function showRelatedObjectLookupPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^lookup_/, true); + } + /** + * 关闭关联对象查找弹窗 + * 选择对象后,将选中的ID填充到对应的输入框 + * @param {Window} win - 弹窗窗口对象 + * @param {string} chosenId - 选中的对象ID + */ + function dismissRelatedLookupPopup(win, chosenId) { + const name = removePopupIndex(win.name); + const elem = document.getElementById(name); + if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { + elem.value += ',' + chosenId; + } else { + elem.value = chosenId; + } + $(elem).trigger('change'); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + /** + * 显示关联对象操作弹窗(添加/编辑/删除) + * 用于打开关联对象的添加、编辑或删除页面 + * @param {HTMLElement} triggeringLink - 触发链接(如"添加"或"编辑"按钮) + * @return {boolean} 调用showAdminPopup的返回值 + */ + function showRelatedObjectPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); + } + /** + * 更新关联对象链接状态 + * 当关联字段的值变化时,更新"查看"、"编辑"、"删除"等链接的可用性 + * @param {HTMLElement} triggeringLink - 触发变化的输入框/选择框 + */ + function updateRelatedObjectLinks(triggeringLink) { + const $this = $(triggeringLink); + const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); + if (!siblings.length) { + return; + } + const value = $this.val(); + if (value) { + siblings.each(function() { + const elm = $(this); + elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); + elm.removeAttr('aria-disabled'); + }); + } else { + siblings.removeAttr('href'); + siblings.attr('aria-disabled', true); + } + } + /** + * 更新关联选择框的选项 + * 当添加/编辑关联对象后,同步更新页面中其他相关的选择框选项 + * @param {HTMLElement} currentSelect - 当前操作的选择框 + * @param {Window} win - 弹窗窗口对象 + * @param {string} objId - 原对象ID(编辑时使用) + * @param {string} newRepr - 新的对象显示文本 + * @param {string} newId - 新的对象ID + * @param {Array} skipIds - 需要跳过的选择框ID列表 + */ + function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId, skipIds = []) { + // After create/edit a model from the options next to the current + // select (+ or :pencil:) update ForeignKey PK of the rest of selects + // in the page. + + const path = win.location.pathname; + // Extract the model from the popup url '...//add/' or + // '...///change/' depending the action (add or change). + const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; + // Select elements with a specific model reference and context of "available-source". + const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); + + selectsRelated.forEach(function(select) { + if (currentSelect === select || skipIds && skipIds.includes(select.id)) { + return; + } + + let option = select.querySelector(`option[value="${objId}"]`); + + if (!option) { + option = new Option(newRepr, newId); + select.options.add(option); + // Update SelectBox cache for related fields. + if (window.SelectBox !== undefined && !SelectBox.cache[currentSelect.id]) { + SelectBox.add_to_cache(select.id, option); + SelectBox.redisplay(select.id); + } + return; + } + + option.textContent = newRepr; + option.value = newId; + }); + } + /** + * 关闭添加关联对象弹窗 + * 添加新关联对象后,将新对象添加到选择框或输入框,并同步更新其他相关选择框 + * @param {Window} win - 弹窗窗口对象 + * @param {string} newId - 新对象的ID + * @param {string} newRepr - 新对象的显示文本 + */ + function dismissAddRelatedObjectPopup(win, newId, newRepr) { + const name = removePopupIndex(win.name); + const elem = document.getElementById(name); + if (elem) { + const elemName = elem.nodeName.toUpperCase(); + if (elemName === 'SELECT') { + elem.options[elem.options.length] = new Option(newRepr, newId, true, true); + updateRelatedSelectsOptions(elem, win, null, newRepr, newId); + } else if (elemName === 'INPUT') { + if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { + elem.value += ',' + newId; + } else { + elem.value = newId; + } + } + // Trigger a change event to update related links if required. + $(elem).trigger('change'); + } else { + const toId = name + "_to"; + const toElem = document.getElementById(toId); + const o = new Option(newRepr, newId); + SelectBox.add_to_cache(toId, o); + SelectBox.redisplay(toId); + if (toElem && toElem.nodeName.toUpperCase() === 'SELECT') { + const skipIds = [name + "_from"]; + updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); + } + } + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + /** + * 关闭编辑关联对象弹窗 + * 编辑关联对象后,更新选择框中对应选项的文本和ID,并同步其他相关选择框 + * @param {Window} win - 弹窗窗口对象 + * @param {string} objId - 原对象ID + * @param {string} newRepr - 编辑后的显示文本 + * @param {string} newId - 编辑后的对象ID(可能不变) + */ + function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { + const id = removePopupIndex(win.name.replace(/^edit_/, '')); + const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + const selects = $(selectsSelector); + selects.find('option').each(function() { + if (this.value === objId) { + this.textContent = newRepr; + this.value = newId; + } + }).trigger('change'); + updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); + selects.next().find('.select2-selection__rendered').each(function() { + // The element can have a clear button as a child. + // Use the lastChild to modify only the displayed value. + this.lastChild.textContent = newRepr; + this.title = newRepr; + }); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + /** + * 关闭删除关联对象弹窗 + * 删除关联对象后,从选择框中移除对应的选项 + * @param {Window} win - 弹窗窗口对象 + * @param {string} objId - 被删除对象的ID + */ + function dismissDeleteRelatedObjectPopup(win, objId) { + const id = removePopupIndex(win.name.replace(/^delete_/, '')); + const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + const selects = $(selectsSelector); + selects.find('option').each(function() { + if (this.value === objId) { + $(this).remove(); + } + }).trigger('change'); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + // 将核心方法暴露到window全局,供页面元素调用 + window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; + window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; + window.showRelatedObjectPopup = showRelatedObjectPopup; + window.updateRelatedObjectLinks = updateRelatedObjectLinks; + window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; + window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; + window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; + window.dismissChildPopups = dismissChildPopups; + window.relatedWindows = relatedWindows; + + // Kept for backward compatibility + window.showAddAnotherPopup = showRelatedObjectPopup; + window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; + + window.addEventListener('unload', function(evt) { + window.dismissChildPopups(); + }); + + $(document).ready(function() { + setPopupIndex(); + $("a[data-popup-opener]").on('click', function(event) { + event.preventDefault(); + opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); + }); + $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { + e.preventDefault(); + if (this.href) { + const event = $.Event('django:show-related', {href: this.href}); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectPopup(this); + } + } + }); + $('body').on('change', '.related-widget-wrapper select', function(e) { + const event = $.Event('django:update-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + updateRelatedObjectLinks(this); + } + }); + $('.related-widget-wrapper select').trigger('change'); + $('body').on('click', '.related-lookup', function(e) { + e.preventDefault(); + const event = $.Event('django:lookup-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectLookupPopup(this); + } + }); + }); +} diff --git a/src/collectedstatic/admin/js/autocomplete.js b/src/collectedstatic/admin/js/autocomplete.js new file mode 100644 index 0000000..6c5617a --- /dev/null +++ b/src/collectedstatic/admin/js/autocomplete.js @@ -0,0 +1,41 @@ +'use strict'; +{ + const $ = django.jQuery; + /** + * 定义jQuery扩展方法:djangoAdminSelect2 + * 给匹配的元素初始化Select2组件,实现远程搜索自动完成 + * @return {jQuery} 返回jQuery对象,支持链式调用 + */ + $.fn.djangoAdminSelect2 = function() { + // 遍历每个匹配的元素(可能有多个关联字段选择框) + $.each(this, function(i, element) { + // 给当前元素初始化Select2 + $(element).select2({ + // 配置AJAX请求:从后端获取搜索结果 + ajax: { + // 定义AJAX请求的参数(传递给后端) + data: (params) => { + return { + term: params.term, + page: params.page, + app_label: element.dataset.appLabel, + model_name: element.dataset.modelName, + field_name: element.dataset.fieldName + }; + } + } + }); + }); + return this; + }; + // 页面DOM加载完成后执行初始化 + $(function() { + // Initialize all autocomplete widgets except the one in the template + // form used when a new formset is added. + $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); + }); + // 监听表单集新增事件(formset:added):当动态新增表单时触发 + document.addEventListener('formset:added', (event) => { + $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); + }); +} diff --git a/src/collectedstatic/admin/js/calendar.js b/src/collectedstatic/admin/js/calendar.js new file mode 100644 index 0000000..9e21fba --- /dev/null +++ b/src/collectedstatic/admin/js/calendar.js @@ -0,0 +1,275 @@ +/*global gettext, pgettext, get_format, quickElement, removeChildren*/ +/* +calendar.js - Calendar functions by Adrian Holovaty +depends on core.js for utility functions like removeChildren or quickElement +*/ +/* +功能说明:日历渲染与交互函数(作者:Adrian Holovaty) +依赖:core.js 中的工具函数(如 removeChildren、quickElement) +*/ +'use strict'; +{ + // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions + const CalendarNamespace = { + // 常量:全年12个月份的完整名称(多语言适配) + monthsOfYear: [ + gettext('January'), + gettext('February'), + gettext('March'), + gettext('April'), + gettext('May'), + gettext('June'), + gettext('July'), + gettext('August'), + gettext('September'), + gettext('October'), + gettext('November'), + gettext('December') + ], + // 常量:全年12个月份的缩写(多语言适配,如“Jan”“Feb”) + monthsOfYearAbbrev: [ + pgettext('abbrev. month January', 'Jan'), + pgettext('abbrev. month February', 'Feb'), + pgettext('abbrev. month March', 'Mar'), + pgettext('abbrev. month April', 'Apr'), + pgettext('abbrev. month May', 'May'), + pgettext('abbrev. month June', 'Jun'), + pgettext('abbrev. month July', 'Jul'), + pgettext('abbrev. month August', 'Aug'), + pgettext('abbrev. month September', 'Sep'), + pgettext('abbrev. month October', 'Oct'), + pgettext('abbrev. month November', 'Nov'), + pgettext('abbrev. month December', 'Dec') + ], + daysOfWeek: [ + gettext('Sunday'), + gettext('Monday'), + gettext('Tuesday'), + gettext('Wednesday'), + gettext('Thursday'), + gettext('Friday'), + gettext('Saturday') + ], + daysOfWeekAbbrev: [ + pgettext('abbrev. day Sunday', 'Sun'), + pgettext('abbrev. day Monday', 'Mon'), + pgettext('abbrev. day Tuesday', 'Tue'), + pgettext('abbrev. day Wednesday', 'Wed'), + pgettext('abbrev. day Thursday', 'Thur'), + pgettext('abbrev. day Friday', 'Fri'), + pgettext('abbrev. day Saturday', 'Sat') + ], + daysOfWeekInitial: [ + pgettext('one letter Sunday', 'S'), + pgettext('one letter Monday', 'M'), + pgettext('one letter Tuesday', 'T'), + pgettext('one letter Wednesday', 'W'), + pgettext('one letter Thursday', 'T'), + pgettext('one letter Friday', 'F'), + pgettext('one letter Saturday', 'S') + ], + firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), + /** + * 判断是否为闰年 + * @param {number} year - 年份(如2024) + * @return {boolean} true=闰年,false=平年 + */ + isLeapYear: function(year) { + return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); + }, + /** + * 获取指定月份的天数 + * @param {number} month - 月份(1-12) + * @param {number} year - 年份(如2024) + * @return {number} 该月份的天数(28/29/30/31) + */ + getDaysInMonth: function(month, year) { + let days; + if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { + days = 31; + } + else if (month === 4 || month === 6 || month === 9 || month === 11) { + days = 30; + } + else if (month === 2 && CalendarNamespace.isLeapYear(year)) { + days = 29; + } + else { + days = 28; + } + return days; + }, + /** + * 渲染日历到指定容器 + * 生成日历表格(包含月份标题、星期表头、日期单元格),并绑定日期点击事件 + * @param {number} month - 要渲染的月份(1-12) + * @param {number} year - 要渲染的年份(如2024) + * @param {string} div_id - 日历要渲染到的容器ID + * @param {Function} callback - 日期点击时的回调函数(参数:year, month, day) + * @param {Date} [selected] - 已选中的日期(用于高亮显示) + */ + draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 + const today = new Date(); + const todayDay = today.getDate(); + const todayMonth = today.getMonth() + 1; + const todayYear = today.getFullYear(); + let todayClass = ''; + + // Use UTC functions here because the date field does not contain time + // and using the UTC function variants prevent the local time offset + // from altering the date, specifically the day field. For example: + // + // ``` + // var x = new Date('2013-10-02'); + // var day = x.getDate(); + // ``` + // + // The day variable above will be 1 instead of 2 in, say, US Pacific time + // zone. + let isSelectedMonth = false; + if (typeof selected !== 'undefined') { + isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); + } + + month = parseInt(month); + year = parseInt(year); + const calDiv = document.getElementById(div_id); + removeChildren(calDiv); + const calTable = document.createElement('table'); + quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); + const tableBody = quickElement('tbody', calTable); + + // Draw days-of-week header + let tableRow = quickElement('tr', tableBody); + for (let i = 0; i < 7; i++) { + quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); + } + + const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); + const days = CalendarNamespace.getDaysInMonth(month, year); + + let nonDayCell; + + // Draw blanks before first of month + tableRow = quickElement('tr', tableBody); + for (let i = 0; i < startingPos; i++) { + nonDayCell = quickElement('td', tableRow, ' '); + nonDayCell.className = "nonday"; + } + + function calendarMonth(y, m) { + function onClick(e) { + e.preventDefault(); + callback(y, m, this.textContent); + } + return onClick; + } + + // Draw days of month + let currentDay = 1; + for (let i = startingPos; currentDay <= days; i++) { + if (i % 7 === 0 && currentDay !== 1) { + tableRow = quickElement('tr', tableBody); + } + if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { + todayClass = 'today'; + } else { + todayClass = ''; + } + + // use UTC function; see above for explanation. + if (isSelectedMonth && currentDay === selected.getUTCDate()) { + if (todayClass !== '') { + todayClass += " "; + } + todayClass += "selected"; + } + + const cell = quickElement('td', tableRow, '', 'class', todayClass); + const link = quickElement('a', cell, currentDay, 'href', '#'); + link.addEventListener('click', calendarMonth(year, month)); + currentDay++; + } + + // Draw blanks after end of month (optional, but makes for valid code) + while (tableRow.childNodes.length < 7) { + nonDayCell = quickElement('td', tableRow, ' '); + nonDayCell.className = "nonday"; + } + + calDiv.appendChild(calTable); + } + }; + + // Calendar -- A calendar instance + function Calendar(div_id, callback, selected) { + // div_id (string) is the ID of the element in which the calendar will + // be displayed + // callback (string) is the name of a JavaScript function that will be + // called with the parameters (year, month, day) when a day in the + // calendar is clicked + this.div_id = div_id; + this.callback = callback; + this.today = new Date(); + this.currentMonth = this.today.getMonth() + 1; + this.currentYear = this.today.getFullYear(); + if (typeof selected !== 'undefined') { + this.selected = selected; + } + } + // 日历实例的原型方法(共享方法,节省内存) + Calendar.prototype = { + drawCurrent: function() { + CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); + }, + drawDate: function(month, year, selected) { + this.currentMonth = month; + this.currentYear = year; + + if(selected) { + this.selected = selected; + } + + this.drawCurrent(); + }, + /** + * 渲染上一个月份的日历 + */ + drawPreviousMonth: function() { + if (this.currentMonth === 1) { + this.currentMonth = 12; + this.currentYear--; + } + else { + this.currentMonth--; + } + this.drawCurrent(); + }, + /** + * 渲染下一个月份的日历 + */ + drawNextMonth: function() { + if (this.currentMonth === 12) { + this.currentMonth = 1; + this.currentYear++; + } + else { + this.currentMonth++; + } + this.drawCurrent(); + }, + /** + * 渲染上一个年份的日历(同月份) + */ + drawPreviousYear: function() { + this.currentYear--; + this.drawCurrent(); + }, + drawNextYear: function() { + this.currentYear++; + this.drawCurrent(); + } + }; + window.Calendar = Calendar; + window.CalendarNamespace = CalendarNamespace; +} diff --git a/src/collectedstatic/admin/js/cancel.js b/src/collectedstatic/admin/js/cancel.js new file mode 100644 index 0000000..731e7fd --- /dev/null +++ b/src/collectedstatic/admin/js/cancel.js @@ -0,0 +1,40 @@ +'use strict'; +{ + // Call function fn when the DOM is loaded and ready. If it is already + // loaded, call the function now. + // http://youmightnotneedjquery.com/#ready + /** + * DOM就绪回调函数 + * 作用:当DOM加载完成后执行传入的回调函数;若DOM已加载,则立即执行 + * 参考自:http://youmightnotneedjquery.com/#ready(无需jQuery的DOM就绪方案) + * @param {Function} fn - DOM就绪后要执行的回调函数 + */ + function ready(fn) { + // 判断DOM状态:若不是“加载中”(即已就绪),直接执行回调 + if (document.readyState !== 'loading') { + fn(); + } else { + document.addEventListener('DOMContentLoaded', fn); + } + } + // 调用ready函数,DOM就绪后执行内部逻辑 + ready(function() { + /** + * 取消链接点击事件处理函数 + * @param {Event} event - 点击事件对象 + */ + function handleClick(event) { + event.preventDefault(); + const params = new URLSearchParams(window.location.search); + if (params.has('_popup')) { + window.close(); // Close the popup. + } else { + window.history.back(); // Otherwise, go back. + } + } + + document.querySelectorAll('.cancel-link').forEach(function(el) { + el.addEventListener('click', handleClick); + }); + }); +} diff --git a/src/collectedstatic/admin/js/change_form.js b/src/collectedstatic/admin/js/change_form.js new file mode 100644 index 0000000..9e7ec48 --- /dev/null +++ b/src/collectedstatic/admin/js/change_form.js @@ -0,0 +1,25 @@ +'use strict'; +{ + // 定义需要自动聚焦的输入元素标签名(都是表单中可交互的输入组件) + const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; + // 从页面隐藏元素中获取当前模型名称(Django 后台自动生成的标识) + // 注:id为“django-admin-form-add-constants”的元素是Django后台渲染的隐藏容器, + // 用于存储表单相关的元数据(如模型名) + const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; + // 若模型名称存在(即当前页面是有效的模型表单页) + if (modelName) { + const form = document.getElementById(modelName + '_form'); + for (const element of form.elements) { + // HTMLElement.offsetParent returns null when the element is not + // rendered. + // 判断元素是否符合聚焦条件: + // 1. 元素标签名在inputTags中(是可交互的输入组件) + // 2. 元素未被禁用(!element.disabled) + // 3. 元素在页面中可见(element.offsetParent不为null,offsetParent为null表示元素未渲染或隐藏) + if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { + element.focus(); + break; + } + } + } +} diff --git a/src/collectedstatic/admin/js/core.js b/src/collectedstatic/admin/js/core.js new file mode 100644 index 0000000..0e3164b --- /dev/null +++ b/src/collectedstatic/admin/js/core.js @@ -0,0 +1,224 @@ +// Core JavaScript helper functions +'use strict'; + +// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); +/** + * 快速创建并插入DOM元素 + * 简化创建元素、添加文本、设置属性、插入父容器的流程 + * @param {string} arguments[0] - 要创建的元素标签名(如"div"、"a") + * @param {HTMLElement} arguments[1] - 父容器元素(新元素将插入到该容器中) + * @param {string} [arguments[2]] - 新元素的文本内容(可选) + * @param {string} [arguments[3], arguments[4]...] - 属性名和属性值(成对传入,可选) + * @return {HTMLElement} 创建并插入后的新元素 + */ +function quickElement() { + const obj = document.createElement(arguments[0]); + if (arguments[2]) { + const textNode = document.createTextNode(arguments[2]); + obj.appendChild(textNode); + } + const len = arguments.length; + for (let i = 3; i < len; i += 2) { + obj.setAttribute(arguments[i], arguments[i + 1]); + } + arguments[1].appendChild(obj); + return obj; +} + +// "a" is reference to an object +/** + * 清空元素的所有子节点 + * @param {HTMLElement} a - 要清空子节点的父元素 + */ +function removeChildren(a) { + while (a.hasChildNodes()) { + a.removeChild(a.lastChild); + } +} + +// ---------------------------------------------------------------------------- +// Find-position functions by PPK +// See https://www.quirksmode.org/js/findpos.html +// ---------------------------------------------------------------------------- +/** + * 计算元素相对于文档的水平偏移量(X轴位置) + * @param {HTMLElement} obj - 要计算位置的元素 + * @return {number} 元素左上角相对于文档左侧的距离(像素) + */ +function findPosX(obj) { + let curleft = 0; + // 若元素有offsetParent(定位父元素),循环向上计算偏移 + if (obj.offsetParent) { + while (obj.offsetParent) { + curleft += obj.offsetLeft - obj.scrollLeft; + obj = obj.offsetParent; + } + } else if (obj.x) { + curleft += obj.x; + } + return curleft; +} +/** + * 计算元素相对于文档的垂直偏移量(Y轴位置) + * @param {HTMLElement} obj - 要计算位置的元素 + * @return {number} 元素左上角相对于文档顶部的距离(像素) + */ +function findPosY(obj) { + let curtop = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curtop += obj.offsetTop - obj.scrollTop; + obj = obj.offsetParent; + } + } else if (obj.y) { + curtop += obj.y; + } + return curtop; +} + +//----------------------------------------------------------------------------- +// Date object extensions +// ---------------------------------------------------------------------------- +{ + /** + * 获取12小时制的小时数(0-11 → 1-12) + * @return {number} 12小时制小时数(如13点返回1,0点返回12) + */ + Date.prototype.getTwelveHours = function() { + return this.getHours() % 12 || 12; + }; + /** + * 获取两位数的月份(1-9 → 01-09,10-12 → 10-12) + * @return {string} 两位数月份字符串 + */ + Date.prototype.getTwoDigitMonth = function() { + return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); + }; + + Date.prototype.getTwoDigitDate = function() { + return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); + }; + + Date.prototype.getTwoDigitTwelveHour = function() { + return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); + }; + + Date.prototype.getTwoDigitHour = function() { + return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); + }; + + Date.prototype.getTwoDigitMinute = function() { + return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); + }; + + Date.prototype.getTwoDigitSecond = function() { + return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); + }; + + Date.prototype.getAbbrevDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; + }; + + Date.prototype.getFullDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeek[this.getDay()]; + }; + + Date.prototype.getAbbrevMonthName = function() { + return typeof window.CalendarNamespace === "undefined" + ? this.getTwoDigitMonth() + : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; + }; + + Date.prototype.getFullMonthName = function() { + return typeof window.CalendarNamespace === "undefined" + ? this.getTwoDigitMonth() + : window.CalendarNamespace.monthsOfYear[this.getMonth()]; + }; + /** + * 格式化日期为指定字符串(类似Python的strftime) + * @param {string} format - 格式化字符串(含%占位符,如“%Y-%m-%d %H:%M”) + * @return {string} 格式化后的日期字符串 + */ + Date.prototype.strftime = function(format) { + const fields = { + a: this.getAbbrevDayName(), + A: this.getFullDayName(), + b: this.getAbbrevMonthName(), + B: this.getFullMonthName(), + c: this.toString(), + d: this.getTwoDigitDate(), + H: this.getTwoDigitHour(), + I: this.getTwoDigitTwelveHour(), + m: this.getTwoDigitMonth(), + M: this.getTwoDigitMinute(), + p: (this.getHours() >= 12) ? 'PM' : 'AM', + S: this.getTwoDigitSecond(), + w: '0' + this.getDay(), + x: this.toLocaleDateString(), + X: this.toLocaleTimeString(), + y: ('' + this.getFullYear()).substr(2, 4), + Y: '' + this.getFullYear(), + '%': '%' + }; + let result = '', i = 0; + while (i < format.length) { + if (format.charAt(i) === '%') { + result += fields[format.charAt(i + 1)]; + ++i; + } + else { + result += format.charAt(i); + } + ++i; + } + return result; + }; + + // ---------------------------------------------------------------------------- + // String object extensions + // ---------------------------------------------------------------------------- + /** + * 将字符串按指定格式解析为Date对象(类似Python的strptime) + * 支持的格式占位符:%d(日期)、%m(月份)、%Y(四位数年份)、%y(两位数年份) + * @param {string} format - 解析格式(如“%Y-%m-%d”“%d/%m/%y”) + * @return {Date} 解析后的Date对象(基于UTC时间) + */ + String.prototype.strptime = function(format) { + const split_format = format.split(/[.\-/]/); + const date = this.split(/[.\-/]/); + let i = 0; + let day, month, year; + while (i < split_format.length) { + switch (split_format[i]) { + case "%d": + day = date[i]; + break; + case "%m": + month = date[i] - 1; + break; + case "%Y": + year = date[i]; + break; + case "%y": + // A %y value in the range of [00, 68] is in the current + // century, while [69, 99] is in the previous century, + // according to the Open Group Specification. + if (parseInt(date[i], 10) >= 69) { + year = date[i]; + } else { + year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; + } + break; + } + ++i; + } + // Create Date object from UTC since the parsed value is supposed to be + // in UTC, not local time. Also, the calendar uses UTC functions for + // date extraction. + return new Date(Date.UTC(year, month, day)); + }; +} diff --git a/src/collectedstatic/admin/js/filters.js b/src/collectedstatic/admin/js/filters.js new file mode 100644 index 0000000..5d061ec --- /dev/null +++ b/src/collectedstatic/admin/js/filters.js @@ -0,0 +1,37 @@ +/** + * Persist changelist filters state (collapsed/expanded). + */ +'use strict'; +{ + // Init filters. + // 1. 初始化筛选器状态 + // 从sessionStorage中读取已保存的筛选器状态(键为"django.admin.filtersState") + // 若读取到数据,解析为JSON对象;若未读取到,后续会初始化为空对象 + let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); + // 若sessionStorage中无筛选器状态数据,初始化filters为空对象 + if (!filters) { + filters = {}; + } + // 遍历已保存的筛选器状态,恢复每个筛选器的展开/折叠状态 + Object.entries(filters).forEach(([key, value]) => { + // 根据筛选器标题(key)找到对应的筛选器元素(data-filter-title属性匹配) + // CSS.escape用于转义特殊字符,避免选择器语法错误 + const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); + + // Check if the filter is present, it could be from other view. + if (detailElement) { + value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); + } + }); + + // Save filter state when clicks. + // 2. 监听筛选器点击事件,实时保存状态 + // 获取页面中所有筛选器元素(通常是
    标签,支持展开/折叠) + const details = document.querySelectorAll('details'); + details.forEach(detail => { + detail.addEventListener('toggle', event => { + filters[`${event.target.dataset.filterTitle}`] = detail.open; + sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); + }); + }); +} diff --git a/src/collectedstatic/admin/js/inlines.js b/src/collectedstatic/admin/js/inlines.js new file mode 100644 index 0000000..774ff1f --- /dev/null +++ b/src/collectedstatic/admin/js/inlines.js @@ -0,0 +1,413 @@ +/*global DateTimeShortcuts, SelectFilter*/ +/** + * Django admin inlines + * + * Based on jQuery Formset 1.1 + * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) + * @requires jQuery 1.2.6 or later + * + * Copyright (c) 2009, Stanislaus Madueke + * All rights reserved. + * + * Spiced up with Code from Zain Memon's GSoC project 2009 + * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. + * + * Licensed under the New BSD License + * See: https://opensource.org/licenses/bsd-license.php + */ +'use strict'; +{ + const $ = django.jQuery; + /** + * 基础表单集扩展方法:实现动态添加/删除表单的核心逻辑 + * @param {Object} opts - 自定义配置(覆盖默认值) + * @return {jQuery} 返回jQuery对象,支持链式调用 + */ + $.fn.formset = function(opts) { + const options = $.extend({}, $.fn.formset.defaults, opts); + const $this = $(this); + const $parent = $this.parent(); + /** + * 更新元素的索引(ID/name/for属性) + * 动态添加/删除表单后,同步更新表单内元素的索引,确保与Django表单集规则一致 + * @param {HTMLElement} el - 要更新的元素 + * @param {string} prefix - 表单集前缀(如"comment_set") + * @param {number} ndx - 目标索引(新的表单序号) + */ + const updateElementIndex = function(el, prefix, ndx) { + const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); + const replacement = prefix + "-" + ndx; + if ($(el).prop("for")) { + $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); + } + if (el.id) { + el.id = el.id.replace(id_regex, replacement); + } + if (el.name) { + el.name = el.name.replace(id_regex, replacement); + } + }; + // 获取表单集核心隐藏字段(Django自动生成,用于管理表单集) + // TOTAL_FORMS:当前表单总数 + const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); + let nextIndex = parseInt(totalForms.val(), 10); + const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); + const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); + let addButton; + + /** + * The "Add another MyModel" button below the inline forms. + */ + /** + * 创建“添加另一个表单”按钮 + * 根据表单布局(表格/普通容器),在合适位置插入添加按钮 + */ + const addInlineAddButton = function() { + if (addButton === null) { + if ($this.prop("tagName") === "TR") { + // If forms are laid out as table rows, insert the + // "add" button in a new table row: + const numCols = $this.eq(-1).children().length; + $parent.append('' + options.addText + ""); + addButton = $parent.find("tr:last a"); + } else { + // Otherwise, insert it immediately after the last form: + $this.filter(":last").after('"); + addButton = $this.filter(":last").next().find("a"); + } + } + addButton.on('click', addInlineClickHandler); + }; + /** + * “添加表单”按钮点击事件处理函数 + * 复制空表单模板,生成新表单并插入,更新表单集状态 + * @param {Event} e - 点击事件对象 + */ + const addInlineClickHandler = function(e) { + e.preventDefault(); + const template = $("#" + options.prefix + "-empty"); + const row = template.clone(true); + row.removeClass(options.emptyCssClass) + .addClass(options.formCssClass) + .attr("id", options.prefix + "-" + nextIndex); + addInlineDeleteButton(row); + row.find("*").each(function() { + updateElementIndex(this, options.prefix, totalForms.val()); + }); + // Insert the new form when it has been fully edited. + row.insertBefore($(template)); + // Update number of total forms. + $(totalForms).val(parseInt(totalForms.val(), 10) + 1); + nextIndex += 1; + // Hide the add button if there's a limit and it's been reached. + if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { + addButton.parent().hide(); + } + // Show the remove buttons if there are more than min_num. + toggleDeleteButtonVisibility(row.closest('.inline-group')); + + // Pass the new form to the post-add callback, if provided. + if (options.added) { + options.added(row); + } + row.get(0).dispatchEvent(new CustomEvent("formset:added", { + bubbles: true, + detail: { + formsetName: options.prefix + } + })); + }; + + /** + * The "X" button that is part of every unsaved inline. + * (When saved, it is replaced with a "Delete" checkbox.) + */ + /** + * 给表单添加“删除”按钮 + * 根据表单布局(表格/列表/普通容器),在合适位置插入删除按钮 + * @param {jQuery} row - 要添加删除按钮的表单(jQuery对象) + */ + const addInlineDeleteButton = function(row) { + if (row.is("tr")) { + // If the forms are laid out in table rows, insert + // the remove button into the last table cell: + row.children(":last").append('"); + } else if (row.is("ul") || row.is("ol")) { + // If they're laid out as an ordered/unordered list, + // insert an
  • after the last list item: + row.append('
  • ' + options.deleteText + "
  • "); + } else { + // Otherwise, just insert the remove button as the + // last child element of the form's container: + row.children(":first").append('' + options.deleteText + ""); + } + // Add delete handler for each row. + row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); + }; + /** + * “删除表单”按钮点击事件处理函数 + * 移除当前表单,更新剩余表单的索引和表单集状态 + * @param {Event} e1 - 点击事件对象 + */ + const inlineDeleteHandler = function(e1) { + e1.preventDefault(); + const deleteButton = $(e1.target); + const row = deleteButton.closest('.' + options.formCssClass); + const inlineGroup = row.closest('.inline-group'); + // Remove the parent form containing this button, + // and also remove the relevant row with non-field errors: + const prevRow = row.prev(); + if (prevRow.length && prevRow.hasClass('row-form-errors')) { + prevRow.remove(); + } + row.remove(); + nextIndex -= 1; + // Pass the deleted form to the post-delete callback, if provided. + if (options.removed) { + options.removed(row); + } + document.dispatchEvent(new CustomEvent("formset:removed", { + detail: { + formsetName: options.prefix + } + })); + // Update the TOTAL_FORMS form count. + const forms = $("." + options.formCssClass); + $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); + // Show add button again once below maximum number. + if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { + addButton.parent().show(); + } + // Hide the remove buttons if at min_num. + toggleDeleteButtonVisibility(inlineGroup); + // Also, update names and ids for all remaining form controls so + // they remain in sequence: + // 更新剩余表单的索引(确保序号连续) + let i, formCount; + const updateElementCallback = function() { + updateElementIndex(this, options.prefix, i); + }; + for (i = 0, formCount = forms.length; i < formCount; i++) { + updateElementIndex($(forms).get(i), options.prefix, i); + $(forms.get(i)).find("*").each(updateElementCallback); + } + }; + /** + * 控制“删除”按钮的显示/隐藏 + * 当表单数量达到最小值时,隐藏所有删除按钮;否则显示 + * @param {jQuery} inlineGroup - 内联表单组容器(jQuery对象) + */ + const toggleDeleteButtonVisibility = function(inlineGroup) { + if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { + inlineGroup.find('.inline-deletelink').hide(); + } else { + inlineGroup.find('.inline-deletelink').show(); + } + }; + // 给非空模板的表单添加“动态表单”样式 + $this.each(function(i) { + $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); + }); + + // Create the delete buttons for all unsaved inlines: + $this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { + addInlineDeleteButton($(this)); + }); + toggleDeleteButtonVisibility($this); + + // Create the add button, initially hidden. + addButton = options.addButton; + addInlineAddButton(); + + // Show the add button if allowed to add more items. + // Note that max_num = None translates to a blank string. + const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; + if ($this.length && showAddButton) { + addButton.parent().show(); + } else { + addButton.parent().hide(); + } + + return this; + }; + + /* Setup plugin defaults */ + /* 基础表单集默认配置 */ + $.fn.formset.defaults = { + prefix: "form", // The form prefix for your django formset + addText: "add another", // Text for the add link + deleteText: "remove", // Text for the delete link + addCssClass: "add-row", // CSS class applied to the add link + deleteCssClass: "delete-row", // CSS class applied to the delete link + emptyCssClass: "empty-row", // CSS class applied to the empty row + formCssClass: "dynamic-form", // CSS class applied to each form in a formset + added: null, // Function called each time a new form is added + removed: null, // Function called each time a form is deleted + addButton: null // Existing add button to use + }; + + + // Tabular inlines --------------------------------------------------------- + /** + * 表格式内联表单集扩展方法 + * 适配表格布局的内联表单,添加日期时间选择、下拉筛选等组件的初始化逻辑 + * @param {string} selector - 表单选择器 + * @param {Object} options - 配置参数 + * @return {jQuery} 返回表单集合对象 + */ + $.fn.tabularFormset = function(selector, options) { + const $rows = $(this); + /** + * 重新初始化日期时间快捷操作组件 + * 新增表单后,重新加载DateTimeShortcuts(日历/时钟选择器) + */ + const reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + /** + * 更新下拉筛选组件(SelectFilter) + * 新增表单后,初始化表单内的SelectFilter组件(关联对象筛选) + */ + const updateSelectFilter = function() { + // If any SelectFilter widgets are a part of the new form, + // instantiate a new SelectFilter instance for it. + if (typeof SelectFilter !== 'undefined') { + $('.selectfilter').each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, false); + }); + $('.selectfilterstacked').each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, true); + }); + } + }; + /** + * 初始化预填充字段(Prepopulated Fields) + * 基于依赖字段的值,自动填充目标字段(如slug字段基于标题自动生成) + * @param {jQuery} row - 新添加的表单(jQuery对象) + */ + const initPrepopulatedFields = function(row) { + row.find('.prepopulated_field').each(function() { + const field = $(this), + input = field.find('input, select, textarea'), + dependency_list = input.data('dependency_list') || [], + dependencies = []; + $.each(dependency_list, function(i, field_name) { + dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr('maxlength')); + } + }); + }; + // 调用基础formset方法,配置表格式内联的特有逻辑 + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + added: function(row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + }, + addButton: options.addButton + }); + + return $rows; + }; + + // Stacked inlines --------------------------------------------------------- + $.fn.stackedFormset = function(selector, options) { + const $rows = $(this); + const updateInlineLabel = function(row) { + $(selector).find(".inline_label").each(function(i) { + const count = i + 1; + $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); + }); + }; + + const reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force, yuck. + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + const updateSelectFilter = function() { + // If any SelectFilter widgets were added, instantiate a new instance. + if (typeof SelectFilter !== "undefined") { + $(".selectfilter").each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, false); + }); + $(".selectfilterstacked").each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, true); + }); + } + }; + + const initPrepopulatedFields = function(row) { + row.find('.prepopulated_field').each(function() { + const field = $(this), + input = field.find('input, select, textarea'), + dependency_list = input.data('dependency_list') || [], + dependencies = []; + $.each(dependency_list, function(i, field_name) { + // Dependency in a fieldset. + let field_element = row.find('.form-row .field-' + field_name); + // Dependency without a fieldset. + if (!field_element.length) { + field_element = row.find('.form-row.field-' + field_name); + } + dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr('maxlength')); + } + }); + }; + // 调用基础formset方法,配置堆叠式内联的特有逻辑 + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + removed: updateInlineLabel, + added: function(row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + updateInlineLabel(row); + }, + addButton: options.addButton + }); + + return $rows; + }; + // 页面加载完成后,初始化内联表单集 + $(document).ready(function() { + $(".js-inline-admin-formset").each(function() { + const data = $(this).data(), + inlineOptions = data.inlineFormset; + let selector; + switch(data.inlineType) { + case "stacked": + selector = inlineOptions.name + "-group .inline-related"; + $(selector).stackedFormset(selector, inlineOptions.options); + break; + case "tabular": + selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; + $(selector).tabularFormset(selector, inlineOptions.options); + break; + } + }); + }); +} diff --git a/src/collectedstatic/admin/js/jquery.init.js b/src/collectedstatic/admin/js/jquery.init.js new file mode 100644 index 0000000..f40b27f --- /dev/null +++ b/src/collectedstatic/admin/js/jquery.init.js @@ -0,0 +1,8 @@ +/*global jQuery:false*/ +'use strict'; +/* Puts the included jQuery into our own namespace using noConflict and passing + * it 'true'. This ensures that the included jQuery doesn't pollute the global + * namespace (i.e. this preserves pre-existing values for both window.$ and + * window.jQuery). + */ +window.django = {jQuery: jQuery.noConflict(true)}; diff --git a/src/collectedstatic/admin/js/nav_sidebar.js b/src/collectedstatic/admin/js/nav_sidebar.js new file mode 100644 index 0000000..fce2c11 --- /dev/null +++ b/src/collectedstatic/admin/js/nav_sidebar.js @@ -0,0 +1,96 @@ +'use strict'; +{ + // 一、左侧导航栏展开/折叠功能(含状态持久化) + // 获取“切换导航栏”按钮(ID为toggle-nav-sidebar) + const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); + if (toggleNavSidebar !== null) { + // 获取导航栏容器(ID为nav-sidebar)和主内容区(ID为main) + const navSidebar = document.getElementById('nav-sidebar'); + const main = document.getElementById('main'); + // 从localStorage读取导航栏状态(open/closed),默认“展开” + let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); + if (navSidebarIsOpen === null) { + navSidebarIsOpen = 'true'; + } + // 初始化导航栏和主内容区的状态 + // 主内容区添加/移除“shifted”类(控制是否偏移,适配导航栏展开) + main.classList.toggle('shifted', navSidebarIsOpen === 'true'); + // 设置导航栏的无障碍属性(aria-expanded),标记展开/折叠状态 + navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); + // 给“切换导航栏”按钮绑定点击事件 + toggleNavSidebar.addEventListener('click', function() { + if (navSidebarIsOpen === 'true') { + navSidebarIsOpen = 'false'; + } else { + navSidebarIsOpen = 'true'; + } + localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); + main.classList.toggle('shifted'); + navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); + }); + } + // 二、导航栏快速搜索过滤功能 + function initSidebarQuickFilter() { + const options = []; + const navSidebar = document.getElementById('nav-sidebar'); + if (!navSidebar) { + return; + } + navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { + options.push({title: container.innerHTML, node: container}); + }); + /** + * 搜索过滤处理函数 + * 根据输入框的值,筛选导航栏选项(显示匹配项,隐藏不匹配项) + * @param {Event} event - 输入/按键事件对象 + */ + function checkValue(event) { + let filterValue = event.target.value; + if (filterValue) { + filterValue = filterValue.toLowerCase(); + } + if (event.key === 'Escape') { + filterValue = ''; + event.target.value = ''; // clear input + } + let matches = false; + for (const o of options) { + let displayValue = ''; + // 若有输入值,转为小写(不区分大小写匹配) + if (filterValue) { + if (o.title.toLowerCase().indexOf(filterValue) === -1) { + displayValue = 'none'; + } else { + matches = true; + } + } + // show/hide parent + o.node.parentNode.parentNode.style.display = displayValue; + } + // 根据是否有匹配项,给输入框添加/移除“无结果”样式 + if (!filterValue || matches) { + event.target.classList.remove('no-results'); + } else { + event.target.classList.add('no-results'); + } + // 将当前过滤值保存到sessionStorage(会话内有效,关闭标签页后清空) + sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); + } + // 获取搜索输入框(ID为nav-filter) + const nav = document.getElementById('nav-filter'); + // 给输入框绑定事件:输入变化、值变化、按键抬起时均触发过滤 + nav.addEventListener('change', checkValue, false); + nav.addEventListener('input', checkValue, false); + nav.addEventListener('keyup', checkValue, false); + // 从sessionStorage读取上次的过滤值,恢复过滤状态 + const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); + if (storedValue) { + nav.value = storedValue; + checkValue({target: nav, key: ''}); + } + } + // 暴露函数到全局,供外部调用(可选) + window.initSidebarQuickFilter = initSidebarQuickFilter; + // 初始化导航栏快速过滤功能 + initSidebarQuickFilter(); +} diff --git a/src/collectedstatic/admin/js/popup_response.js b/src/collectedstatic/admin/js/popup_response.js new file mode 100644 index 0000000..a4bfa45 --- /dev/null +++ b/src/collectedstatic/admin/js/popup_response.js @@ -0,0 +1,25 @@ +'use strict'; +{ + // 从页面隐藏元素中解析初始化数据 + // 注:id为“django-admin-popup-response-constants”的元素由Django后台自动生成 + // 其data-popup-response属性中存储着弹窗操作的结果数据(如对象新值、操作类型等) + const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); + // 根据弹窗中的操作类型,调用父窗口对应的处理函数 + switch(initData.action) { + case 'change': + // 若操作类型为“编辑关联对象” + // 调用父窗口(opener)的dismissChangeRelatedObjectPopup函数 + // 参数:当前窗口对象、对象原始值、对象实例、编辑后的新值 + opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); + break; + case 'delete': + opener.dismissDeleteRelatedObjectPopup(window, initData.value); + break; + default: + // 默认操作类型为“添加关联对象” + // 调用父窗口的dismissAddRelatedObjectPopup函数 + // 参数:当前窗口对象、新对象的值、新对象实例 + opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); + break; + } +} diff --git a/src/collectedstatic/admin/js/prepopulate.js b/src/collectedstatic/admin/js/prepopulate.js new file mode 100644 index 0000000..85241d2 --- /dev/null +++ b/src/collectedstatic/admin/js/prepopulate.js @@ -0,0 +1,58 @@ +/*global URLify*/ +'use strict'; +{ + const $ = django.jQuery; + /** + * jQuery扩展方法:prepopulate(预填充字段) + * 根据依赖字段的值,自动生成当前字段的内容(URL化处理) + * @param {Array} dependencies - 依赖字段的选择器数组(如['#id_title']) + * @param {number} maxLength - 生成内容的最大长度限制 + * @param {boolean} allowUnicode - 是否允许Unicode字符(true则保留,false则转为ASCII) + * @return {jQuery} 返回jQuery对象,支持链式调用 + */ + $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { + /* + Depends on urlify.js + Populates a selected field with the values of the dependent fields, + URLifies and shortens the string. + dependencies - array of dependent fields ids + maxLength - maximum length of the URLify'd string + allowUnicode - Unicode support of the URLify'd string + */ + return this.each(function() { + const prepopulatedField = $(this); + /** + * 预填充处理函数 + * 收集依赖字段的值,拼接后经URL化处理,填充到当前字段 + */ + const populate = function() { + // Bail if the field's value has been changed by the user + if (prepopulatedField.data('_changed')) { + return; + } + + const values = []; + $.each(dependencies, function(i, field) { + field = $(field); + if (field.val().length > 0) { + values.push(field.val()); + } + }); + // 将依赖字段的值拼接成字符串,经URL化处理后填充到当前字段 + // URLify参数:原始字符串、最大长度、是否允许Unicode + prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); + }; + // 初始化标记:当前字段是否被用户手动修改过(默认false) + prepopulatedField.data('_changed', false); + // 监听当前字段的change事件:用户手动修改后,标记为已更改(停止自动填充) + prepopulatedField.on('change', function() { + prepopulatedField.data('_changed', true); + }); + // 如果当前字段初始值为空,才绑定依赖字段的事件(避免覆盖已有值) + if (!prepopulatedField.val()) { + // 当依赖字段发生键盘输入、值变化、获取焦点时,触发预填充 + $(dependencies.join(',')).on('keyup change focus', populate); + } + }); + }; +} diff --git a/src/collectedstatic/admin/js/prepopulate_init.js b/src/collectedstatic/admin/js/prepopulate_init.js new file mode 100644 index 0000000..a081e00 --- /dev/null +++ b/src/collectedstatic/admin/js/prepopulate_init.js @@ -0,0 +1,22 @@ +'use strict'; +{ + const $ = django.jQuery; + // 从页面隐藏元素中获取预填充字段的配置数据 + // 注:id为“django-admin-prepopulated-fields-constants”的元素由Django后台生成 + // 其data-prepopulatedFields属性存储着所有需要预填充的字段配置(如依赖字段、最大长度等) + const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); + // 遍历每个预填充字段的配置,初始化预填充功能 + $.each(fields, function(index, field) { + // 1. 给空表单模板中的对应字段添加“prepopulated_field”样式类 + // 适配三种可能的空表单布局(表单行内带字段容器、表单行即字段容器等) + $( + '.empty-form .form-row .field-' + field.name + + ', .empty-form.form-row .field-' + field.name + + ', .empty-form .form-row.field-' + field.name + ).addClass('prepopulated_field'); + // 2. 为当前字段初始化prepopulate功能 + $(field.id).data('dependency_list', field.dependency_list).prepopulate( + field.dependency_ids, field.maxLength, field.allowUnicode + ); + }); +} diff --git a/src/collectedstatic/admin/js/theme.js b/src/collectedstatic/admin/js/theme.js new file mode 100644 index 0000000..78f7d0d --- /dev/null +++ b/src/collectedstatic/admin/js/theme.js @@ -0,0 +1,61 @@ +'use strict'; +{ + /** + * 设置网页主题 + * 验证主题模式有效性,将主题应用到页面,并保存到本地存储 + * @param {string} mode - 目标主题模式(light/dark/auto) + */ + function setTheme(mode) { + if (mode !== "light" && mode !== "dark" && mode !== "auto") { + // 判断系统是否偏好深色模式(通过媒体查询) + console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); + mode = "auto"; + } + document.documentElement.dataset.theme = mode; + localStorage.setItem("theme", mode); + } + + function cycleTheme() { + const currentTheme = localStorage.getItem("theme") || "auto"; + const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + + if (prefersDark) { + // Auto (dark) -> Light -> Dark + // 系统偏好浅色:切换顺序为「Auto(实际显示浅色)→ Dark → Light → Auto」 + if (currentTheme === "auto") { + setTheme("light"); + } else if (currentTheme === "light") { + setTheme("dark"); + } else { + setTheme("auto"); + } + } else { + // Auto (light) -> Dark -> Light + if (currentTheme === "auto") { + setTheme("dark"); + } else if (currentTheme === "dark") { + setTheme("light"); + } else { + setTheme("auto"); + } + } + } + /** + * 初始化网页主题 + * 页面加载时,优先使用localStorage中保存的主题,无则默认“auto” + */ + function initTheme() { + // set theme defined in localStorage if there is one, or fallback to auto mode + const currentTheme = localStorage.getItem("theme"); + currentTheme ? setTheme(currentTheme) : setTheme("auto"); + } + // 页面加载完成后,给所有主题切换按钮绑定点击事件 + window.addEventListener('load', function(_) { + const buttons = document.getElementsByClassName("theme-toggle"); + Array.from(buttons).forEach((btn) => { + btn.addEventListener("click", cycleTheme); + }); + }); + + initTheme(); +} diff --git a/src/collectedstatic/admin/js/unusable_password_field.js b/src/collectedstatic/admin/js/unusable_password_field.js new file mode 100644 index 0000000..b04851e --- /dev/null +++ b/src/collectedstatic/admin/js/unusable_password_field.js @@ -0,0 +1,42 @@ +"use strict"; +// Fallback JS for browsers which do not support :has selector used in +// admin/css/unusable_password_fields.css +// Remove file once all supported browsers support :has selector +// 降级方案:针对不支持:has选择器的浏览器(对应admin/css/unusable_password_fields.css中的样式逻辑) +// 一旦所有兼容浏览器都支持:has选择器,即可删除此文件 +try { + // 测试浏览器是否支持:has选择器(若不支持,此语句会抛出错误) + // If browser does not support :has selector this will raise an error + document.querySelector("form:has(input)"); +} catch (error) { + // 浏览器不支持:has选择器,执行JS降级逻辑 + console.log("Defaulting to javascript for usable password form management: " + error); + // JS replacement for unsupported :has selector + // JS逻辑替换不支持的:has选择器功能 + // 找到所有name为"usable_password"的选项(控制是否启用密码的单选框/复选框) + document.querySelectorAll('input[name="usable_password"]').forEach(option => { + // 给选项绑定“变化”事件(选中状态改变时触发) + option.addEventListener('change', function() { + // 判断是否“启用密码”: + const usablePassword = (this.value === "true" ? this.checked : !this.checked); + // 获取表单中的关键元素 + const submit1 = document.querySelector('input[type="submit"].set-password'); + const submit2 = document.querySelector('input[type="submit"].unset-password'); + const messages = document.querySelector('#id_unusable_warning'); + // 根据“是否启用密码”,显示/隐藏密码输入框(password1和password2) + document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; + document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; + // 显示/隐藏密码不可用的提示信息(启用密码时隐藏,禁用时显示) + if (messages) { + messages.hidden = usablePassword; + } + // 显示/隐藏对应的操作按钮(启用密码显示“设置密码”,禁用显示“取消密码”) + if (submit1 && submit2) { + submit1.hidden = !usablePassword; + submit2.hidden = usablePassword; + } + }); + // 初始化时手动触发一次“变化”事件,确保页面加载时字段状态正确 + option.dispatchEvent(new Event('change')); + }); +} diff --git a/src/collectedstatic/admin/js/urlify.js b/src/collectedstatic/admin/js/urlify.js new file mode 100644 index 0000000..9fc0409 --- /dev/null +++ b/src/collectedstatic/admin/js/urlify.js @@ -0,0 +1,169 @@ +/*global XRegExp*/ +'use strict'; +{ + const LATIN_MAP = { + 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', + 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', + 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', + 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', + 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', + 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', + 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', + 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', + 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', + 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' + }; + const LATIN_SYMBOLS_MAP = { + '©': '(c)' + }; + const GREEK_MAP = { + 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', + 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', + 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', + 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', + 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', + 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', + 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', + 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', + 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', + 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' + }; + const TURKISH_MAP = { + 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', + 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' + }; + const ROMANIAN_MAP = { + 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', + 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' + }; + const RUSSIAN_MAP = { + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', + 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', + 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', + 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', + 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', + 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', + 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', + 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', + 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', + 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' + }; + const UKRAINIAN_MAP = { + 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', + 'ї': 'yi', 'ґ': 'g' + }; + const CZECH_MAP = { + 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', + 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', + 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' + }; + const SLOVAK_MAP = { + 'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', + 'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', + 'ú': 'u', 'ý': 'y', 'ž': 'z', + 'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', + 'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', + 'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' + }; + const POLISH_MAP = { + 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', + 'ź': 'z', 'ż': 'z', + 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', + 'Ź': 'Z', 'Ż': 'Z' + }; + const LATVIAN_MAP = { + 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', + 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', + 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', + 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' + }; + const ARABIC_MAP = { + 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', + 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', + 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', + 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' + }; + const LITHUANIAN_MAP = { + 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', + 'ū': 'u', 'ž': 'z', + 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', + 'Ū': 'U', 'Ž': 'Z' + }; + const SERBIAN_MAP = { + 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', + 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', + 'Џ': 'Dz', 'Đ': 'Dj' + }; + const AZERBAIJANI_MAP = { + 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', + 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' + }; + const GEORGIAN_MAP = { + 'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', + 'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', + 'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', + 'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', + 'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' + }; + + const ALL_DOWNCODE_MAPS = [ + LATIN_MAP, + LATIN_SYMBOLS_MAP, + GREEK_MAP, + TURKISH_MAP, + ROMANIAN_MAP, + RUSSIAN_MAP, + UKRAINIAN_MAP, + CZECH_MAP, + SLOVAK_MAP, + POLISH_MAP, + LATVIAN_MAP, + ARABIC_MAP, + LITHUANIAN_MAP, + SERBIAN_MAP, + AZERBAIJANI_MAP, + GEORGIAN_MAP + ]; + + const Downcoder = { + 'Initialize': function() { + if (Downcoder.map) { // already made + return; + } + Downcoder.map = {}; + for (const lookup of ALL_DOWNCODE_MAPS) { + Object.assign(Downcoder.map, lookup); + } + Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); + } + }; + + function downcode(slug) { + Downcoder.Initialize(); + return slug.replace(Downcoder.regex, function(m) { + return Downcoder.map[m]; + }); + } + + + function URLify(s, num_chars, allowUnicode) { + // changes, e.g., "Petty theft" to "petty-theft" + if (!allowUnicode) { + s = downcode(s); + } + s = s.toLowerCase(); // convert to lowercase + // if downcode doesn't hit, the char will be stripped here + if (allowUnicode) { + // Keep Unicode letters including both lowercase and uppercase + // characters, whitespace, and dash; remove other characters. + s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); + } else { + s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars + } + s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces + s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens + s = s.substring(0, num_chars); // trim to first num_chars chars + return s.replace(/-+$/g, ''); // trim any trailing hyphens + } + window.URLify = URLify; +} diff --git a/src/collectedstatic/admin/js/vendor/jquery/LICENSE.txt b/src/collectedstatic/admin/js/vendor/jquery/LICENSE.txt new file mode 100644 index 0000000..f642c3f --- /dev/null +++ b/src/collectedstatic/admin/js/vendor/jquery/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/collectedstatic/admin/js/vendor/jquery/jquery.js b/src/collectedstatic/admin/js/vendor/jquery/jquery.js new file mode 100644 index 0000000..1a86433 --- /dev/null +++ b/src/collectedstatic/admin/js/vendor/jquery/jquery.js @@ -0,0 +1,10716 @@ +/*! + * jQuery JavaScript Library v3.7.1 + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2023-08-28T13:37Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket trac-14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var version = "3.7.1", + + rhtmlSuffix = /HTML$/i, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + +var i, + Expr, + outermostContext, + sortInput, + hasDuplicate, + push = pushNative, + + // Local document vars + document, + documentElement, + documentIsHTML, + rbuggyQSA, + matches, + + // Instance-specific data + expando = jQuery.expando, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE/Edge. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, "fieldset" ); + }, + { dir: "parentNode", next: "legend" } + ); + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android <=4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { + apply: function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); + } + }; +} + +function find( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + push.call( results, elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + find.contains( context, elem ) && + elem.id === m ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = jQuery.escapeSelector( nid ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by jQuery selector module + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, "input" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11+ + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a jQuery selector context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +function setDocument( node ) { + var subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); + } + + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; + } ); + + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); + } ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); + } ); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; + + // Class + Expr.find.CLASS = function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + rbuggyQSA = []; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + documentElement.appendChild( el ).innerHTML = + "" + + ""; + + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); + + if ( !support.cssHas ) { + + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + }; + + return document; +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return find( expr, document, null, [ elem ] ).length > 0; +}; + +find.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return jQuery.contains( context, elem ); +}; + + +find.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (see trac-13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + if ( val !== undefined ) { + return val; + } + + return elem.getAttribute( name ); +}; + +find.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +Expr = jQuery.expr = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + ATTR: function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) + .replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + CHILD: function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + return match; + }, + + PSEUDO: function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr.CHILD.test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + TAG: function( nodeNameSelector ) { + var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + CLASS: function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + ATTR: function( name, operator, check ) { + return function( elem ) { + var result = find.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + + return false; + }; + }, + + CHILD: function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + outerCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + PSEUDO: function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // https://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + find.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + not: markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + find.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + target: function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + root: function( elem ) { + return elem === documentElement; + }, + + focus: function( elem ) { + return elem === safeActiveElement() && + document.hasFocus() && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), + + checked: function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + parent: function( elem ) { + return !Expr.pseudos.empty( elem ); + }, + + // Element/input types + header: function( elem ) { + return rheader.test( elem.nodeName ); + }, + + input: function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); + }, + + text: function( elem ) { + var attr; + return nodeName( elem, "input" ) && elem.type === "text" && + + // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + first: createPositionalPseudo( function() { + return [ 0 ]; + } ), + + last: createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + even: createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + odd: createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos.nth = Expr.pseudos.eq; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + find.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + outerCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + find( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, matcherOut, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find.TAG( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + push.call( results, elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +} + +/** + * A low-level selection function that works with jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find.ID( + token.matches[ 0 ].replace( runescape, funescape ), + context + ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +} + +// One-time assignments + +// Support: Android <=4.0 - 4.1+ +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Initialize against the default document +setDocument(); + +// Support: Android <=4.0 - 4.1+ +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +jQuery.find = find; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + + /* eslint-enable */ + +} )(); + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to jQuery#find + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.error ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the error, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, + error.stack, asyncError ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See trac-6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (trac-9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see trac-8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (trac-14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (trac-11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (trac-14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (trac-13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (trac-12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (trac-13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", true ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, isSetup ) { + + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + if ( !saved ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + this[ type ](); + result = dataPriv.get( this, type ); + dataPriv.set( this, type, false ); + + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + return result; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved ) { + + // ...and capture the result + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (trac-504, trac-13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + var attaches; + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, true ); + + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + + delegateType: delegateType + }; + + // Support: Firefox <=44 + // Firefox doesn't have focus(in | out) events + // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + // + // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 + // focus(in | out) events fire after focus & blur events, + // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order + // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (trac-8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Re-enable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew jQuery#find here for performance reasons: + // https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var rcustomProp = /^--/; + + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (trac-8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is `display: block` + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, trac-12537) + // .css('--customProperty) (gh-3144) + if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0, + marginDelta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). + if ( box === "margin" ) { + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta + marginDelta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (trac-7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug trac-9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (trac-7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // Use proper attribute retrieval (trac-12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + removeClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + + // This expression is here for better compressibility (see addClass) + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Remove *all* instances + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var classNames, className, i, self, + type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + + return this.each( function() { + if ( isValidValue ) { + + // Toggle individual class names + self = jQuery( this ); + + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (trac-14686, trac-14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (trac-2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (trac-6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // trac-7653, trac-8125, trac-8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes trac-9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (trac-10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket trac-12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // trac-9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (trac-11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // trac-1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see trac-8605, trac-14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // trac-14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "") + * - mode: 分隔符之间的语法模式(如 JavaScript 模式) + * - delimStyle: 分隔符的样式类(用于高亮分隔符本身) + * - innerStyle: 内部模式内容的额外样式类(可选) + */ +CodeMirror.multiplexingMode = function(outer /*, others */) { + // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects + var others = Array.prototype.slice.call(arguments, 1); + var n_others = others.length; + + function indexOf(string, pattern, from) { + if (typeof pattern == "string") return string.indexOf(pattern, from); + var m = pattern.exec(from ? string.slice(from) : string); + return m ? m.index + from : -1; + } + + return { + startState: function() { + return { + outer: CodeMirror.startState(outer), + innerActive: null, + inner: null + }; + }, + + copyState: function(state) { + return { + outer: CodeMirror.copyState(outer, state.outer), + innerActive: state.innerActive, + inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) + }; + }, + + token: function(stream, state) { + if (!state.innerActive) { + var cutOff = Infinity, oldContent = stream.string; + for (var i = 0; i < n_others; ++i) { + var other = others[i]; + var found = indexOf(oldContent, other.open, stream.pos); + if (found == stream.pos) { + stream.match(other.open); + state.innerActive = other; + state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); + return other.delimStyle; + } else if (found != -1 && found < cutOff) { + cutOff = found; + } + } + if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); + var outerToken = outer.token(stream, state.outer); + if (cutOff != Infinity) stream.string = oldContent; + return outerToken; + } else { + var curInner = state.innerActive, oldContent = stream.string; + if (!curInner.close && stream.sol()) { + state.innerActive = state.inner = null; + return this.token(stream, state); + } + var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos) : -1; + if (found == stream.pos) { + stream.match(curInner.close); + state.innerActive = state.inner = null; + return curInner.delimStyle; + } + if (found > -1) stream.string = oldContent.slice(0, found); + var innerToken = curInner.mode.token(stream, state.inner); + if (found > -1) stream.string = oldContent; + + if (curInner.innerStyle) { + if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle; + else innerToken = curInner.innerStyle; + } + + return innerToken; + } + }, + + indent: function(state, textAfter) { + var mode = state.innerActive ? state.innerActive.mode : outer; + if (!mode.indent) return CodeMirror.Pass; + return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); + }, + + blankLine: function(state) { + var mode = state.innerActive ? state.innerActive.mode : outer; + if (mode.blankLine) { + mode.blankLine(state.innerActive ? state.inner : state.outer); + } + if (!state.innerActive) { + for (var i = 0; i < n_others; ++i) { + var other = others[i]; + if (other.open === "\n") { + state.innerActive = other; + state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0); + } + } + } else if (state.innerActive.close === "\n") { + state.innerActive = state.inner = null; + } + }, + + electricChars: outer.electricChars, + + innerMode: function(state) { + return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; + } + }; +}; + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/multiplex_test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/multiplex_test.js new file mode 100644 index 0000000..e7ecc70 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/multiplex_test.js @@ -0,0 +1,34 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + CodeMirror.defineMode("markdown_with_stex", function(){ + // 1. 获取两个基础模式 + var inner = CodeMirror.getMode({}, "stex"); + var outer = CodeMirror.getMode({}, "markdown"); + // 2. 配置内部模式规则(Markdown 中嵌入 LaTeX 的规则) + var innerOptions = { + open: '$', + close: '$', + mode: inner, + delimStyle: 'delim', + innerStyle: 'inner' + }; + + return CodeMirror.multiplexingMode(outer, innerOptions); + }); + + var mode = CodeMirror.getMode({}, "markdown_with_stex"); + + function MT(name) { + test.mode( + name, + mode, + Array.prototype.slice.call(arguments, 1), + 'multiplexing'); + } + // 执行测试用例:验证 Markdown 中嵌入 LaTeX 公式的解析结果 + MT( + "stexInsideMarkdown", + "[strong **Equation:**] [delim $][inner&tag \\pi][delim $]"); +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/overlay.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/overlay.js new file mode 100644 index 0000000..8d5e3f3 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/overlay.js @@ -0,0 +1,95 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Utility function that allows modes to be combined. The mode given +// as the base argument takes care of most of the normal mode +// functionality, but a second (typically simple) mode is used, which +// can override the style of text. Both modes get to parse all of the +// text, but when both assign a non-null style to a piece of code, the +// overlay wins, unless the combine argument was true and not overridden, +// or state.overlay.combineTokens was true, in which case the styles are +// combined. +/** + * CodeMirror 叠加语法模式工具(overlayMode) + * 支持在基础模式上叠加覆盖模式,两种模式并行解析文本,合并高亮结果 + * 适用于关键词高亮、特殊标记标注等场景(如在代码中叠加TODO标记高亮) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; +/** + * 创建叠加语法模式(核心函数) + * @param {Object} base - 基础语法模式(如 JavaScript、文本模式,提供主要解析逻辑) + * @param {Object} overlay - 覆盖语法模式(仅关注特定内容,如关键词、标记,提供额外高亮) + * @param {boolean} [combine] - 是否合并两种模式的 token 样式(默认根据覆盖模式配置决定) + * @return {Object} 叠加模式对象(可直接用于 CodeMirror 的 mode 配置) + */ +CodeMirror.overlayMode = function(base, overlay, combine) { + return { + startState: function() { + return { + base: CodeMirror.startState(base), + overlay: CodeMirror.startState(overlay), + basePos: 0, baseCur: null, + overlayPos: 0, overlayCur: null, + streamSeen: null + }; + }, + copyState: function(state) { + return { + base: CodeMirror.copyState(base, state.base), + overlay: CodeMirror.copyState(overlay, state.overlay), + basePos: state.basePos, baseCur: null, + overlayPos: state.overlayPos, overlayCur: null + }; + }, + + token: function(stream, state) { + if (stream != state.streamSeen || + Math.min(state.basePos, state.overlayPos) < stream.start) { + state.streamSeen = stream; + state.basePos = state.overlayPos = stream.start; + } + + if (stream.start == state.basePos) { + state.baseCur = base.token(stream, state.base); + state.basePos = stream.pos; + } + if (stream.start == state.overlayPos) { + stream.pos = stream.start; + state.overlayCur = overlay.token(stream, state.overlay); + state.overlayPos = stream.pos; + } + stream.pos = Math.min(state.basePos, state.overlayPos); + + // state.overlay.combineTokens always takes precedence over combine, + // unless set to null + if (state.overlayCur == null) return state.baseCur; + else if (state.baseCur != null && + state.overlay.combineTokens || + combine && state.overlay.combineTokens == null) + return state.baseCur + " " + state.overlayCur; + else return state.overlayCur; + }, + + indent: base.indent && function(state, textAfter) { + return base.indent(state.base, textAfter); + }, + electricChars: base.electricChars, + + innerMode: function(state) { return {state: state.base, mode: base}; }, + + blankLine: function(state) { + if (base.blankLine) base.blankLine(state.base); + if (overlay.blankLine) overlay.blankLine(state.overlay); + } + }; +}; + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/simple.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/simple.js new file mode 100644 index 0000000..576a4b8 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/mode/simple.js @@ -0,0 +1,222 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 简化语法模式工具(defineSimpleMode/simpleMode) + * 提供“状态-规则”配置式语法,快速生成自定义语法模式 + * 自动封装 CodeMirror 模式核心接口,无需手动实现复杂逻辑 + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineSimpleMode = function(name, states) { + CodeMirror.defineMode(name, function(config) { + return CodeMirror.simpleMode(config, states); + }); + }; +/** + * 核心方法:根据“状态-规则”配置生成标准模式对象 + * @param {Object} config - 编辑器配置(如 indentUnit 缩进单位) + * @param {Object} states - “状态-规则”配置 + * @return {Object} 符合 CodeMirror 标准的模式对象 + */ + CodeMirror.simpleMode = function(config, states) { + ensureState(states, "start"); + var states_ = {}, meta = states.meta || {}, hasIndentation = false; + for (var state in states) if (state != meta && states.hasOwnProperty(state)) { + var list = states_[state] = [], orig = states[state]; + for (var i = 0; i < orig.length; i++) { + var data = orig[i]; + list.push(new Rule(data, states)); + if (data.indent || data.dedent) hasIndentation = true; + } + } + var mode = { + startState: function() { + return {state: "start", pending: null, + local: null, localState: null, + indent: hasIndentation ? [] : null}; + }, + copyState: function(state) { + var s = {state: state.state, pending: state.pending, + local: state.local, localState: null, + indent: state.indent && state.indent.slice(0)}; + if (state.localState) + s.localState = CodeMirror.copyState(state.local.mode, state.localState); + if (state.stack) + s.stack = state.stack.slice(0); + for (var pers = state.persistentStates; pers; pers = pers.next) + s.persistentStates = {mode: pers.mode, + spec: pers.spec, + state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), + next: s.persistentStates}; + return s; + }, + token: tokenFunction(states_, config), + innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; }, + indent: indentFunction(states_, meta) + }; + if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop)) + mode[prop] = meta[prop]; + return mode; + }; + + function ensureState(states, name) { + if (!states.hasOwnProperty(name)) + throw new Error("Undefined state " + name + "in simple mode"); + } + + function toRegex(val, caret) { + if (!val) return /(?:)/; + var flags = ""; + if (val instanceof RegExp) { + if (val.ignoreCase) flags = "i"; + val = val.source; + } else { + val = String(val); + } + return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); + } + + function asToken(val) { + if (!val) return null; + if (typeof val == "string") return val.replace(/\./g, " "); + var result = []; + for (var i = 0; i < val.length; i++) + result.push(val[i] && val[i].replace(/\./g, " ")); + return result; + } + + function Rule(data, states) { + if (data.next || data.push) ensureState(states, data.next || data.push); + this.regex = toRegex(data.regex); + this.token = asToken(data.token); + this.data = data; + } + + function tokenFunction(states, config) { + return function(stream, state) { + if (state.pending) { + var pend = state.pending.shift(); + if (state.pending.length == 0) state.pending = null; + stream.pos += pend.text.length; + return pend.token; + } + + if (state.local) { + if (state.local.end && stream.match(state.local.end)) { + var tok = state.local.endToken || null; + state.local = state.localState = null; + return tok; + } else { + var tok = state.local.mode.token(stream, state.localState), m; + if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) + stream.pos = stream.start + m.index; + return tok; + } + } + + var curState = states[state.state]; + for (var i = 0; i < curState.length; i++) { + var rule = curState[i]; + var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex); + if (matches) { + if (rule.data.next) { + state.state = rule.data.next; + } else if (rule.data.push) { + (state.stack || (state.stack = [])).push(state.state); + state.state = rule.data.push; + } else if (rule.data.pop && state.stack && state.stack.length) { + state.state = state.stack.pop(); + } + + if (rule.data.mode) + enterLocalMode(config, state, rule.data.mode, rule.token); + if (rule.data.indent) + state.indent.push(stream.indentation() + config.indentUnit); + if (rule.data.dedent) + state.indent.pop(); + if (matches.length > 2) { + state.pending = []; + for (var j = 2; j < matches.length; j++) + if (matches[j]) + state.pending.push({text: matches[j], token: rule.token[j - 1]}); + stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); + return rule.token[0]; + } else if (rule.token && rule.token.join) { + return rule.token[0]; + } else { + return rule.token; + } + } + } + stream.next(); + return null; + }; + } + + function cmp(a, b) { + if (a === b) return true; + if (!a || typeof a != "object" || !b || typeof b != "object") return false; + var props = 0; + for (var prop in a) if (a.hasOwnProperty(prop)) { + if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; + props++; + } + for (var prop in b) if (b.hasOwnProperty(prop)) props--; + return props == 0; + } + + function enterLocalMode(config, state, spec, token) { + var pers; + if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next) + if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; + var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); + var lState = pers ? pers.state : CodeMirror.startState(mode); + if (spec.persistent && !pers) + state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates}; + + state.localState = lState; + state.local = {mode: mode, + end: spec.end && toRegex(spec.end), + endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), + endToken: token && token.join ? token[token.length - 1] : token}; + } + + function indexOf(val, arr) { + for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true; + } + + function indentFunction(states, meta) { + return function(state, textAfter, line) { + if (state.local && state.local.mode.indent) + return state.local.mode.indent(state.localState, textAfter, line); + if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1) + return CodeMirror.Pass; + + var pos = state.indent.length - 1, rules = states[state.state]; + scan: for (;;) { + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { + var m = rule.regex.exec(textAfter); + if (m && m[0]) { + pos--; + if (rule.next || rule.push) rules = states[rule.next || rule.push]; + textAfter = textAfter.slice(m[0].length); + continue scan; + } + } + } + break; + } + return pos < 0 ? 0 : state.indent[pos]; + }; + } +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/colorize.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/colorize.js new file mode 100644 index 0000000..e4d01b1 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/colorize.js @@ -0,0 +1,44 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./runmode")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./runmode"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/; + /** + * 提取 DOM 节点的文本内容(保留块级标签的换行结构) + * @param {HTMLElement} node - 目标 DOM 节点 + * @param {Array} out - 存储文本内容的数组(通过 push 积累内容) + */ + function textContent(node, out) { + if (node.nodeType == 3) return out.push(node.nodeValue); + for (var ch = node.firstChild; ch; ch = ch.nextSibling) { + textContent(ch, out); + if (isBlock.test(node.nodeType)) out.push("\n"); + } + } + + CodeMirror.colorize = function(collection, defaultMode) { + if (!collection) collection = document.body.getElementsByTagName("pre"); + + for (var i = 0; i < collection.length; ++i) { + var node = collection[i]; + var mode = node.getAttribute("data-lang") || defaultMode; + if (!mode) continue; + + var text = []; + textContent(node, text); + node.innerHTML = ""; + CodeMirror.runMode(text.join(""), mode, node); + + node.className += " cm-s-default"; + } + }; +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode-standalone.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode-standalone.js new file mode 100644 index 0000000..9b45cdd --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode-standalone.js @@ -0,0 +1,165 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * 浏览器环境简化版 CodeMirror 核心工具包 + * 功能:语法模式注册、文本流解析、静态语法高亮(runMode) + * 适配场景:浏览器端静态代码展示(如文档、博客),无需完整编辑功能 + */ +window.CodeMirror = {}; + +(function() { +"use strict"; +/** + * 文本流解析类(模拟完整 CodeMirror 的 StringStream) + * 作用:逐字符/逐段解析单行文本,提供语法解析所需的流操作方法 + * @param {string} string - 待解析的单行文本 + */ +function splitLines(string){ return string.split(/\r?\n|\r/); }; + +function StringStream(string) { + this.pos = this.start = 0; + this.string = string; + this.lineStart = 0; +} +StringStream.prototype = { + eol: function() {return this.pos >= this.string.length;}, + sol: function() {return this.pos == 0;}, + peek: function() {return this.string.charAt(this.pos) || null;}, + next: function() { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function(match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") var ok = ch == match; + else var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) {++this.pos; return ch;} + }, + eatWhile: function(match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start; + }, + eatSpace: function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; + return this.pos > start; + }, + skipToEnd: function() {this.pos = this.string.length;}, + skipTo: function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true;} + }, + backUp: function(n) {this.pos -= n;}, + column: function() {return this.start - this.lineStart;}, + indentation: function() {return 0;}, + match: function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) this.pos += pattern.length; + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) return null; + if (match && consume !== false) this.pos += match[0].length; + return match; + } + }, + current: function(){return this.string.slice(this.start, this.pos);}, + hideFirstChars: function(n, inner) { + this.lineStart += n; + try { return inner(); } + finally { this.lineStart -= n; } + } +}; +CodeMirror.StringStream = StringStream; + +CodeMirror.startState = function (mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; +}; + +var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; +CodeMirror.defineMode = function (name, mode) { + if (arguments.length > 2) + mode.dependencies = Array.prototype.slice.call(arguments, 2); + modes[name] = mode; +}; +CodeMirror.defineMIME = function (mime, spec) { mimeModes[mime] = spec; }; +CodeMirror.resolveMode = function(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + spec = mimeModes[spec.name]; + } + if (typeof spec == "string") return {name: spec}; + else return spec || {name: "null"}; +}; +CodeMirror.getMode = function (options, spec) { + spec = CodeMirror.resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) throw new Error("Unknown mode: " + spec); + return mfactory(options, spec); +}; +CodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min; +CodeMirror.defineMode("null", function() { + return {token: function(stream) {stream.skipToEnd();}}; +}); +CodeMirror.defineMIME("text/plain", "null"); + +CodeMirror.runMode = function (string, modespec, callback, options) { + var mode = CodeMirror.getMode({ indentUnit: 2 }, modespec); + + if (callback.nodeType == 1) { + var tabSize = (options && options.tabSize) || 4; + var node = callback, col = 0; + node.innerHTML = ""; + callback = function (text, style) { + if (text == "\n") { + node.appendChild(document.createElement("br")); + col = 0; + return; + } + var content = ""; + // replace tabs + for (var pos = 0; ;) { + var idx = text.indexOf("\t", pos); + if (idx == -1) { + content += text.slice(pos); + col += text.length - pos; + break; + } else { + col += idx - pos; + content += text.slice(pos, idx); + var size = tabSize - col % tabSize; + col += size; + for (var i = 0; i < size; ++i) content += " "; + pos = idx + 1; + } + } + + if (style) { + var sp = node.appendChild(document.createElement("span")); + sp.className = "cm-" + style.replace(/ +/g, " cm-"); + sp.appendChild(document.createTextNode(content)); + } else { + node.appendChild(document.createTextNode(content)); + } + }; + } + + var lines = splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); + for (var i = 0, e = lines.length; i < e; ++i) { + if (i) callback("\n"); + var stream = new CodeMirror.StringStream(lines[i]); + if (!stream.string && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state); + callback(stream.current(), style, i, stream.start, state); + stream.start = stream.pos; + } + } +}; +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.js new file mode 100644 index 0000000..c84e65e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.js @@ -0,0 +1,86 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 语法解析与渲染工具(runMode 方法) + * 功能:对输入文本按指定语法模式解析,将结果通过回调处理(如生成带高亮样式的 HTML) + * 用途:静态代码高亮、语法分析、文本格式化等(无需初始化完整编辑器) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; +/** + * 解析文本并按语法模式处理(核心方法) + * @param {string} string - 待解析的文本(如代码字符串) + * @param {string/Object} modespec - 语法模式(如 "javascript" 或模式配置对象) + * @param {Function/HTMLElement} callback - 处理结果的回调: + * - 若为函数:接收 (text, style, line, startPos, state) 参数,自定义处理逻辑 + * - 若为 DOM 元素:自动将解析结果渲染为带样式的 HTML 插入该元素 + * @param {Object} [options] - 可选配置: + * - tabSize: 制表符宽度(默认使用 CodeMirror 全局配置) + * - state: 初始模式状态(用于连续解析,默认自动初始化) + */ +CodeMirror.runMode = function(string, modespec, callback, options) { + var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); + + if (callback.nodeType == 1) { + var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; + var node = callback, col = 0; + node.innerHTML = ""; + callback = function(text, style) { + if (text == "\n") { + // Emitting LF or CRLF on IE8 or earlier results in an incorrect display. + // Emitting a carriage return makes everything ok. + node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text)); + col = 0; + return; + } + var content = ""; + // replace tabs + for (var pos = 0;;) { + var idx = text.indexOf("\t", pos); + if (idx == -1) { + content += text.slice(pos); + col += text.length - pos; + break; + } else { + col += idx - pos; + content += text.slice(pos, idx); + var size = tabSize - col % tabSize; + col += size; + for (var i = 0; i < size; ++i) content += " "; + pos = idx + 1; + } + } + + if (style) { + var sp = node.appendChild(document.createElement("span")); + sp.className = "cm-" + style.replace(/ +/g, " cm-"); + sp.appendChild(document.createTextNode(content)); + } else { + node.appendChild(document.createTextNode(content)); + } + }; + } + + var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); + for (var i = 0, e = lines.length; i < e; ++i) { + if (i) callback("\n"); + var stream = new CodeMirror.StringStream(lines[i]); + if (!stream.string && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state); + callback(stream.current(), style, i, stream.start, state); + stream.start = stream.pos; + } + } +}; + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.node.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.node.js new file mode 100644 index 0000000..2293891 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/runmode/runmode.node.js @@ -0,0 +1,131 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/* Just enough of CodeMirror to run runMode under node.js */ + +// declare global: StringStream +/** + * Node.js 环境简化版 CodeMirror 核心工具包 + * 功能:语法模式注册、文本流解析、无界面语法解析(runMode) + * 适配场景:Node.js 端静态代码分析、语法高亮文本生成等(无 DOM 依赖) + */ + +// ------------------------------ 工具函数:文本分行 ------------------------------ +/** + * 将文本按换行符分割为行数组(兼容 \n、\r\n、\r 三种换行格式) + * @param {string} string - 待分割的文本 + * @return {Array} 行数组(每一项为一行文本) + */ +function splitLines(string){ return string.split(/\r?\n|\r/); }; + +function StringStream(string) { + this.pos = this.start = 0; + this.string = string; + this.lineStart = 0; +} +StringStream.prototype = { + eol: function() {return this.pos >= this.string.length;}, + sol: function() {return this.pos == 0;}, + peek: function() {return this.string.charAt(this.pos) || null;}, + next: function() { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function(match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") var ok = ch == match; + else var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) {++this.pos; return ch;} + }, + eatWhile: function(match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start; + }, + eatSpace: function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; + return this.pos > start; + }, + skipToEnd: function() {this.pos = this.string.length;}, + skipTo: function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true;} + }, + backUp: function(n) {this.pos -= n;}, + column: function() {return this.start - this.lineStart;}, + indentation: function() {return 0;}, + match: function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) this.pos += pattern.length; + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) return null; + if (match && consume !== false) this.pos += match[0].length; + return match; + } + }, + current: function(){return this.string.slice(this.start, this.pos);}, + hideFirstChars: function(n, inner) { + this.lineStart += n; + try { return inner(); } + finally { this.lineStart -= n; } + } +}; +exports.StringStream = StringStream; + +exports.startState = function(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; +}; + +var modes = exports.modes = {}, mimeModes = exports.mimeModes = {}; +exports.defineMode = function(name, mode) { + if (arguments.length > 2) + mode.dependencies = Array.prototype.slice.call(arguments, 2); + modes[name] = mode; +}; +exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; + +exports.defineMode("null", function() { + return {token: function(stream) {stream.skipToEnd();}}; +}); +exports.defineMIME("text/plain", "null"); + +exports.resolveMode = function(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + spec = mimeModes[spec.name]; + } + if (typeof spec == "string") return {name: spec}; + else return spec || {name: "null"}; +}; +exports.getMode = function(options, spec) { + spec = exports.resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) throw new Error("Unknown mode: " + spec); + return mfactory(options, spec); +}; +exports.registerHelper = exports.registerGlobalHelper = Math.min; + +exports.runMode = function(string, modespec, callback, options) { + var mode = exports.getMode({indentUnit: 2}, modespec); + var lines = splitLines(string), state = (options && options.state) || exports.startState(mode); + for (var i = 0, e = lines.length; i < e; ++i) { + if (i) callback("\n"); + var stream = new exports.StringStream(lines[i]); + if (!stream.string && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state); + callback(stream.current(), style, i, stream.start, state); + stream.start = stream.pos; + } + } +}; + +require.cache[require.resolve("../../lib/codemirror")] = require.cache[require.resolve("./runmode.node")]; diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/annotatescrollbar.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/annotatescrollbar.js new file mode 100644 index 0000000..5a318d3 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/annotatescrollbar.js @@ -0,0 +1,118 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 滚动条标注扩展(annotateScrollbar) + * 功能:在编辑器滚动条上添加彩色/自定义样式的标注块,标记文本中指定范围的内容 + * 用途:代码错误标记、版本修改痕迹、重点内容定位等场景 + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + /** + * 定义编辑器扩展方法:annotateScrollbar(挂载到 CodeMirror 实例) + * @param {Object/string} options - 配置项: + * - 若为字符串:直接作为标注的样式类名(className) + * - 若为对象:含 className(必填,标注样式类)、scrollButtonHeight(滚动按钮高度)、listenForChanges(是否监听文本变化) + * @return {Annotation} 标注实例(用于更新/清除标注) + */ + CodeMirror.defineExtension("annotateScrollbar", function(options) { + if (typeof options == "string") options = {className: options}; + return new Annotation(this, options); + }); + /** + * 定义编辑器配置项:scrollButtonHeight(滚动条按钮高度) + * 作用:计算标注位置时,抵消滚动按钮占用的空间,确保标注对齐 + * 默认值:0(无滚动按钮时使用) + */ + CodeMirror.defineOption("scrollButtonHeight", 0); + /** + * 标注实例类(管理滚动条标注的创建、更新、清除) + * @param {CodeMirror} cm - 编辑器实例 + * @param {Object} options - 配置项(同 annotateScrollbar 方法的 options) + */ + function Annotation(cm, options) { + this.cm = cm; + this.options = options; + this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight"); + this.annotations = []; + this.doRedraw = this.doUpdate = null; + this.div = cm.getWrapperElement().appendChild(document.createElement("div")); + this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none"; + this.computeScale(); + + function scheduleRedraw(delay) { + clearTimeout(self.doRedraw); + self.doRedraw = setTimeout(function() { self.redraw(); }, delay); + } + + var self = this; + cm.on("refresh", this.resizeHandler = function() { + clearTimeout(self.doUpdate); + self.doUpdate = setTimeout(function() { + if (self.computeScale()) scheduleRedraw(20); + }, 100); + }); + cm.on("markerAdded", this.resizeHandler); + cm.on("markerCleared", this.resizeHandler); + if (options.listenForChanges !== false) + cm.on("change", this.changeHandler = function() { + scheduleRedraw(250); + }); + } + + Annotation.prototype.computeScale = function() { + var cm = this.cm; + var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) / + cm.heightAtLine(cm.lastLine() + 1, "local"); + if (hScale != this.hScale) { + this.hScale = hScale; + return true; + } + }; + + Annotation.prototype.update = function(annotations) { + this.annotations = annotations; + this.redraw(); + }; + + Annotation.prototype.redraw = function(compute) { + if (compute !== false) this.computeScale(); + var cm = this.cm, hScale = this.hScale; + + var frag = document.createDocumentFragment(), anns = this.annotations; + if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) { + var ann = anns[i]; + var top = nextTop || cm.charCoords(ann.from, "local").top * hScale; + var bottom = cm.charCoords(ann.to, "local").bottom * hScale; + while (i < anns.length - 1) { + nextTop = cm.charCoords(anns[i + 1].from, "local").top * hScale; + if (nextTop > bottom + .9) break; + ann = anns[++i]; + bottom = cm.charCoords(ann.to, "local").bottom * hScale; + } + if (bottom == top) continue; + var height = Math.max(bottom - top, 3); + + var elt = frag.appendChild(document.createElement("div")); + elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " + + (top + this.buttonHeight) + "px; height: " + height + "px"; + elt.className = this.options.className; + } + this.div.textContent = ""; + this.div.appendChild(frag); + }; + + Annotation.prototype.clear = function() { + this.cm.off("refresh", this.resizeHandler); + this.cm.off("markerAdded", this.resizeHandler); + this.cm.off("markerCleared", this.resizeHandler); + if (this.changeHandler) this.cm.off("change", this.changeHandler); + this.div.parentNode.removeChild(this.div); + }; +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/scrollpastend.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/scrollpastend.js new file mode 100644 index 0000000..979efe0 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/scrollpastend.js @@ -0,0 +1,50 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 滚动溢出底部扩展(scrollPastEnd 配置) + * 功能:允许编辑器内容底部留出额外空白区域,支持滚动到内容末尾之外 + * 用途:提升长文档末尾内容的编辑体验(避免光标被编辑器底部遮挡) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("change", onChange); + cm.off("refresh", updateBottomMargin); + cm.display.lineSpace.parentNode.style.paddingBottom = ""; + cm.state.scrollPastEndPadding = null; + } + if (val) { + cm.on("change", onChange); + cm.on("refresh", updateBottomMargin); + updateBottomMargin(cm); + } + }); + + function onChange(cm, change) { + if (CodeMirror.changeEnd(change).line == cm.lastLine()) + updateBottomMargin(cm); + } + + function updateBottomMargin(cm) { + var padding = ""; + if (cm.lineCount() > 1) { + var totalH = cm.display.scroller.clientHeight - 30, + lastLineH = cm.getLineHandle(cm.lastLine()).height; + padding = (totalH - lastLineH) + "px"; + } + if (cm.state.scrollPastEndPadding != padding) { + cm.state.scrollPastEndPadding = padding; + cm.display.lineSpace.parentNode.style.paddingBottom = padding; + cm.setSize(); + } + } +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.css b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.css new file mode 100644 index 0000000..5eea7aa --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.css @@ -0,0 +1,66 @@ +.CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div { + position: absolute; + background: #ccc; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid #bbb; + border-radius: 2px; +} + +.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical { + position: absolute; + z-index: 6; + background: #eee; +} + +.CodeMirror-simplescroll-horizontal { + bottom: 0; left: 0; + height: 8px; +} +.CodeMirror-simplescroll-horizontal div { + bottom: 0; + height: 100%; +} + +.CodeMirror-simplescroll-vertical { + right: 0; top: 0; + width: 8px; +} +.CodeMirror-simplescroll-vertical div { + right: 0; + width: 100%; +} + + +.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler { + display: none; +} + +.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { + position: absolute; + background: #bcd; + border-radius: 3px; +} + +.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical { + position: absolute; + z-index: 6; +} + +.CodeMirror-overlayscroll-horizontal { + bottom: 0; left: 0; + height: 6px; +} +.CodeMirror-overlayscroll-horizontal div { + bottom: 0; + height: 100%; +} + +.CodeMirror-overlayscroll-vertical { + right: 0; top: 0; + width: 6px; +} +.CodeMirror-overlayscroll-vertical div { + right: 0; + width: 100%; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.js new file mode 100644 index 0000000..c7b6b9f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/scroll/simplescrollbars.js @@ -0,0 +1,150 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 简易滚动条模型(simple/overlay 两种样式) + * 功能:用自定义 DOM 实现滚动条交互(拖拽、点击跳转、滚轮控制),替代原生滚动条 + * 用途:定制滚动条样式(如颜色、大小)、适配编辑器布局(如叠加/内嵌) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + /** + * 单个滚动条实例(可生成水平或垂直滚动条) + * @param {string} cls - 基础样式类名(用于区分不同滚动条模型,如 "CodeMirror-simplescroll") + * @param {string} orientation - 方向("horizontal" 水平 / "vertical" 垂直) + * @param {Function} scroll - 滚动回调函数(参数:滚动位置、方向,用于同步编辑器内容) + */ + function Bar(cls, orientation, scroll) { + this.orientation = orientation; + this.scroll = scroll; + this.screen = this.total = this.size = 1; + this.pos = 0; + + this.node = document.createElement("div"); + this.node.className = cls + "-" + orientation; + this.inner = this.node.appendChild(document.createElement("div")); + + var self = this; + CodeMirror.on(this.inner, "mousedown", function(e) { + if (e.which != 1) return; + CodeMirror.e_preventDefault(e); + var axis = self.orientation == "horizontal" ? "pageX" : "pageY"; + var start = e[axis], startpos = self.pos; + function done() { + CodeMirror.off(document, "mousemove", move); + CodeMirror.off(document, "mouseup", done); + } + function move(e) { + if (e.which != 1) return done(); + self.moveTo(startpos + (e[axis] - start) * (self.total / self.size)); + } + CodeMirror.on(document, "mousemove", move); + CodeMirror.on(document, "mouseup", done); + }); + + CodeMirror.on(this.node, "click", function(e) { + CodeMirror.e_preventDefault(e); + var innerBox = self.inner.getBoundingClientRect(), where; + if (self.orientation == "horizontal") + where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0; + else + where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0; + self.moveTo(self.pos + where * self.screen); + }); + + function onWheel(e) { + var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"]; + var oldPos = self.pos; + self.moveTo(self.pos + moved); + if (self.pos != oldPos) CodeMirror.e_preventDefault(e); + } + CodeMirror.on(this.node, "mousewheel", onWheel); + CodeMirror.on(this.node, "DOMMouseScroll", onWheel); + } + + Bar.prototype.moveTo = function(pos, update) { + if (pos < 0) pos = 0; + if (pos > this.total - this.screen) pos = this.total - this.screen; + if (pos == this.pos) return; + this.pos = pos; + this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = + (pos * (this.size / this.total)) + "px"; + if (update !== false) this.scroll(pos, this.orientation); + }; + + Bar.prototype.update = function(scrollSize, clientSize, barSize) { + this.screen = clientSize; + this.total = scrollSize; + this.size = barSize; + + // FIXME clip to min size? + this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = + this.screen * (this.size / this.total) + "px"; + this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = + this.pos * (this.size / this.total) + "px"; + }; + + function SimpleScrollbars(cls, place, scroll) { + this.addClass = cls; + this.horiz = new Bar(cls, "horizontal", scroll); + place(this.horiz.node); + this.vert = new Bar(cls, "vertical", scroll); + place(this.vert.node); + this.width = null; + } + + SimpleScrollbars.prototype.update = function(measure) { + if (this.width == null) { + var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle; + if (style) this.width = parseInt(style.height); + } + var width = this.width || 0; + + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + this.vert.node.style.display = needsV ? "block" : "none"; + this.horiz.node.style.display = needsH ? "block" : "none"; + + if (needsV) { + this.vert.update(measure.scrollHeight, measure.clientHeight, + measure.viewHeight - (needsH ? width : 0)); + this.vert.node.style.display = "block"; + this.vert.node.style.bottom = needsH ? width + "px" : "0"; + } + if (needsH) { + this.horiz.update(measure.scrollWidth, measure.clientWidth, + measure.viewWidth - (needsV ? width : 0) - measure.barLeft); + this.horiz.node.style.right = needsV ? width + "px" : "0"; + this.horiz.node.style.left = measure.barLeft + "px"; + } + + return {right: needsV ? width : 0, bottom: needsH ? width : 0}; + }; + + SimpleScrollbars.prototype.setScrollTop = function(pos) { + this.vert.moveTo(pos, false); + }; + + SimpleScrollbars.prototype.setScrollLeft = function(pos) { + this.horiz.moveTo(pos, false); + }; + + SimpleScrollbars.prototype.clear = function() { + var parent = this.horiz.node.parentNode; + parent.removeChild(this.horiz.node); + parent.removeChild(this.vert.node); + }; + + CodeMirror.scrollbarModel.simple = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll); + }; + CodeMirror.scrollbarModel.overlay = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll); + }; +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/match-highlighter.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/match-highlighter.js new file mode 100644 index 0000000..9d64d5a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/match-highlighter.js @@ -0,0 +1,132 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Highlighting text that matches the selection +// +// Defines an option highlightSelectionMatches, which, when enabled, +// will style strings that match the selection throughout the +// document. +// +// The option can be set to true to simply enable it, or to a +// {minChars, style, wordsOnly, showToken, delay} object to explicitly +// configure it. minChars is the minimum amount of characters that should be +// selected for the behavior to occur, and style is the token style to +// apply to the matches. This will be prefixed by "cm-" to create an +// actual CSS class name. If wordsOnly is enabled, the matches will be +// highlighted only if the selected text is a word. showToken, when enabled, +// will cause the current token to be highlighted when nothing is selected. +// delay is used to specify how much time to wait, in milliseconds, before +// highlighting the matches. +/** + * CodeMirror 选中内容高亮扩展(highlightSelectionMatches) + * 功能:自动高亮与当前选中内容/光标所在单词相同的文本 + * 用途:快速定位重复内容(如变量、关键词),提升代码阅读和编辑效率 + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var DEFAULT_MIN_CHARS = 2; + var DEFAULT_TOKEN_STYLE = "matchhighlight"; + var DEFAULT_DELAY = 100; + var DEFAULT_WORDS_ONLY = false; + + function State(options) { + if (typeof options == "object") { + this.minChars = options.minChars; + this.style = options.style; + this.showToken = options.showToken; + this.delay = options.delay; + this.wordsOnly = options.wordsOnly; + } + if (this.style == null) this.style = DEFAULT_TOKEN_STYLE; + if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS; + if (this.delay == null) this.delay = DEFAULT_DELAY; + if (this.wordsOnly == null) this.wordsOnly = DEFAULT_WORDS_ONLY; + this.overlay = this.timeout = null; + } + + CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + var over = cm.state.matchHighlighter.overlay; + if (over) cm.removeOverlay(over); + clearTimeout(cm.state.matchHighlighter.timeout); + cm.state.matchHighlighter = null; + cm.off("cursorActivity", cursorActivity); + } + if (val) { + cm.state.matchHighlighter = new State(val); + highlightMatches(cm); + cm.on("cursorActivity", cursorActivity); + } + }); + + function cursorActivity(cm) { + var state = cm.state.matchHighlighter; + clearTimeout(state.timeout); + state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay); + } + + function highlightMatches(cm) { + cm.operation(function() { + var state = cm.state.matchHighlighter; + if (state.overlay) { + cm.removeOverlay(state.overlay); + state.overlay = null; + } + if (!cm.somethingSelected() && state.showToken) { + var re = state.showToken === true ? /[\w$]/ : state.showToken; + var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start; + while (start && re.test(line.charAt(start - 1))) --start; + while (end < line.length && re.test(line.charAt(end))) ++end; + if (start < end) + cm.addOverlay(state.overlay = makeOverlay(line.slice(start, end), re, state.style)); + return; + } + var from = cm.getCursor("from"), to = cm.getCursor("to"); + if (from.line != to.line) return; + if (state.wordsOnly && !isWord(cm, from, to)) return; + var selection = cm.getRange(from, to).replace(/^\s+|\s+$/g, ""); + if (selection.length >= state.minChars) + cm.addOverlay(state.overlay = makeOverlay(selection, false, state.style)); + }); + } + + function isWord(cm, from, to) { + var str = cm.getRange(from, to); + if (str.match(/^\w+$/) !== null) { + if (from.ch > 0) { + var pos = {line: from.line, ch: from.ch - 1}; + var chr = cm.getRange(pos, from); + if (chr.match(/\W/) === null) return false; + } + if (to.ch < cm.getLine(from.line).length) { + var pos = {line: to.line, ch: to.ch + 1}; + var chr = cm.getRange(to, pos); + if (chr.match(/\W/) === null) return false; + } + return true; + } else return false; + } + + function boundariesAround(stream, re) { + return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && + (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); + } + + function makeOverlay(query, hasBoundary, style) { + return {token: function(stream) { + if (stream.match(query) && + (!hasBoundary || boundariesAround(stream, hasBoundary))) + return style; + stream.next(); + stream.skipTo(query.charAt(0)) || stream.skipToEnd(); + }}; + } +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.css b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.css new file mode 100644 index 0000000..77932cc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.css @@ -0,0 +1,8 @@ +.CodeMirror-search-match { + background: gold; + border-top: 1px solid orange; + border-bottom: 1px solid orange; + -moz-box-sizing: border-box; + box-sizing: border-box; + opacity: .5; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.js new file mode 100644 index 0000000..cbdf079 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/matchesonscrollbar.js @@ -0,0 +1,114 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 搜索结果滚动条标注扩展(showMatchesOnScrollbar) + * 功能:在滚动条上标注全局搜索结果的位置,支持文本变化时动态更新标注 + * 用途:全局搜索后快速定位匹配内容,提升长文档搜索效率 + * 依赖:searchcursor(搜索光标工具)、annotatescrollbar(滚动条标注扩展) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + /** + * 定义编辑器扩展方法:showMatchesOnScrollbar(挂载到 CodeMirror 实例) + * @param {string/RegExp} query - 搜索关键词(字符串或正则表达式) + * @param {boolean} caseFold - 是否忽略大小写(true:忽略,false:区分) + * @param {Object/string} options - 配置项: + * - 若为字符串:直接作为标注样式类名(className) + * - 若为对象:含 className(标注样式类)、scrollButtonHeight(滚动按钮高度)等 + * @return {SearchAnnotation} 搜索标注实例(用于清理标注) + */ + CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) { + if (typeof options == "string") options = {className: options}; + if (!options) options = {}; + return new SearchAnnotation(this, query, caseFold, options); + }); + /** + * 搜索标注实例类(管理搜索结果、滚动条标注、文本变化更新) + * @param {CodeMirror} cm - 编辑器实例 + * @param {string/RegExp} query - 搜索关键词 + * @param {boolean} caseFold - 是否忽略大小写 + * @param {Object} options - 配置项(同 showMatchesOnScrollbar 方法的 options) + */ + function SearchAnnotation(cm, query, caseFold, options) { + this.cm = cm; + var annotateOptions = {listenForChanges: false}; + for (var prop in options) annotateOptions[prop] = options[prop]; + if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match"; + this.annotation = cm.annotateScrollbar(annotateOptions); + this.query = query; + this.caseFold = caseFold; + this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1}; + this.matches = []; + this.update = null; + + this.findMatches(); + this.annotation.update(this.matches); + + var self = this; + cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); }); + } + + var MAX_MATCHES = 1000; + + SearchAnnotation.prototype.findMatches = function() { + if (!this.gap) return; + for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + if (match.from.line >= this.gap.to) break; + if (match.to.line >= this.gap.from) this.matches.splice(i--, 1); + } + var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), this.caseFold); + while (cursor.findNext()) { + var match = {from: cursor.from(), to: cursor.to()}; + if (match.from.line >= this.gap.to) break; + this.matches.splice(i++, 0, match); + if (this.matches.length > MAX_MATCHES) break; + } + this.gap = null; + }; + + function offsetLine(line, changeStart, sizeChange) { + if (line <= changeStart) return line; + return Math.max(changeStart, line + sizeChange); + } + + SearchAnnotation.prototype.onChange = function(change) { + var startLine = change.from.line; + var endLine = CodeMirror.changeEnd(change).line; + var sizeChange = endLine - change.to.line; + if (this.gap) { + this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line); + this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line); + } else { + this.gap = {from: change.from.line, to: endLine + 1}; + } + + if (sizeChange) for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + var newFrom = offsetLine(match.from.line, startLine, sizeChange); + if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch); + var newTo = offsetLine(match.to.line, startLine, sizeChange); + if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch); + } + clearTimeout(this.update); + var self = this; + this.update = setTimeout(function() { self.updateAfterChange(); }, 250); + }; + + SearchAnnotation.prototype.updateAfterChange = function() { + this.findMatches(); + this.annotation.update(this.matches); + }; + + SearchAnnotation.prototype.clear = function() { + this.cm.off("change", this.changeHandler); + this.annotation.clear(); + }; +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/search.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/search.js new file mode 100644 index 0000000..8fef12d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/search.js @@ -0,0 +1,170 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Define search commands. Depends on dialog.js or another +// implementation of the openDialog method. + +// Replace works a little oddly -- it will do the replace on the next +// Ctrl-G (or whatever is bound to findNext) press. You prevent a +// replace by making sure the match is no longer selected when hitting +// Ctrl-G. +/** + * CodeMirror 搜索与替换功能扩展 + * 功能:实现全局搜索、逐次查找(下一个/上一个)、单条替换、全部替换,支持正则表达式 + * 依赖:searchcursor(搜索光标工具)、dialog(对话框扩展) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + function searchOverlay(query, caseInsensitive) { + if (typeof query == "string") + query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g"); + else if (!query.global) + query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); + + return {token: function(stream) { + query.lastIndex = stream.pos; + var match = query.exec(stream.string); + if (match && match.index == stream.pos) { + stream.pos += match[0].length; + return "searching"; + } else if (match) { + stream.pos = match.index; + } else { + stream.skipToEnd(); + } + }}; + } + /** + * 搜索状态类(存储搜索相关临时数据) + */ + function SearchState() { + this.posFrom = this.posTo = this.query = null; + this.overlay = null; + } + function getSearchState(cm) { + return cm.state.search || (cm.state.search = new SearchState()); + } + function queryCaseInsensitive(query) { + return typeof query == "string" && query == query.toLowerCase(); + } + function getSearchCursor(cm, query, pos) { + // Heuristic: if the query string is all lowercase, do a case insensitive search. + return cm.getSearchCursor(query, pos, queryCaseInsensitive(query)); + } + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, {value: deflt}); + else f(prompt(shortText, deflt)); + } + function confirmDialog(cm, text, shortText, fs) { + if (cm.openConfirm) cm.openConfirm(text, fs); + else if (confirm(shortText)) fs[0](); + } + function parseQuery(query) { + var isRE = query.match(/^\/(.*)\/([a-z]*)$/); + if (isRE) { + try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); } + catch(e) {} // Not a regular expression after all, do a string search + } + if (typeof query == "string" ? query == "" : query.test("")) + query = /x^/; + return query; + } + var queryDialog = + 'Search: (Use /re/ syntax for regexp search)'; + function doSearch(cm, rev) { + var state = getSearchState(cm); + if (state.query) return findNext(cm, rev); + dialog(cm, queryDialog, "Search for:", cm.getSelection(), function(query) { + cm.operation(function() { + if (!query || state.query) return; + state.query = parseQuery(query); + cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); + state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); + cm.addOverlay(state.overlay); + if (cm.showMatchesOnScrollbar) { + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); + } + state.posFrom = state.posTo = cm.getCursor(); + findNext(cm, rev); + }); + }); + } + function findNext(cm, rev) {cm.operation(function() { + var state = getSearchState(cm); + var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); + if (!cursor.find(rev)) { + cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); + if (!cursor.find(rev)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); + state.posFrom = cursor.from(); state.posTo = cursor.to(); + });} + function clearSearch(cm) {cm.operation(function() { + var state = getSearchState(cm); + if (!state.query) return; + state.query = null; + cm.removeOverlay(state.overlay); + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + });} + + var replaceQueryDialog = + 'Replace: (Use /re/ syntax for regexp search)'; + var replacementQueryDialog = 'With: '; + var doReplaceConfirm = "Replace? "; + function replace(cm, all) { + if (cm.getOption("readOnly")) return; + dialog(cm, replaceQueryDialog, "Replace:", cm.getSelection(), function(query) { + if (!query) return; + query = parseQuery(query); + dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) { + if (all) { + cm.operation(function() { + for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { + if (typeof query != "string") { + var match = cm.getRange(cursor.from(), cursor.to()).match(query); + cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + } else cursor.replace(text); + } + }); + } else { + clearSearch(cm); + var cursor = getSearchCursor(cm, query, cm.getCursor()); + var advance = function() { + var start = cursor.from(), match; + if (!(match = cursor.findNext())) { + cursor = getSearchCursor(cm, query); + if (!(match = cursor.findNext()) || + (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); + confirmDialog(cm, doReplaceConfirm, "Replace?", + [function() {doReplace(match);}, advance]); + }; + var doReplace = function(match) { + cursor.replace(typeof query == "string" ? text : + text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + advance(); + }; + advance(); + } + }); + }); + } + + CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; + CodeMirror.commands.findNext = doSearch; + CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; + CodeMirror.commands.clearSearch = clearSearch; + CodeMirror.commands.replace = replace; + CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/searchcursor.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/searchcursor.js new file mode 100644 index 0000000..e3c64cc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/search/searchcursor.js @@ -0,0 +1,193 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 搜索光标核心工具(SearchCursor) + * 功能:实现精准文本搜索,支持字符串/正则、正向/反向、单/多行匹配,及匹配内容替换 + * 用途:作为搜索相关扩展的底层依赖(如全局搜索、替换功能) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var Pos = CodeMirror.Pos; + + function SearchCursor(doc, query, pos, caseFold) { + this.atOccurrence = false; this.doc = doc; + if (caseFold == null && typeof query == "string") caseFold = false; + + pos = pos ? doc.clipPos(pos) : Pos(0, 0); + this.pos = {from: pos, to: pos}; + + // The matches method is filled in based on the type of query. + // It takes a position and a direction, and returns an object + // describing the next occurrence of the query, or null if no + // more matches were found. + if (typeof query != "string") { // Regexp match + if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g"); + this.matches = function(reverse, pos) { + if (reverse) { + query.lastIndex = 0; + var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start; + for (;;) { + query.lastIndex = cutOff; + var newMatch = query.exec(line); + if (!newMatch) break; + match = newMatch; + start = match.index; + cutOff = match.index + (match[0].length || 1); + if (cutOff == line.length) break; + } + var matchLen = (match && match[0].length) || 0; + if (!matchLen) { + if (start == 0 && line.length == 0) {match = undefined;} + else if (start != doc.getLine(pos.line).length) { + matchLen++; + } + } + } else { + query.lastIndex = pos.ch; + var line = doc.getLine(pos.line), match = query.exec(line); + var matchLen = (match && match[0].length) || 0; + var start = match && match.index; + if (start + matchLen != line.length && !matchLen) matchLen = 1; + } + if (match && matchLen) + return {from: Pos(pos.line, start), + to: Pos(pos.line, start + matchLen), + match: match}; + }; + } else { // String query + var origQuery = query; + if (caseFold) query = query.toLowerCase(); + var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;}; + var target = query.split("\n"); + // Different methods for single-line and multi-line queries + if (target.length == 1) { + if (!query.length) { + // Empty string would match anything and never progress, so + // we define it to match nothing instead. + this.matches = function() {}; + } else { + this.matches = function(reverse, pos) { + if (reverse) { + var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig); + var match = line.lastIndexOf(query); + if (match > -1) { + match = adjustPos(orig, line, match); + return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; + } + } else { + var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig); + var match = line.indexOf(query); + if (match > -1) { + match = adjustPos(orig, line, match) + pos.ch; + return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; + } + } + }; + } + } else { + var origTarget = origQuery.split("\n"); + this.matches = function(reverse, pos) { + var last = target.length - 1; + if (reverse) { + if (pos.line - (target.length - 1) < doc.firstLine()) return; + if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return; + var to = Pos(pos.line, origTarget[last].length); + for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln) + if (target[i] != fold(doc.getLine(ln))) return; + var line = doc.getLine(ln), cut = line.length - origTarget[0].length; + if (fold(line.slice(cut)) != target[0]) return; + return {from: Pos(ln, cut), to: to}; + } else { + if (pos.line + (target.length - 1) > doc.lastLine()) return; + var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length; + if (fold(line.slice(cut)) != target[0]) return; + var from = Pos(pos.line, cut); + for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln) + if (target[i] != fold(doc.getLine(ln))) return; + if (fold(doc.getLine(ln).slice(0, origTarget[last].length)) != target[last]) return; + return {from: from, to: Pos(ln, origTarget[last].length)}; + } + }; + } + } + } + + SearchCursor.prototype = { + findNext: function() {return this.find(false);}, + findPrevious: function() {return this.find(true);}, + + find: function(reverse) { + var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); + function savePosAndFail(line) { + var pos = Pos(line, 0); + self.pos = {from: pos, to: pos}; + self.atOccurrence = false; + return false; + } + + for (;;) { + if (this.pos = this.matches(reverse, pos)) { + this.atOccurrence = true; + return this.pos.match || true; + } + if (reverse) { + if (!pos.line) return savePosAndFail(0); + pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length); + } + else { + var maxLine = this.doc.lineCount(); + if (pos.line == maxLine - 1) return savePosAndFail(maxLine); + pos = Pos(pos.line + 1, 0); + } + } + }, + + from: function() {if (this.atOccurrence) return this.pos.from;}, + to: function() {if (this.atOccurrence) return this.pos.to;}, + + replace: function(newText) { + if (!this.atOccurrence) return; + var lines = CodeMirror.splitLines(newText); + this.doc.replaceRange(lines, this.pos.from, this.pos.to); + this.pos.to = Pos(this.pos.from.line + lines.length - 1, + lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); + } + }; + + // Maps a position in a case-folded line back to a position in the original line + // (compensating for codepoints increasing in number during folding) + function adjustPos(orig, folded, pos) { + if (orig.length == folded.length) return pos; + for (var pos1 = Math.min(pos, orig.length);;) { + var len1 = orig.slice(0, pos1).toLowerCase().length; + if (len1 < pos) ++pos1; + else if (len1 > pos) --pos1; + else return pos1; + } + } + + CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this.doc, query, pos, caseFold); + }); + CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this, query, pos, caseFold); + }); + + CodeMirror.defineExtension("selectMatches", function(query, caseFold) { + var ranges = [], next; + var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); + while (next = cur.findNext()) { + if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; + ranges.push({anchor: cur.from(), head: cur.to()}); + } + if (ranges.length) + this.setSelections(ranges, 0); + }); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/active-line.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/active-line.js new file mode 100644 index 0000000..8044a9e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/active-line.js @@ -0,0 +1,79 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Because sometimes you need to style the cursor's line. +// +// Adds an option 'styleActiveLine' which, when enabled, gives the +// active line's wrapping
    the CSS class "CodeMirror-activeline", +// and gives its background
    the class "CodeMirror-activeline-background". +/** + * CodeMirror 激活行高亮扩展(styleActiveLine) + * 功能:给光标所在的行添加特殊样式(背景、边框等),突出显示激活行 + * 用途:长文档编辑时快速定位光标位置,提升视觉辨识度 + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var WRAP_CLASS = "CodeMirror-activeline"; + var BACK_CLASS = "CodeMirror-activeline-background"; + /** + * 定义编辑器配置项:styleActiveLine(激活行高亮) + * @param {boolean} val - 是否启用(true:启用,false:禁用) + * @param {*} old - 旧值(用于初始化和切换状态) + */ + CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.state.activeLines = []; + updateActiveLines(cm, cm.listSelections()); + cm.on("beforeSelectionChange", selectionChange); + } else if (!val && prev) { + cm.off("beforeSelectionChange", selectionChange); + clearActiveLines(cm); + delete cm.state.activeLines; + } + }); + + function clearActiveLines(cm) { + for (var i = 0; i < cm.state.activeLines.length; i++) { + cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); + cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); + } + } + + function sameArray(a, b) { + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) + if (a[i] != b[i]) return false; + return true; + } + + function updateActiveLines(cm, ranges) { + var active = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (!range.empty()) continue; + var line = cm.getLineHandleVisualStart(range.head.line); + if (active[active.length - 1] != line) active.push(line); + } + if (sameArray(cm.state.activeLines, active)) return; + cm.operation(function() { + clearActiveLines(cm); + for (var i = 0; i < active.length; i++) { + cm.addLineClass(active[i], "wrap", WRAP_CLASS); + cm.addLineClass(active[i], "background", BACK_CLASS); + } + cm.state.activeLines = active; + }); + } + + function selectionChange(cm, sel) { + updateActiveLines(cm, sel.ranges); + } +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/mark-selection.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/mark-selection.js new file mode 100644 index 0000000..66da74a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/mark-selection.js @@ -0,0 +1,128 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Because sometimes you need to mark the selected *text*. +// +// Adds an option 'styleSelectedText' which, when enabled, gives +// selected text the CSS class given as option value, or +// "CodeMirror-selectedtext" when the value is not a string. +/** + * CodeMirror 选中文本高亮扩展(styleSelectedText) + * 功能:给选中文本添加自定义样式,支持大文本选择时的分块优化,区别于默认选中样式 + * 用途:突出显示选中文本,适配特殊场景下的文本选择视觉需求(如二次高亮、自定义主题) + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.state.markedSelection = []; + cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext"; + reset(cm); + cm.on("cursorActivity", onCursorActivity); + cm.on("change", onChange); + } else if (!val && prev) { + cm.off("cursorActivity", onCursorActivity); + cm.off("change", onChange); + clear(cm); + cm.state.markedSelection = cm.state.markedSelectionStyle = null; + } + }); + + function onCursorActivity(cm) { + cm.operation(function() { update(cm); }); + } + + function onChange(cm) { + if (cm.state.markedSelection.length) + cm.operation(function() { clear(cm); }); + } + + var CHUNK_SIZE = 8; + var Pos = CodeMirror.Pos; + var cmp = CodeMirror.cmpPos; + /** + * 分块覆盖选中文本(给指定范围的文本添加自定义样式,分块优化性能) + * @param {CodeMirror} cm - 编辑器实例 + * @param {Object} from - 选择起始位置(Pos 对象) + * @param {Object} to - 选择结束位置(Pos 对象) + * @param {number} [addAt] - 标记对象插入位置(默认追加到数组末尾) + */ + function coverRange(cm, from, to, addAt) { + if (cmp(from, to) == 0) return; + var array = cm.state.markedSelection; + var cls = cm.state.markedSelectionStyle; + for (var line = from.line;;) { + var start = line == from.line ? from : Pos(line, 0); + var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line; + var end = atEnd ? to : Pos(endLine, 0); + var mark = cm.markText(start, end, {className: cls}); + if (addAt == null) array.push(mark); + else array.splice(addAt++, 0, mark); + if (atEnd) break; + line = endLine; + } + } + + function clear(cm) { + var array = cm.state.markedSelection; + for (var i = 0; i < array.length; ++i) array[i].clear(); + array.length = 0; + } + + function reset(cm) { + clear(cm); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) + coverRange(cm, ranges[i].from(), ranges[i].to()); + } + + function update(cm) { + if (!cm.somethingSelected()) return clear(cm); + if (cm.listSelections().length > 1) return reset(cm); + + var from = cm.getCursor("start"), to = cm.getCursor("end"); + + var array = cm.state.markedSelection; + if (!array.length) return coverRange(cm, from, to); + + var coverStart = array[0].find(), coverEnd = array[array.length - 1].find(); + if (!coverStart || !coverEnd || to.line - from.line < CHUNK_SIZE || + cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0) + return reset(cm); + + while (cmp(from, coverStart.from) > 0) { + array.shift().clear(); + coverStart = array[0].find(); + } + if (cmp(from, coverStart.from) < 0) { + if (coverStart.to.line - from.line < CHUNK_SIZE) { + array.shift().clear(); + coverRange(cm, from, coverStart.to, 0); + } else { + coverRange(cm, from, coverStart.from, 0); + } + } + + while (cmp(to, coverEnd.to) < 0) { + array.pop().clear(); + coverEnd = array[array.length - 1].find(); + } + if (cmp(to, coverEnd.to) > 0) { + if (to.line - coverEnd.from.line < CHUNK_SIZE) { + array.pop().clear(); + coverRange(cm, coverEnd.from, to); + } else { + coverRange(cm, coverEnd.to, to); + } + } + } +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/selection-pointer.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/selection-pointer.js new file mode 100644 index 0000000..b264555 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/selection/selection-pointer.js @@ -0,0 +1,108 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 选择区域光标样式扩展(selectionPointer) + * 功能:当鼠标悬停在选中文本区域时,显示自定义光标样式;离开区域时恢复默认光标 + * 用途:通过光标样式变化,直观提示用户当前处于悬停在选中文本上,增强交互体验 + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + /** + * 定义编辑器配置项:selectionPointer(选择区域光标样式) + * @param {boolean/string} val - 配置值: + * - true:启用,使用默认光标样式("default") + * - 字符串:启用,使用该字符串指定的光标样式(如 "copy"、"pointer" 等 CSS 光标值) + * - false:禁用 + */ + CodeMirror.defineOption("selectionPointer", false, function(cm, val) { + var data = cm.state.selectionPointer; + if (data) { + CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.off(window, "scroll", data.windowScroll); + cm.off("cursorActivity", reset); + cm.off("scroll", reset); + cm.state.selectionPointer = null; + cm.display.lineDiv.style.cursor = ""; + } + if (val) { + data = cm.state.selectionPointer = { + value: typeof val == "string" ? val : "default", + mousemove: function(event) { mousemove(cm, event); }, + mouseout: function(event) { mouseout(cm, event); }, + windowScroll: function() { reset(cm); }, + rects: null, + mouseX: null, mouseY: null, + willUpdate: false + }; + CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.on(window, "scroll", data.windowScroll); + cm.on("cursorActivity", reset); + cm.on("scroll", reset); + } + }); + + function mousemove(cm, event) { + var data = cm.state.selectionPointer; + if (event.buttons == null ? event.which : event.buttons) { + data.mouseX = data.mouseY = null; + } else { + data.mouseX = event.clientX; + data.mouseY = event.clientY; + } + scheduleUpdate(cm); + } + + function mouseout(cm, event) { + if (!cm.getWrapperElement().contains(event.relatedTarget)) { + var data = cm.state.selectionPointer; + data.mouseX = data.mouseY = null; + scheduleUpdate(cm); + } + } + + function reset(cm) { + cm.state.selectionPointer.rects = null; + scheduleUpdate(cm); + } + + function scheduleUpdate(cm) { + if (!cm.state.selectionPointer.willUpdate) { + cm.state.selectionPointer.willUpdate = true; + setTimeout(function() { + update(cm); + cm.state.selectionPointer.willUpdate = false; + }, 50); + } + } + + function update(cm) { + var data = cm.state.selectionPointer; + if (!data) return; + if (data.rects == null && data.mouseX != null) { + data.rects = []; + if (cm.somethingSelected()) { + for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling) + data.rects.push(sel.getBoundingClientRect()); + } + } + var inside = false; + if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) { + var rect = data.rects[i]; + if (rect.left <= data.mouseX && rect.right >= data.mouseX && + rect.top <= data.mouseY && rect.bottom >= data.mouseY) + inside = true; + } + var cursor = inside ? data.value : ""; + if (cm.display.lineDiv.style.cursor != cursor) + cm.display.lineDiv.style.cursor = cursor; + } +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.css b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.css new file mode 100644 index 0000000..76fba33 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.css @@ -0,0 +1,86 @@ +.CodeMirror-Tern-completion { + padding-left: 22px; + position: relative; +} +.CodeMirror-Tern-completion:before { + position: absolute; + left: 2px; + bottom: 2px; + border-radius: 50%; + font-size: 12px; + font-weight: bold; + height: 15px; + width: 15px; + line-height: 16px; + text-align: center; + color: white; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.CodeMirror-Tern-completion-unknown:before { + content: "?"; + background: #4bb; +} +.CodeMirror-Tern-completion-object:before { + content: "O"; + background: #77c; +} +.CodeMirror-Tern-completion-fn:before { + content: "F"; + background: #7c7; +} +.CodeMirror-Tern-completion-array:before { + content: "A"; + background: #c66; +} +.CodeMirror-Tern-completion-number:before { + content: "1"; + background: #999; +} +.CodeMirror-Tern-completion-string:before { + content: "S"; + background: #999; +} +.CodeMirror-Tern-completion-bool:before { + content: "B"; + background: #999; +} + +.CodeMirror-Tern-completion-guess { + color: #999; +} + +.CodeMirror-Tern-tooltip { + border: 1px solid silver; + border-radius: 3px; + color: #444; + padding: 2px 5px; + font-size: 90%; + font-family: monospace; + background-color: white; + white-space: pre-wrap; + + max-width: 40em; + position: absolute; + z-index: 10; + -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + box-shadow: 2px 3px 5px rgba(0,0,0,.2); + + transition: opacity 1s; + -moz-transition: opacity 1s; + -webkit-transition: opacity 1s; + -o-transition: opacity 1s; + -ms-transition: opacity 1s; +} + +.CodeMirror-Tern-hint-doc { + max-width: 25em; + margin-top: -3px; +} + +.CodeMirror-Tern-fname { color: black; } +.CodeMirror-Tern-farg { color: #70a; } +.CodeMirror-Tern-farg-current { text-decoration: underline; } +.CodeMirror-Tern-type { color: #07c; } +.CodeMirror-Tern-fhint-guess { opacity: .7; } diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.js new file mode 100644 index 0000000..dce06cc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/tern.js @@ -0,0 +1,708 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Glue code between CodeMirror and Tern. +// +// Create a CodeMirror.TernServer to wrap an actual Tern server, +// register open documents (CodeMirror.Doc instances) with it, and +// call its methods to activate the assisting functions that Tern +// provides. +// +// Options supported (all optional): +// * defs: An array of JSON definition data structures. +// * plugins: An object mapping plugin names to configuration +// options. +// * getFile: A function(name, c) that can be used to access files in +// the project that haven't been loaded yet. Simply do c(null) to +// indicate that a file is not available. +// * fileFilter: A function(value, docName, doc) that will be applied +// to documents before passing them on to Tern. +// * switchToDoc: A function(name, doc) that should, when providing a +// multi-file view, switch the view or focus to the named file. +// * showError: A function(editor, message) that can be used to +// override the way errors are displayed. +// * completionTip: Customize the content in tooltips for completions. +// Is passed a single argument—the completion's data as returned by +// Tern—and may return a string, DOM node, or null to indicate that +// no tip should be shown. By default the docstring is shown. +// * typeTip: Like completionTip, but for the tooltips shown for type +// queries. +// * responseFilter: A function(doc, query, request, error, data) that +// will be applied to the Tern responses before treating them +// +// +// It is possible to run the Tern server in a web worker by specifying +// these additional options: +// * useWorker: Set to true to enable web worker mode. You'll probably +// want to feature detect the actual value you use here, for example +// !!window.Worker. +// * workerScript: The main script of the worker. Point this to +// wherever you are hosting worker.js from this directory. +// * workerDeps: An array of paths pointing (relative to workerScript) +// to the Acorn and Tern libraries and any Tern plugins you want to +// load. Or, if you minified those into a single script and included +// them in the workerScript, simply leave this undefined. +/** + * CodeMirror Tern 智能提示扩展 + * 功能:集成 Tern 代码分析引擎,提供 JS 智能补全、类型提示、参数提示、跳转定义等 IDE 级功能 + * 依赖:Tern 引擎(可通过 Worker 或直接运行)、CodeMirror 核心 + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + // declare global: tern + /** + * Tern 服务实例类(管理 Tern 引擎、文档状态、交互逻辑) + * @param {Object} options - 配置项: + * - useWorker: 是否使用 Web Worker 运行 Tern(避免阻塞主线程) + * - defs: Tern 类型定义文件(如 ES6、Node.js 定义) + * - plugins: Tern 插件(默认启用 doc_comment 文档注释插件) + * - workerScript: Worker 脚本路径(useWorker 为 true 时需配置) + */ + CodeMirror.TernServer = function(options) { + var self = this; + this.options = options || {}; + var plugins = this.options.plugins || (this.options.plugins = {}); + if (!plugins.doc_comment) plugins.doc_comment = true; + if (this.options.useWorker) { + this.server = new WorkerServer(this); + } else { + this.server = new tern.Server({ + getFile: function(name, c) { return getFile(self, name, c); }, + async: true, + defs: this.options.defs || [], + plugins: plugins + }); + } + this.docs = Object.create(null); + this.trackChange = function(doc, change) { trackChange(self, doc, change); }; + + this.cachedArgHints = null; + this.activeArgHints = null; + this.jumpStack = []; + + this.getHint = function(cm, c) { return hint(self, cm, c); }; + this.getHint.async = true; + }; + + CodeMirror.TernServer.prototype = { + addDoc: function(name, doc) { + var data = {doc: doc, name: name, changed: null}; + this.server.addFile(name, docValue(this, data)); + CodeMirror.on(doc, "change", this.trackChange); + return this.docs[name] = data; + }, + + delDoc: function(id) { + var found = resolveDoc(this, id); + if (!found) return; + CodeMirror.off(found.doc, "change", this.trackChange); + delete this.docs[found.name]; + this.server.delFile(found.name); + }, + + hideDoc: function(id) { + closeArgHints(this); + var found = resolveDoc(this, id); + if (found && found.changed) sendDoc(this, found); + }, + + complete: function(cm) { + cm.showHint({hint: this.getHint}); + }, + + showType: function(cm, pos, c) { showContextInfo(this, cm, pos, "type", c); }, + + showDocs: function(cm, pos, c) { showContextInfo(this, cm, pos, "documentation", c); }, + + updateArgHints: function(cm) { updateArgHints(this, cm); }, + + jumpToDef: function(cm) { jumpToDef(this, cm); }, + + jumpBack: function(cm) { jumpBack(this, cm); }, + + rename: function(cm) { rename(this, cm); }, + + selectName: function(cm) { selectName(this, cm); }, + + request: function (cm, query, c, pos) { + var self = this; + var doc = findDoc(this, cm.getDoc()); + var request = buildRequest(this, doc, query, pos); + + this.server.request(request, function (error, data) { + if (!error && self.options.responseFilter) + data = self.options.responseFilter(doc, query, request, error, data); + c(error, data); + }); + }, + + destroy: function () { + if (this.worker) { + this.worker.terminate(); + this.worker = null; + } + } + }; + + var Pos = CodeMirror.Pos; + var cls = "CodeMirror-Tern-"; + var bigDoc = 250; + + function getFile(ts, name, c) { + var buf = ts.docs[name]; + if (buf) + c(docValue(ts, buf)); + else if (ts.options.getFile) + ts.options.getFile(name, c); + else + c(null); + } + + function findDoc(ts, doc, name) { + for (var n in ts.docs) { + var cur = ts.docs[n]; + if (cur.doc == doc) return cur; + } + if (!name) for (var i = 0;; ++i) { + n = "[doc" + (i || "") + "]"; + if (!ts.docs[n]) { name = n; break; } + } + return ts.addDoc(name, doc); + } + + function resolveDoc(ts, id) { + if (typeof id == "string") return ts.docs[id]; + if (id instanceof CodeMirror) id = id.getDoc(); + if (id instanceof CodeMirror.Doc) return findDoc(ts, id); + } + + function trackChange(ts, doc, change) { + var data = findDoc(ts, doc); + + var argHints = ts.cachedArgHints; + if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) <= 0) + ts.cachedArgHints = null; + + var changed = data.changed; + if (changed == null) + data.changed = changed = {from: change.from.line, to: change.from.line}; + var end = change.from.line + (change.text.length - 1); + if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end); + if (end >= changed.to) changed.to = end + 1; + if (changed.from > change.from.line) changed.from = change.from.line; + + if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() { + if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data); + }, 200); + } + + function sendDoc(ts, doc) { + ts.server.request({files: [{type: "full", name: doc.name, text: docValue(ts, doc)}]}, function(error) { + if (error) window.console.error(error); + else doc.changed = null; + }); + } + + // Completion + + function hint(ts, cm, c) { + ts.request(cm, {type: "completions", types: true, docs: true, urls: true}, function(error, data) { + if (error) return showError(ts, cm, error); + var completions = [], after = ""; + var from = data.start, to = data.end; + if (cm.getRange(Pos(from.line, from.ch - 2), from) == "[\"" && + cm.getRange(to, Pos(to.line, to.ch + 2)) != "\"]") + after = "\"]"; + + for (var i = 0; i < data.completions.length; ++i) { + var completion = data.completions[i], className = typeToIcon(completion.type); + if (data.guess) className += " " + cls + "guess"; + completions.push({text: completion.name + after, + displayText: completion.name, + className: className, + data: completion}); + } + + var obj = {from: from, to: to, list: completions}; + var tooltip = null; + CodeMirror.on(obj, "close", function() { remove(tooltip); }); + CodeMirror.on(obj, "update", function() { remove(tooltip); }); + CodeMirror.on(obj, "select", function(cur, node) { + remove(tooltip); + var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc; + if (content) { + tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, + node.getBoundingClientRect().top + window.pageYOffset, content); + tooltip.className += " " + cls + "hint-doc"; + } + }); + c(obj); + }); + } + + function typeToIcon(type) { + var suffix; + if (type == "?") suffix = "unknown"; + else if (type == "number" || type == "string" || type == "bool") suffix = type; + else if (/^fn\(/.test(type)) suffix = "fn"; + else if (/^\[/.test(type)) suffix = "array"; + else suffix = "object"; + return cls + "completion " + cls + "completion-" + suffix; + } + + // Type queries + + function showContextInfo(ts, cm, pos, queryName, c) { + ts.request(cm, queryName, function(error, data) { + if (error) return showError(ts, cm, error); + if (ts.options.typeTip) { + var tip = ts.options.typeTip(data); + } else { + var tip = elt("span", null, elt("strong", null, data.type || "not found")); + if (data.doc) + tip.appendChild(document.createTextNode(" — " + data.doc)); + if (data.url) { + tip.appendChild(document.createTextNode(" ")); + var child = tip.appendChild(elt("a", null, "[docs]")); + child.href = data.url; + child.target = "_blank"; + } + } + tempTooltip(cm, tip); + if (c) c(); + }, pos); + } + + // Maintaining argument hints + + function updateArgHints(ts, cm) { + closeArgHints(ts); + + if (cm.somethingSelected()) return; + var state = cm.getTokenAt(cm.getCursor()).state; + var inner = CodeMirror.innerMode(cm.getMode(), state); + if (inner.mode.name != "javascript") return; + var lex = inner.state.lexical; + if (lex.info != "call") return; + + var ch, argPos = lex.pos || 0, tabSize = cm.getOption("tabSize"); + for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) { + var str = cm.getLine(line), extra = 0; + for (var pos = 0;;) { + var tab = str.indexOf("\t", pos); + if (tab == -1) break; + extra += tabSize - (tab + extra) % tabSize - 1; + pos = tab + 1; + } + ch = lex.column - extra; + if (str.charAt(ch) == "(") {found = true; break;} + } + if (!found) return; + + var start = Pos(line, ch); + var cache = ts.cachedArgHints; + if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0) + return showArgHints(ts, cm, argPos); + + ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) { + if (error || !data.type || !(/^fn\(/).test(data.type)) return; + ts.cachedArgHints = { + start: pos, + type: parseFnType(data.type), + name: data.exprName || data.name || "fn", + guess: data.guess, + doc: cm.getDoc() + }; + showArgHints(ts, cm, argPos); + }); + } + + function showArgHints(ts, cm, pos) { + closeArgHints(ts); + + var cache = ts.cachedArgHints, tp = cache.type; + var tip = elt("span", cache.guess ? cls + "fhint-guess" : null, + elt("span", cls + "fname", cache.name), "("); + for (var i = 0; i < tp.args.length; ++i) { + if (i) tip.appendChild(document.createTextNode(", ")); + var arg = tp.args[i]; + tip.appendChild(elt("span", cls + "farg" + (i == pos ? " " + cls + "farg-current" : ""), arg.name || "?")); + if (arg.type != "?") { + tip.appendChild(document.createTextNode(":\u00a0")); + tip.appendChild(elt("span", cls + "type", arg.type)); + } + } + tip.appendChild(document.createTextNode(tp.rettype ? ") ->\u00a0" : ")")); + if (tp.rettype) tip.appendChild(elt("span", cls + "type", tp.rettype)); + var place = cm.cursorCoords(null, "page"); + ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip); + } + + function parseFnType(text) { + var args = [], pos = 3; + + function skipMatching(upto) { + var depth = 0, start = pos; + for (;;) { + var next = text.charAt(pos); + if (upto.test(next) && !depth) return text.slice(start, pos); + if (/[{\[\(]/.test(next)) ++depth; + else if (/[}\]\)]/.test(next)) --depth; + ++pos; + } + } + + // Parse arguments + if (text.charAt(pos) != ")") for (;;) { + var name = text.slice(pos).match(/^([^, \(\[\{]+): /); + if (name) { + pos += name[0].length; + name = name[1]; + } + args.push({name: name, type: skipMatching(/[\),]/)}); + if (text.charAt(pos) == ")") break; + pos += 2; + } + + var rettype = text.slice(pos).match(/^\) -> (.*)$/); + + return {args: args, rettype: rettype && rettype[1]}; + } + + // Moving to the definition of something + + function jumpToDef(ts, cm) { + function inner(varName) { + var req = {type: "definition", variable: varName || null}; + var doc = findDoc(ts, cm.getDoc()); + ts.server.request(buildRequest(ts, doc, req), function(error, data) { + if (error) return showError(ts, cm, error); + if (!data.file && data.url) { window.open(data.url); return; } + + if (data.file) { + var localDoc = ts.docs[data.file], found; + if (localDoc && (found = findContext(localDoc.doc, data))) { + ts.jumpStack.push({file: doc.name, + start: cm.getCursor("from"), + end: cm.getCursor("to")}); + moveTo(ts, doc, localDoc, found.start, found.end); + return; + } + } + showError(ts, cm, "Could not find a definition."); + }); + } + + if (!atInterestingExpression(cm)) + dialog(cm, "Jump to variable", function(name) { if (name) inner(name); }); + else + inner(); + } + + function jumpBack(ts, cm) { + var pos = ts.jumpStack.pop(), doc = pos && ts.docs[pos.file]; + if (!doc) return; + moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end); + } + + function moveTo(ts, curDoc, doc, start, end) { + doc.doc.setSelection(start, end); + if (curDoc != doc && ts.options.switchToDoc) { + closeArgHints(ts); + ts.options.switchToDoc(doc.name, doc.doc); + } + } + + // The {line,ch} representation of positions makes this rather awkward. + function findContext(doc, data) { + var before = data.context.slice(0, data.contextOffset).split("\n"); + var startLine = data.start.line - (before.length - 1); + var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length); + + var text = doc.getLine(startLine).slice(start.ch); + for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur) + text += "\n" + doc.getLine(cur); + if (text.slice(0, data.context.length) == data.context) return data; + + var cursor = doc.getSearchCursor(data.context, 0, false); + var nearest, nearestDist = Infinity; + while (cursor.findNext()) { + var from = cursor.from(), dist = Math.abs(from.line - start.line) * 10000; + if (!dist) dist = Math.abs(from.ch - start.ch); + if (dist < nearestDist) { nearest = from; nearestDist = dist; } + } + if (!nearest) return null; + + if (before.length == 1) + nearest.ch += before[0].length; + else + nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length); + if (data.start.line == data.end.line) + var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch)); + else + var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch); + return {start: nearest, end: end}; + } + + function atInterestingExpression(cm) { + var pos = cm.getCursor("end"), tok = cm.getTokenAt(pos); + if (tok.start < pos.ch && (tok.type == "comment" || tok.type == "string")) return false; + return /\w/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1)); + } + + // Variable renaming + + function rename(ts, cm) { + var token = cm.getTokenAt(cm.getCursor()); + if (!/\w/.test(token.string)) return showError(ts, cm, "Not at a variable"); + dialog(cm, "New name for " + token.string, function(newName) { + ts.request(cm, {type: "rename", newName: newName, fullDocs: true}, function(error, data) { + if (error) return showError(ts, cm, error); + applyChanges(ts, data.changes); + }); + }); + } + + function selectName(ts, cm) { + var name = findDoc(ts, cm.doc).name; + ts.request(cm, {type: "refs"}, function(error, data) { + if (error) return showError(ts, cm, error); + var ranges = [], cur = 0; + for (var i = 0; i < data.refs.length; i++) { + var ref = data.refs[i]; + if (ref.file == name) { + ranges.push({anchor: ref.start, head: ref.end}); + if (cmpPos(cur, ref.start) >= 0 && cmpPos(cur, ref.end) <= 0) + cur = ranges.length - 1; + } + } + cm.setSelections(ranges, cur); + }); + } + + var nextChangeOrig = 0; + function applyChanges(ts, changes) { + var perFile = Object.create(null); + for (var i = 0; i < changes.length; ++i) { + var ch = changes[i]; + (perFile[ch.file] || (perFile[ch.file] = [])).push(ch); + } + for (var file in perFile) { + var known = ts.docs[file], chs = perFile[file];; + if (!known) continue; + chs.sort(function(a, b) { return cmpPos(b.start, a.start); }); + var origin = "*rename" + (++nextChangeOrig); + for (var i = 0; i < chs.length; ++i) { + var ch = chs[i]; + known.doc.replaceRange(ch.text, ch.start, ch.end, origin); + } + } + } + + // Generic request-building helper + + function buildRequest(ts, doc, query, pos) { + var files = [], offsetLines = 0, allowFragments = !query.fullDocs; + if (!allowFragments) delete query.fullDocs; + if (typeof query == "string") query = {type: query}; + query.lineCharPositions = true; + if (query.end == null) { + query.end = pos || doc.doc.getCursor("end"); + if (doc.doc.somethingSelected()) + query.start = doc.doc.getCursor("start"); + } + var startPos = query.start || query.end; + + if (doc.changed) { + if (doc.doc.lineCount() > bigDoc && allowFragments !== false && + doc.changed.to - doc.changed.from < 100 && + doc.changed.from <= startPos.line && doc.changed.to > query.end.line) { + files.push(getFragmentAround(doc, startPos, query.end)); + query.file = "#0"; + var offsetLines = files[0].offsetLines; + if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch); + query.end = Pos(query.end.line - offsetLines, query.end.ch); + } else { + files.push({type: "full", + name: doc.name, + text: docValue(ts, doc)}); + query.file = doc.name; + doc.changed = null; + } + } else { + query.file = doc.name; + } + for (var name in ts.docs) { + var cur = ts.docs[name]; + if (cur.changed && cur != doc) { + files.push({type: "full", name: cur.name, text: docValue(ts, cur)}); + cur.changed = null; + } + } + + return {query: query, files: files}; + } + + function getFragmentAround(data, start, end) { + var doc = data.doc; + var minIndent = null, minLine = null, endLine, tabSize = 4; + for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) { + var line = doc.getLine(p), fn = line.search(/\bfunction\b/); + if (fn < 0) continue; + var indent = CodeMirror.countColumn(line, null, tabSize); + if (minIndent != null && minIndent <= indent) continue; + minIndent = indent; + minLine = p; + } + if (minLine == null) minLine = min; + var max = Math.min(doc.lastLine(), end.line + 20); + if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize)) + endLine = max; + else for (endLine = end.line + 1; endLine < max; ++endLine) { + var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize); + if (indent <= minIndent) break; + } + var from = Pos(minLine, 0); + + return {type: "part", + name: data.name, + offsetLines: from.line, + text: doc.getRange(from, Pos(endLine, 0))}; + } + + // Generic utilities + + var cmpPos = CodeMirror.cmpPos; + + function elt(tagname, cls /*, ... elts*/) { + var e = document.createElement(tagname); + if (cls) e.className = cls; + for (var i = 2; i < arguments.length; ++i) { + var elt = arguments[i]; + if (typeof elt == "string") elt = document.createTextNode(elt); + e.appendChild(elt); + } + return e; + } + + function dialog(cm, text, f) { + if (cm.openDialog) + cm.openDialog(text + ": ", f); + else + f(prompt(text, "")); + } + + // Tooltips + + function tempTooltip(cm, content) { + if (cm.state.ternTooltip) remove(cm.state.ternTooltip); + var where = cm.cursorCoords(); + var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content); + function maybeClear() { + old = true; + if (!mouseOnTip) clear(); + } + function clear() { + cm.state.ternTooltip = null; + if (!tip.parentNode) return; + cm.off("cursorActivity", clear); + cm.off('blur', clear); + cm.off('scroll', clear); + fadeOut(tip); + } + var mouseOnTip = false, old = false; + CodeMirror.on(tip, "mousemove", function() { mouseOnTip = true; }); + CodeMirror.on(tip, "mouseout", function(e) { + if (!CodeMirror.contains(tip, e.relatedTarget || e.toElement)) { + if (old) clear(); + else mouseOnTip = false; + } + }); + setTimeout(maybeClear, 1700); + cm.on("cursorActivity", clear); + cm.on('blur', clear); + cm.on('scroll', clear); + } + + function makeTooltip(x, y, content) { + var node = elt("div", cls + "tooltip", content); + node.style.left = x + "px"; + node.style.top = y + "px"; + document.body.appendChild(node); + return node; + } + + function remove(node) { + var p = node && node.parentNode; + if (p) p.removeChild(node); + } + + function fadeOut(tooltip) { + tooltip.style.opacity = "0"; + setTimeout(function() { remove(tooltip); }, 1100); + } + + function showError(ts, cm, msg) { + if (ts.options.showError) + ts.options.showError(cm, msg); + else + tempTooltip(cm, String(msg)); + } + + function closeArgHints(ts) { + if (ts.activeArgHints) { remove(ts.activeArgHints); ts.activeArgHints = null; } + } + + function docValue(ts, doc) { + var val = doc.doc.getValue(); + if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc); + return val; + } + + // Worker wrapper + + function WorkerServer(ts) { + var worker = ts.worker = new Worker(ts.options.workerScript); + worker.postMessage({type: "init", + defs: ts.options.defs, + plugins: ts.options.plugins, + scripts: ts.options.workerDeps}); + var msgId = 0, pending = {}; + + function send(data, c) { + if (c) { + data.id = ++msgId; + pending[msgId] = c; + } + worker.postMessage(data); + } + worker.onmessage = function(e) { + var data = e.data; + if (data.type == "getFile") { + getFile(ts, data.name, function(err, text) { + send({type: "getFile", err: String(err), text: text, id: data.id}); + }); + } else if (data.type == "debug") { + window.console.log(data.message); + } else if (data.id && pending[data.id]) { + pending[data.id](data.err, data.body); + delete pending[data.id]; + } + }; + worker.onerror = function(e) { + for (var id in pending) pending[id](e); + pending = {}; + }; + + this.addFile = function(name, text) { send({type: "add", name: name, text: text}); }; + this.delFile = function(name) { send({type: "del", name: name}); }; + this.request = function(body, c) { send({type: "req", body: body}, c); }; + } +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/worker.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/worker.js new file mode 100644 index 0000000..71ed025 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/tern/worker.js @@ -0,0 +1,51 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// declare global: tern, server +/** + * Tern 服务 Worker 端(后台线程处理 Tern 分析任务) + * 功能:在 Web Worker 中运行 Tern 引擎,接收主线程指令(初始化、文件操作、分析请求), + * 处理后返回结果,避免阻塞主线程 + */ +var server; +/** + * 监听主线程消息(处理各类指令) + * @param {Event} e - 消息事件对象(e.data 为指令数据) + */ +this.onmessage = function(e) { + var data = e.data; + switch (data.type) { + case "init": return startServer(data.defs, data.plugins, data.scripts); + case "add": return server.addFile(data.name, data.text); + case "del": return server.delFile(data.name); + case "req": return server.request(data.body, function(err, reqData) { + postMessage({id: data.id, body: reqData, err: err && String(err)}); + }); + case "getFile": + var c = pending[data.id]; + delete pending[data.id]; + return c(data.err, data.text); + default: throw new Error("Unknown message type: " + data.type); + } +}; + +var nextId = 0, pending = {}; +function getFile(file, c) { + postMessage({type: "getFile", name: file, id: ++nextId}); + pending[nextId] = c; +} + +function startServer(defs, plugins, scripts) { + if (scripts) importScripts.apply(null, scripts); + + server = new tern.Server({ + getFile: getFile, + async: true, + defs: defs, + plugins: plugins + }); +} + +var console = { + log: function(v) { postMessage({type: "debug", message: v}); } +}; diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addon/wrap/hardwrap.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/wrap/hardwrap.js new file mode 100644 index 0000000..0edcb8d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addon/wrap/hardwrap.js @@ -0,0 +1,151 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +/** + * CodeMirror 文本换行扩展 + * 功能:实现段落自动换行、选中区域换行、自定义换行规则,支持按指定宽度拆分文本 + * 用途:格式化长文本(如文档、注释),使其在指定宽度内自动换行,提升可读性 + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var Pos = CodeMirror.Pos; + /** + * 查找光标所在段落的范围(从段落起始行到结束行) + * @param {CodeMirror} cm - 编辑器实例 + * @param {Object} pos - 光标位置(Pos 对象) + * @param {Object} options - 配置项: + * - paragraphStart: 段落起始行匹配正则(如标题行) + * - paragraphEnd: 段落结束行匹配正则 + * @return {Object} 段落范围({from: 起始行, to: 结束行}) + */ + function findParagraph(cm, pos, options) { + var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart"); + for (var start = pos.line, first = cm.firstLine(); start > first; --start) { + var line = cm.getLine(start); + if (startRE && startRE.test(line)) break; + if (!/\S/.test(line)) { ++start; break; } + } + var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd"); + for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) { + var line = cm.getLine(end); + if (endRE && endRE.test(line)) { ++end; break; } + if (!/\S/.test(line)) break; + } + return {from: start, to: end}; + } + + function findBreakPoint(text, column, wrapOn, killTrailingSpace) { + for (var at = column; at > 0; --at) + if (wrapOn.test(text.slice(at - 1, at + 1))) break; + if (at == 0) at = column; + var endOfText = at; + if (killTrailingSpace) + while (text.charAt(endOfText - 1) == " ") --endOfText; + return {from: endOfText, to: at}; + } + + function wrapRange(cm, from, to, options) { + from = cm.clipPos(from); to = cm.clipPos(to); + var column = options.column || 80; + var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/; + var killTrailing = options.killTrailingSpace !== false; + var changes = [], curLine = "", curNo = from.line; + var lines = cm.getRange(from, to, false); + if (!lines.length) return null; + var leadingSpace = lines[0].match(/^[ \t]*/)[0]; + + for (var i = 0; i < lines.length; ++i) { + var text = lines[i], oldLen = curLine.length, spaceInserted = 0; + if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) { + curLine += " "; + spaceInserted = 1; + } + var spaceTrimmed = ""; + if (i) { + spaceTrimmed = text.match(/^\s*/)[0]; + text = text.slice(spaceTrimmed.length); + } + curLine += text; + if (i) { + var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed && + findBreakPoint(curLine, column, wrapOn, killTrailing); + // If this isn't broken, or is broken at a different point, remove old break + if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) { + changes.push({text: [spaceInserted ? " " : ""], + from: Pos(curNo, oldLen), + to: Pos(curNo + 1, spaceTrimmed.length)}); + } else { + curLine = leadingSpace + text; + ++curNo; + } + } + while (curLine.length > column) { + var bp = findBreakPoint(curLine, column, wrapOn, killTrailing); + changes.push({text: ["", leadingSpace], + from: Pos(curNo, bp.from), + to: Pos(curNo, bp.to)}); + curLine = leadingSpace + curLine.slice(bp.to); + ++curNo; + } + } + if (changes.length) cm.operation(function() { + for (var i = 0; i < changes.length; ++i) { + var change = changes[i]; + cm.replaceRange(change.text, change.from, change.to); + } + }); + return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null; + } + + CodeMirror.defineExtension("wrapParagraph", function(pos, options) { + options = options || {}; + if (!pos) pos = this.getCursor(); + var para = findParagraph(this, pos, options); + return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options); + }); + + CodeMirror.commands.wrapLines = function(cm) { + cm.operation(function() { + var ranges = cm.listSelections(), at = cm.lastLine() + 1; + for (var i = ranges.length - 1; i >= 0; i--) { + var range = ranges[i], span; + if (range.empty()) { + var para = findParagraph(cm, range.head, {}); + span = {from: Pos(para.from, 0), to: Pos(para.to - 1)}; + } else { + span = {from: range.from(), to: range.to()}; + } + if (span.to.line >= at) continue; + at = span.from.line; + wrapRange(cm, span.from, span.to, {}); + } + }); + }; + + CodeMirror.defineExtension("wrapRange", function(from, to, options) { + return wrapRange(this, from, to, options || {}); + }); + + CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) { + options = options || {}; + var cm = this, paras = []; + for (var line = from.line; line <= to.line;) { + var para = findParagraph(cm, Pos(line, 0), options); + paras.push(para); + line = para.to; + } + var madeChange = false; + if (paras.length) cm.operation(function() { + for (var i = paras.length - 1; i >= 0; --i) + madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options); + }); + return madeChange; + }); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/addons.min.js b/src/collectedstatic/mdeditor/js/lib/codemirror/addons.min.js new file mode 100644 index 0000000..5d98e6c --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/addons.min.js @@ -0,0 +1,4 @@ +/*! Editor.md v1.5.0 | addons.min.js | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 */ +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){e.defineOption("showTrailingSpace",!1,function(t, i, o){o==e.Init&&(o=!1),o&&!i?t.removeOverlay("trailingspace"):!o&&i&&t.addOverlay({token:function(e){for(var t=e.string.length,i=t; i&&/\s/.test(e.string.charAt(i-1)); --i);return i>e.pos?(e.pos=i,null):(e.pos=t,"trailingspace")},name:"trailingspace"})})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){function t(e, t, i){var o,r=e.getWrapperElement();return o=r.appendChild(document.createElement("div")),i?o.className="CodeMirror-dialog CodeMirror-dialog-bottom":o.className="CodeMirror-dialog CodeMirror-dialog-top","string"==typeof t?o.innerHTML=t:o.appendChild(t),o}function i(e, t){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=t}e.defineExtension("openDialog",function(o, r, n){function a(e){if("string"==typeof e)h.value=e;else{if(c)return;c=!0,l.parentNode.removeChild(l),d.focus(),n.onClose&&n.onClose(l)}}n||(n={}),i(this,null);var s,l=t(this,o,n.bottom),c=!1,d=this,h=l.getElementsByTagName("input")[0];return h?(n.value&&(h.value=n.value,h.select()),n.onInput&&e.on(h,"input",function(e){n.onInput(e,h.value,a)}),n.onKeyUp&&e.on(h,"keyup",function(e){n.onKeyUp(e,h.value,a)}),e.on(h,"keydown",function(t){n&&n.onKeyDown&&n.onKeyDown(t,h.value,a)||((27==t.keyCode||n.closeOnEnter!==!1&&13==t.keyCode)&&(h.blur(),e.e_stop(t),a()),13==t.keyCode&&r(h.value,t))}),n.closeOnBlur!==!1&&e.on(h,"blur",a),h.focus()):(s=l.getElementsByTagName("button")[0])&&(e.on(s,"click",function(){a(),d.focus()}),n.closeOnBlur!==!1&&e.on(s,"blur",a),s.focus()),a}),e.defineExtension("openConfirm",function(o,r,n){function a(){c||(c=!0,s.parentNode.removeChild(s),d.focus())}i(this,null);var s=t(this,o,n&&n.bottom),l=s.getElementsByTagName("button"),c=!1,d=this,h=1;l[0].focus();for(var u=0; u=h&&a()},200)}),e.on(f,"focus",function(){++h})}}),e.defineExtension("openNotification",function(o, r){function n(){l||(l=!0,clearTimeout(a),s.parentNode.removeChild(s))}i(this,n);var a,s=t(this,o,r&&r.bottom),l=!1,c=r&&"undefined"!=typeof r.duration?r.duration:5e3;return e.on(s,"click",function(t){e.e_preventDefault(t),n()}),c&&(a=setTimeout(n,c)),n})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e, t, r, n){if(this.atOccurrence=!1,this.doc=e,null==n&&"string"==typeof t&&(n=!1),r=r?e.clipPos(r):o(0,0),this.pos={from:r,to:r},"string"!=typeof t)t.global||(t=new RegExp(t.source,t.ignoreCase?"ig":"g")),this.matches=function(i, r){if(i){t.lastIndex=0;for(var n,a,s=e.getLine(r.line).slice(0,r.ch),l=0;;){t.lastIndex=l;var c=t.exec(s);if(!c)break;if(n=c,a=n.index,l=n.index+(n[0].length||1),l==s.length)break}var d=n&&n[0].length||0;d||(0==a&&0==s.length?n=void 0:a!=e.getLine(r.line).length&&d++)}else{t.lastIndex=r.ch;var s=e.getLine(r.line),n=t.exec(s),d=n&&n[0].length||0,a=n&&n.index;a+d==s.length||d||(d=1)}return n&&d?{from:o(r.line,a),to:o(r.line,a+d),match:n}:void 0};else{var a=t;n&&(t=t.toLowerCase());var s=n?function(e){return e.toLowerCase()}:function(e){return e},l=t.split("\n");if(1==l.length)t.length?this.matches=function(r,n){if(r){var l=e.getLine(n.line).slice(0,n.ch),c=s(l),d=c.lastIndexOf(t);if(d>-1)return d=i(l,c,d),{from:o(n.line,d),to:o(n.line,d+a.length)}}else{var l=e.getLine(n.line).slice(n.ch),c=s(l),d=c.indexOf(t);if(d>-1)return d=i(l,c,d)+n.ch,{from:o(n.line,d),to:o(n.line,d+a.length)}}}:this.matches=function(){};else{var c=a.split("\n");this.matches=function(t,i){var r=l.length-1;if(t){if(i.line-(l.length-1)=1;--d,--a)if(l[d]!=s(e.getLine(a)))return;var h=e.getLine(a),u=h.length-c[0].length;if(s(h.slice(u))!=l[0])return;return{from:o(a,u),to:n}}if(!(i.line+(l.length-1)>e.lastLine())){var h=e.getLine(i.line),u=h.length-c[0].length;if(s(h.slice(u))==l[0]){for(var f=o(i.line,u),a=i.line+1,d=1;r>d;++d,++a)if(l[d]!=s(e.getLine(a)))return;if(s(e.getLine(a).slice(0,c[r].length))==l[r])return{from:f,to:o(a,c[r].length)}}}}}}}function i(e,t,i){if(e.length==t.length)return i;for(var o=Math.min(i,e.length);;){var r=e.slice(0,o).toLowerCase().length;if(i>r)++o;else{if(!(r>i))return o;--o}}}var o=e.Pos;t.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(e){function t(e){var t=o(e,0);return i.pos={from:t,to:t},i.atOccurrence=!1,!1}for(var i=this,r=this.doc.clipPos(e?this.pos.from:this.pos.to);;){if(this.pos=this.matches(e,r))return this.atOccurrence=!0,this.pos.match||!0;if(e){if(!r.line)return t(0);r=o(r.line-1,this.doc.getLine(r.line-1).length)}else{var n=this.doc.lineCount();if(r.line==n-1)return t(n);r=o(r.line+1,0)}}},from:function(){return this.atOccurrence?this.pos.from:void 0},to:function(){return this.atOccurrence?this.pos.to:void 0},replace:function(t){if(this.atOccurrence){var i=e.splitLines(t);this.doc.replaceRange(i,this.pos.from,this.pos.to),this.pos.to=o(this.pos.from.line+i.length-1,i[i.length-1].length+(1==i.length?this.pos.from.ch:0))}}},e.defineExtension("getSearchCursor",function(e, i, o){return new t(this.doc,e,i,o)}),e.defineDocExtension("getSearchCursor",function(e, i, o){return new t(this,e,i,o)}),e.defineExtension("selectMatches",function(t, i){for(var o,r=[],n=this.getSearchCursor(t,this.getCursor("from"),i); (o=n.findNext())&&!(e.cmpPos(n.to(),this.getCursor("to"))>0);)r.push({anchor:n.from(),head:n.to()});r.length&&this.setSelections(r,0)})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("./searchcursor"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["./lib/codemirror","./searchcursor","../dialog/dialog"],e):e(CodeMirror)}(function(e){"use strict";function t(e, t){return"string"==typeof e?e=new RegExp(e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),t?"gi":"g"):e.global||(e=new RegExp(e.source,e.ignoreCase?"gi":"g")),{token:function(t){e.lastIndex=t.pos;var i=e.exec(t.string);return i&&i.index==t.pos?(t.pos+=i[0].length,"searching"):void(i?t.pos=i.index:t.skipToEnd())}}}function i(){this.posFrom=this.posTo=this.query=null,this.overlay=null}function o(e){return e.state.search||(e.state.search=new i)}function r(e){return"string"==typeof e&&e==e.toLowerCase()}function n(e,t,i){return e.getSearchCursor(t,i,r(t))}function a(e,t,i,o,r){e.openDialog?e.openDialog(t,r,{value:o}):r(prompt(i,o))}function s(e,t,i,o){e.openConfirm?e.openConfirm(t,o):confirm(i)&&o[0]()}function l(e){var t=e.match(/^\/(.*)\/([a-z]*)$/);if(t)try{e=new RegExp(t[1],-1==t[2].indexOf("i")?"":"i")}catch(i){}return("string"==typeof e?""==e:e.test(""))&&(e=/x^/),e}function c(e,i){var n=o(e);return n.query?d(e,i):void a(e,f,"Search for:",e.getSelection(),function(o){e.operation(function(){o&&!n.query&&(n.query=l(o),e.removeOverlay(n.overlay,r(n.query)),n.overlay=t(n.query,r(n.query)),e.addOverlay(n.overlay),e.showMatchesOnScrollbar&&(n.annotate&&(n.annotate.clear(),n.annotate=null),n.annotate=e.showMatchesOnScrollbar(n.query,r(n.query))),n.posFrom=n.posTo=e.getCursor(),d(e,i))})})}function d(t,i){t.operation(function(){var r=o(t),a=n(t,r.query,i?r.posFrom:r.posTo);(a.find(i)||(a=n(t,r.query,i?e.Pos(t.lastLine()):e.Pos(t.firstLine(),0)),a.find(i)))&&(t.setSelection(a.from(),a.to()),t.scrollIntoView({from:a.from(),to:a.to()}),r.posFrom=a.from(),r.posTo=a.to())})}function h(e){e.operation(function(){var t=o(e);t.query&&(t.query=null,e.removeOverlay(t.overlay),t.annotate&&(t.annotate.clear(),t.annotate=null))})}function u(e,t){e.getOption("readOnly")||a(e,g,"Replace:",e.getSelection(),function(i){i&&(i=l(i),a(e,p,"Replace with:","",function(o){if(t)e.operation(function(){for(var t=n(e,i);t.findNext();)if("string"!=typeof i){var r=e.getRange(t.from(),t.to()).match(i);t.replace(o.replace(/\$(\d)/g,function(e,t){return r[t]}))}else t.replace(o)});else{h(e);var r=n(e,i,e.getCursor()),a=function(){var t,o=r.from();!(t=r.findNext())&&(r=n(e,i),!(t=r.findNext())||o&&r.from().line==o.line&&r.from().ch==o.ch)||(e.setSelection(r.from(),r.to()),e.scrollIntoView({from:r.from(),to:r.to()}),s(e,m,"Replace?",[function(){l(t)},a]))},l=function(e){r.replace("string"==typeof i?o:o.replace(/\$(\d)/g,function(t,i){return e[i]})),a()};a()}}))})}var f='Search: (Use /re/ syntax for regexp search)',g='Replace: (Use /re/ syntax for regexp search)',p='With: ',m="Replace? ";e.commands.find=function(e){h(e),c(e)},e.commands.findNext=c,e.commands.findPrev=function(e){c(e,!0)},e.commands.clearSearch=h,e.commands.replace=u,e.commands.replaceAll=function(e){u(e,!0)}}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e, t){function i(e){clearTimeout(o.doRedraw),o.doRedraw=setTimeout(function(){o.redraw()},e)}this.cm=e,this.options=t,this.buttonHeight=t.scrollButtonHeight||e.getOption("scrollButtonHeight"),this.annotations=[],this.doRedraw=this.doUpdate=null,this.div=e.getWrapperElement().appendChild(document.createElement("div")),this.div.style.cssText="position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none",this.computeScale();var o=this;e.on("refresh",this.resizeHandler=function(){clearTimeout(o.doUpdate),o.doUpdate=setTimeout(function(){o.computeScale()&&i(20)},100)}),e.on("markerAdded",this.resizeHandler),e.on("markerCleared",this.resizeHandler),t.listenForChanges!==!1&&e.on("change",this.changeHandler=function(){i(250)})}e.defineExtension("annotateScrollbar",function(e){return"string"==typeof e&&(e={className:e}),new t(this,e)}),e.defineOption("scrollButtonHeight",0),t.prototype.computeScale=function(){var e=this.cm,t=(e.getWrapperElement().clientHeight-e.display.barHeight-2*this.buttonHeight)/e.heightAtLine(e.lastLine()+1,"local");return t!=this.hScale?(this.hScale=t,!0):void 0},t.prototype.update=function(e){this.annotations=e,this.redraw()},t.prototype.redraw=function(e){e!==!1&&this.computeScale();var t=this.cm,i=this.hScale,o=document.createDocumentFragment(),r=this.annotations;if(t.display.barWidth)for(var n,a=0; ac+.9));)s=r[++a],c=t.charCoords(s.to,"local").bottom*i;if(c!=l){var d=Math.max(c-l,3),h=o.appendChild(document.createElement("div"));h.style.cssText="position: absolute; right: 0px; width: "+Math.max(t.display.barWidth-1,2)+"px; top: "+(l+this.buttonHeight)+"px; height: "+d+"px",h.className=this.options.className}}this.div.textContent="",this.div.appendChild(o)},t.prototype.clear=function(){this.cm.off("refresh",this.resizeHandler),this.cm.off("markerAdded",this.resizeHandler),this.cm.off("markerCleared",this.resizeHandler),this.changeHandler&&this.cm.off("change",this.changeHandler),this.div.parentNode.removeChild(this.div)}}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("./searchcursor"),require("../scroll/annotatescrollbar")):"function"==typeof define&&define.amd?define(["./lib/codemirror","./searchcursor","../scroll/annotatescrollbar"],e):e(CodeMirror)}(function(e){"use strict";function t(e, t, i, o){this.cm=e;var r={listenForChanges:!1};for(var n in o)r[n]=o[n];r.className||(r.className="CodeMirror-search-match"),this.annotation=e.annotateScrollbar(r),this.query=t,this.caseFold=i,this.gap={from:e.firstLine(),to:e.lastLine()+1},this.matches=[],this.update=null,this.findMatches(),this.annotation.update(this.matches);var a=this;e.on("change",this.changeHandler=function(e, t){a.onChange(t)})}function i(e,t,i){return t>=e?e:Math.max(t,e+i)}e.defineExtension("showMatchesOnScrollbar",function(e,i,o){return"string"==typeof o&&(o={className:o}),o||(o={}),new t(this,e,i,o)});var o=1e3;t.prototype.findMatches=function(){if(this.gap){for(var t=0;t=this.gap.to)break;i.to.line>=this.gap.from&&this.matches.splice(t--,1)}for(var r=this.cm.getSearchCursor(this.query,e.Pos(this.gap.from,0),this.caseFold);r.findNext();){var i={from:r.from(),to:r.to()};if(i.from.line>=this.gap.to)break;if(this.matches.splice(t++,0,i),this.matches.length>o)break}this.gap=null}},t.prototype.onChange=function(t){var o=t.from.line,r=e.changeEnd(t).line,n=r-t.to.line;if(this.gap?(this.gap.from=Math.min(i(this.gap.from,o,n),t.from.line),this.gap.to=Math.max(i(this.gap.to,o,n),t.from.line)):this.gap={from:t.from.line,to:r+1},n)for(var a=0; ac.ch&&(v=v.slice(0,v.length-d.end+c.ch));var w=v.toLowerCase();if(!v||"string"==d.type&&(d.end!=c.ch||!/[\"\']/.test(d.string.charAt(d.string.length-1))||1==d.string.length)||"tag"==d.type&&"closeTag"==u.type||d.string.indexOf("/")==d.string.length-1||p&&r(p,w)>-1||n(t,v,c,u,!0))return e.Pass;var b=m&&r(m,w)>-1;o[l]={indent:b,text:">"+(b?"\n\n":"")+"",newPos:b?e.Pos(c.line+1,0):e.Pos(c.line,c.ch+1)}}for(var l=i.length-1;l>=0;l--){var y=o[l];t.replaceRange(y.text,i[l].head,i[l].anchor,"+insert");var k=t.listSelections().slice(0);k[l]={head:y.newPos,anchor:y.newPos},t.setSelections(k),y.indent&&(t.indentLine(y.newPos.line,null,!0),t.indentLine(y.newPos.line+1,null,!0))}}function i(t,i){for(var o=t.listSelections(),r=[],a=i?"/":"";else{if("htmlmixed"!=t.getMode().name||"css"!=d.mode.name)return e.Pass;r[s]=a+"style>"}else{if(!h.context||!h.context.tagName||n(t,h.context.tagName,l,h))return e.Pass;r[s]=a+h.context.tagName+">"}}t.replaceSelections(r),o=t.listSelections();for(var s=0;si;++i)if(e[i]==t)return i;return-1}function n(t,i,o,r,n){if(!e.scanForClosingTag)return!1;var a=Math.min(t.lastLine()+1,o.line+500),s=e.scanForClosingTag(t,o,null,a);if(!s||s.tag!=i)return!1;for(var l=r.context,c=n?1:0;l&&l.tagName==i;l=l.prev)++c;o=s.to;for(var d=1;c>d;d++){var h=e.scanForClosingTag(t,o,null,a);if(!h||h.tag!=i)return!1;o=h.to}return!0}e.defineOption("autoCloseTags",!1,function(i,r,n){if(n!=e.Init&&n&&i.removeKeyMap("autoCloseTags"),r){var a={name:"autoCloseTags"};("object"!=typeof r||r.whenClosing)&&(a["'/'"]=function(e){return o(e)}),("object"!=typeof r||r.whenOpening)&&(a["'>'"]=function(e){return t(e)}),i.addKeyMap(a)}});var a=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],s=["applet","blockquote","body","button","div","dl","fieldset","form","frameset","h1","h2","h3","h4","h5","h6","head","html","iframe","layer","legend","object","ol","p","select","table","ul"];e.commands.closeTag=function(e){return i(e)}}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(t, r, n, a){function s(e){var i=l(t,r);if(!i||i.to.line-i.from.linet.firstLine();)r=e.Pos(r.line-1,0),d=s(!1);if(d&&!d.cleared&&"unfold"!==a){var h=i(t,n);e.on(h,"mousedown",function(t){u.clear(),e.e_preventDefault(t)});var u=t.markText(d.from,d.to,{replacedWith:h,clearOnEnter:!0,__isFold:!0});u.on("clear",function(i,o){e.signal(t,"unfold",t,i,o)}),e.signal(t,"fold",t,d.from,d.to)}}function i(e,t){var i=o(e,t,"widget");if("string"==typeof i){var r=document.createTextNode(i);i=document.createElement("span"),i.appendChild(r),i.className="CodeMirror-foldmarker"}return i}function o(e,t,i){if(t&&void 0!==t[i])return t[i];var o=e.options.foldOptions;return o&&void 0!==o[i]?o[i]:r[i]}e.newFoldFunction=function(e,i){return function(o,r){t(o,r,{rangeFinder:e,widget:i})}},e.defineExtension("foldCode",function(e,i,o){t(this,e,i,o)}),e.defineExtension("isFolded",function(e){for(var t=this.findMarksAt(e),i=0;i=i;i++)t.foldCode(e.Pos(i,0),null,"fold")})},e.commands.unfoldAll=function(t){t.operation(function(){for(var i=t.firstLine(),o=t.lastLine();o>=i;i++)t.foldCode(e.Pos(i,0),null,"unfold")})},e.registerHelper("fold","combine",function(){var e=Array.prototype.slice.call(arguments,0);return function(t, i){for(var o=0; o=s&&(i=r(n.indicatorOpen))}e.setGutterMarker(t,n.gutter,i),++a})}function a(e){var t=e.getViewport(),i=e.state.foldGutter;i&&(e.operation(function(){n(e,t.from,t.to)}),i.from=t.from,i.to=t.to)}function s(e,t,i){var o=e.state.foldGutter;if(o){var r=o.options;i==r.gutter&&e.foldCode(h(t,0),r.rangeFinder)}}function l(e){var t=e.state.foldGutter;if(t){var i=t.options;t.from=t.to=0,clearTimeout(t.changeUpdate),t.changeUpdate=setTimeout(function(){a(e)},i.foldOnChangeTimeSpan||600)}}function c(e){var t=e.state.foldGutter;if(t){var i=t.options;clearTimeout(t.changeUpdate),t.changeUpdate=setTimeout(function(){var i=e.getViewport();t.from==t.to||i.from-t.to>20||t.from-i.to>20?a(e):e.operation(function(){i.fromt.to&&(n(e,t.to,i.to),t.to=i.to)})},i.updateViewportTimeSpan||400)}}function d(e,t){var i=e.state.foldGutter;if(i){var o=t.line;o>=i.from&&o=l; ++l){var d=t.getLine(l),h=n(d);if(h>a)s=l;else if(/\S/.test(d))break}return s?{from:e.Pos(i.line,r.length),to:e.Pos(s,t.getLine(s).length)}:void 0}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.registerHelper("fold","brace",function(t, i){function o(o){for(var r=i.ch,l=0;;){var c=0>=r?-1:s.lastIndexOf(o,r-1);if(-1!=c){if(1==l&&c=g; ++g)for(var p=t.getLine(g),m=g==a?r:0;;){var v=p.indexOf(l,m),w=p.indexOf(c,m);if(0>v&&(v=p.length),0>w&&(w=p.length),m=Math.min(v,w),m==p.length)break;if(t.getTokenTypeAt(e.Pos(g,m+1))==n)if(m==v)++u;else if(!--u){d=g,h=m;break e}++m}if(null!=d&&(a!=d||h!=r))return{from:e.Pos(a,r),to:e.Pos(d,h)}}}),e.registerHelper("fold","import",function(t,i){function o(i){if(it.lastLine())return null;var o=t.getTokenAt(e.Pos(i,1));if(/\S/.test(o.string)||(o=t.getTokenAt(e.Pos(i,o.end+1))),"keyword"!=o.type||"import"!=o.string)return null;for(var r=i,n=Math.min(t.lastLine(),i+10);n>=r;++r){var a=t.getLine(r),s=a.indexOf(";");if(-1!=s)return{startCh:o.end,end:e.Pos(r,s)}}}var r,i=i.line,n=o(i);if(!n||o(i-1)||(r=o(i-2))&&r.end.line==i-1)return null;for(var a=n.end;;){var s=o(a.line+1);if(null==s)break;a=s.end}return{from:t.clipPos(e.Pos(i,n.startCh+1)),to:a}}),e.registerHelper("fold","include",function(t, i){function o(i){if(it.lastLine())return null;var o=t.getTokenAt(e.Pos(i,1));return/\S/.test(o.string)||(o=t.getTokenAt(e.Pos(i,o.end+1))),"meta"==o.type&&"#include"==o.string.slice(0,8)?o.start+8:void 0}var i=i.line,r=o(i);if(null==r||null!=o(i-1))return null;for(var n=i;;){var a=o(n+1);if(null==a)break;++n}return{from:e.Pos(i,r+1),to:t.clipPos(e.Pos(n))}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e, t){return e.line-t.line||e.ch-t.ch}function i(e, t, i, o){this.line=t,this.ch=i,this.cm=e,this.text=e.getLine(t),this.min=o?o.from:e.firstLine(),this.max=o?o.to-1:e.lastLine()}function o(e, t){var i=e.cm.getTokenTypeAt(u(e.line,t));return i&&/\btag\b/.test(i)}function r(e){return e.line>=e.max?void 0:(e.ch=0,e.text=e.cm.getLine(++e.line),!0)}function n(e){return e.line<=e.min?void 0:(e.text=e.cm.getLine(--e.line),e.ch=e.text.length,!0)}function a(e){for(;;){var t=e.text.indexOf(">",e.ch);if(-1==t){if(r(e))continue;return}{if(o(e,t+1)){var i=e.text.lastIndexOf("/",t),n=i>-1&&!/\S/.test(e.text.slice(i+1,t));return e.ch=t+1,n?"selfClose":"regular"}e.ch=t+1}}}function s(e){for(;;){var t=e.ch?e.text.lastIndexOf("<",e.ch-1):-1;if(-1==t){if(n(e))continue;return}if(o(e,t+1)){p.lastIndex=t,e.ch=t;var i=p.exec(e.text);if(i&&i.index==t)return i}else e.ch=t}}function l(e){for(;;){p.lastIndex=e.ch;var t=p.exec(e.text);if(!t){if(r(e))continue;return}{if(o(e,t.index+1))return e.ch=t.index+t[0].length,t;e.ch=t.index+1}}}function c(e){for(;;){var t=e.ch?e.text.lastIndexOf(">",e.ch-1):-1;if(-1==t){if(n(e))continue;return}{if(o(e,t+1)){var i=e.text.lastIndexOf("/",t),r=i>-1&&!/\S/.test(e.text.slice(i+1,t));return e.ch=t+1,r?"selfClose":"regular"}e.ch=t}}}function d(e,t){for(var i=[];;){var o,r=l(e),n=e.line,s=e.ch-(r?r[0].length:0);if(!r||!(o=a(e)))return;if("selfClose"!=o)if(r[1]){for(var c=i.length-1;c>=0;--c)if(i[c]==r[2]){i.length=c;break}if(0>c&&(!t||t==r[2]))return{tag:r[2],from:u(n,s),to:u(e.line,e.ch)}}else i.push(r[2])}}function h(e,t){for(var i=[];;){var o=c(e);if(!o)return;if("selfClose"!=o){var r=e.line,n=e.ch,a=s(e);if(!a)return;if(a[1])i.push(a[2]);else{for(var l=i.length-1;l>=0;--l)if(i[l]==a[2]){i.length=l;break}if(0>l&&(!t||t==a[2]))return{tag:a[2],from:u(e.line,e.ch),to:u(r,n)}}}else s(e)}}var u=e.Pos,f="A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",g=f+"-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",p=new RegExp("<(/?)(["+f+"]["+g+"]*)","g");e.registerHelper("fold","xml",function(e,t){for(var o=new i(e,t.line,0);;){var r,n=l(o);if(!n||o.line!=t.line||!(r=a(o)))return;if(!n[1]&&"selfClose"!=r){var t=u(o.line,o.ch),s=d(o,n[2]);return s&&{from:t,to:s.from}}}}),e.findMatchingTag=function(e,o,r){var n=new i(e,o.line,o.ch,r);if(-1!=n.text.indexOf(">")||-1!=n.text.indexOf("<")){var l=a(n),c=l&&u(n.line,n.ch),f=l&&s(n);if(l&&f&&!(t(n,o)>0)){var g={from:u(n.line,n.ch),to:c,tag:f[2]};return"selfClose"==l?{open:g,close:null,at:"open"}:f[1]?{open:h(n,f[2]),close:g,at:"close"}:(n=new i(e,c.line,c.ch,r),{open:g,close:d(n,f[2]),at:"open"})}}},e.findEnclosingTag=function(e, t, o){for(var r=new i(e,t.line,t.ch,o);;){var n=h(r);if(!n)break;var a=new i(e,t.line,t.ch,o),s=d(a,n.tag);if(s)return{open:n,close:s}}},e.scanForClosingTag=function(e, t, o, r){var n=new i(e,t.line,t.ch,r?{from:0,to:r}:null);return d(n,o)}}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.registerHelper("fold","markdown",function(t, i){function o(i){var o=t.getTokenTypeAt(e.Pos(i,0));return o&&/\bheader\b/.test(o)}function r(e, t, i){var r=t&&t.match(/^#+/);return r&&o(e)?r[0].length:(r=i&&i.match(/^[=\-]+\s*$/),r&&o(e+1)?"="==i[0]?1:2:n)}var n=100,a=t.getLine(i.line),s=t.getLine(i.line+1),l=r(i.line,a,s);if(l===n)return void 0;for(var c=t.lastLine(),d=i.line,h=t.getLine(d+2); c>d&&!(r(d+1,s,h)<=l);)++d,s=h,h=t.getLine(d+2);return{from:e.Pos(i.line,a.length),to:e.Pos(d,t.getLine(d).length)}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.registerGlobalHelper("fold","comment",function(e){return e.blockCommentStart&&e.blockCommentEnd},function(t, i){var o=t.getModeAt(i),r=o.blockCommentStart,n=o.blockCommentEnd;if(r&&n){for(var a,s=i.line,l=t.getLine(s),c=i.ch,d=0;;){var h=0>=c?-1:l.lastIndexOf(r,c-1);if(-1!=h){if(1==d&&h=m; ++m)for(var v=t.getLine(m),w=m==s?a:0;;){var b=v.indexOf(r,w),y=v.indexOf(n,w);if(0>b&&(b=v.length),0>y&&(y=v.length),w=Math.min(b,y),w==v.length)break;if(w==b)++g;else if(!--g){u=m,f=w;break e}++w}if(null!=u&&(s!=u||f!=a))return{from:e.Pos(s,a),to:e.Pos(u,f)}}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.overlayMode=function(t, i, o){return{startState:function(){return{base:e.startState(t),overlay:e.startState(i),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(o){return{base:e.copyState(t,o.base),overlay:e.copyState(i,o.overlay),basePos:o.basePos,baseCur:null,overlayPos:o.overlayPos,overlayCur:null}},token:function(e, r){return(e!=r.streamSeen||Math.min(r.basePos,r.overlayPos)=i.ch+1)return/\bstring2?\b/.test(s);a.start=a.pos}}function o(o, r){for(var n={name:"autoCloseBrackets",Backspace:function(i){if(i.getOption("disableInput"))return e.Pass;for(var r=i.listSelections(),n=0;n=0;n--){var s=r[n].head;i.replaceRange("",c(s.line,s.ch-1),c(s.line,s.ch+1))}}},a="",s=0; s1&&r.indexOf(t)>=0&&n.getRange(c(p.line,p.ch-2),p)==t+t&&(p.ch<=2||n.getRange(c(p.line,p.ch-3),c(p.line,p.ch-2))!=t))f="addFour";else if('"'==t||"'"==t){if(e.isWordChar(d)||!i(n,p,t))return e.Pass;f="both"}else{if(!(n.getLine(p.line).length==p.ch||a.indexOf(d)>=0||l.test(d)))return e.Pass;f="both"}else f="surround";if(s){if(s!=f)return e.Pass}else s=f}n.operation(function(){if("skip"==s)n.execCommand("goCharRight");else if("skipThree"==s)for(var e=0;3>e;e++)n.execCommand("goCharRight");else if("surround"==s){for(var i=n.getSelections(),e=0;es&&e.addOverlay(t.overlay=a(n.slice(s,l),i,t.style)))}var c=e.getCursor("from"),d=e.getCursor("to");if(c.line==d.line&&(!t.wordsOnly||r(e,c,d))){var h=e.getRange(c,d).replace(/^\s+|\s+$/g,"");h.length>=t.minChars&&e.addOverlay(t.overlay=a(h,!1,t.style))}})}function r(e,t,i){var o=e.getRange(t,i);if(null!==o.match(/^\w+$/)){if(t.ch>0){var r={line:t.line,ch:t.ch-1},n=e.getRange(r,t);if(null===n.match(/\W/))return!1}if(i.ch=15){presto=false;webkit=true}var flipCtrlCmd=mac&&(qtwebkit||presto&&(presto_version==null||presto_version<12.11));var captureRightClick=gecko||(ie&&ie_version>=9);var sawReadOnlySpans=false,sawCollapsedSpans=false;function CodeMirror(place,options){if(!(this instanceof CodeMirror)){return new CodeMirror(place,options)}this.options=options=options?copyObj(options):{};copyObj(defaults,options,false);setGuttersForLineNumbers(options);var doc=options.value;if(typeof doc=="string"){doc=new Doc(doc,options.mode)}this.doc=doc;var input=new CodeMirror.inputStyles[options.inputStyle](this);var display=this.display=new Display(place,doc,input);display.wrapper.CodeMirror=this;updateGutters(this);themeChanged(this);if(options.lineWrapping){this.display.wrapper.className+=" CodeMirror-wrap"}if(options.autofocus&&!mobile){display.input.focus()}initScrollbars(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:false,focused:false,suppressEdits:false,pasteIncoming:false,cutIncoming:false,draggingText:false,highlight:new Delayed(),keySeq:null};var cm=this;if(ie&&ie_version<11){setTimeout(function(){cm.display.input.reset(true)},20)}registerEventHandlers(this);ensureGlobalHandlers();startOperation(this);this.curOp.forceUpdate=true;attachDoc(this,doc);if((options.autofocus&&!mobile)||cm.hasFocus()){setTimeout(bind(onFocus,this),20)}else{onBlur(this)}for(var opt in optionHandlers){if(optionHandlers.hasOwnProperty(opt)){optionHandlers[opt](this,options[opt],Init)}}maybeUpdateLineNumberWidth(this);if(options.finishInit){options.finishInit(this)}for(var i=0;id.maxLineLength){d.maxLineLength=len;d.maxLine=line}})}function setGuttersForLineNumbers(options){var found=indexOf(options.gutters,"CodeMirror-linenumbers");if(found==-1&&options.lineNumbers){options.gutters=options.gutters.concat(["CodeMirror-linenumbers"])}else{if(found>-1&&!options.lineNumbers){options.gutters=options.gutters.slice(0);options.gutters.splice(found,1)}}}function measureForScrollbars(cm){var d=cm.display,gutterW=d.gutters.offsetWidth;var docH=Math.round(cm.doc.height+paddingVert(cm.display));return{clientHeight:d.scroller.clientHeight,viewHeight:d.wrapper.clientHeight,scrollWidth:d.scroller.scrollWidth,clientWidth:d.scroller.clientWidth,viewWidth:d.wrapper.clientWidth,barLeft:cm.options.fixedGutter?gutterW:0,docHeight:docH,scrollHeight:docH+scrollGap(cm)+d.barHeight,nativeBarWidth:d.nativeBarWidth,gutterWidth:gutterW}}function NativeScrollbars(place,scroll,cm){this.cm=cm;var vert=this.vert=elt("div",[elt("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar");var horiz=this.horiz=elt("div",[elt("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");place(vert);place(horiz);on(vert,"scroll",function(){if(vert.clientHeight){scroll(vert.scrollTop,"vertical")}});on(horiz,"scroll",function(){if(horiz.clientWidth){scroll(horiz.scrollLeft,"horizontal")}});this.checkedOverlay=false;if(ie&&ie_version<8){this.horiz.style.minHeight=this.vert.style.minWidth="18px"}}NativeScrollbars.prototype=copyObj({update:function(measure){var needsH=measure.scrollWidth>measure.clientWidth+1;var needsV=measure.scrollHeight>measure.clientHeight+1;var sWidth=measure.nativeBarWidth;if(needsV){this.vert.style.display="block";this.vert.style.bottom=needsH?sWidth+"px":"0";var totalHeight=measure.viewHeight-(needsH?sWidth:0);this.vert.firstChild.style.height=Math.max(0,measure.scrollHeight-measure.clientHeight+totalHeight)+"px" +}else{this.vert.style.display="";this.vert.firstChild.style.height="0"}if(needsH){this.horiz.style.display="block";this.horiz.style.right=needsV?sWidth+"px":"0";this.horiz.style.left=measure.barLeft+"px";var totalWidth=measure.viewWidth-measure.barLeft-(needsV?sWidth:0);this.horiz.firstChild.style.width=(measure.scrollWidth-measure.clientWidth+totalWidth)+"px"}else{this.horiz.style.display="";this.horiz.firstChild.style.width="0"}if(!this.checkedOverlay&&measure.clientHeight>0){if(sWidth==0){this.overlayHack()}this.checkedOverlay=true}return{right:needsV?sWidth:0,bottom:needsH?sWidth:0}},setScrollLeft:function(pos){if(this.horiz.scrollLeft!=pos){this.horiz.scrollLeft=pos}},setScrollTop:function(pos){if(this.vert.scrollTop!=pos){this.vert.scrollTop=pos}},overlayHack:function(){var w=mac&&!mac_geMountainLion?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=w;var self=this;var barMouseDown=function(e){if(e_target(e)!=self.vert&&e_target(e)!=self.horiz){operation(self.cm,onMouseDown)(e)}};on(this.vert,"mousedown",barMouseDown);on(this.horiz,"mousedown",barMouseDown)},clear:function(){var parent=this.horiz.parentNode;parent.removeChild(this.horiz);parent.removeChild(this.vert)}},NativeScrollbars.prototype);function NullScrollbars(){}NullScrollbars.prototype=copyObj({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},NullScrollbars.prototype);CodeMirror.scrollbarModel={"native":NativeScrollbars,"null":NullScrollbars};function initScrollbars(cm){if(cm.display.scrollbars){cm.display.scrollbars.clear();if(cm.display.scrollbars.addClass){rmClass(cm.display.wrapper,cm.display.scrollbars.addClass)}}cm.display.scrollbars=new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node){cm.display.wrapper.insertBefore(node,cm.display.scrollbarFiller);on(node,"mousedown",function(){if(cm.state.focused){setTimeout(function(){cm.display.input.focus()},0)}});node.setAttribute("cm-not-content","true")},function(pos,axis){if(axis=="horizontal"){setScrollLeft(cm,pos)}else{setScrollTop(cm,pos)}},cm);if(cm.display.scrollbars.addClass){addClass(cm.display.wrapper,cm.display.scrollbars.addClass)}}function updateScrollbars(cm,measure){if(!measure){measure=measureForScrollbars(cm)}var startWidth=cm.display.barWidth,startHeight=cm.display.barHeight;updateScrollbarsInner(cm,measure);for(var i=0;i<4&&startWidth!=cm.display.barWidth||startHeight!=cm.display.barHeight;i++){if(startWidth!=cm.display.barWidth&&cm.options.lineWrapping){updateHeightsInViewport(cm)}updateScrollbarsInner(cm,measureForScrollbars(cm));startWidth=cm.display.barWidth;startHeight=cm.display.barHeight}}function updateScrollbarsInner(cm,measure){var d=cm.display;var sizes=d.scrollbars.update(measure);d.sizer.style.paddingRight=(d.barWidth=sizes.right)+"px";d.sizer.style.paddingBottom=(d.barHeight=sizes.bottom)+"px";if(sizes.right&&sizes.bottom){d.scrollbarFiller.style.display="block";d.scrollbarFiller.style.height=sizes.bottom+"px";d.scrollbarFiller.style.width=sizes.right+"px"}else{d.scrollbarFiller.style.display=""}if(sizes.bottom&&cm.options.coverGutterNextToScrollbar&&cm.options.fixedGutter){d.gutterFiller.style.display="block";d.gutterFiller.style.height=sizes.bottom+"px";d.gutterFiller.style.width=measure.gutterWidth+"px"}else{d.gutterFiller.style.display=""}}function visibleLines(display,doc,viewport){var top=viewport&&viewport.top!=null?Math.max(0,viewport.top):display.scroller.scrollTop;top=Math.floor(top-paddingTop(display));var bottom=viewport&&viewport.bottom!=null?viewport.bottom:top+display.wrapper.clientHeight;var from=lineAtHeight(doc,top),to=lineAtHeight(doc,bottom);if(viewport&&viewport.ensure){var ensureFrom=viewport.ensure.from.line,ensureTo=viewport.ensure.to.line;if(ensureFrom=to){from=lineAtHeight(doc,heightAtLine(getLine(doc,ensureTo))-display.wrapper.clientHeight);to=ensureTo}}}return{from:from,to:Math.max(to,from+1)}}function alignHorizontally(cm){var display=cm.display,view=display.view;if(!display.alignWidgets&&(!display.gutters.firstChild||!cm.options.fixedGutter)){return}var comp=compensateForHScroll(display)-display.scroller.scrollLeft+cm.doc.scrollLeft;var gutterW=display.gutters.offsetWidth,left=comp+"px";for(var i=0;i=display.viewFrom&&update.visible.to<=display.viewTo&&(display.updateLineNumbers==null||display.updateLineNumbers>=display.viewTo)&&display.renderedView==display.view&&countDirtyView(cm)==0){return false}if(maybeUpdateLineNumberWidth(cm)){resetView(cm);update.dims=getDimensions(cm)}var end=doc.first+doc.size;var from=Math.max(update.visible.from-cm.options.viewportMargin,doc.first);var to=Math.min(end,update.visible.to+cm.options.viewportMargin);if(display.viewFromto&&display.viewTo-to<20){to=Math.min(end,display.viewTo)}if(sawCollapsedSpans){from=visualLineNo(cm.doc,from);to=visualLineEndNo(cm.doc,to)}var different=from!=display.viewFrom||to!=display.viewTo||display.lastWrapHeight!=update.wrapperHeight||display.lastWrapWidth!=update.wrapperWidth;adjustView(cm,from,to);display.viewOffset=heightAtLine(getLine(cm.doc,display.viewFrom));cm.display.mover.style.top=display.viewOffset+"px";var toUpdate=countDirtyView(cm);if(!different&&toUpdate==0&&!update.force&&display.renderedView==display.view&&(display.updateLineNumbers==null||display.updateLineNumbers>=display.viewTo)){return false}var focused=activeElt();if(toUpdate>4){display.lineDiv.style.display="none"}patchDisplay(cm,display.updateLineNumbers,update.dims);if(toUpdate>4){display.lineDiv.style.display=""}display.renderedView=display.view;if(focused&&activeElt()!=focused&&focused.offsetHeight){focused.focus()}removeChildren(display.cursorDiv);removeChildren(display.selectionDiv);display.gutters.style.height=0;if(different){display.lastWrapHeight=update.wrapperHeight;display.lastWrapWidth=update.wrapperWidth;startWorker(cm,400)}display.updateLineNumbers=null;return true}function postUpdateDisplay(cm,update){var force=update.force,viewport=update.viewport;for(var first=true;;first=false){if(first&&cm.options.lineWrapping&&update.oldDisplayWidth!=displayWidth(cm)){force=true}else{force=false;if(viewport&&viewport.top!=null){viewport={top:Math.min(cm.doc.height+paddingVert(cm.display)-displayHeight(cm),viewport.top)}}update.visible=visibleLines(cm.display,cm.doc,viewport);if(update.visible.from>=cm.display.viewFrom&&update.visible.to<=cm.display.viewTo){break}}if(!updateDisplayIfNeeded(cm,update)){break}updateHeightsInViewport(cm);var barMeasure=measureForScrollbars(cm);updateSelection(cm);setDocumentHeight(cm,barMeasure);updateScrollbars(cm,barMeasure)}update.signal(cm,"update",cm);if(cm.display.viewFrom!=cm.display.reportedViewFrom||cm.display.viewTo!=cm.display.reportedViewTo){update.signal(cm,"viewportChange",cm,cm.display.viewFrom,cm.display.viewTo);cm.display.reportedViewFrom=cm.display.viewFrom;cm.display.reportedViewTo=cm.display.viewTo}}function updateDisplaySimple(cm,viewport){var update=new DisplayUpdate(cm,viewport);if(updateDisplayIfNeeded(cm,update)){updateHeightsInViewport(cm);postUpdateDisplay(cm,update);var barMeasure=measureForScrollbars(cm);updateSelection(cm);setDocumentHeight(cm,barMeasure);updateScrollbars(cm,barMeasure);update.finish()}}function setDocumentHeight(cm,measure){cm.display.sizer.style.minHeight=measure.docHeight+"px";var total=measure.docHeight+cm.display.barHeight; +cm.display.heightForcer.style.top=total+"px";cm.display.gutters.style.height=Math.max(total+scrollGap(cm),measure.clientHeight)+"px"}function updateHeightsInViewport(cm){var display=cm.display;var prevBottom=display.lineDiv.offsetTop;for(var i=0;i0.001||diff<-0.001){updateLineHeight(cur.line,height);updateWidgetHeight(cur.line);if(cur.rest){for(var j=0;j-1){updateNumber=false}updateLineForChanges(cm,lineView,lineN,dims)}if(updateNumber){removeChildren(lineView.lineNumber);lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options,lineN)))}cur=lineView.node.nextSibling}}lineN+=lineView.size}while(cur){cur=rm(cur)}}function updateLineForChanges(cm,lineView,lineN,dims){for(var j=0;j1){if(lastCopied&&lastCopied.join("\n")==inserted){multiPaste=sel.ranges.length%lastCopied.length==0&&map(lastCopied,splitLines)}else{if(textLines.length==sel.ranges.length){multiPaste=map(textLines,function(l){return[l]})}}}for(var i=sel.ranges.length-1;i>=0;i--){var range=sel.ranges[i];var from=range.from(),to=range.to();if(range.empty()){if(deleted&&deleted>0){from=Pos(from.line,from.ch-deleted)}else{if(cm.state.overwrite&&!cm.state.pasteIncoming){to=Pos(to.line,Math.min(getLine(doc,to.line).text.length,to.ch+lst(textLines).length))}}}var updateInput=cm.curOp.updateInput;var changeEvent={from:from,to:to,text:multiPaste?multiPaste[i%multiPaste.length]:textLines,origin:cm.state.pasteIncoming?"paste":cm.state.cutIncoming?"cut":"+input"};makeChange(cm.doc,changeEvent);signalLater(cm,"inputRead",cm,changeEvent);if(inserted&&!cm.state.pasteIncoming&&cm.options.electricChars&&cm.options.smartIndent&&range.head.ch<100&&(!i||sel.ranges[i-1].head.line!=range.head.line)){var mode=cm.getModeAt(range.head);var end=changeEnd(changeEvent);if(mode.electricChars){for(var j=0;j-1){indentLine(cm,end.line,"smart");break}}}else{if(mode.electricInput){if(mode.electricInput.test(getLine(doc,end.line).text.slice(0,end.ch))){indentLine(cm,end.line,"smart")}}}}}ensureCursorVisible(cm);cm.curOp.updateInput=updateInput;cm.curOp.typing=true;cm.state.pasteIncoming=cm.state.cutIncoming=false}function copyableRanges(cm){var text=[],ranges=[];for(var i=0;i=9&&input.hasSelection){input.hasSelection=null}input.poll()});on(te,"paste",function(){if(webkit&&!cm.state.fakedLastChar&&!(new Date-cm.state.lastMiddleDown<200)){var start=te.selectionStart,end=te.selectionEnd;te.value+="$";te.selectionEnd=end;te.selectionStart=start;cm.state.fakedLastChar=true}cm.state.pasteIncoming=true;input.fastPoll()});function prepareCopyCut(e){if(cm.somethingSelected()){lastCopied=cm.getSelections();if(input.inaccurateSelection){input.prevInput="";input.inaccurateSelection=false;te.value=lastCopied.join("\n");selectInput(te)}}else{var ranges=copyableRanges(cm);lastCopied=ranges.text;if(e.type=="cut"){cm.setSelections(ranges.ranges,null,sel_dontScroll)}else{input.prevInput="";te.value=ranges.text.join("\n");selectInput(te)}}if(e.type=="cut"){cm.state.cutIncoming=true}}on(te,"cut",prepareCopyCut);on(te,"copy",prepareCopyCut);on(display.scroller,"paste",function(e){if(eventInWidget(display,e)){return}cm.state.pasteIncoming=true;input.focus()});on(display.lineSpace,"selectstart",function(e){if(!eventInWidget(display,e)){e_preventDefault(e)}})},prepareSelection:function(){var cm=this.cm,display=cm.display,doc=cm.doc;var result=prepareSelection(cm);if(cm.options.moveInputWithCursor){var headPos=cursorCoords(cm,doc.sel.primary().head,"div");var wrapOff=display.wrapper.getBoundingClientRect(),lineOff=display.lineDiv.getBoundingClientRect();result.teTop=Math.max(0,Math.min(display.wrapper.clientHeight-10,headPos.top+lineOff.top-wrapOff.top));result.teLeft=Math.max(0,Math.min(display.wrapper.clientWidth-10,headPos.left+lineOff.left-wrapOff.left))}return result},showSelection:function(drawn){var cm=this.cm,display=cm.display;removeChildrenAndAdd(display.cursorDiv,drawn.cursors);removeChildrenAndAdd(display.selectionDiv,drawn.selection);if(drawn.teTop!=null){this.wrapper.style.top=drawn.teTop+"px";this.wrapper.style.left=drawn.teLeft+"px"}},reset:function(typing){if(this.contextMenuPending){return}var minimal,selected,cm=this.cm,doc=cm.doc;if(cm.somethingSelected()){this.prevInput="";var range=doc.sel.primary();minimal=hasCopyEvent&&(range.to().line-range.from().line>100||(selected=cm.getSelection()).length>1000);var content=minimal?"-":selected||cm.getSelection();this.textarea.value=content;if(cm.state.focused){selectInput(this.textarea)}if(ie&&ie_version>=9){this.hasSelection=content}}else{if(!typing){this.prevInput=this.textarea.value="";if(ie&&ie_version>=9){this.hasSelection=null}}}this.inaccurateSelection=minimal},getField:function(){return this.textarea},supportsTouch:function(){return false},focus:function(){if(this.cm.options.readOnly!="nocursor"&&(!mobile||activeElt()!=this.textarea)){try{this.textarea.focus()}catch(e){}}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var input=this;if(input.pollingFast){return}input.polling.set(this.cm.options.pollInterval,function(){input.poll();if(input.cm.state.focused){input.slowPoll()}})},fastPoll:function(){var missed=false,input=this;input.pollingFast=true;function p(){var changed=input.poll();if(!changed&&!missed){missed=true;input.polling.set(60,p)}else{input.pollingFast=false;input.slowPoll()}}input.polling.set(20,p)},poll:function(){var cm=this.cm,input=this.textarea,prevInput=this.prevInput;if(!cm.state.focused||(hasSelection(input)&&!prevInput)||isReadOnly(cm)||cm.options.disableInput||cm.state.keySeq){return false}if(cm.state.pasteIncoming&&cm.state.fakedLastChar){input.value=input.value.substring(0,input.value.length-1);cm.state.fakedLastChar=false}var text=input.value;if(text==prevInput&&!cm.somethingSelected()){return false}if(ie&&ie_version>=9&&this.hasSelection===text||mac&&/[\uf700-\uf7ff]/.test(text)){cm.display.input.reset();return false}if(text.charCodeAt(0)==8203&&cm.doc.sel==cm.display.selForContextMenu&&!prevInput){prevInput="\u200b" +}var same=0,l=Math.min(prevInput.length,text.length);while(same1000||text.indexOf("\n")>-1){input.value=self.prevInput=""}else{self.prevInput=text}});return true},ensurePolled:function(){if(this.pollingFast&&this.poll()){this.pollingFast=false}},onKeyPress:function(){if(ie&&ie_version>=9){this.hasSelection=null}this.fastPoll()},onContextMenu:function(e){var input=this,cm=input.cm,display=cm.display,te=input.textarea;var pos=posFromMouse(cm,e),scrollPos=display.scroller.scrollTop;if(!pos||presto){return}var reset=cm.options.resetSelectionOnContextMenu;if(reset&&cm.doc.sel.contains(pos)==-1){operation(cm,setSelection)(cm.doc,simpleSelection(pos),sel_dontScroll)}var oldCSS=te.style.cssText;input.wrapper.style.position="absolute";te.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(e.clientY-5)+"px; left: "+(e.clientX-5)+"px; z-index: 1000; background: "+(ie?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";if(webkit){var oldScrollY=window.scrollY}display.input.focus();if(webkit){window.scrollTo(null,oldScrollY)}display.input.reset();if(!cm.somethingSelected()){te.value=input.prevInput=" "}input.contextMenuPending=true;display.selForContextMenu=cm.doc.sel;clearTimeout(display.detectingSelectAll);function prepareSelectAllHack(){if(te.selectionStart!=null){var selected=cm.somethingSelected();var extval=te.value="\u200b"+(selected?te.value:"");input.prevInput=selected?"":"\u200b";te.selectionStart=1;te.selectionEnd=extval.length;display.selForContextMenu=cm.doc.sel}}function rehide(){input.contextMenuPending=false;input.wrapper.style.position="relative";te.style.cssText=oldCSS;if(ie&&ie_version<9){display.scrollbars.setScrollTop(display.scroller.scrollTop=scrollPos)}if(te.selectionStart!=null){if(!ie||(ie&&ie_version<9)){prepareSelectAllHack()}var i=0,poll=function(){if(display.selForContextMenu==cm.doc.sel&&te.selectionStart==0){operation(cm,commands.selectAll)(cm)}else{if(i++<10){display.detectingSelectAll=setTimeout(poll,500)}else{display.input.reset()}}};display.detectingSelectAll=setTimeout(poll,200)}}if(ie&&ie_version>=9){prepareSelectAllHack()}if(captureRightClick){e_stop(e);var mouseup=function(){off(window,"mouseup",mouseup);setTimeout(rehide,20)};on(window,"mouseup",mouseup)}else{setTimeout(rehide,50)}},setUneditable:nothing,needsContentAttribute:false},TextareaInput.prototype);function ContentEditableInput(cm){this.cm=cm;this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null;this.polling=new Delayed()}ContentEditableInput.prototype=copyObj({init:function(display){var input=this,cm=input.cm;var div=input.div=display.lineDiv;div.contentEditable="true";disableBrowserMagic(div);on(div,"paste",function(e){var pasted=e.clipboardData&&e.clipboardData.getData("text/plain");if(pasted){e.preventDefault();cm.replaceSelection(pasted,null,"paste")}});on(div,"compositionstart",function(e){var data=e.data;input.composing={sel:cm.doc.sel,data:data,startData:data};if(!data){return}var prim=cm.doc.sel.primary();var line=cm.getLine(prim.head.line);var found=line.indexOf(data,Math.max(0,prim.head.ch-data.length));if(found>-1&&found<=prim.head.ch){input.composing.sel=simpleSelection(Pos(prim.head.line,found),Pos(prim.head.line,found+data.length))}});on(div,"compositionupdate",function(e){input.composing.data=e.data});on(div,"compositionend",function(e){var ours=input.composing;if(!ours){return}if(e.data!=ours.startData&&!/\u200b/.test(e.data)){ours.data=e.data}setTimeout(function(){if(!ours.handled){input.applyComposition(ours)}if(input.composing==ours){input.composing=null}},50)});on(div,"touchstart",function(){input.forceCompositionEnd()});on(div,"input",function(){if(input.composing){return}if(!input.pollContent()){runInOp(input.cm,function(){regChange(cm)})}});function onCopyCut(e){if(cm.somethingSelected()){lastCopied=cm.getSelections();if(e.type=="cut"){cm.replaceSelection("",null,"cut")}}else{var ranges=copyableRanges(cm);lastCopied=ranges.text;if(e.type=="cut"){cm.operation(function(){cm.setSelections(ranges.ranges,0,sel_dontScroll);cm.replaceSelection("",null,"cut")})}}if(e.clipboardData&&!ios){e.preventDefault();e.clipboardData.clearData();e.clipboardData.setData("text/plain",lastCopied.join("\n"))}else{var kludge=hiddenTextarea(),te=kludge.firstChild;cm.display.lineSpace.insertBefore(kludge,cm.display.lineSpace.firstChild);te.value=lastCopied.join("\n");var hadFocus=document.activeElement;selectInput(te);setTimeout(function(){cm.display.lineSpace.removeChild(kludge);hadFocus.focus()},50)}}on(div,"copy",onCopyCut);on(div,"cut",onCopyCut)},prepareSelection:function(){var result=prepareSelection(this.cm,false);result.focus=this.cm.state.focused;return result},showSelection:function(info){if(!info||!this.cm.display.view.length){return +}if(info.focus){this.showPrimarySelection()}this.showMultipleSelections(info)},showPrimarySelection:function(){var sel=window.getSelection(),prim=this.cm.doc.sel.primary();var curAnchor=domToPos(this.cm,sel.anchorNode,sel.anchorOffset);var curFocus=domToPos(this.cm,sel.focusNode,sel.focusOffset);if(curAnchor&&!curAnchor.bad&&curFocus&&!curFocus.bad&&cmp(minPos(curAnchor,curFocus),prim.from())==0&&cmp(maxPos(curAnchor,curFocus),prim.to())==0){return}var start=posToDOM(this.cm,prim.from());var end=posToDOM(this.cm,prim.to());if(!start&&!end){return}var view=this.cm.display.view;var old=sel.rangeCount&&sel.getRangeAt(0);if(!start){start={node:view[0].measure.map[2],offset:0}}else{if(!end){var measure=view[view.length-1].measure;var map=measure.maps?measure.maps[measure.maps.length-1]:measure.map;end={node:map[map.length-1],offset:map[map.length-2]-map[map.length-3]}}}try{var rng=range(start.node,start.offset,end.offset,end.node)}catch(e){}if(rng){sel.removeAllRanges();sel.addRange(rng);if(old&&sel.anchorNode==null){sel.addRange(old)}}this.rememberSelection()},showMultipleSelections:function(info){removeChildrenAndAdd(this.cm.display.cursorDiv,info.cursors);removeChildrenAndAdd(this.cm.display.selectionDiv,info.selection)},rememberSelection:function(){var sel=window.getSelection();this.lastAnchorNode=sel.anchorNode;this.lastAnchorOffset=sel.anchorOffset;this.lastFocusNode=sel.focusNode;this.lastFocusOffset=sel.focusOffset},selectionInEditor:function(){var sel=window.getSelection();if(!sel.rangeCount){return false}var node=sel.getRangeAt(0).commonAncestorContainer;return contains(this.div,node)},focus:function(){if(this.cm.options.readOnly!="nocursor"){this.div.focus()}},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return true},receivedFocus:function(){var input=this;if(this.selectionInEditor()){this.pollSelection()}else{runInOp(this.cm,function(){input.cm.curOp.selectionChanged=true})}function poll(){if(input.cm.state.focused){input.pollSelection();input.polling.set(input.cm.options.pollInterval,poll)}}this.polling.set(this.cm.options.pollInterval,poll)},pollSelection:function(){if(this.composing){return}var sel=window.getSelection(),cm=this.cm;if(sel.anchorNode!=this.lastAnchorNode||sel.anchorOffset!=this.lastAnchorOffset||sel.focusNode!=this.lastFocusNode||sel.focusOffset!=this.lastFocusOffset){this.rememberSelection();var anchor=domToPos(cm,sel.anchorNode,sel.anchorOffset);var head=domToPos(cm,sel.focusNode,sel.focusOffset);if(anchor&&head){runInOp(cm,function(){setSelection(cm.doc,simpleSelection(anchor,head),sel_dontScroll);if(anchor.bad||head.bad){cm.curOp.selectionChanged=true}})}}},pollContent:function(){var cm=this.cm,display=cm.display,sel=cm.doc.sel.primary();var from=sel.from(),to=sel.to();if(from.linedisplay.viewTo-1){return false}var fromIndex;if(from.line==display.viewFrom||(fromIndex=findViewIndex(cm,from.line))==0){var fromLine=lineNo(display.view[0].line);var fromNode=display.view[0].node}else{var fromLine=lineNo(display.view[fromIndex].line);var fromNode=display.view[fromIndex-1].node.nextSibling}var toIndex=findViewIndex(cm,to.line);if(toIndex==display.view.length-1){var toLine=display.viewTo-1;var toNode=display.view[toIndex].node}else{var toLine=lineNo(display.view[toIndex+1].line)-1;var toNode=display.view[toIndex+1].node.previousSibling}var newText=splitLines(domTextBetween(cm,fromNode,toNode,fromLine,toLine));var oldText=getBetween(cm.doc,Pos(fromLine,0),Pos(toLine,getLine(cm.doc,toLine).text.length));while(newText.length>1&&oldText.length>1){if(lst(newText)==lst(oldText)){newText.pop();oldText.pop();toLine--}else{if(newText[0]==oldText[0]){newText.shift();oldText.shift();fromLine++}else{break}}}var cutFront=0,cutEnd=0;var newTop=newText[0],oldTop=oldText[0],maxCutFront=Math.min(newTop.length,oldTop.length);while(cutFront1||newText[0]||cmp(chFrom,chTo)){replaceRange(cm.doc,newText,chFrom,chTo,"+input");return true}},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){if(!this.composing||this.composing.handled){return}this.applyComposition(this.composing);this.composing.handled=true;this.div.blur();this.div.focus()},applyComposition:function(composing){if(composing.data&&composing.data!=composing.startData){operation(this.cm,applyTextInput)(this.cm,composing.data,0,composing.sel) +}},setUneditable:function(node){node.setAttribute("contenteditable","false")},onKeyPress:function(e){e.preventDefault();operation(this.cm,applyTextInput)(this.cm,String.fromCharCode(e.charCode==null?e.keyCode:e.charCode),0)},onContextMenu:nothing,resetPosition:nothing,needsContentAttribute:true},ContentEditableInput.prototype);function posToDOM(cm,pos){var view=findViewForLine(cm,pos.line);if(!view||view.hidden){return null}var line=getLine(cm.doc,pos.line);var info=mapFromLineView(view,line,pos.line);var order=getOrder(line),side="left";if(order){var partPos=getBidiPartAt(order,pos.ch);side=partPos%2?"right":"left"}var result=nodeAndOffsetInLineMap(info.map,pos.ch,"left");result.offset=result.collapse=="right"?result.end:result.start;return result}function badPos(pos,bad){if(bad){pos.bad=true}return pos}function domToPos(cm,node,offset){var lineNode;if(node==cm.display.lineDiv){lineNode=cm.display.lineDiv.childNodes[offset];if(!lineNode){return badPos(cm.clipPos(Pos(cm.display.viewTo-1)),true)}node=null;offset=0}else{for(lineNode=node;;lineNode=lineNode.parentNode){if(!lineNode||lineNode==cm.display.lineDiv){return null}if(lineNode.parentNode&&lineNode.parentNode==cm.display.lineDiv){break}}}for(var i=0;i=0&&cmp(pos,range.to())<=0){return i}}return -1}};function Range(anchor,head){this.anchor=anchor;this.head=head +}Range.prototype={from:function(){return minPos(this.anchor,this.head)},to:function(){return maxPos(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};function normalizeSelection(ranges,primIndex){var prim=ranges[primIndex];ranges.sort(function(a,b){return cmp(a.from(),b.from())});primIndex=indexOf(ranges,prim);for(var i=1;i=0){var from=minPos(prev.from(),cur.from()),to=maxPos(prev.to(),cur.to());var inv=prev.empty()?cur.from()==cur.head:prev.from()==prev.head;if(i<=primIndex){--primIndex}ranges.splice(--i,2,new Range(inv?to:from,inv?from:to))}}return new Selection(ranges,primIndex)}function simpleSelection(anchor,head){return new Selection([new Range(anchor,head||anchor)],0)}function clipLine(doc,n){return Math.max(doc.first,Math.min(n,doc.first+doc.size-1))}function clipPos(doc,pos){if(pos.linelast){return Pos(last,getLine(doc,last).text.length)}return clipToLen(pos,getLine(doc,pos.line).text.length)}function clipToLen(pos,linelen){var ch=pos.ch;if(ch==null||ch>linelen){return Pos(pos.line,linelen)}else{if(ch<0){return Pos(pos.line,0)}else{return pos}}}function isLine(doc,l){return l>=doc.first&&l=curPos.ch:sp.to>curPos.ch))){if(mayClear){signal(m,"beforeCursorEnter");if(m.explicitlyCleared){if(!line.markedSpans){break}else{--i;continue}}}if(!m.atomic){continue}var newPos=m.find(dir<0?-1:1);if(cmp(newPos,curPos)==0){newPos.ch+=dir; +if(newPos.ch<0){if(newPos.line>doc.first){newPos=clipPos(doc,Pos(newPos.line-1))}else{newPos=null}}else{if(newPos.ch>line.text.length){if(newPos.line3){add(left,leftPos.top,null,leftPos.bottom);left=leftSide;if(leftPos.bottomend.bottom||rightPos.bottom==end.bottom&&rightPos.right>end.right){end=rightPos}if(left0){display.blinker=setInterval(function(){display.cursorDiv.style.visibility=(on=!on)?"":"hidden"},cm.options.cursorBlinkRate)}else{if(cm.options.cursorBlinkRate<0){display.cursorDiv.style.visibility="hidden"}}}function startWorker(cm,time){if(cm.doc.mode.startState&&cm.doc.frontier=cm.display.viewTo){return}var end=+new Date+cm.options.workTime;var state=copyState(doc.mode,getStateBefore(cm,doc.frontier));var changedLines=[];doc.iter(doc.frontier,Math.min(doc.first+doc.size,cm.display.viewTo+500),function(line){if(doc.frontier>=cm.display.viewFrom){var oldStyles=line.styles; +var highlighted=highlightLine(cm,line,state,true);line.styles=highlighted.styles;var oldCls=line.styleClasses,newCls=highlighted.classes;if(newCls){line.styleClasses=newCls}else{if(oldCls){line.styleClasses=null}}var ischange=!oldStyles||oldStyles.length!=line.styles.length||oldCls!=newCls&&(!oldCls||!newCls||oldCls.bgClass!=newCls.bgClass||oldCls.textClass!=newCls.textClass);for(var i=0;!ischange&&iend){startWorker(cm,cm.options.workDelay);return true}});if(changedLines.length){runInOp(cm,function(){for(var i=0;ilim;--search){if(search<=doc.first){return doc.first}var line=getLine(doc,search-1);if(line.stateAfter&&(!precise||search<=doc.frontier)){return search}var indented=countColumn(line.text,null,cm.options.tabSize);if(minline==null||minindent>indented){minline=search-1;minindent=indented}}return minline}function getStateBefore(cm,n,precise){var doc=cm.doc,display=cm.display;if(!doc.mode.startState){return true}var pos=findStartLine(cm,n,precise),state=pos>doc.first&&getLine(doc,pos-1).stateAfter;if(!state){state=startState(doc.mode)}else{state=copyState(doc.mode,state)}doc.iter(pos,n,function(line){processLine(cm,line.text,state);var save=pos==n-1||pos%5==0||pos>=display.viewFrom&&pos2){heights.push((cur.bottom+next.top)/2-rect.top)}}}heights.push(rect.bottom-rect.top)}}function mapFromLineView(lineView,line,lineN){if(lineView.line==line){return{map:lineView.measure.map,cache:lineView.measure.cache}}for(var i=0;ilineN){return{map:lineView.measure.maps[i],cache:lineView.measure.caches[i],before:true}}}}function updateExternalMeasurement(cm,line){line=visualLine(line);var lineN=lineNo(line);var view=cm.display.externalMeasured=new LineView(cm.doc,line,lineN);view.lineN=lineN;var built=view.built=buildLineContent(cm,view);view.text=built.pre;removeChildrenAndAdd(cm.display.lineMeasure,built.pre);return view}function measureChar(cm,line,ch,bias){return measureCharPrepared(cm,prepareMeasureForLine(cm,line),ch,bias)}function findViewForLine(cm,lineN){if(lineN>=cm.display.viewFrom&&lineN=ext.lineN&&lineNch){end=mEnd-mStart;start=end-1;if(ch>=mEnd){collapse="right"}}}}if(start!=null){node=map[i+2];if(mStart==mEnd&&bias==(node.insertLeft?"left":"right")){collapse=bias}if(bias=="left"&&start==0){while(i&&map[i-2]==map[i-3]&&map[i-1].insertLeft){node=map[(i-=3)+2];collapse="left"}}if(bias=="right"&&start==mEnd-mStart){while(i0){collapse=bias="right"}var rects;if(cm.options.lineWrapping&&(rects=node.getClientRects()).length>1){rect=rects[bias=="right"?rects.length-1:0]}else{rect=node.getBoundingClientRect()}}if(ie&&ie_version<9&&!start&&(!rect||!rect.left&&!rect.right)){var rSpan=node.parentNode.getClientRects()[0];if(rSpan){rect={left:rSpan.left,right:rSpan.left+charWidth(cm.display),top:rSpan.top,bottom:rSpan.bottom}}else{rect=nullRect}}var rtop=rect.top-prepared.rect.top,rbot=rect.bottom-prepared.rect.top;var mid=(rtop+rbot)/2;var heights=prepared.view.measure.heights;for(var i=0;ipart.from){return get(ch-1)}return get(ch,right)}var order=getOrder(lineObj),ch=pos.ch;if(!order){return get(ch)}var partPos=getBidiPartAt(order,ch);var val=getBidi(ch,partPos);if(bidiOther!=null){val.other=getBidi(ch,bidiOther)}return val}function estimateCoords(cm,pos){var left=0,pos=clipPos(cm.doc,pos);if(!cm.options.lineWrapping){left=charWidth(cm.display)*pos.ch}var lineObj=getLine(cm.doc,pos.line);var top=heightAtLine(lineObj)+paddingTop(cm.display);return{left:left,right:left,top:top,bottom:top+lineObj.height}}function PosWithInfo(line,ch,outside,xRel){var pos=Pos(line,ch);pos.xRel=xRel;if(outside){pos.outside=true}return pos}function coordsChar(cm,x,y){var doc=cm.doc;y+=cm.display.viewOffset;if(y<0){return PosWithInfo(doc.first,0,true,-1)}var lineN=lineAtHeight(doc,y),last=doc.first+doc.size-1;if(lineN>last){return PosWithInfo(doc.first+doc.size-1,getLine(doc,last).text.length,true,1)}if(x<0){x=0}var lineObj=getLine(doc,lineN);for(;;){var found=coordsCharInner(cm,lineObj,lineN,x,y);var merged=collapsedSpanAtEnd(lineObj);var mergedPos=merged&&merged.find(0,true);if(merged&&(found.ch>mergedPos.from.ch||found.ch==mergedPos.from.ch&&found.xRel>0)){lineN=lineNo(lineObj=mergedPos.to.line)}else{return found}}}function coordsCharInner(cm,lineObj,lineNo,x,y){var innerOff=y-heightAtLine(lineObj);var wrongLine=false,adjust=2*cm.display.wrapper.clientWidth;var preparedMeasure=prepareMeasureForLine(cm,lineObj);function getX(ch){var sp=cursorCoords(cm,Pos(lineNo,ch),"line",lineObj,preparedMeasure);wrongLine=true;if(innerOff>sp.bottom){return sp.left-adjust}else{if(innerOfftoX){return PosWithInfo(lineNo,to,toOutside,1)}for(;;){if(bidi?to==from||to==moveVisually(lineObj,from,1):to-from<=1){var ch=x1?1:0);return pos}var step=Math.ceil(dist/2),middle=from+step;if(bidi){middle=from;for(var i=0;ix){to=middle;toX=middleX;if(toOutside=wrongLine){toX+=1000}dist=step}else{from=middle;fromX=middleX;fromOutside=wrongLine;dist-=step}}}var measureText;function textHeight(display){if(display.cachedTextHeight!=null){return display.cachedTextHeight}if(measureText==null){measureText=elt("pre");for(var i=0;i<49;++i){measureText.appendChild(document.createTextNode("x"));measureText.appendChild(elt("br"))}measureText.appendChild(document.createTextNode("x"))}removeChildrenAndAdd(display.measure,measureText);var height=measureText.offsetHeight/50;if(height>3){display.cachedTextHeight=height}removeChildren(display.measure);return height||1}function charWidth(display){if(display.cachedCharWidth!=null){return display.cachedCharWidth}var anchor=elt("span","xxxxxxxxxx");var pre=elt("pre",[anchor]);removeChildrenAndAdd(display.measure,pre);var rect=anchor.getBoundingClientRect(),width=(rect.right-rect.left)/10;if(width>2){display.cachedCharWidth=width}return width||10}var operationGroup=null;var nextOpId=0;function startOperation(cm){cm.curOp={cm:cm,viewChanged:false,startHeight:cm.doc.height,forceUpdate:false,updateInput:null,typing:false,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:false,updateMaxLine:false,scrollLeft:null,scrollTop:null,scrollToPos:null,id:++nextOpId};if(operationGroup){operationGroup.ops.push(cm.curOp)}else{cm.curOp.ownsGroup=operationGroup={ops:[cm.curOp],delayedCallbacks:[]}}}function fireCallbacksForOps(group){var callbacks=group.delayedCallbacks,i=0; +do{for(;i=display.viewTo)||display.maxLineChanged&&cm.options.lineWrapping;op.update=op.mustUpdate&&new DisplayUpdate(cm,op.mustUpdate&&{top:op.scrollTop,ensure:op.scrollToPos},op.forceUpdate)}function endOperation_W1(op){op.updatedDisplay=op.mustUpdate&&updateDisplayIfNeeded(op.cm,op.update)}function endOperation_R2(op){var cm=op.cm,display=cm.display;if(op.updatedDisplay){updateHeightsInViewport(cm)}op.barMeasure=measureForScrollbars(cm);if(display.maxLineChanged&&!cm.options.lineWrapping){op.adjustWidthTo=measureChar(cm,display.maxLine,display.maxLine.text.length).left+3;cm.display.sizerWidth=op.adjustWidthTo;op.barMeasure.scrollWidth=Math.max(display.scroller.clientWidth,display.sizer.offsetLeft+op.adjustWidthTo+scrollGap(cm)+cm.display.barWidth);op.maxScrollLeft=Math.max(0,display.sizer.offsetLeft+op.adjustWidthTo-displayWidth(cm))}if(op.updatedDisplay||op.selectionChanged){op.preparedSelection=display.input.prepareSelection()}}function endOperation_W2(op){var cm=op.cm;if(op.adjustWidthTo!=null){cm.display.sizer.style.minWidth=op.adjustWidthTo+"px";if(op.maxScrollLeft
    ]", + "[link ]", + "[tag&bracket <][tag div][tag&bracket >]", + "[tag&bracket ]"); + +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/meta.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/meta.js new file mode 100644 index 0000000..e110288 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/meta.js @@ -0,0 +1,177 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.modeInfo = [ + {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]}, + {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i}, + {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]}, + {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]}, + {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]}, + {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp"]}, + {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj"]}, + {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]}, + {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]}, + {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]}, + {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]}, + {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]}, + {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]}, + {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]}, + {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]}, + {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]}, + {name: "Django", mime: "text/x-django", mode: "django"}, + {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/}, + {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]}, + {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]}, + {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"}, + {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]}, + {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]}, + {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]}, + {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]}, + {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]}, + {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]}, + {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]}, + {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]}, + {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]}, + {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]}, + {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history).md$/i}, + {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]}, + {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy"]}, + {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]}, + {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]}, + {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]}, + {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]}, + {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]}, + {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"], alias: ["xhtml"]}, + {name: "HTTP", mime: "message/http", mode: "http"}, + {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]}, + {name: "Jade", mime: "text/x-jade", mode: "jade", ext: ["jade"]}, + {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]}, + {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]}, + {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], + mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]}, + {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]}, + {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]}, + {name: "Jinja2", mime: "null", mode: "jinja2"}, + {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]}, + {name: "Kotlin", mime: "text/x-kotlin", mode: "kotlin", ext: ["kt"]}, + {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]}, + {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]}, + {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]}, + {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]}, + {name: "mIRC", mime: "text/mirc", mode: "mirc"}, + {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"}, + {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]}, + {name: "MS SQL", mime: "text/x-mssql", mode: "sql"}, + {name: "MySQL", mime: "text/x-mysql", mode: "sql"}, + {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i}, + {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]}, + {name: "Objective C", mime: "text/x-objectivec", mode: "clike", ext: ["m", "mm"]}, + {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]}, + {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]}, + {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]}, + {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]}, + {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]}, + {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]}, + {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]}, + {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]}, + {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]}, + {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]}, + {name: "Python", mime: "text/x-python", mode: "python", ext: ["py", "pyw"]}, + {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]}, + {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]}, + {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"], alias: ["rscript"]}, + {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]}, + {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"}, + {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]}, + {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]}, + {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]}, + {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]}, + {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]}, + {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]}, + {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]}, + {name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"]}, + {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]}, + {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]}, + {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]}, + {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]}, + {name: "SmartyMixed", mime: "text/x-smarty", mode: "smartymixed"}, + {name: "Solr", mime: "text/x-solr", mode: "solr"}, + {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]}, + {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]}, + {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]}, + {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]}, + {name: "MariaDB", mime: "text/x-mariadb", mode: "sql"}, + {name: "sTeX", mime: "text/x-stex", mode: "stex"}, + {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"], alias: ["tex"]}, + {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]}, + {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]}, + {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]}, + {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, + {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, + {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]}, + {name: "Tornado", mime: "text/x-tornado", mode: "tornado"}, + {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]}, + {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]}, + {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]}, + {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]}, + {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]}, + {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]}, + {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]}, + {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]}, + {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml"], alias: ["yml"]}, + {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]} + ]; + // Ensure all modes have a mime property for backwards compatibility + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mimes) info.mime = info.mimes[0]; + } + + CodeMirror.findModeByMIME = function(mime) { + mime = mime.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mime == mime) return info; + if (info.mimes) for (var j = 0; j < info.mimes.length; j++) + if (info.mimes[j] == mime) return info; + } + }; + + CodeMirror.findModeByExtension = function(ext) { + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.ext) for (var j = 0; j < info.ext.length; j++) + if (info.ext[j] == ext) return info; + } + }; + + CodeMirror.findModeByFileName = function(filename) { + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.file && info.file.test(filename)) return info; + } + var dot = filename.lastIndexOf("."); + var ext = dot > -1 && filename.substring(dot + 1, filename.length); + if (ext) return CodeMirror.findModeByExtension(ext); + }; + + CodeMirror.findModeByName = function(name) { + name = name.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.name.toLowerCase() == name) return info; + if (info.alias) for (var j = 0; j < info.alias.length; j++) + if (info.alias[j].toLowerCase() == name) return info; + } + }; +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/index.html new file mode 100644 index 0000000..fd2f34e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/index.html @@ -0,0 +1,160 @@ + + +CodeMirror: mIRC mode + + + + + + + + + + +
    +

    mIRC mode

    +
    + + +

    MIME types defined: text/mirc.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/mirc.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/mirc.js new file mode 100644 index 0000000..f0d5c6a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mirc/mirc.js @@ -0,0 +1,193 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +//mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMIME("text/mirc", "mirc"); +CodeMirror.defineMode("mirc", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " + + "$activewid $address $addtok $agent $agentname $agentstat $agentver " + + "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " + + "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " + + "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " + + "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " + + "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " + + "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " + + "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " + + "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " + + "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " + + "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " + + "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " + + "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " + + "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " + + "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " + + "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " + + "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " + + "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " + + "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " + + "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " + + "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " + + "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " + + "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " + + "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " + + "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " + + "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " + + "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " + + "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " + + "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " + + "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " + + "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " + + "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " + + "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " + + "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " + + "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor"); + var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " + + "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " + + "channel clear clearall cline clipboard close cnick color comclose comopen " + + "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " + + "debug dec describe dialog did didtok disable disconnect dlevel dline dll " + + "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " + + "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " + + "events exit fclose filter findtext finger firewall flash flist flood flush " + + "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " + + "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " + + "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " + + "ialmark identd if ignore iline inc invite iuser join kick linesep links list " + + "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " + + "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " + + "qme qmsg query queryn quit raw reload remini remote remove rename renwin " + + "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " + + "say scid scon server set showmirc signam sline sockaccept sockclose socklist " + + "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " + + "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " + + "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " + + "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " + + "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " + + "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " + + "elseif else goto menu nicklist status title icon size option text edit " + + "button check radio box scroll list combo link tab item"); + var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); + var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + if (/[\[\]{}\(\),\.]/.test(ch)) { + if (ch == "(" && beforeParams) state.inParams = true; + else if (ch == ")") state.inParams = false; + return null; + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + else if (ch == "\\") { + stream.eat("\\"); + stream.eat(/./); + return "number"; + } + else if (ch == "/" && stream.eat("*")) { + return chain(stream, state, tokenComment); + } + else if (ch == ";" && stream.match(/ *\( *\(/)) { + return chain(stream, state, tokenUnparsed); + } + else if (ch == ";" && !state.inParams) { + stream.skipToEnd(); + return "comment"; + } + else if (ch == '"') { + stream.eat(/"/); + return "keyword"; + } + else if (ch == "$") { + stream.eatWhile(/[$_a-z0-9A-Z\.:]/); + if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) { + return "keyword"; + } + else { + state.beforeParams = true; + return "builtin"; + } + } + else if (ch == "%") { + stream.eatWhile(/[^,^\s^\(^\)]/); + state.beforeParams = true; + return "string"; + } + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + stream.eatWhile(/[\w\$_{}]/); + var word = stream.current().toLowerCase(); + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + if (functions && functions.propertyIsEnumerable(word)) { + state.beforeParams = true; + return "keyword"; + } + return null; + } + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == ";" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == ")") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + } + }; +}); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/index.html new file mode 100644 index 0000000..5923af8 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/index.html @@ -0,0 +1,179 @@ + + +CodeMirror: ML-like mode + + + + + + + + + + +
    +

    OCaml mode

    + + + + +

    F# mode

    + + + + + +

    MIME types defined: text/x-ocaml (OCaml) and text/x-fsharp (F#).

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/mllike.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/mllike.js new file mode 100644 index 0000000..04ab1c9 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/mllike/mllike.js @@ -0,0 +1,205 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('mllike', function(_config, parserConfig) { + var words = { + 'let': 'keyword', + 'rec': 'keyword', + 'in': 'keyword', + 'of': 'keyword', + 'and': 'keyword', + 'if': 'keyword', + 'then': 'keyword', + 'else': 'keyword', + 'for': 'keyword', + 'to': 'keyword', + 'while': 'keyword', + 'do': 'keyword', + 'done': 'keyword', + 'fun': 'keyword', + 'function': 'keyword', + 'val': 'keyword', + 'type': 'keyword', + 'mutable': 'keyword', + 'match': 'keyword', + 'with': 'keyword', + 'try': 'keyword', + 'open': 'builtin', + 'ignore': 'builtin', + 'begin': 'keyword', + 'end': 'keyword' + }; + + var extraWords = parserConfig.extraWords || {}; + for (var prop in extraWords) { + if (extraWords.hasOwnProperty(prop)) { + words[prop] = parserConfig.extraWords[prop]; + } + } + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + if (ch === '(') { + if (stream.eat('*')) { + state.commentLevel++; + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + } + if (ch === '~') { + stream.eatWhile(/\w/); + return 'variable-2'; + } + if (ch === '`') { + stream.eatWhile(/\w/); + return 'quote'; + } + if (ch === '/' && parserConfig.slashComments && stream.eat('/')) { + stream.skipToEnd(); + return 'comment'; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\d]/); + if (stream.eat('.')) { + stream.eatWhile(/[\d]/); + } + return 'number'; + } + if ( /[+\-*&%=<>!?|]/.test(ch)) { + return 'operator'; + } + stream.eatWhile(/\w/); + var cur = stream.current(); + return words[cur] || 'variable'; + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while(state.commentLevel > 0 && (next = stream.next()) != null) { + if (prev === '(' && next === '*') state.commentLevel++; + if (prev === '*' && next === ')') state.commentLevel--; + prev = next; + } + if (state.commentLevel <= 0) { + state.tokenize = tokenBase; + } + return 'comment'; + } + + return { + startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + + blockCommentStart: "(*", + blockCommentEnd: "*)", + lineComment: parserConfig.slashComments ? "//" : null + }; +}); + +CodeMirror.defineMIME('text/x-ocaml', { + name: 'mllike', + extraWords: { + 'succ': 'keyword', + 'trace': 'builtin', + 'exit': 'builtin', + 'print_string': 'builtin', + 'print_endline': 'builtin', + 'true': 'atom', + 'false': 'atom', + 'raise': 'keyword' + } +}); + +CodeMirror.defineMIME('text/x-fsharp', { + name: 'mllike', + extraWords: { + 'abstract': 'keyword', + 'as': 'keyword', + 'assert': 'keyword', + 'base': 'keyword', + 'class': 'keyword', + 'default': 'keyword', + 'delegate': 'keyword', + 'downcast': 'keyword', + 'downto': 'keyword', + 'elif': 'keyword', + 'exception': 'keyword', + 'extern': 'keyword', + 'finally': 'keyword', + 'global': 'keyword', + 'inherit': 'keyword', + 'inline': 'keyword', + 'interface': 'keyword', + 'internal': 'keyword', + 'lazy': 'keyword', + 'let!': 'keyword', + 'member' : 'keyword', + 'module': 'keyword', + 'namespace': 'keyword', + 'new': 'keyword', + 'null': 'keyword', + 'override': 'keyword', + 'private': 'keyword', + 'public': 'keyword', + 'return': 'keyword', + 'return!': 'keyword', + 'select': 'keyword', + 'static': 'keyword', + 'struct': 'keyword', + 'upcast': 'keyword', + 'use': 'keyword', + 'use!': 'keyword', + 'val': 'keyword', + 'when': 'keyword', + 'yield': 'keyword', + 'yield!': 'keyword', + + 'List': 'builtin', + 'Seq': 'builtin', + 'Map': 'builtin', + 'Set': 'builtin', + 'int': 'builtin', + 'string': 'builtin', + 'raise': 'builtin', + 'failwith': 'builtin', + 'not': 'builtin', + 'true': 'builtin', + 'false': 'builtin' + }, + slashComments: true +}); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/index.html new file mode 100644 index 0000000..408c3b1 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/index.html @@ -0,0 +1,67 @@ + + +CodeMirror: Modelica mode + + + + + + + + + + + + +
    +

    Modelica mode

    + +
    + + + +

    Simple mode that tries to handle Modelica as well as it can.

    + +

    MIME types defined: text/x-modelica + (Modlica code).

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/modelica.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/modelica.js new file mode 100644 index 0000000..77ec7a3 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/modelica/modelica.js @@ -0,0 +1,245 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Modelica support for CodeMirror, copyright (c) by Lennart Ochel + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +}) + +(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("modelica", function(config, parserConfig) { + + var indentUnit = config.indentUnit; + var keywords = parserConfig.keywords || {}; + var builtin = parserConfig.builtin || {}; + var atoms = parserConfig.atoms || {}; + + var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/; + var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/; + var isDigit = /[0-9]/; + var isNonDigit = /[_a-zA-Z]/; + + function tokenLineComment(stream, state) { + stream.skipToEnd(); + state.tokenize = null; + return "comment"; + } + + function tokenBlockComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == '"' && !escaped) { + state.tokenize = null; + state.sol = false; + break; + } + escaped = !escaped && ch == "\\"; + } + + return "string"; + } + + function tokenIdent(stream, state) { + stream.eatWhile(isDigit); + while (stream.eat(isDigit) || stream.eat(isNonDigit)) { } + + + var cur = stream.current(); + + if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++; + else if(state.sol && cur == "end" && state.level > 0) state.level--; + + state.tokenize = null; + state.sol = false; + + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + else if (builtin.propertyIsEnumerable(cur)) return "builtin"; + else if (atoms.propertyIsEnumerable(cur)) return "atom"; + else return "variable"; + } + + function tokenQIdent(stream, state) { + while (stream.eat(/[^']/)) { } + + state.tokenize = null; + state.sol = false; + + if(stream.eat("'")) + return "variable"; + else + return "error"; + } + + function tokenUnsignedNuber(stream, state) { + stream.eatWhile(isDigit); + if (stream.eat('.')) { + stream.eatWhile(isDigit); + } + if (stream.eat('e') || stream.eat('E')) { + if (!stream.eat('-')) + stream.eat('+'); + stream.eatWhile(isDigit); + } + + state.tokenize = null; + state.sol = false; + return "number"; + } + + // Interface + return { + startState: function() { + return { + tokenize: null, + level: 0, + sol: true + }; + }, + + token: function(stream, state) { + if(state.tokenize != null) { + return state.tokenize(stream, state); + } + + if(stream.sol()) { + state.sol = true; + } + + // WHITESPACE + if(stream.eatSpace()) { + state.tokenize = null; + return null; + } + + var ch = stream.next(); + + // LINECOMMENT + if(ch == '/' && stream.eat('/')) { + state.tokenize = tokenLineComment; + } + // BLOCKCOMMENT + else if(ch == '/' && stream.eat('*')) { + state.tokenize = tokenBlockComment; + } + // TWO SYMBOL TOKENS + else if(isDoubleOperatorChar.test(ch+stream.peek())) { + stream.next(); + state.tokenize = null; + return "operator"; + } + // SINGLE SYMBOL TOKENS + else if(isSingleOperatorChar.test(ch)) { + state.tokenize = null; + return "operator"; + } + // IDENT + else if(isNonDigit.test(ch)) { + state.tokenize = tokenIdent; + } + // Q-IDENT + else if(ch == "'" && stream.peek() && stream.peek() != "'") { + state.tokenize = tokenQIdent; + } + // STRING + else if(ch == '"') { + state.tokenize = tokenString; + } + // UNSIGNED_NUBER + else if(isDigit.test(ch)) { + state.tokenize = tokenUnsignedNuber; + } + // ERROR + else { + state.tokenize = null; + return "error"; + } + + return state.tokenize(stream, state); + }, + + indent: function(state, textAfter) { + if (state.tokenize != null) return CodeMirror.Pass; + + var level = state.level; + if(/(algorithm)/.test(textAfter)) level--; + if(/(equation)/.test(textAfter)) level--; + if(/(initial algorithm)/.test(textAfter)) level--; + if(/(initial equation)/.test(textAfter)) level--; + if(/(end)/.test(textAfter)) level--; + + if(level > 0) + return indentUnit*level; + else + return 0; + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i=0; i + +CodeMirror: NGINX mode + + + + + + + + + + + + + +
    +

    NGINX mode

    +
    + + +

    MIME types defined: text/nginx.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/nginx/nginx.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/nginx/nginx.js new file mode 100644 index 0000000..135b9cc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/nginx/nginx.js @@ -0,0 +1,178 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("nginx", function(config) { + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = words( + /* ngxDirectiveControl */ "break return rewrite set" + + /* ngxDirective */ " 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_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types 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 degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect 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 rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk 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 thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark 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 worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23" + ); + + var keywords_block = words( + /* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map" + ); + + var keywords_important = words( + /* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files" + ); + + var indentUnit = config.indentUnit, type; + function ret(style, tp) {type = tp; return style;} + + function tokenBase(stream, state) { + + + stream.eatWhile(/[\w\$_]/); + + var cur = stream.current(); + + + if (keywords.propertyIsEnumerable(cur)) { + return "keyword"; + } + else if (keywords_block.propertyIsEnumerable(cur)) { + return "variable-2"; + } + else if (keywords_important.propertyIsEnumerable(cur)) { + return "string-2"; + } + /**/ + + var ch = stream.next(); + if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());} + else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + else if (ch == "<" && stream.eat("!")) { + state.tokenize = tokenSGMLComment; + return tokenSGMLComment(stream, state); + } + else if (ch == "=") ret(null, "compare"); + else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + else if (ch == "#") { + stream.skipToEnd(); + return ret("comment", "comment"); + } + else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } + else if (/[,.+>*\/]/.test(ch)) { + return ret(null, "select-op"); + } + else if (/[;{}:\[\]]/.test(ch)) { + return ret(null, ch); + } + else { + stream.eatWhile(/[\w\\\-]/); + return ret("variable", "variable"); + } + } + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenSGMLComment(stream, state) { + var dashes = 0, ch; + while ((ch = stream.next()) != null) { + if (dashes >= 2 && ch == ">") { + state.tokenize = tokenBase; + break; + } + dashes = (ch == "-") ? dashes + 1 : 0; + } + return ret("comment", "comment"); + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) + break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + stack: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + type = null; + var style = state.tokenize(stream, state); + + var context = state.stack[state.stack.length-1]; + if (type == "hash" && context == "rule") style = "atom"; + else if (style == "variable") { + if (context == "rule") style = "number"; + else if (!context || context == "@media{") style = "tag"; + } + + if (context == "rule" && /^[\{\};]$/.test(type)) + state.stack.pop(); + if (type == "{") { + if (context == "@media") state.stack[state.stack.length-1] = "@media{"; + else state.stack.push("{"); + } + else if (type == "}") state.stack.pop(); + else if (type == "@media") state.stack.push("@media"); + else if (context == "{" && type != "comment") state.stack.push("rule"); + return style; + }, + + indent: function(state, textAfter) { + var n = state.stack.length; + if (/^\}/.test(textAfter)) + n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; + return state.baseIndent + n * indentUnit; + }, + + electricChars: "}" + }; +}); + +CodeMirror.defineMIME("text/nginx", "text/x-nginx-conf"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/index.html new file mode 100644 index 0000000..1355e71 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/index.html @@ -0,0 +1,45 @@ + + +CodeMirror: NTriples mode + + + + + + + + + +
    +

    NTriples mode

    +
    + +
    + + +

    MIME types defined: text/n-triples.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/ntriples.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/ntriples.js new file mode 100644 index 0000000..0524b1e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ntriples/ntriples.js @@ -0,0 +1,186 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/********************************************************** +* This script provides syntax highlighting support for +* the Ntriples format. +* Ntriples format specification: +* http://www.w3.org/TR/rdf-testcases/#ntriples +***********************************************************/ + +/* + The following expression defines the defined ASF grammar transitions. + + pre_subject -> + { + ( writing_subject_uri | writing_bnode_uri ) + -> pre_predicate + -> writing_predicate_uri + -> pre_object + -> writing_object_uri | writing_object_bnode | + ( + writing_object_literal + -> writing_literal_lang | writing_literal_type + ) + -> post_object + -> BEGIN + } otherwise { + -> ERROR + } +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("ntriples", function() { + + var Location = { + PRE_SUBJECT : 0, + WRITING_SUB_URI : 1, + WRITING_BNODE_URI : 2, + PRE_PRED : 3, + WRITING_PRED_URI : 4, + PRE_OBJ : 5, + WRITING_OBJ_URI : 6, + WRITING_OBJ_BNODE : 7, + WRITING_OBJ_LITERAL : 8, + WRITING_LIT_LANG : 9, + WRITING_LIT_TYPE : 10, + POST_OBJ : 11, + ERROR : 12 + }; + function transitState(currState, c) { + var currLocation = currState.location; + var ret; + + // Opening. + if (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI; + else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI; + else if(currLocation == Location.PRE_PRED && c == '<') ret = Location.WRITING_PRED_URI; + else if(currLocation == Location.PRE_OBJ && c == '<') ret = Location.WRITING_OBJ_URI; + else if(currLocation == Location.PRE_OBJ && c == '_') ret = Location.WRITING_OBJ_BNODE; + else if(currLocation == Location.PRE_OBJ && c == '"') ret = Location.WRITING_OBJ_LITERAL; + + // Closing. + else if(currLocation == Location.WRITING_SUB_URI && c == '>') ret = Location.PRE_PRED; + else if(currLocation == Location.WRITING_BNODE_URI && c == ' ') ret = Location.PRE_PRED; + else if(currLocation == Location.WRITING_PRED_URI && c == '>') ret = Location.PRE_OBJ; + else if(currLocation == Location.WRITING_OBJ_URI && c == '>') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_OBJ_BNODE && c == ' ') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ; + + // Closing typed and language literal. + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG; + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE; + + // Spaces. + else if( c == ' ' && + ( + currLocation == Location.PRE_SUBJECT || + currLocation == Location.PRE_PRED || + currLocation == Location.PRE_OBJ || + currLocation == Location.POST_OBJ + ) + ) ret = currLocation; + + // Reset. + else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT; + + // Error + else ret = Location.ERROR; + + currState.location=ret; + } + + return { + startState: function() { + return { + location : Location.PRE_SUBJECT, + uris : [], + anchors : [], + bnodes : [], + langs : [], + types : [] + }; + }, + token: function(stream, state) { + var ch = stream.next(); + if(ch == '<') { + transitState(state, ch); + var parsedURI = ''; + stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} ); + state.uris.push(parsedURI); + if( stream.match('#', false) ) return 'variable'; + stream.next(); + transitState(state, '>'); + return 'variable'; + } + if(ch == '#') { + var parsedAnchor = ''; + stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;}); + state.anchors.push(parsedAnchor); + return 'variable-2'; + } + if(ch == '>') { + transitState(state, '>'); + return 'variable'; + } + if(ch == '_') { + transitState(state, ch); + var parsedBNode = ''; + stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;}); + state.bnodes.push(parsedBNode); + stream.next(); + transitState(state, ' '); + return 'builtin'; + } + if(ch == '"') { + transitState(state, ch); + stream.eatWhile( function(c) { return c != '"'; } ); + stream.next(); + if( stream.peek() != '@' && stream.peek() != '^' ) { + transitState(state, '"'); + } + return 'string'; + } + if( ch == '@' ) { + transitState(state, '@'); + var parsedLang = ''; + stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;}); + state.langs.push(parsedLang); + stream.next(); + transitState(state, ' '); + return 'string-2'; + } + if( ch == '^' ) { + stream.next(); + transitState(state, '^'); + var parsedType = ''; + stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} ); + state.types.push(parsedType); + stream.next(); + transitState(state, '>'); + return 'variable'; + } + if( ch == ' ' ) { + transitState(state, ch); + } + if( ch == '.' ) { + transitState(state, ch); + } + } + }; +}); + +CodeMirror.defineMIME("text/n-triples", "ntriples"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/index.html new file mode 100644 index 0000000..79df581 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/index.html @@ -0,0 +1,83 @@ + + +CodeMirror: Octave mode + + + + + + + + + +
    +

    Octave mode

    + +
    + + +

    MIME types defined: text/x-octave.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/octave.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/octave.js new file mode 100644 index 0000000..a7bec03 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/octave/octave.js @@ -0,0 +1,135 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("octave", function() { + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&|\\^~<>!@'\\\\]"); + var singleDelimiters = new RegExp('^[\\(\\[\\{\\},:=;]'); + var doubleOperators = new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))"); + var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = new RegExp("^((>>=)|(<<=))"); + var expressionEnd = new RegExp("^[\\]\\)]"); + var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); + + var builtins = wordRegexp([ + 'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos', + 'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh', + 'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones', + 'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov', + 'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot', + 'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str', + 'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember' + ]); + + var keywords = wordRegexp([ + 'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction', + 'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events', + 'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until', + 'continue', 'pkg' + ]); + + + // tokenizers + function tokenTranspose(stream, state) { + if (!stream.sol() && stream.peek() === '\'') { + stream.next(); + state.tokenize = tokenBase; + return 'operator'; + } + state.tokenize = tokenBase; + return tokenBase(stream, state); + } + + + function tokenComment(stream, state) { + if (stream.match(/^.*%}/)) { + state.tokenize = tokenBase; + return 'comment'; + }; + stream.skipToEnd(); + return 'comment'; + } + + function tokenBase(stream, state) { + // whitespaces + if (stream.eatSpace()) return null; + + // Handle one line Comments + if (stream.match('%{')){ + state.tokenize = tokenComment; + stream.skipToEnd(); + return 'comment'; + } + + if (stream.match(/^[%#]/)){ + stream.skipToEnd(); + return 'comment'; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.+-]/, false)) { + if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) { + stream.tokenize = tokenBase; + return 'number'; }; + if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; + if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; + } + if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; }; + + // Handle Strings + if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } ; + if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } ; + + // Handle words + if (stream.match(keywords)) { return 'keyword'; } ; + if (stream.match(builtins)) { return 'builtin'; } ; + if (stream.match(identifiers)) { return 'variable'; } ; + + if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; }; + if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; }; + + if (stream.match(expressionEnd)) { + state.tokenize = tokenTranspose; + return null; + }; + + + // Handle non-detected items + stream.next(); + return 'error'; + }; + + + return { + startState: function() { + return { + tokenize: tokenBase + }; + }, + + token: function(stream, state) { + var style = state.tokenize(stream, state); + if (style === 'number' || style === 'variable'){ + state.tokenize = tokenTranspose; + } + return style; + } + }; +}); + +CodeMirror.defineMIME("text/x-octave", "octave"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/index.html new file mode 100644 index 0000000..f8a99ad --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/index.html @@ -0,0 +1,61 @@ + + +CodeMirror: Pascal mode + + + + + + + + + +
    +

    Pascal mode

    + + +
    + + + +

    MIME types defined: text/x-pascal.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/pascal.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/pascal.js new file mode 100644 index 0000000..2d0c3d4 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pascal/pascal.js @@ -0,0 +1,109 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pascal", function() { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = words("and array begin case const div do downto else end file for forward integer " + + "boolean char function goto if in label mod nil not of or packed procedure " + + "program record repeat set string then to type until var while with"); + var atoms = {"null": true}; + + var isOperatorChar = /[+\-*&%=<>!?|\/]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == "#" && state.startOfLine) { + stream.skipToEnd(); + return "meta"; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (ch == "(" && stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !escaped) state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == ")" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + // Interface + + return { + startState: function() { + return {tokenize: null}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + return style; + }, + + electricChars: "{}" + }; +}); + +CodeMirror.defineMIME("text/x-pascal", "pascal"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/index.html new file mode 100644 index 0000000..0c74604 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/index.html @@ -0,0 +1,66 @@ + + + + CodeMirror: PEG.js Mode + + + + + + + + + + + + +
    +

    PEG.js Mode

    +
    + +

    The PEG.js Mode

    +

    Created by Forbes Lindesay.

    +
    + + diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/pegjs.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/pegjs.js new file mode 100644 index 0000000..306e376 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pegjs/pegjs.js @@ -0,0 +1,114 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../javascript/javascript")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../javascript/javascript"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pegjs", function (config) { + var jsMode = CodeMirror.getMode(config, "javascript"); + + function identifier(stream) { + return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); + } + + return { + startState: function () { + return { + inString: false, + stringType: null, + inComment: false, + inChracterClass: false, + braced: 0, + lhs: true, + localState: null + }; + }, + token: function (stream, state) { + if (stream) + + //check for state changes + if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.inString = true; // Update state + } + if (!state.inString && !state.inComment && stream.match(/^\/\*/)) { + state.inComment = true; + } + + //return state + if (state.inString) { + while (state.inString && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.inString = false; // Clear flag + } else if (stream.peek() === '\\') { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + } else if (state.inComment) { + while (state.inComment && !stream.eol()) { + if (stream.match(/\*\//)) { + state.inComment = false; // Clear flag + } else { + stream.match(/^.[^\*]*/); + } + } + return "comment"; + } else if (state.inChracterClass) { + while (state.inChracterClass && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { + state.inChracterClass = false; + } + } + } else if (stream.peek() === '[') { + stream.next(); + state.inChracterClass = true; + return 'bracket'; + } else if (stream.match(/^\/\//)) { + stream.skipToEnd(); + return "comment"; + } else if (state.braced || stream.peek() === '{') { + if (state.localState === null) { + state.localState = jsMode.startState(); + } + var token = jsMode.token(stream, state.localState); + var text = stream.current(); + if (!token) { + for (var i = 0; i < text.length; i++) { + if (text[i] === '{') { + state.braced++; + } else if (text[i] === '}') { + state.braced--; + } + }; + } + return token; + } else if (identifier(stream)) { + if (stream.peek() === ':') { + return 'variable'; + } + return 'variable-2'; + } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { + stream.next(); + return 'bracket'; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; +}, "javascript"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/index.html new file mode 100644 index 0000000..8c1021c --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/index.html @@ -0,0 +1,75 @@ + + +CodeMirror: Perl mode + + + + + + + + + +
    +

    Perl mode

    + + +
    + + + +

    MIME types defined: text/x-perl.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/perl.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/perl.js new file mode 100644 index 0000000..bef62bc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/perl/perl.js @@ -0,0 +1,837 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08) +// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com) + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("perl",function(){ + // http://perldoc.perl.org + var PERL={ // null - magic touch + // 1 - keyword + // 2 - def + // 3 - atom + // 4 - operator + // 5 - variable-2 (predefined) + // [x,y] - x=1,2,3; y=must be defined if x{...} + // PERL operators + '->' : 4, + '++' : 4, + '--' : 4, + '**' : 4, + // ! ~ \ and unary + and - + '=~' : 4, + '!~' : 4, + '*' : 4, + '/' : 4, + '%' : 4, + 'x' : 4, + '+' : 4, + '-' : 4, + '.' : 4, + '<<' : 4, + '>>' : 4, + // named unary operators + '<' : 4, + '>' : 4, + '<=' : 4, + '>=' : 4, + 'lt' : 4, + 'gt' : 4, + 'le' : 4, + 'ge' : 4, + '==' : 4, + '!=' : 4, + '<=>' : 4, + 'eq' : 4, + 'ne' : 4, + 'cmp' : 4, + '~~' : 4, + '&' : 4, + '|' : 4, + '^' : 4, + '&&' : 4, + '||' : 4, + '//' : 4, + '..' : 4, + '...' : 4, + '?' : 4, + ':' : 4, + '=' : 4, + '+=' : 4, + '-=' : 4, + '*=' : 4, // etc. ??? + ',' : 4, + '=>' : 4, + '::' : 4, + // list operators (rightward) + 'not' : 4, + 'and' : 4, + 'or' : 4, + 'xor' : 4, + // PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;) + 'BEGIN' : [5,1], + 'END' : [5,1], + 'PRINT' : [5,1], + 'PRINTF' : [5,1], + 'GETC' : [5,1], + 'READ' : [5,1], + 'READLINE' : [5,1], + 'DESTROY' : [5,1], + 'TIE' : [5,1], + 'TIEHANDLE' : [5,1], + 'UNTIE' : [5,1], + 'STDIN' : 5, + 'STDIN_TOP' : 5, + 'STDOUT' : 5, + 'STDOUT_TOP' : 5, + 'STDERR' : 5, + 'STDERR_TOP' : 5, + '$ARG' : 5, + '$_' : 5, + '@ARG' : 5, + '@_' : 5, + '$LIST_SEPARATOR' : 5, + '$"' : 5, + '$PROCESS_ID' : 5, + '$PID' : 5, + '$$' : 5, + '$REAL_GROUP_ID' : 5, + '$GID' : 5, + '$(' : 5, + '$EFFECTIVE_GROUP_ID' : 5, + '$EGID' : 5, + '$)' : 5, + '$PROGRAM_NAME' : 5, + '$0' : 5, + '$SUBSCRIPT_SEPARATOR' : 5, + '$SUBSEP' : 5, + '$;' : 5, + '$REAL_USER_ID' : 5, + '$UID' : 5, + '$<' : 5, + '$EFFECTIVE_USER_ID' : 5, + '$EUID' : 5, + '$>' : 5, + '$a' : 5, + '$b' : 5, + '$COMPILING' : 5, + '$^C' : 5, + '$DEBUGGING' : 5, + '$^D' : 5, + '${^ENCODING}' : 5, + '$ENV' : 5, + '%ENV' : 5, + '$SYSTEM_FD_MAX' : 5, + '$^F' : 5, + '@F' : 5, + '${^GLOBAL_PHASE}' : 5, + '$^H' : 5, + '%^H' : 5, + '@INC' : 5, + '%INC' : 5, + '$INPLACE_EDIT' : 5, + '$^I' : 5, + '$^M' : 5, + '$OSNAME' : 5, + '$^O' : 5, + '${^OPEN}' : 5, + '$PERLDB' : 5, + '$^P' : 5, + '$SIG' : 5, + '%SIG' : 5, + '$BASETIME' : 5, + '$^T' : 5, + '${^TAINT}' : 5, + '${^UNICODE}' : 5, + '${^UTF8CACHE}' : 5, + '${^UTF8LOCALE}' : 5, + '$PERL_VERSION' : 5, + '$^V' : 5, + '${^WIN32_SLOPPY_STAT}' : 5, + '$EXECUTABLE_NAME' : 5, + '$^X' : 5, + '$1' : 5, // - regexp $1, $2... + '$MATCH' : 5, + '$&' : 5, + '${^MATCH}' : 5, + '$PREMATCH' : 5, + '$`' : 5, + '${^PREMATCH}' : 5, + '$POSTMATCH' : 5, + "$'" : 5, + '${^POSTMATCH}' : 5, + '$LAST_PAREN_MATCH' : 5, + '$+' : 5, + '$LAST_SUBMATCH_RESULT' : 5, + '$^N' : 5, + '@LAST_MATCH_END' : 5, + '@+' : 5, + '%LAST_PAREN_MATCH' : 5, + '%+' : 5, + '@LAST_MATCH_START' : 5, + '@-' : 5, + '%LAST_MATCH_START' : 5, + '%-' : 5, + '$LAST_REGEXP_CODE_RESULT' : 5, + '$^R' : 5, + '${^RE_DEBUG_FLAGS}' : 5, + '${^RE_TRIE_MAXBUF}' : 5, + '$ARGV' : 5, + '@ARGV' : 5, + 'ARGV' : 5, + 'ARGVOUT' : 5, + '$OUTPUT_FIELD_SEPARATOR' : 5, + '$OFS' : 5, + '$,' : 5, + '$INPUT_LINE_NUMBER' : 5, + '$NR' : 5, + '$.' : 5, + '$INPUT_RECORD_SEPARATOR' : 5, + '$RS' : 5, + '$/' : 5, + '$OUTPUT_RECORD_SEPARATOR' : 5, + '$ORS' : 5, + '$\\' : 5, + '$OUTPUT_AUTOFLUSH' : 5, + '$|' : 5, + '$ACCUMULATOR' : 5, + '$^A' : 5, + '$FORMAT_FORMFEED' : 5, + '$^L' : 5, + '$FORMAT_PAGE_NUMBER' : 5, + '$%' : 5, + '$FORMAT_LINES_LEFT' : 5, + '$-' : 5, + '$FORMAT_LINE_BREAK_CHARACTERS' : 5, + '$:' : 5, + '$FORMAT_LINES_PER_PAGE' : 5, + '$=' : 5, + '$FORMAT_TOP_NAME' : 5, + '$^' : 5, + '$FORMAT_NAME' : 5, + '$~' : 5, + '${^CHILD_ERROR_NATIVE}' : 5, + '$EXTENDED_OS_ERROR' : 5, + '$^E' : 5, + '$EXCEPTIONS_BEING_CAUGHT' : 5, + '$^S' : 5, + '$WARNING' : 5, + '$^W' : 5, + '${^WARNING_BITS}' : 5, + '$OS_ERROR' : 5, + '$ERRNO' : 5, + '$!' : 5, + '%OS_ERROR' : 5, + '%ERRNO' : 5, + '%!' : 5, + '$CHILD_ERROR' : 5, + '$?' : 5, + '$EVAL_ERROR' : 5, + '$@' : 5, + '$OFMT' : 5, + '$#' : 5, + '$*' : 5, + '$ARRAY_BASE' : 5, + '$[' : 5, + '$OLD_PERL_VERSION' : 5, + '$]' : 5, + // PERL blocks + 'if' :[1,1], + elsif :[1,1], + 'else' :[1,1], + 'while' :[1,1], + unless :[1,1], + 'for' :[1,1], + foreach :[1,1], + // PERL functions + 'abs' :1, // - absolute value function + accept :1, // - accept an incoming socket connect + alarm :1, // - schedule a SIGALRM + 'atan2' :1, // - arctangent of Y/X in the range -PI to PI + bind :1, // - binds an address to a socket + binmode :1, // - prepare binary files for I/O + bless :1, // - create an object + bootstrap :1, // + 'break' :1, // - break out of a "given" block + caller :1, // - get context of the current subroutine call + chdir :1, // - change your current working directory + chmod :1, // - changes the permissions on a list of files + chomp :1, // - remove a trailing record separator from a string + chop :1, // - remove the last character from a string + chown :1, // - change the owership on a list of files + chr :1, // - get character this number represents + chroot :1, // - make directory new root for path lookups + close :1, // - close file (or pipe or socket) handle + closedir :1, // - close directory handle + connect :1, // - connect to a remote socket + 'continue' :[1,1], // - optional trailing block in a while or foreach + 'cos' :1, // - cosine function + crypt :1, // - one-way passwd-style encryption + dbmclose :1, // - breaks binding on a tied dbm file + dbmopen :1, // - create binding on a tied dbm file + 'default' :1, // + defined :1, // - test whether a value, variable, or function is defined + 'delete' :1, // - deletes a value from a hash + die :1, // - raise an exception or bail out + 'do' :1, // - turn a BLOCK into a TERM + dump :1, // - create an immediate core dump + each :1, // - retrieve the next key/value pair from a hash + endgrent :1, // - be done using group file + endhostent :1, // - be done using hosts file + endnetent :1, // - be done using networks file + endprotoent :1, // - be done using protocols file + endpwent :1, // - be done using passwd file + endservent :1, // - be done using services file + eof :1, // - test a filehandle for its end + 'eval' :1, // - catch exceptions or compile and run code + 'exec' :1, // - abandon this program to run another + exists :1, // - test whether a hash key is present + exit :1, // - terminate this program + 'exp' :1, // - raise I to a power + fcntl :1, // - file control system call + fileno :1, // - return file descriptor from filehandle + flock :1, // - lock an entire file with an advisory lock + fork :1, // - create a new process just like this one + format :1, // - declare a picture format with use by the write() function + formline :1, // - internal function used for formats + getc :1, // - get the next character from the filehandle + getgrent :1, // - get next group record + getgrgid :1, // - get group record given group user ID + getgrnam :1, // - get group record given group name + gethostbyaddr :1, // - get host record given its address + gethostbyname :1, // - get host record given name + gethostent :1, // - get next hosts record + getlogin :1, // - return who logged in at this tty + getnetbyaddr :1, // - get network record given its address + getnetbyname :1, // - get networks record given name + getnetent :1, // - get next networks record + getpeername :1, // - find the other end of a socket connection + getpgrp :1, // - get process group + getppid :1, // - get parent process ID + getpriority :1, // - get current nice value + getprotobyname :1, // - get protocol record given name + getprotobynumber :1, // - get protocol record numeric protocol + getprotoent :1, // - get next protocols record + getpwent :1, // - get next passwd record + getpwnam :1, // - get passwd record given user login name + getpwuid :1, // - get passwd record given user ID + getservbyname :1, // - get services record given its name + getservbyport :1, // - get services record given numeric port + getservent :1, // - get next services record + getsockname :1, // - retrieve the sockaddr for a given socket + getsockopt :1, // - get socket options on a given socket + given :1, // + glob :1, // - expand filenames using wildcards + gmtime :1, // - convert UNIX time into record or string using Greenwich time + 'goto' :1, // - create spaghetti code + grep :1, // - locate elements in a list test true against a given criterion + hex :1, // - convert a string to a hexadecimal number + 'import' :1, // - patch a module's namespace into your own + index :1, // - find a substring within a string + 'int' :1, // - get the integer portion of a number + ioctl :1, // - system-dependent device control system call + 'join' :1, // - join a list into a string using a separator + keys :1, // - retrieve list of indices from a hash + kill :1, // - send a signal to a process or process group + last :1, // - exit a block prematurely + lc :1, // - return lower-case version of a string + lcfirst :1, // - return a string with just the next letter in lower case + length :1, // - return the number of bytes in a string + 'link' :1, // - create a hard link in the filesytem + listen :1, // - register your socket as a server + local : 2, // - create a temporary value for a global variable (dynamic scoping) + localtime :1, // - convert UNIX time into record or string using local time + lock :1, // - get a thread lock on a variable, subroutine, or method + 'log' :1, // - retrieve the natural logarithm for a number + lstat :1, // - stat a symbolic link + m :null, // - match a string with a regular expression pattern + map :1, // - apply a change to a list to get back a new list with the changes + mkdir :1, // - create a directory + msgctl :1, // - SysV IPC message control operations + msgget :1, // - get SysV IPC message queue + msgrcv :1, // - receive a SysV IPC message from a message queue + msgsnd :1, // - send a SysV IPC message to a message queue + my : 2, // - declare and assign a local variable (lexical scoping) + 'new' :1, // + next :1, // - iterate a block prematurely + no :1, // - unimport some module symbols or semantics at compile time + oct :1, // - convert a string to an octal number + open :1, // - open a file, pipe, or descriptor + opendir :1, // - open a directory + ord :1, // - find a character's numeric representation + our : 2, // - declare and assign a package variable (lexical scoping) + pack :1, // - convert a list into a binary representation + 'package' :1, // - declare a separate global namespace + pipe :1, // - open a pair of connected filehandles + pop :1, // - remove the last element from an array and return it + pos :1, // - find or set the offset for the last/next m//g search + print :1, // - output a list to a filehandle + printf :1, // - output a formatted list to a filehandle + prototype :1, // - get the prototype (if any) of a subroutine + push :1, // - append one or more elements to an array + q :null, // - singly quote a string + qq :null, // - doubly quote a string + qr :null, // - Compile pattern + quotemeta :null, // - quote regular expression magic characters + qw :null, // - quote a list of words + qx :null, // - backquote quote a string + rand :1, // - retrieve the next pseudorandom number + read :1, // - fixed-length buffered input from a filehandle + readdir :1, // - get a directory from a directory handle + readline :1, // - fetch a record from a file + readlink :1, // - determine where a symbolic link is pointing + readpipe :1, // - execute a system command and collect standard output + recv :1, // - receive a message over a Socket + redo :1, // - start this loop iteration over again + ref :1, // - find out the type of thing being referenced + rename :1, // - change a filename + require :1, // - load in external functions from a library at runtime + reset :1, // - clear all variables of a given name + 'return' :1, // - get out of a function early + reverse :1, // - flip a string or a list + rewinddir :1, // - reset directory handle + rindex :1, // - right-to-left substring search + rmdir :1, // - remove a directory + s :null, // - replace a pattern with a string + say :1, // - print with newline + scalar :1, // - force a scalar context + seek :1, // - reposition file pointer for random-access I/O + seekdir :1, // - reposition directory pointer + select :1, // - reset default output or do I/O multiplexing + semctl :1, // - SysV semaphore control operations + semget :1, // - get set of SysV semaphores + semop :1, // - SysV semaphore operations + send :1, // - send a message over a socket + setgrent :1, // - prepare group file for use + sethostent :1, // - prepare hosts file for use + setnetent :1, // - prepare networks file for use + setpgrp :1, // - set the process group of a process + setpriority :1, // - set a process's nice value + setprotoent :1, // - prepare protocols file for use + setpwent :1, // - prepare passwd file for use + setservent :1, // - prepare services file for use + setsockopt :1, // - set some socket options + shift :1, // - remove the first element of an array, and return it + shmctl :1, // - SysV shared memory operations + shmget :1, // - get SysV shared memory segment identifier + shmread :1, // - read SysV shared memory + shmwrite :1, // - write SysV shared memory + shutdown :1, // - close down just half of a socket connection + 'sin' :1, // - return the sine of a number + sleep :1, // - block for some number of seconds + socket :1, // - create a socket + socketpair :1, // - create a pair of sockets + 'sort' :1, // - sort a list of values + splice :1, // - add or remove elements anywhere in an array + 'split' :1, // - split up a string using a regexp delimiter + sprintf :1, // - formatted print into a string + 'sqrt' :1, // - square root function + srand :1, // - seed the random number generator + stat :1, // - get a file's status information + state :1, // - declare and assign a state variable (persistent lexical scoping) + study :1, // - optimize input data for repeated searches + 'sub' :1, // - declare a subroutine, possibly anonymously + 'substr' :1, // - get or alter a portion of a stirng + symlink :1, // - create a symbolic link to a file + syscall :1, // - execute an arbitrary system call + sysopen :1, // - open a file, pipe, or descriptor + sysread :1, // - fixed-length unbuffered input from a filehandle + sysseek :1, // - position I/O pointer on handle used with sysread and syswrite + system :1, // - run a separate program + syswrite :1, // - fixed-length unbuffered output to a filehandle + tell :1, // - get current seekpointer on a filehandle + telldir :1, // - get current seekpointer on a directory handle + tie :1, // - bind a variable to an object class + tied :1, // - get a reference to the object underlying a tied variable + time :1, // - return number of seconds since 1970 + times :1, // - return elapsed time for self and child processes + tr :null, // - transliterate a string + truncate :1, // - shorten a file + uc :1, // - return upper-case version of a string + ucfirst :1, // - return a string with just the next letter in upper case + umask :1, // - set file creation mode mask + undef :1, // - remove a variable or function definition + unlink :1, // - remove one link to a file + unpack :1, // - convert binary structure into normal perl variables + unshift :1, // - prepend more elements to the beginning of a list + untie :1, // - break a tie binding to a variable + use :1, // - load in a module at compile time + utime :1, // - set a file's last access and modify times + values :1, // - return a list of the values in a hash + vec :1, // - test or set particular bits in a string + wait :1, // - wait for any child process to die + waitpid :1, // - wait for a particular child process to die + wantarray :1, // - get void vs scalar vs list context of current subroutine call + warn :1, // - print debugging info + when :1, // + write :1, // - print a picture record + y :null}; // - transliterate a string + + var RXstyle="string-2"; + var RXmodifiers=/[goseximacplud]/; // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type + + function tokenChain(stream,state,chain,style,tail){ // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;) + state.chain=null; // 12 3tail + state.style=null; + state.tail=null; + state.tokenize=function(stream,state){ + var e=false,c,i=0; + while(c=stream.next()){ + if(c===chain[i]&&!e){ + if(chain[++i]!==undefined){ + state.chain=chain[i]; + state.style=style; + state.tail=tail;} + else if(tail) + stream.eatWhile(tail); + state.tokenize=tokenPerl; + return style;} + e=!e&&c=="\\";} + return style;}; + return state.tokenize(stream,state);} + + function tokenSOMETHING(stream,state,string){ + state.tokenize=function(stream,state){ + if(stream.string==string) + state.tokenize=tokenPerl; + stream.skipToEnd(); + return "string";}; + return state.tokenize(stream,state);} + + function tokenPerl(stream,state){ + if(stream.eatSpace()) + return null; + if(state.chain) + return tokenChain(stream,state,state.chain,state.style,state.tail); + if(stream.match(/^\-?[\d\.]/,false)) + if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) + return 'number'; + if(stream.match(/^<<(?=\w)/)){ // NOTE: <"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(c=="q"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"string");}} + else if(c=="w"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"bracket");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"bracket");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"bracket");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"bracket");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"bracket");}} + else if(c=="r"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(/[\^'"!~\/(\[{<]/.test(c)){ + if(c=="("){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[stream.eat(c)],"string");}}}} + if(ch=="m"){ + var c=look(stream, -2); + if(!(c&&/\w/.test(c))){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[c],RXstyle,RXmodifiers);} + if(c=="("){ + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}} + if(ch=="s"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="y"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="t"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat("r");if(c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}} + if(ch=="`"){ + return tokenChain(stream,state,[ch],"variable-2");} + if(ch=="/"){ + if(!/~\s*$/.test(prefix(stream))) + return "operator"; + else + return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);} + if(ch=="$"){ + var p=stream.pos; + if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}")) + return "variable-2"; + else + stream.pos=p;} + if(/[$@%]/.test(ch)){ + var p=stream.pos; + if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){ + var c=stream.current(); + if(PERL[c]) + return "variable-2";} + stream.pos=p;} + if(/[$@%&]/.test(ch)){ + if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){ + var c=stream.current(); + if(PERL[c]) + return "variable-2"; + else + return "variable";}} + if(ch=="#"){ + if(look(stream, -2)!="$"){ + stream.skipToEnd(); + return "comment";}} + if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){ + var p=stream.pos; + stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/); + if(PERL[stream.current()]) + return "operator"; + else + stream.pos=p;} + if(ch=="_"){ + if(stream.pos==1){ + if(suffix(stream, 6)=="_END__"){ + return tokenChain(stream,state,['\0'],"comment");} + else if(suffix(stream, 7)=="_DATA__"){ + return tokenChain(stream,state,['\0'],"variable-2");} + else if(suffix(stream, 7)=="_C__"){ + return tokenChain(stream,state,['\0'],"string");}}} + if(/\w/.test(ch)){ + var p=stream.pos; + if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}")) + return "string"; + else + stream.pos=p;} + if(/[A-Z]/.test(ch)){ + var l=look(stream, -2); + var p=stream.pos; + stream.eatWhile(/[A-Z_]/); + if(/[\da-z]/.test(look(stream, 0))){ + stream.pos=p;} + else{ + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";}} + if(/[a-zA-Z_]/.test(ch)){ + var l=look(stream, -2); + stream.eatWhile(/\w/); + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";} + return null;} + + return { + startState: function() { + return { + tokenize: tokenPerl, + chain: null, + style: null, + tail: null + }; + }, + token: function(stream, state) { + return (state.tokenize || tokenPerl)(stream, state); + }, + lineComment: '#' + }; +}); + +CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); + +CodeMirror.defineMIME("text/x-perl", "perl"); + +// it's like "peek", but need for look-ahead or look-behind if index < 0 +function look(stream, c){ + return stream.string.charAt(stream.pos+(c||0)); +} + +// return a part of prefix of current stream from current position +function prefix(stream, c){ + if(c){ + var x=stream.pos-c; + return stream.string.substr((x>=0?x:0),c);} + else{ + return stream.string.substr(0,stream.pos-1); + } +} + +// return a part of suffix of current stream from current position +function suffix(stream, c){ + var y=stream.string.length; + var x=y-stream.pos+1; + return stream.string.substr(stream.pos,(c&&c=(y=stream.string.length-1)) + stream.pos=y; + else + stream.pos=x; +} + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/index.html new file mode 100644 index 0000000..80bf649 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/index.html @@ -0,0 +1,64 @@ + + +CodeMirror: PHP mode + + + + + + + + + + + + + + + +
    +

    PHP mode

    +
    + + + +

    Simple HTML/PHP mode based on + the C-like mode. Depends on XML, + JavaScript, CSS, HTMLMixed, and C-like modes.

    + +

    MIME types defined: application/x-httpd-php (HTML with PHP code), text/x-php (plain, non-wrapped PHP code).

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/php.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/php.js new file mode 100644 index 0000000..e112d91 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/php.js @@ -0,0 +1,226 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../clike/clike")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // Helper for stringWithEscapes + function matchSequence(list, end) { + if (list.length == 0) return stringWithEscapes(end); + return function (stream, state) { + var patterns = list[0]; + for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { + state.tokenize = matchSequence(list.slice(1), end); + return patterns[i][1]; + } + state.tokenize = stringWithEscapes(end); + return "string"; + }; + } + function stringWithEscapes(closing) { + return function(stream, state) { return stringWithEscapes_(stream, state, closing); }; + } + function stringWithEscapes_(stream, state, closing) { + // "Complex" syntax + if (stream.match("${", false) || stream.match("{$", false)) { + state.tokenize = null; + return "string"; + } + + // Simple syntax + if (stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) { + // After the variable name there may appear array or object operator. + if (stream.match("[", false)) { + // Match array operator + state.tokenize = matchSequence([ + [["[", null]], + [[/\d[\w\.]*/, "number"], + [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], + [/[\w\$]+/, "variable"]], + [["]", null]] + ], closing); + } + if (stream.match(/\-\>\w/, false)) { + // Match object operator + state.tokenize = matchSequence([ + [["->", null]], + [[/[\w]+/, "variable"]] + ], closing); + } + return "variable-2"; + } + + var escaped = false; + // Normal string + while (!stream.eol() && + (escaped || (!stream.match("{$", false) && + !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) { + if (!escaped && stream.match(closing)) { + state.tokenize = null; + state.tokStack.pop(); state.tokStack.pop(); + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + var phpKeywords = "abstract and array as break case catch class clone const continue declare default " + + "do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final " + + "for foreach function global goto if implements interface instanceof namespace " + + "new or private protected public static switch throw trait try use var while xor " + + "die echo empty exit eval include include_once isset list require require_once return " + + "print unset __halt_compiler self static parent yield insteadof finally"; + var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"; + var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count"; + CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" ")); + CodeMirror.registerHelper("wordChars", "php", /[\w$]/); + + var phpConfig = { + name: "clike", + helperType: "php", + keywords: keywords(phpKeywords), + blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"), + atoms: keywords(phpAtoms), + builtin: keywords(phpBuiltin), + multiLineStrings: true, + hooks: { + "$": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "variable-2"; + }, + "<": function(stream, state) { + if (stream.match(/<", false)) stream.next(); + return "comment"; + }, + "/": function(stream) { + if (stream.eat("/")) { + while (!stream.eol() && !stream.match("?>", false)) stream.next(); + return "comment"; + } + return false; + }, + '"': function(_stream, state) { + (state.tokStack || (state.tokStack = [])).push('"', 0); + state.tokenize = stringWithEscapes('"'); + return "string"; + }, + "{": function(_stream, state) { + if (state.tokStack && state.tokStack.length) + state.tokStack[state.tokStack.length - 1]++; + return false; + }, + "}": function(_stream, state) { + if (state.tokStack && state.tokStack.length > 0 && + !--state.tokStack[state.tokStack.length - 1]) { + state.tokenize = stringWithEscapes(state.tokStack[state.tokStack.length - 2]); + } + return false; + } + } + }; + + CodeMirror.defineMode("php", function(config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, "text/html"); + var phpMode = CodeMirror.getMode(config, phpConfig); + + function dispatch(stream, state) { + var isPHP = state.curMode == phpMode; + if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null; + if (!isPHP) { + if (stream.match(/^<\?\w*/)) { + state.curMode = phpMode; + state.curState = state.php; + return "meta"; + } + if (state.pending == '"' || state.pending == "'") { + while (!stream.eol() && stream.next() != state.pending) {} + var style = "string"; + } else if (state.pending && stream.pos < state.pending.end) { + stream.pos = state.pending.end; + var style = state.pending.style; + } else { + var style = htmlMode.token(stream, state.curState); + } + if (state.pending) state.pending = null; + var cur = stream.current(), openPHP = cur.search(/<\?/), m; + if (openPHP != -1) { + if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0]; + else state.pending = {end: stream.pos, style: style}; + stream.backUp(cur.length - openPHP); + } + return style; + } else if (isPHP && state.php.tokenize == null && stream.match("?>")) { + state.curMode = htmlMode; + state.curState = state.html; + return "meta"; + } else { + return phpMode.token(stream, state.curState); + } + } + + return { + startState: function() { + var html = CodeMirror.startState(htmlMode), php = CodeMirror.startState(phpMode); + return {html: html, + php: php, + curMode: parserConfig.startOpen ? phpMode : htmlMode, + curState: parserConfig.startOpen ? php : html, + pending: null}; + }, + + copyState: function(state) { + var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), + php = state.php, phpNew = CodeMirror.copyState(phpMode, php), cur; + if (state.curMode == htmlMode) cur = htmlNew; + else cur = phpNew; + return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, + pending: state.pending}; + }, + + token: dispatch, + + indent: function(state, textAfter) { + if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || + (state.curMode == phpMode && /^\?>/.test(textAfter))) + return htmlMode.indent(state.html, textAfter); + return state.curMode.indent(state.curState, textAfter); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + + innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } + }; + }, "htmlmixed", "clike"); + + CodeMirror.defineMIME("application/x-httpd-php", "php"); + CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); + CodeMirror.defineMIME("text/x-php", phpConfig); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/test.js new file mode 100644 index 0000000..e2ecefc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/php/test.js @@ -0,0 +1,154 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "php"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT('simple_test', + '[meta ]'); + + MT('variable_interpolation_non_alphanumeric', + '[meta $/$\\$}$\\\"$:$;$?$|$[[$]]$+$=aaa"]', + '[meta ?>]'); + + MT('variable_interpolation_digits', + '[meta ]'); + + MT('variable_interpolation_simple_syntax_1', + '[meta ]'); + + MT('variable_interpolation_simple_syntax_2', + '[meta ]'); + + MT('variable_interpolation_simple_syntax_3', + '[meta [variable aaaaa][string .aaaaaa"];', + '[keyword echo] [string "aaa][variable-2 $aaaa][string ->][variable-2 $aaaaa][string .aaaaaa"];', + '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string [[2]].aaaaaa"];', + '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string ->aaaa2.aaaaaa"];', + '[meta ?>]'); + + MT('variable_interpolation_escaping', + '[meta aaa.aaa"];', + '[keyword echo] [string "aaa\\$aaaa[[2]]aaa.aaa"];', + '[keyword echo] [string "aaa\\$aaaa[[asd]]aaa.aaa"];', + '[keyword echo] [string "aaa{\\$aaaa->aaa.aaa"];', + '[keyword echo] [string "aaa{\\$aaaa[[2]]aaa.aaa"];', + '[keyword echo] [string "aaa{\\aaaaa[[asd]]aaa.aaa"];', + '[keyword echo] [string "aaa\\${aaaa->aaa.aaa"];', + '[keyword echo] [string "aaa\\${aaaa[[2]]aaa.aaa"];', + '[keyword echo] [string "aaa\\${aaaa[[asd]]aaa.aaa"];', + '[meta ?>]'); + + MT('variable_interpolation_complex_syntax_1', + '[meta aaa.aaa"];', + '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa]}[string ->aaa.aaa"];', + '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa][[',' [number 42]',']]}[string ->aaa.aaa"];', + '[keyword echo] [string "aaa][variable-2 $]{[variable aaaa][meta ?>]aaaaaa'); + + MT('variable_interpolation_complex_syntax_2', + '[meta } $aaaaaa.aaa"];', + '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*}?>*/][[',' [string "aaa][variable-2 $aaa][string {}][variable-2 $]{[variable aaa]}[string "]',']]}[string ->aaa.aaa"];', + '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*} } $aaa } */]}[string ->aaa.aaa"];'); + + + function build_recursive_monsters(nt, t, n){ + var monsters = [t]; + for (var i = 1; i <= n; ++i) + monsters[i] = nt.join(monsters[i - 1]); + return monsters; + } + + var m1 = build_recursive_monsters( + ['[string "][variable-2 $]{[variable aaa] [operator +] ', '}[string "]'], + '[comment /* }?>} */] [string "aaa][variable-2 $aaa][string .aaa"]', + 10 + ); + + MT('variable_interpolation_complex_syntax_3_1', + '[meta ]'); + + var m2 = build_recursive_monsters( + ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', '}[string .a"]'], + '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', + 5 + ); + + MT('variable_interpolation_complex_syntax_3_2', + '[meta ]'); + + function build_recursive_monsters_2(mf1, mf2, nt, t, n){ + var monsters = [t]; + for (var i = 1; i <= n; ++i) + monsters[i] = nt[0] + mf1[i - 1] + nt[1] + mf2[i - 1] + nt[2] + monsters[i - 1] + nt[3]; + return monsters; + } + + var m3 = build_recursive_monsters_2( + m1, + m2, + ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', ' [operator +] ', '}[string .a"]'], + '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', + 4 + ); + + MT('variable_interpolation_complex_syntax_3_3', + '[meta ]'); + + MT("variable_interpolation_heredoc", + "[meta + +CodeMirror: Pig Latin mode + + + + + + + + + +
    +

    Pig Latin mode

    +
    + + + +

    + Simple mode that handles Pig Latin language. +

    + +

    MIME type defined: text/x-pig + (PIG code) + +

    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pig/pig.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pig/pig.js new file mode 100644 index 0000000..c74b2cc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/pig/pig.js @@ -0,0 +1,188 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/* + * Pig Latin Mode for CodeMirror 2 + * @author Prasanth Jayachandran + * @link https://github.com/prasanthj/pig-codemirror-2 + * This implementation is adapted from PL/SQL mode in CodeMirror 2. + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pig", function(_config, parserConfig) { + var keywords = parserConfig.keywords, + builtins = parserConfig.builtins, + types = parserConfig.types, + multiLineStrings = parserConfig.multiLineStrings; + + var isOperatorChar = /[*+\-%<>=&?:\/!|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + var type; + function ret(tp, style) { + type = tp; + return style; + } + + function tokenComment(stream, state) { + var isEnd = false; + var ch; + while(ch = stream.next()) { + if(ch == "/" && isEnd) { + state.tokenize = tokenBase; + break; + } + isEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = tokenBase; + return ret("string", "error"); + }; + } + + function tokenBase(stream, state) { + var ch = stream.next(); + + // is a start of string? + if (ch == '"' || ch == "'") + return chain(stream, state, tokenString(ch)); + // is it one of the special chars + else if(/[\[\]{}\(\),;\.]/.test(ch)) + return ret(ch); + // is it a number? + else if(/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return ret("number", "number"); + } + // multi line comment or operator + else if (ch == "/") { + if (stream.eat("*")) { + return chain(stream, state, tokenComment); + } + else { + stream.eatWhile(isOperatorChar); + return ret("operator", "operator"); + } + } + // single line comment or operator + else if (ch=="-") { + if(stream.eat("-")){ + stream.skipToEnd(); + return ret("comment", "comment"); + } + else { + stream.eatWhile(isOperatorChar); + return ret("operator", "operator"); + } + } + // is it an operator + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return ret("operator", "operator"); + } + else { + // get the while word + stream.eatWhile(/[\w\$_]/); + // is it one of the listed keywords? + if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { + if (stream.eat(")") || stream.eat(".")) { + //keywords can be used as variables like flatten(group), group.$0 etc.. + } + else { + return ("keyword", "keyword"); + } + } + // is it one of the builtin functions? + if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) + { + return ("keyword", "variable-2"); + } + // is it one of the listed types? + if (types && types.propertyIsEnumerable(stream.current().toUpperCase())) + return ("keyword", "variable-3"); + // default is a 'variable' + return ret("variable", "pig-word"); + } + } + + // Interface + return { + startState: function() { + return { + tokenize: tokenBase, + startOfLine: true + }; + }, + + token: function(stream, state) { + if(stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + } + }; +}); + +(function() { + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // builtin funcs taken from trunk revision 1303237 + var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " + + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " + + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " + + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " + + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " + + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " + + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " + + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " + + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " + + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; + + // taken from QueryLexer.g + var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " + + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " + + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " + + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " + + "NEQ MATCHES TRUE FALSE DUMP"; + + // data types + var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "; + + CodeMirror.defineMIME("text/x-pig", { + name: "pig", + builtins: keywords(pBuiltins), + keywords: keywords(pKeywords), + types: keywords(pTypes) + }); + + CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" ")); +}()); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/index.html new file mode 100644 index 0000000..f885302 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/index.html @@ -0,0 +1,53 @@ + + +CodeMirror: Properties files mode + + + + + + + + + +
    +

    Properties files mode

    +
    + + +

    MIME types defined: text/x-properties, + text/x-ini.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/properties.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/properties.js new file mode 100644 index 0000000..0740084 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/properties/properties.js @@ -0,0 +1,78 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("properties", function() { + return { + token: function(stream, state) { + var sol = stream.sol() || state.afterSection; + var eol = stream.eol(); + + state.afterSection = false; + + if (sol) { + if (state.nextMultiline) { + state.inMultiline = true; + state.nextMultiline = false; + } else { + state.position = "def"; + } + } + + if (eol && ! state.nextMultiline) { + state.inMultiline = false; + state.position = "def"; + } + + if (sol) { + while(stream.eatSpace()); + } + + var ch = stream.next(); + + if (sol && (ch === "#" || ch === "!" || ch === ";")) { + state.position = "comment"; + stream.skipToEnd(); + return "comment"; + } else if (sol && ch === "[") { + state.afterSection = true; + stream.skipTo("]"); stream.eat("]"); + return "header"; + } else if (ch === "=" || ch === ":") { + state.position = "quote"; + return null; + } else if (ch === "\\" && state.position === "quote") { + if (stream.next() !== "u") { // u = Unicode sequence \u1234 + // Multiline value + state.nextMultiline = true; + } + } + + return state.position; + }, + + startState: function() { + return { + position : "def", // Current position, "def", "quote" or "comment" + nextMultiline : false, // Is the next line multiline value + inMultiline : false, // Is the current line a multiline value + afterSection : false // Did we just open a section + }; + } + + }; +}); + +CodeMirror.defineMIME("text/x-properties", "properties"); +CodeMirror.defineMIME("text/x-ini", "properties"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/index.html new file mode 100644 index 0000000..5614c36 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/index.html @@ -0,0 +1,121 @@ + + +CodeMirror: Puppet mode + + + + + + + + + + +
    +

    Puppet mode

    +
    + + +

    MIME types defined: text/x-puppet.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/puppet.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/puppet.js new file mode 100644 index 0000000..e7f799f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/puppet/puppet.js @@ -0,0 +1,220 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("puppet", function () { + // Stores the words from the define method + var words = {}; + // Taken, mostly, from the Puppet official variable standards regex + var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/; + + // Takes a string of words separated by spaces and adds them as + // keys with the value of the first argument 'style' + function define(style, string) { + var split = string.split(' '); + for (var i = 0; i < split.length; i++) { + words[split[i]] = style; + } + } + + // Takes commonly known puppet types/words and classifies them to a style + define('keyword', 'class define site node include import inherits'); + define('keyword', 'case if else in and elsif default or'); + define('atom', 'false true running present absent file directory undef'); + define('builtin', 'action augeas burst chain computer cron destination dport exec ' + + 'file filebucket group host icmp iniface interface jump k5login limit log_level ' + + 'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' + + 'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' + + 'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' + + 'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' + + 'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' + + 'resources router schedule scheduled_task selboolean selmodule service source ' + + 'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' + + 'user vlan yumrepo zfs zone zpool'); + + // After finding a start of a string ('|") this function attempts to find the end; + // If a variable is encountered along the way, we display it differently when it + // is encapsulated in a double-quoted string. + function tokenString(stream, state) { + var current, prev, found_var = false; + while (!stream.eol() && (current = stream.next()) != state.pending) { + if (current === '$' && prev != '\\' && state.pending == '"') { + found_var = true; + break; + } + prev = current; + } + if (found_var) { + stream.backUp(1); + } + if (current == state.pending) { + state.continueString = false; + } else { + state.continueString = true; + } + return "string"; + } + + // Main function + function tokenize(stream, state) { + // Matches one whole word + var word = stream.match(/[\w]+/, false); + // Matches attributes (i.e. ensure => present ; 'ensure' would be matched) + var attribute = stream.match(/(\s+)?\w+\s+=>.*/, false); + // Matches non-builtin resource declarations + // (i.e. "apache::vhost {" or "mycustomclasss {" would be matched) + var resource = stream.match(/(\s+)?[\w:_]+(\s+)?{/, false); + // Matches virtual and exported resources (i.e. @@user { ; and the like) + var special_resource = stream.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/, false); + + // Finally advance the stream + var ch = stream.next(); + + // Have we found a variable? + if (ch === '$') { + if (stream.match(variable_regex)) { + // If so, and its in a string, assign it a different color + return state.continueString ? 'variable-2' : 'variable'; + } + // Otherwise return an invalid variable + return "error"; + } + // Should we still be looking for the end of a string? + if (state.continueString) { + // If so, go through the loop again + stream.backUp(1); + return tokenString(stream, state); + } + // Are we in a definition (class, node, define)? + if (state.inDefinition) { + // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched) + if (stream.match(/(\s+)?[\w:_]+(\s+)?/)) { + return 'def'; + } + // Match the rest it the next time around + stream.match(/\s+{/); + state.inDefinition = false; + } + // Are we in an 'include' statement? + if (state.inInclude) { + // Match and return the included class + stream.match(/(\s+)?\S+(\s+)?/); + state.inInclude = false; + return 'def'; + } + // Do we just have a function on our hands? + // In 'ensure_resource("myclass")', 'ensure_resource' is matched + if (stream.match(/(\s+)?\w+\(/)) { + stream.backUp(1); + return 'def'; + } + // Have we matched the prior attribute regex? + if (attribute) { + stream.match(/(\s+)?\w+/); + return 'tag'; + } + // Do we have Puppet specific words? + if (word && words.hasOwnProperty(word)) { + // Negates the initial next() + stream.backUp(1); + // Acutally move the stream + stream.match(/[\w]+/); + // We want to process these words differently + // do to the importance they have in Puppet + if (stream.match(/\s+\S+\s+{/, false)) { + state.inDefinition = true; + } + if (word == 'include') { + state.inInclude = true; + } + // Returns their value as state in the prior define methods + return words[word]; + } + // Is there a match on a reference? + if (/(^|\s+)[A-Z][\w:_]+/.test(word)) { + // Negate the next() + stream.backUp(1); + // Match the full reference + stream.match(/(^|\s+)[A-Z][\w:_]+/); + return 'def'; + } + // Have we matched the prior resource regex? + if (resource) { + stream.match(/(\s+)?[\w:_]+/); + return 'def'; + } + // Have we matched the prior special_resource regex? + if (special_resource) { + stream.match(/(\s+)?[@]{1,2}/); + return 'special'; + } + // Match all the comments. All of them. + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + // Have we found a string? + if (ch == "'" || ch == '"') { + // Store the type (single or double) + state.pending = ch; + // Perform the looping function to find the end + return tokenString(stream, state); + } + // Match all the brackets + if (ch == '{' || ch == '}') { + return 'bracket'; + } + // Match characters that we are going to assume + // are trying to be regex + if (ch == '/') { + stream.match(/.*?\//); + return 'variable-3'; + } + // Match all the numbers + if (ch.match(/[0-9]/)) { + stream.eatWhile(/[0-9]+/); + return 'number'; + } + // Match the '=' and '=>' operators + if (ch == '=') { + if (stream.peek() == '>') { + stream.next(); + } + return "operator"; + } + // Keep advancing through all the rest + stream.eatWhile(/[\w-]/); + // Return a blank line for everything else + return null; + } + // Start it all + return { + startState: function () { + var state = {}; + state.inDefinition = false; + state.inInclude = false; + state.continueString = false; + state.pending = false; + return state; + }, + token: function (stream, state) { + // Strip the spaces, but regex will account for them eitherway + if (stream.eatSpace()) return null; + // Go through the main process + return tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME("text/x-puppet", "puppet"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/index.html new file mode 100644 index 0000000..86eb3d5 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/index.html @@ -0,0 +1,198 @@ + + +CodeMirror: Python mode + + + + + + + + + + +
    +

    Python mode

    + +
    + + +

    Cython mode

    + +
    + + +

    Configuration Options for Python mode:

    +
      +
    • version - 2/3 - The version of Python to recognize. Default is 2.
    • +
    • singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.
    • +
    • hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.
    • +
    +

    Advanced Configuration Options:

    +

    Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help

    +
      +
    • singleOperators - RegEx - Regular Expression for single operator matching, default :
      ^[\\+\\-\\*/%&|\\^~<>!]
      including
      @
      on Python 3
    • +
    • singleDelimiters - RegEx - Regular Expression for single delimiter matching, default :
      ^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]
    • +
    • doubleOperators - RegEx - Regular Expression for double operators matching, default :
      ^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))
    • +
    • doubleDelimiters - RegEx - Regular Expressoin for double delimiters matching, default :
      ^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))
    • +
    • tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default :
      ^((//=)|(>>=)|(<<=)|(\\*\\*=))
    • +
    • identifiers - RegEx - Regular Expression for identifier, default :
      ^[_A-Za-z][_A-Za-z0-9]*
      on Python 2 and
      ^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*
      on Python 3.
    • +
    • extra_keywords - list of string - List of extra words ton consider as keywords
    • +
    • extra_builtins - list of string - List of extra words ton consider as builtins
    • +
    + + +

    MIME types defined: text/x-python and text/x-cython.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/python.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/python.js new file mode 100644 index 0000000..98c0409 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/python/python.js @@ -0,0 +1,359 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var wordOperators = wordRegexp(["and", "or", "not", "is"]); + var commonKeywords = ["as", "assert", "break", "class", "continue", + "def", "del", "elif", "else", "except", "finally", + "for", "from", "global", "if", "import", + "lambda", "pass", "raise", "return", + "try", "while", "with", "yield", "in"]; + var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", + "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", + "enumerate", "eval", "filter", "float", "format", "frozenset", + "getattr", "globals", "hasattr", "hash", "help", "hex", "id", + "input", "int", "isinstance", "issubclass", "iter", "len", + "list", "locals", "map", "max", "memoryview", "min", "next", + "object", "oct", "open", "ord", "pow", "property", "range", + "repr", "reversed", "round", "set", "setattr", "slice", + "sorted", "staticmethod", "str", "sum", "super", "tuple", + "type", "vars", "zip", "__import__", "NotImplemented", + "Ellipsis", "__debug__"]; + var py2 = {builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile", + "file", "intern", "long", "raw_input", "reduce", "reload", + "unichr", "unicode", "xrange", "False", "True", "None"], + keywords: ["exec", "print"]}; + var py3 = {builtins: ["ascii", "bytes", "exec", "print"], + keywords: ["nonlocal", "False", "True", "None"]}; + + CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); + + function top(state) { + return state.scopes[state.scopes.length - 1]; + } + + CodeMirror.defineMode("python", function(conf, parserConf) { + var ERRORCLASS = "error"; + + var singleDelimiters = parserConf.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"); + var doubleOperators = parserConf.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); + var doubleDelimiters = parserConf.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = parserConf.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); + + if (parserConf.version && parseInt(parserConf.version, 10) == 3){ + // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator + var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]"); + var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*"); + } else { + var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]"); + var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); + } + + var hangingIndent = parserConf.hangingIndent || conf.indentUnit; + + var myKeywords = commonKeywords, myBuiltins = commonBuiltins; + if(parserConf.extra_keywords != undefined){ + myKeywords = myKeywords.concat(parserConf.extra_keywords); + } + if(parserConf.extra_builtins != undefined){ + myBuiltins = myBuiltins.concat(parserConf.extra_builtins); + } + if (parserConf.version && parseInt(parserConf.version, 10) == 3) { + myKeywords = myKeywords.concat(py3.keywords); + myBuiltins = myBuiltins.concat(py3.builtins); + var stringPrefixes = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i"); + } else { + myKeywords = myKeywords.concat(py2.keywords); + myBuiltins = myBuiltins.concat(py2.builtins); + var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); + } + var keywords = wordRegexp(myKeywords); + var builtins = wordRegexp(myBuiltins); + + // tokenizers + function tokenBase(stream, state) { + // Handle scope changes + if (stream.sol() && top(state).type == "py") { + var scopeOffset = top(state).offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) + pushScope(stream, state, "py"); + else if (lineOffset < scopeOffset && dedent(stream, state)) + state.errorToken = true; + return null; + } else { + var style = tokenBaseInner(stream, state); + if (scopeOffset > 0 && dedent(stream, state)) + style += " " + ERRORCLASS; + return style; + } + } + return tokenBaseInner(stream, state); + } + + function tokenBaseInner(stream, state) { + if (stream.eatSpace()) return null; + + var ch = stream.peek(); + + // Handle Comments + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } + if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } + if (stream.match(/^\.\d+/)) { floatLiteral = true; } + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true; + // Binary + if (stream.match(/^0b[01]+/i)) intLiteral = true; + // Octal + if (stream.match(/^0o[0-7]+/i)) intLiteral = true; + // Decimal + if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^0(?![\dx])/i)) intLiteral = true; + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return "number"; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) + return null; + + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) + return "operator"; + + if (stream.match(singleDelimiters)) + return null; + + if (stream.match(keywords)) + return "keyword"; + + if (stream.match(builtins)) + return "builtin"; + + if (stream.match(/^(self|cls)\b/)) + return "variable-2"; + + if (stream.match(identifiers)) { + if (state.lastToken == "def" || state.lastToken == "class") + return "def"; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + while ("rub".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenBase; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function pushScope(stream, state, type) { + var offset = 0, align = null; + if (type == "py") { + while (top(state).type != "py") + state.scopes.pop(); + } + offset = top(state).offset + (type == "py" ? conf.indentUnit : hangingIndent); + if (type != "py" && !stream.match(/^(\s|#.*)*$/, false)) + align = stream.column() + 1; + state.scopes.push({offset: offset, type: type, align: align}); + } + + function dedent(stream, state) { + var indented = stream.indentation(); + while (top(state).offset > indented) { + if (top(state).type != "py") return true; + state.scopes.pop(); + } + return top(state).offset != indented; + } + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current == ".") { + style = stream.match(identifiers, false) ? null : ERRORCLASS; + if (style == null && state.lastStyle == "meta") { + // Apply 'meta' style to '.' connected identifiers when + // appropriate. + style = "meta"; + } + return style; + } + + // Handle decorators + if (current == "@"){ + if(parserConf.version && parseInt(parserConf.version, 10) == 3){ + return stream.match(identifiers, false) ? "meta" : "operator"; + } else { + return stream.match(identifiers, false) ? "meta" : ERRORCLASS; + } + } + + if ((style == "variable" || style == "builtin") + && state.lastStyle == "meta") + style = "meta"; + + // Handle scope changes. + if (current == "pass" || current == "return") + state.dedent += 1; + + if (current == "lambda") state.lambda = true; + if (current == ":" && !state.lambda && top(state).type == "py") + pushScope(stream, state, "py"); + + var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1; + if (delimiter_index != -1) + pushScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + + delimiter_index = "])}".indexOf(current); + if (delimiter_index != -1) { + if (top(state).type == current) state.scopes.pop(); + else return ERRORCLASS; + } + if (state.dedent > 0 && stream.eol() && top(state).type == "py") { + if (state.scopes.length > 1) state.scopes.pop(); + state.dedent -= 1; + } + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{offset: basecolumn || 0, type: "py", align: null}], + lastStyle: null, + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var addErr = state.errorToken; + if (addErr) state.errorToken = false; + var style = tokenLexer(stream, state); + + state.lastStyle = style; + + var current = stream.current(); + if (current && style) + state.lastToken = current; + + if (stream.eol() && state.lambda) + state.lambda = false; + return addErr ? style + " " + ERRORCLASS : style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) + return state.tokenize.isString ? CodeMirror.Pass : 0; + + var scope = top(state); + var closing = textAfter && textAfter.charAt(0) == scope.type; + if (scope.align != null) + return scope.align - (closing ? 1 : 0); + else if (closing && state.scopes.length > 1) + return state.scopes[state.scopes.length - 2].offset; + else + return scope.offset; + }, + + lineComment: "#", + fold: "indent" + }; + return external; + }); + + CodeMirror.defineMIME("text/x-python", "python"); + + var words = function(str) { return str.split(" "); }; + + CodeMirror.defineMIME("text/x-cython", { + name: "python", + extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+ + "extern gil include nogil property public"+ + "readonly struct union DEF IF ELIF ELSE") + }); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/index.html new file mode 100644 index 0000000..72785ba --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/index.html @@ -0,0 +1,144 @@ + + +CodeMirror: Q mode + + + + + + + + + + +
    +

    Q mode

    + + +
    + + + +

    MIME type defined: text/x-q.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/q.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/q.js new file mode 100644 index 0000000..a4af938 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/q/q.js @@ -0,0 +1,139 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("q",function(config){ + var indentUnit=config.indentUnit, + curPunc, + keywords=buildRE(["abs","acos","aj","aj0","all","and","any","asc","asin","asof","atan","attr","avg","avgs","bin","by","ceiling","cols","cor","cos","count","cov","cross","csv","cut","delete","deltas","desc","dev","differ","distinct","div","do","each","ej","enlist","eval","except","exec","exit","exp","fby","fills","first","fkeys","flip","floor","from","get","getenv","group","gtime","hclose","hcount","hdel","hopen","hsym","iasc","idesc","if","ij","in","insert","inter","inv","key","keys","last","like","list","lj","load","log","lower","lsq","ltime","ltrim","mavg","max","maxs","mcount","md5","mdev","med","meta","min","mins","mmax","mmin","mmu","mod","msum","neg","next","not","null","or","over","parse","peach","pj","plist","prd","prds","prev","prior","rand","rank","ratios","raze","read0","read1","reciprocal","reverse","rload","rotate","rsave","rtrim","save","scan","select","set","setenv","show","signum","sin","sqrt","ss","ssr","string","sublist","sum","sums","sv","system","tables","tan","til","trim","txf","type","uj","ungroup","union","update","upper","upsert","value","var","view","views","vs","wavg","where","where","while","within","wj","wj1","wsum","xasc","xbar","xcol","xcols","xdesc","xexp","xgroup","xkey","xlog","xprev","xrank"]), + E=/[|/&^!+:\\\-*%$=~#;@><,?_\'\"\[\(\]\)\s{}]/; + function buildRE(w){return new RegExp("^("+w.join("|")+")$");} + function tokenBase(stream,state){ + var sol=stream.sol(),c=stream.next(); + curPunc=null; + if(sol) + if(c=="/") + return(state.tokenize=tokenLineComment)(stream,state); + else if(c=="\\"){ + if(stream.eol()||/\s/.test(stream.peek())) + return stream.skipToEnd(),/^\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream, state):state.tokenize=tokenBase,"comment"; + else + return state.tokenize=tokenBase,"builtin"; + } + if(/\s/.test(c)) + return stream.peek()=="/"?(stream.skipToEnd(),"comment"):"whitespace"; + if(c=='"') + return(state.tokenize=tokenString)(stream,state); + if(c=='`') + return stream.eatWhile(/[A-Z|a-z|\d|_|:|\/|\.]/),"symbol"; + if(("."==c&&/\d/.test(stream.peek()))||/\d/.test(c)){ + var t=null; + stream.backUp(1); + if(stream.match(/^\d{4}\.\d{2}(m|\.\d{2}([D|T](\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)?)?)/) + || stream.match(/^\d+D(\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)/) + || stream.match(/^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?/) + || stream.match(/^\d+[ptuv]{1}/)) + t="temporal"; + else if(stream.match(/^0[NwW]{1}/) + || stream.match(/^0x[\d|a-f|A-F]*/) + || stream.match(/^[0|1]+[b]{1}/) + || stream.match(/^\d+[chijn]{1}/) + || stream.match(/-?\d*(\.\d*)?(e[+\-]?\d+)?(e|f)?/)) + t="number"; + return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),"error"); + } + if(/[A-Z|a-z]|\./.test(c)) + return stream.eatWhile(/[A-Z|a-z|\.|_|\d]/),keywords.test(stream.current())?"keyword":"variable"; + if(/[|/&^!+:\\\-*%$=~#;@><\.,?_\']/.test(c)) + return null; + if(/[{}\(\[\]\)]/.test(c)) + return null; + return"error"; + } + function tokenLineComment(stream,state){ + return stream.skipToEnd(),/\/\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),"comment"; + } + function tokenBlockComment(stream,state){ + var f=stream.sol()&&stream.peek()=="\\"; + stream.skipToEnd(); + if(f&&/^\\\s*$/.test(stream.current())) + state.tokenize=tokenBase; + return"comment"; + } + function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";} + function tokenString(stream,state){ + var escaped=false,next,end=false; + while((next=stream.next())){ + if(next=="\""&&!escaped){end=true;break;} + escaped=!escaped&&next=="\\"; + } + if(end)state.tokenize=tokenBase; + return"string"; + } + function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};} + function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;} + return{ + startState:function(){ + return{tokenize:tokenBase, + context:null, + indent:0, + col:0}; + }, + token:function(stream,state){ + if(stream.sol()){ + if(state.context&&state.context.align==null) + state.context.align=false; + state.indent=stream.indentation(); + } + //if (stream.eatSpace()) return null; + var style=state.tokenize(stream,state); + if(style!="comment"&&state.context&&state.context.align==null&&state.context.type!="pattern"){ + state.context.align=true; + } + if(curPunc=="(")pushContext(state,")",stream.column()); + else if(curPunc=="[")pushContext(state,"]",stream.column()); + else if(curPunc=="{")pushContext(state,"}",stream.column()); + else if(/[\]\}\)]/.test(curPunc)){ + while(state.context&&state.context.type=="pattern")popContext(state); + if(state.context&&curPunc==state.context.type)popContext(state); + } + else if(curPunc=="."&&state.context&&state.context.type=="pattern")popContext(state); + else if(/atom|string|variable/.test(style)&&state.context){ + if(/[\}\]]/.test(state.context.type)) + pushContext(state,"pattern",stream.column()); + else if(state.context.type=="pattern"&&!state.context.align){ + state.context.align=true; + state.context.col=stream.column(); + } + } + return style; + }, + indent:function(state,textAfter){ + var firstChar=textAfter&&textAfter.charAt(0); + var context=state.context; + if(/[\]\}]/.test(firstChar)) + while (context&&context.type=="pattern")context=context.prev; + var closing=context&&firstChar==context.type; + if(!context) + return 0; + else if(context.type=="pattern") + return context.col; + else if(context.align) + return context.col+(closing?0:1); + else + return context.indent+(closing?0:indentUnit); + } + }; +}); +CodeMirror.defineMIME("text/x-q","q"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/index.html new file mode 100644 index 0000000..6dd9634 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/index.html @@ -0,0 +1,85 @@ + + +CodeMirror: R mode + + + + + + + + + +
    +

    R mode

    +
    + + +

    MIME types defined: text/x-rsrc.

    + +

    Development of the CodeMirror R mode was kindly sponsored + by Ubalo.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/r.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/r.js new file mode 100644 index 0000000..1ab4a95 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/r/r.js @@ -0,0 +1,162 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("r", function(config) { + function wordObj(str) { + var words = str.split(" "), res = {}; + for (var i = 0; i < words.length; ++i) res[words[i]] = true; + return res; + } + var atoms = wordObj("NULL NA Inf NaN NA_integer_ NA_real_ NA_complex_ NA_character_"); + var builtins = wordObj("list quote bquote eval return call parse deparse"); + var keywords = wordObj("if else repeat while function for in next break"); + var blockkeywords = wordObj("if else repeat while function for"); + var opChars = /[+\-*\/^<>=!&|~$:]/; + var curPunc; + + function tokenBase(stream, state) { + curPunc = null; + var ch = stream.next(); + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } else if (ch == "0" && stream.eat("x")) { + stream.eatWhile(/[\da-f]/i); + return "number"; + } else if (ch == "." && stream.eat(/\d/)) { + stream.match(/\d*(?:e[+\-]?\d+)?/); + return "number"; + } else if (/\d/.test(ch)) { + stream.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/); + return "number"; + } else if (ch == "'" || ch == '"') { + state.tokenize = tokenString(ch); + return "string"; + } else if (ch == "." && stream.match(/.[.\d]+/)) { + return "keyword"; + } else if (/[\w\.]/.test(ch) && ch != "_") { + stream.eatWhile(/[\w\.]/); + var word = stream.current(); + if (atoms.propertyIsEnumerable(word)) return "atom"; + if (keywords.propertyIsEnumerable(word)) { + // Block keywords start new blocks, except 'else if', which only starts + // one new block for the 'if', no block for the 'else'. + if (blockkeywords.propertyIsEnumerable(word) && + !stream.match(/\s*if(\s+|$)/, false)) + curPunc = "block"; + return "keyword"; + } + if (builtins.propertyIsEnumerable(word)) return "builtin"; + return "variable"; + } else if (ch == "%") { + if (stream.skipTo("%")) stream.next(); + return "variable-2"; + } else if (ch == "<" && stream.eat("-")) { + return "arrow"; + } else if (ch == "=" && state.ctx.argList) { + return "arg-is"; + } else if (opChars.test(ch)) { + if (ch == "$") return "dollar"; + stream.eatWhile(opChars); + return "operator"; + } else if (/[\(\){}\[\];]/.test(ch)) { + curPunc = ch; + if (ch == ";") return "semi"; + return null; + } else { + return null; + } + } + + function tokenString(quote) { + return function(stream, state) { + if (stream.eat("\\")) { + var ch = stream.next(); + if (ch == "x") stream.match(/^[a-f0-9]{2}/i); + else if ((ch == "u" || ch == "U") && stream.eat("{") && stream.skipTo("}")) stream.next(); + else if (ch == "u") stream.match(/^[a-f0-9]{4}/i); + else if (ch == "U") stream.match(/^[a-f0-9]{8}/i); + else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/); + return "string-2"; + } else { + var next; + while ((next = stream.next()) != null) { + if (next == quote) { state.tokenize = tokenBase; break; } + if (next == "\\") { stream.backUp(1); break; } + } + return "string"; + } + }; + } + + function push(state, type, stream) { + state.ctx = {type: type, + indent: state.indent, + align: null, + column: stream.column(), + prev: state.ctx}; + } + function pop(state) { + state.indent = state.ctx.indent; + state.ctx = state.ctx.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + ctx: {type: "top", + indent: -config.indentUnit, + align: false}, + indent: 0, + afterIdent: false}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.ctx.align == null) state.ctx.align = false; + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (style != "comment" && state.ctx.align == null) state.ctx.align = true; + + var ctype = state.ctx.type; + if ((curPunc == ";" || curPunc == "{" || curPunc == "}") && ctype == "block") pop(state); + if (curPunc == "{") push(state, "}", stream); + else if (curPunc == "(") { + push(state, ")", stream); + if (state.afterIdent) state.ctx.argList = true; + } + else if (curPunc == "[") push(state, "]", stream); + else if (curPunc == "block") push(state, "block", stream); + else if (curPunc == ctype) pop(state); + state.afterIdent = style == "variable" || style == "keyword"; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx, + closing = firstChar == ctx.type; + if (ctx.type == "block") return ctx.indent + (firstChar == "{" ? 0 : config.indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indent + (closing ? 0 : config.indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/x-rsrc", "r"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/changes/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/changes/index.html new file mode 100644 index 0000000..6e5031b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/changes/index.html @@ -0,0 +1,66 @@ + + +CodeMirror: RPM changes mode + + + + + + + + + + + +
    +

    RPM changes mode

    + +
    + + +

    MIME types defined: text/x-rpm-changes.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/index.html new file mode 100644 index 0000000..9a34e6d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/index.html @@ -0,0 +1,149 @@ + + +CodeMirror: RPM changes mode + + + + + + + + + + + +
    +

    RPM changes mode

    + +
    + + +

    RPM spec mode

    + +
    + + +

    MIME types defined: text/x-rpm-spec, text/x-rpm-changes.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/rpm.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/rpm.js new file mode 100644 index 0000000..3bb7cd2 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rpm/rpm.js @@ -0,0 +1,101 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("rpm-changes", function() { + var headerSeperator = /^-+$/; + var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /; + var simpleEmail = /^[\w+.-]+@[\w.-]+/; + + return { + token: function(stream) { + if (stream.sol()) { + if (stream.match(headerSeperator)) { return 'tag'; } + if (stream.match(headerLine)) { return 'tag'; } + } + if (stream.match(simpleEmail)) { return 'string'; } + stream.next(); + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-rpm-changes", "rpm-changes"); + +// Quick and dirty spec file highlighting + +CodeMirror.defineMode("rpm-spec", function() { + var arch = /^(i386|i586|i686|x86_64|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/; + + var preamble = /^(Name|Version|Release|License|Summary|Url|Group|Source|BuildArch|BuildRequires|BuildRoot|AutoReqProv|Provides|Requires(\(\w+\))?|Obsoletes|Conflicts|Recommends|Source\d*|Patch\d*|ExclusiveArch|NoSource|Supplements):/; + var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pre|post|triggerin|triggerun|pretrans|posttrans|verifyscript|check|triggerpostun|triggerprein|trigger)/; + var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros + var control_flow_simple = /^%(else|endif)/; // rpm control flow macros + var operators = /^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/; // operators in control flow macros + + return { + startState: function () { + return { + controlFlow: false, + macroParameters: false, + section: false + }; + }, + token: function (stream, state) { + var ch = stream.peek(); + if (ch == "#") { stream.skipToEnd(); return "comment"; } + + if (stream.sol()) { + if (stream.match(preamble)) { return "preamble"; } + if (stream.match(section)) { return "section"; } + } + + if (stream.match(/^\$\w+/)) { return "def"; } // Variables like '$RPM_BUILD_ROOT' + if (stream.match(/^\$\{\w+\}/)) { return "def"; } // Variables like '${RPM_BUILD_ROOT}' + + if (stream.match(control_flow_simple)) { return "keyword"; } + if (stream.match(control_flow_complex)) { + state.controlFlow = true; + return "keyword"; + } + if (state.controlFlow) { + if (stream.match(operators)) { return "operator"; } + if (stream.match(/^(\d+)/)) { return "number"; } + if (stream.eol()) { state.controlFlow = false; } + } + + if (stream.match(arch)) { return "number"; } + + // Macros like '%make_install' or '%attr(0775,root,root)' + if (stream.match(/^%[\w]+/)) { + if (stream.match(/^\(/)) { state.macroParameters = true; } + return "macro"; + } + if (state.macroParameters) { + if (stream.match(/^\d+/)) { return "number";} + if (stream.match(/^\)/)) { + state.macroParameters = false; + return "macro"; + } + } + if (stream.match(/^%\{\??[\w \-]+\}/)) { return "macro"; } // Macros like '%{defined fedora}' + + //TODO: Include bash script sub-parser (CodeMirror supports that) + stream.next(); + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-rpm-spec", "rpm-spec"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/index.html new file mode 100644 index 0000000..2902dea --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/index.html @@ -0,0 +1,535 @@ + + +CodeMirror: reStructuredText mode + + + + + + + + + + +
    +

    reStructuredText mode

    +
    + + +

    + The python mode will be used for highlighting blocks + containing Python/IPython terminal sessions: blocks starting with + >>> (for Python) or In [num]: (for + IPython). + + Further, the stex mode will be used for highlighting + blocks containing LaTex code. +

    + +

    MIME types defined: text/x-rst.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/rst.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/rst.js new file mode 100644 index 0000000..bcf110c --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rst/rst.js @@ -0,0 +1,557 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('rst', function (config, options) { + + var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/; + var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/; + var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/; + + var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/; + var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/; + var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/; + + var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://"; + var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})"; + var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*"; + var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path); + + var overlay = { + token: function (stream) { + + if (stream.match(rx_strong) && stream.match (/\W+|$/, false)) + return 'strong'; + if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false)) + return 'em'; + if (stream.match(rx_literal) && stream.match (/\W+|$/, false)) + return 'string-2'; + if (stream.match(rx_number)) + return 'number'; + if (stream.match(rx_positive)) + return 'positive'; + if (stream.match(rx_negative)) + return 'negative'; + if (stream.match(rx_uri)) + return 'link'; + + while (stream.next() != null) { + if (stream.match(rx_strong, false)) break; + if (stream.match(rx_emphasis, false)) break; + if (stream.match(rx_literal, false)) break; + if (stream.match(rx_number, false)) break; + if (stream.match(rx_positive, false)) break; + if (stream.match(rx_negative, false)) break; + if (stream.match(rx_uri, false)) break; + } + + return null; + } + }; + + var mode = CodeMirror.getMode( + config, options.backdrop || 'rst-base' + ); + + return CodeMirror.overlayMode(mode, overlay, true); // combine +}, 'python', 'stex'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +CodeMirror.defineMode('rst-base', function (config) { + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function format(string) { + var args = Array.prototype.slice.call(arguments, 1); + return string.replace(/{(\d+)}/g, function (match, n) { + return typeof args[n] != 'undefined' ? args[n] : match; + }); + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + var mode_python = CodeMirror.getMode(config, 'python'); + var mode_stex = CodeMirror.getMode(config, 'stex'); + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + var SEPA = "\\s+"; + var TAIL = "(?:\\s*|\\W|$)", + rx_TAIL = new RegExp(format('^{0}', TAIL)); + + var NAME = + "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)", + rx_NAME = new RegExp(format('^{0}', NAME)); + var NAME_WWS = + "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)"; + var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS); + + var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)"; + var TEXT2 = "(?:[^\\`]+)", + rx_TEXT2 = new RegExp(format('^{0}', TEXT2)); + + var rx_section = new RegExp( + "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"); + var rx_explicit = new RegExp( + format('^\\.\\.{0}', SEPA)); + var rx_link = new RegExp( + format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL)); + var rx_directive = new RegExp( + format('^{0}::{1}', REF_NAME, TAIL)); + var rx_substitution = new RegExp( + format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL)); + var rx_footnote = new RegExp( + format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL)); + var rx_citation = new RegExp( + format('^\\[{0}\\]{1}', REF_NAME, TAIL)); + + var rx_substitution_ref = new RegExp( + format('^\\|{0}\\|', TEXT1)); + var rx_footnote_ref = new RegExp( + format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME)); + var rx_citation_ref = new RegExp( + format('^\\[{0}\\]_', REF_NAME)); + var rx_link_ref1 = new RegExp( + format('^{0}__?', REF_NAME)); + var rx_link_ref2 = new RegExp( + format('^`{0}`_', TEXT2)); + + var rx_role_pre = new RegExp( + format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL)); + var rx_role_suf = new RegExp( + format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL)); + var rx_role = new RegExp( + format('^:{0}:{1}', NAME, TAIL)); + + var rx_directive_name = new RegExp(format('^{0}', REF_NAME)); + var rx_directive_tail = new RegExp(format('^::{0}', TAIL)); + var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1)); + var rx_substitution_sepa = new RegExp(format('^{0}', SEPA)); + var rx_substitution_name = new RegExp(format('^{0}', REF_NAME)); + var rx_substitution_tail = new RegExp(format('^::{0}', TAIL)); + var rx_link_head = new RegExp("^_"); + var rx_link_name = new RegExp(format('^{0}|_', REF_NAME)); + var rx_link_tail = new RegExp(format('^:{0}', TAIL)); + + var rx_verbatim = new RegExp('^::\\s*$'); + var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s'); + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_normal(stream, state) { + var token = null; + + if (stream.sol() && stream.match(rx_examples, false)) { + change(state, to_mode, { + mode: mode_python, local: CodeMirror.startState(mode_python) + }); + } else if (stream.sol() && stream.match(rx_explicit)) { + change(state, to_explicit); + token = 'meta'; + } else if (stream.sol() && stream.match(rx_section)) { + change(state, to_normal); + token = 'header'; + } else if (phase(state) == rx_role_pre || + stream.match(rx_role_pre, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role_pre, 1)); + stream.match(/^:/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role_pre, 2)); + stream.match(rx_NAME); + token = 'keyword'; + + if (stream.current().match(/^(?:math|latex)/)) { + state.tmp_stex = true; + } + break; + case 2: + change(state, to_normal, context(rx_role_pre, 3)); + stream.match(/^:`/); + token = 'meta'; + break; + case 3: + if (state.tmp_stex) { + state.tmp_stex = undefined; state.tmp = { + mode: mode_stex, local: CodeMirror.startState(mode_stex) + }; + } + + if (state.tmp) { + if (stream.peek() == '`') { + change(state, to_normal, context(rx_role_pre, 4)); + state.tmp = undefined; + break; + } + + token = state.tmp.mode.token(stream, state.tmp.local); + break; + } + + change(state, to_normal, context(rx_role_pre, 4)); + stream.match(rx_TEXT2); + token = 'string'; + break; + case 4: + change(state, to_normal, context(rx_role_pre, 5)); + stream.match(/^`/); + token = 'meta'; + break; + case 5: + change(state, to_normal, context(rx_role_pre, 6)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_role_suf || + stream.match(rx_role_suf, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role_suf, 1)); + stream.match(/^`/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role_suf, 2)); + stream.match(rx_TEXT2); + token = 'string'; + break; + case 2: + change(state, to_normal, context(rx_role_suf, 3)); + stream.match(/^`:/); + token = 'meta'; + break; + case 3: + change(state, to_normal, context(rx_role_suf, 4)); + stream.match(rx_NAME); + token = 'keyword'; + break; + case 4: + change(state, to_normal, context(rx_role_suf, 5)); + stream.match(/^:/); + token = 'meta'; + break; + case 5: + change(state, to_normal, context(rx_role_suf, 6)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_role || stream.match(rx_role, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role, 1)); + stream.match(/^:/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role, 2)); + stream.match(rx_NAME); + token = 'keyword'; + break; + case 2: + change(state, to_normal, context(rx_role, 3)); + stream.match(/^:/); + token = 'meta'; + break; + case 3: + change(state, to_normal, context(rx_role, 4)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_substitution_ref || + stream.match(rx_substitution_ref, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_substitution_ref, 1)); + stream.match(rx_substitution_text); + token = 'variable-2'; + break; + case 1: + change(state, to_normal, context(rx_substitution_ref, 2)); + if (stream.match(/^_?_?/)) token = 'link'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_footnote_ref)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_citation_ref)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_link_ref1)) { + change(state, to_normal); + if (!stream.peek() || stream.peek().match(/^\W$/)) { + token = 'link'; + } + } else if (phase(state) == rx_link_ref2 || + stream.match(rx_link_ref2, false)) { + + switch (stage(state)) { + case 0: + if (!stream.peek() || stream.peek().match(/^\W$/)) { + change(state, to_normal, context(rx_link_ref2, 1)); + } else { + stream.match(rx_link_ref2); + } + break; + case 1: + change(state, to_normal, context(rx_link_ref2, 2)); + stream.match(/^`/); + token = 'link'; + break; + case 2: + change(state, to_normal, context(rx_link_ref2, 3)); + stream.match(rx_TEXT2); + break; + case 3: + change(state, to_normal, context(rx_link_ref2, 4)); + stream.match(/^`_/); + token = 'link'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_verbatim)) { + change(state, to_verbatim); + } + + else { + if (stream.next()) change(state, to_normal); + } + + return token; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_explicit(stream, state) { + var token = null; + + if (phase(state) == rx_substitution || + stream.match(rx_substitution, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_substitution, 1)); + stream.match(rx_substitution_text); + token = 'variable-2'; + break; + case 1: + change(state, to_explicit, context(rx_substitution, 2)); + stream.match(rx_substitution_sepa); + break; + case 2: + change(state, to_explicit, context(rx_substitution, 3)); + stream.match(rx_substitution_name); + token = 'keyword'; + break; + case 3: + change(state, to_explicit, context(rx_substitution, 4)); + stream.match(rx_substitution_tail); + token = 'meta'; + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_directive || + stream.match(rx_directive, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_directive, 1)); + stream.match(rx_directive_name); + token = 'keyword'; + + if (stream.current().match(/^(?:math|latex)/)) + state.tmp_stex = true; + else if (stream.current().match(/^python/)) + state.tmp_py = true; + break; + case 1: + change(state, to_explicit, context(rx_directive, 2)); + stream.match(rx_directive_tail); + token = 'meta'; + + if (stream.match(/^latex\s*$/) || state.tmp_stex) { + state.tmp_stex = undefined; change(state, to_mode, { + mode: mode_stex, local: CodeMirror.startState(mode_stex) + }); + } + break; + case 2: + change(state, to_explicit, context(rx_directive, 3)); + if (stream.match(/^python\s*$/) || state.tmp_py) { + state.tmp_py = undefined; change(state, to_mode, { + mode: mode_python, local: CodeMirror.startState(mode_python) + }); + } + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_link || stream.match(rx_link, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_link, 1)); + stream.match(rx_link_head); + stream.match(rx_link_name); + token = 'link'; + break; + case 1: + change(state, to_explicit, context(rx_link, 2)); + stream.match(rx_link_tail); + token = 'meta'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_footnote)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_citation)) { + change(state, to_normal); + token = 'quote'; + } + + else { + stream.eatSpace(); + if (stream.eol()) { + change(state, to_normal); + } else { + stream.skipToEnd(); + change(state, to_comment); + token = 'comment'; + } + } + + return token; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_comment(stream, state) { + return as_block(stream, state, 'comment'); + } + + function to_verbatim(stream, state) { + return as_block(stream, state, 'meta'); + } + + function as_block(stream, state, token) { + if (stream.eol() || stream.eatSpace()) { + stream.skipToEnd(); + return token; + } else { + change(state, to_normal); + return null; + } + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_mode(stream, state) { + + if (state.ctx.mode && state.ctx.local) { + + if (stream.sol()) { + if (!stream.eatSpace()) change(state, to_normal); + return null; + } + + return state.ctx.mode.token(stream, state.ctx.local); + } + + change(state, to_normal); + return null; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function context(phase, stage, mode, local) { + return {phase: phase, stage: stage, mode: mode, local: local}; + } + + function change(state, tok, ctx) { + state.tok = tok; + state.ctx = ctx || {}; + } + + function stage(state) { + return state.ctx.stage || 0; + } + + function phase(state) { + return state.ctx.phase; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + return { + startState: function () { + return {tok: to_normal, ctx: context(undefined, 0)}; + }, + + copyState: function (state) { + var ctx = state.ctx, tmp = state.tmp; + if (ctx.local) + ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)}; + if (tmp) + tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)}; + return {tok: state.tok, ctx: ctx, tmp: tmp}; + }, + + innerMode: function (state) { + return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode} + : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode} + : null; + }, + + token: function (stream, state) { + return state.tok(stream, state); + } + }; +}, 'python', 'stex'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +CodeMirror.defineMIME('text/x-rst', 'rst'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/index.html new file mode 100644 index 0000000..97544ba --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/index.html @@ -0,0 +1,183 @@ + + +CodeMirror: Ruby mode + + + + + + + + + + +
    +

    Ruby mode

    +
    + + +

    MIME types defined: text/x-ruby.

    + +

    Development of the CodeMirror Ruby mode was kindly sponsored + by Ubalo.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/ruby.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/ruby.js new file mode 100644 index 0000000..eab9d9d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/ruby.js @@ -0,0 +1,285 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("ruby", function(config) { + function wordObj(words) { + var o = {}; + for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; + return o; + } + var keywords = wordObj([ + "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else", + "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or", + "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", + "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc", + "caller", "lambda", "proc", "public", "protected", "private", "require", "load", + "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__" + ]); + var indentWords = wordObj(["def", "class", "case", "for", "while", "module", "then", + "catch", "loop", "proc", "begin"]); + var dedentWords = wordObj(["end", "until"]); + var matching = {"[": "]", "{": "}", "(": ")"}; + var curPunc; + + function chain(newtok, stream, state) { + state.tokenize.push(newtok); + return newtok(stream, state); + } + + function tokenBase(stream, state) { + curPunc = null; + if (stream.sol() && stream.match("=begin") && stream.eol()) { + state.tokenize.push(readBlockComment); + return "comment"; + } + if (stream.eatSpace()) return null; + var ch = stream.next(), m; + if (ch == "`" || ch == "'" || ch == '"') { + return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state); + } else if (ch == "/") { + var currentIndex = stream.current().length; + if (stream.skipTo("/")) { + var search_till = stream.current().length; + stream.backUp(stream.current().length - currentIndex); + var balance = 0; // balance brackets + while (stream.current().length < search_till) { + var chchr = stream.next(); + if (chchr == "(") balance += 1; + else if (chchr == ")") balance -= 1; + if (balance < 0) break; + } + stream.backUp(stream.current().length - currentIndex); + if (balance == 0) + return chain(readQuoted(ch, "string-2", true), stream, state); + } + return "operator"; + } else if (ch == "%") { + var style = "string", embed = true; + if (stream.eat("s")) style = "atom"; + else if (stream.eat(/[WQ]/)) style = "string"; + else if (stream.eat(/[r]/)) style = "string-2"; + else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; } + var delim = stream.eat(/[^\w\s=]/); + if (!delim) return "operator"; + if (matching.propertyIsEnumerable(delim)) delim = matching[delim]; + return chain(readQuoted(delim, style, embed, true), stream, state); + } else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) { + return chain(readHereDoc(m[1]), stream, state); + } else if (ch == "0") { + if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/); + else if (stream.eat("b")) stream.eatWhile(/[01]/); + else stream.eatWhile(/[0-7]/); + return "number"; + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/); + return "number"; + } else if (ch == "?") { + while (stream.match(/^\\[CM]-/)) {} + if (stream.eat("\\")) stream.eatWhile(/\w/); + else stream.next(); + return "string"; + } else if (ch == ":") { + if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state); + if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state); + + // :> :>> :< :<< are valid symbols + if (stream.eat(/[\<\>]/)) { + stream.eat(/[\<\>]/); + return "atom"; + } + + // :+ :- :/ :* :| :& :! are valid symbols + if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) { + return "atom"; + } + + // Symbols can't start by a digit + if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) { + stream.eatWhile(/[\w$\xa1-\uffff]/); + // Only one ? ! = is allowed and only as the last character + stream.eat(/[\?\!\=]/); + return "atom"; + } + return "operator"; + } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) { + stream.eat("@"); + stream.eatWhile(/[\w\xa1-\uffff]/); + return "variable-2"; + } else if (ch == "$") { + if (stream.eat(/[a-zA-Z_]/)) { + stream.eatWhile(/[\w]/); + } else if (stream.eat(/\d/)) { + stream.eat(/\d/); + } else { + stream.next(); // Must be a special global like $: or $! + } + return "variable-3"; + } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) { + stream.eatWhile(/[\w\xa1-\uffff]/); + stream.eat(/[\?\!]/); + if (stream.eat(":")) return "atom"; + return "ident"; + } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) { + curPunc = "|"; + return null; + } else if (/[\(\)\[\]{}\\;]/.test(ch)) { + curPunc = ch; + return null; + } else if (ch == "-" && stream.eat(">")) { + return "arrow"; + } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) { + var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/); + if (ch == "." && !more) curPunc = "."; + return "operator"; + } else { + return null; + } + } + + function tokenBaseUntilBrace(depth) { + if (!depth) depth = 1; + return function(stream, state) { + if (stream.peek() == "}") { + if (depth == 1) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } else { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1); + } + } else if (stream.peek() == "{") { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1); + } + return tokenBase(stream, state); + }; + } + function tokenBaseOnce() { + var alreadyCalled = false; + return function(stream, state) { + if (alreadyCalled) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } + alreadyCalled = true; + return tokenBase(stream, state); + }; + } + function readQuoted(quote, style, embed, unescaped) { + return function(stream, state) { + var escaped = false, ch; + + if (state.context.type === 'read-quoted-paused') { + state.context = state.context.prev; + stream.eat("}"); + } + + while ((ch = stream.next()) != null) { + if (ch == quote && (unescaped || !escaped)) { + state.tokenize.pop(); + break; + } + if (embed && ch == "#" && !escaped) { + if (stream.eat("{")) { + if (quote == "}") { + state.context = {prev: state.context, type: 'read-quoted-paused'}; + } + state.tokenize.push(tokenBaseUntilBrace()); + break; + } else if (/[@\$]/.test(stream.peek())) { + state.tokenize.push(tokenBaseOnce()); + break; + } + } + escaped = !escaped && ch == "\\"; + } + return style; + }; + } + function readHereDoc(phrase) { + return function(stream, state) { + if (stream.match(phrase)) state.tokenize.pop(); + else stream.skipToEnd(); + return "string"; + }; + } + function readBlockComment(stream, state) { + if (stream.sol() && stream.match("=end") && stream.eol()) + state.tokenize.pop(); + stream.skipToEnd(); + return "comment"; + } + + return { + startState: function() { + return {tokenize: [tokenBase], + indented: 0, + context: {type: "top", indented: -config.indentUnit}, + continuedLine: false, + lastTok: null, + varList: false}; + }, + + token: function(stream, state) { + if (stream.sol()) state.indented = stream.indentation(); + var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype; + var thisTok = curPunc; + if (style == "ident") { + var word = stream.current(); + style = state.lastTok == "." ? "property" + : keywords.propertyIsEnumerable(stream.current()) ? "keyword" + : /^[A-Z]/.test(word) ? "tag" + : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def" + : "variable"; + if (style == "keyword") { + thisTok = word; + if (indentWords.propertyIsEnumerable(word)) kwtype = "indent"; + else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent"; + else if ((word == "if" || word == "unless") && stream.column() == stream.indentation()) + kwtype = "indent"; + else if (word == "do" && state.context.indented < state.indented) + kwtype = "indent"; + } + } + if (curPunc || (style && style != "comment")) state.lastTok = thisTok; + if (curPunc == "|") state.varList = !state.varList; + + if (kwtype == "indent" || /[\(\[\{]/.test(curPunc)) + state.context = {prev: state.context, type: curPunc || style, indented: state.indented}; + else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev) + state.context = state.context.prev; + + if (stream.eol()) + state.continuedLine = (curPunc == "\\" || style == "operator"); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize[state.tokenize.length-1] != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0); + var ct = state.context; + var closing = ct.type == matching[firstChar] || + ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter); + return ct.indented + (closing ? 0 : config.indentUnit) + + (state.continuedLine ? config.indentUnit : 0); + }, + + electricChars: "}de", // enD and rescuE + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/x-ruby", "ruby"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/test.js new file mode 100644 index 0000000..cade864 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/ruby/test.js @@ -0,0 +1,14 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "ruby"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT("divide_equal_operator", + "[variable bar] [operator /=] [variable foo]"); + + MT("divide_equal_operator_no_spacing", + "[variable foo][operator /=][number 42]"); + +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/index.html new file mode 100644 index 0000000..407e84f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/index.html @@ -0,0 +1,60 @@ + + +CodeMirror: Rust mode + + + + + + + + + +
    +

    Rust mode

    + + +
    + + + +

    MIME types defined: text/x-rustsrc.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/rust.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/rust.js new file mode 100644 index 0000000..2bffa9a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/rust/rust.js @@ -0,0 +1,451 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("rust", function() { + var indentUnit = 4, altIndentUnit = 2; + var valKeywords = { + "if": "if-style", "while": "if-style", "loop": "else-style", "else": "else-style", + "do": "else-style", "ret": "else-style", "fail": "else-style", + "break": "atom", "cont": "atom", "const": "let", "resource": "fn", + "let": "let", "fn": "fn", "for": "for", "alt": "alt", "iface": "iface", + "impl": "impl", "type": "type", "enum": "enum", "mod": "mod", + "as": "op", "true": "atom", "false": "atom", "assert": "op", "check": "op", + "claim": "op", "native": "ignore", "unsafe": "ignore", "import": "else-style", + "export": "else-style", "copy": "op", "log": "op", "log_err": "op", + "use": "op", "bind": "op", "self": "atom", "struct": "enum" + }; + var typeKeywords = function() { + var keywords = {"fn": "fn", "block": "fn", "obj": "obj"}; + var atoms = "bool uint int i8 i16 i32 i64 u8 u16 u32 u64 float f32 f64 str char".split(" "); + for (var i = 0, e = atoms.length; i < e; ++i) keywords[atoms[i]] = "atom"; + return keywords; + }(); + var operatorChar = /[+\-*&%=<>!?|\.@]/; + + // Tokenizer + + // Used as scratch variable to communicate multiple values without + // consing up tons of objects. + var tcat, content; + function r(tc, style) { + tcat = tc; + return style; + } + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + if (ch == "'") { + tcat = "atom"; + if (stream.eat("\\")) { + if (stream.skipTo("'")) { stream.next(); return "string"; } + else { return "error"; } + } else { + stream.next(); + return stream.eat("'") ? "string" : "error"; + } + } + if (ch == "/") { + if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } + if (stream.eat("*")) { + state.tokenize = tokenComment(1); + return state.tokenize(stream, state); + } + } + if (ch == "#") { + if (stream.eat("[")) { tcat = "open-attr"; return null; } + stream.eatWhile(/\w/); + return r("macro", "meta"); + } + if (ch == ":" && stream.match(":<")) { + return r("op", null); + } + if (ch.match(/\d/) || (ch == "." && stream.eat(/\d/))) { + var flp = false; + if (!stream.match(/^x[\da-f]+/i) && !stream.match(/^b[01]+/)) { + stream.eatWhile(/\d/); + if (stream.eat(".")) { flp = true; stream.eatWhile(/\d/); } + if (stream.match(/^e[+\-]?\d+/i)) { flp = true; } + } + if (flp) stream.match(/^f(?:32|64)/); + else stream.match(/^[ui](?:8|16|32|64)/); + return r("atom", "number"); + } + if (ch.match(/[()\[\]{}:;,]/)) return r(ch, null); + if (ch == "-" && stream.eat(">")) return r("->", null); + if (ch.match(operatorChar)) { + stream.eatWhile(operatorChar); + return r("op", null); + } + stream.eatWhile(/\w/); + content = stream.current(); + if (stream.match(/^::\w/)) { + stream.backUp(1); + return r("prefix", "variable-2"); + } + if (state.keywords.propertyIsEnumerable(content)) + return r(state.keywords[content], content.match(/true|false/) ? "atom" : "keyword"); + return r("name", "variable"); + } + + function tokenString(stream, state) { + var ch, escaped = false; + while (ch = stream.next()) { + if (ch == '"' && !escaped) { + state.tokenize = tokenBase; + return r("atom", "string"); + } + escaped = !escaped && ch == "\\"; + } + // Hack to not confuse the parser when a string is split in + // pieces. + return r("op", "string"); + } + + function tokenComment(depth) { + return function(stream, state) { + var lastCh = null, ch; + while (ch = stream.next()) { + if (ch == "/" && lastCh == "*") { + if (depth == 1) { + state.tokenize = tokenBase; + break; + } else { + state.tokenize = tokenComment(depth - 1); + return state.tokenize(stream, state); + } + } + if (ch == "*" && lastCh == "/") { + state.tokenize = tokenComment(depth + 1); + return state.tokenize(stream, state); + } + lastCh = ch; + } + return "comment"; + }; + } + + // Parser + + var cx = {state: null, stream: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + + function pushlex(type, info) { + var result = function() { + var state = cx.state; + state.lexical = {indented: state.indented, column: cx.stream.column(), + type: type, prev: state.lexical, info: info}; + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + function typecx() { cx.state.keywords = typeKeywords; } + function valcx() { cx.state.keywords = valKeywords; } + poplex.lex = typecx.lex = valcx.lex = true; + + function commasep(comb, end) { + function more(type) { + if (type == ",") return cont(comb, more); + if (type == end) return cont(); + return cont(more); + } + return function(type) { + if (type == end) return cont(); + return pass(comb, more); + }; + } + + function stat_of(comb, tag) { + return cont(pushlex("stat", tag), comb, poplex, block); + } + function block(type) { + if (type == "}") return cont(); + if (type == "let") return stat_of(letdef1, "let"); + if (type == "fn") return stat_of(fndef); + if (type == "type") return cont(pushlex("stat"), tydef, endstatement, poplex, block); + if (type == "enum") return stat_of(enumdef); + if (type == "mod") return stat_of(mod); + if (type == "iface") return stat_of(iface); + if (type == "impl") return stat_of(impl); + if (type == "open-attr") return cont(pushlex("]"), commasep(expression, "]"), poplex); + if (type == "ignore" || type.match(/[\]\);,]/)) return cont(block); + return pass(pushlex("stat"), expression, poplex, endstatement, block); + } + function endstatement(type) { + if (type == ";") return cont(); + return pass(); + } + function expression(type) { + if (type == "atom" || type == "name") return cont(maybeop); + if (type == "{") return cont(pushlex("}"), exprbrace, poplex); + if (type.match(/[\[\(]/)) return matchBrackets(type, expression); + if (type.match(/[\]\)\};,]/)) return pass(); + if (type == "if-style") return cont(expression, expression); + if (type == "else-style" || type == "op") return cont(expression); + if (type == "for") return cont(pattern, maybetype, inop, expression, expression); + if (type == "alt") return cont(expression, altbody); + if (type == "fn") return cont(fndef); + if (type == "macro") return cont(macro); + return cont(); + } + function maybeop(type) { + if (content == ".") return cont(maybeprop); + if (content == "::<"){return cont(typarams, maybeop);} + if (type == "op" || content == ":") return cont(expression); + if (type == "(" || type == "[") return matchBrackets(type, expression); + return pass(); + } + function maybeprop() { + if (content.match(/^\w+$/)) {cx.marked = "variable"; return cont(maybeop);} + return pass(expression); + } + function exprbrace(type) { + if (type == "op") { + if (content == "|") return cont(blockvars, poplex, pushlex("}", "block"), block); + if (content == "||") return cont(poplex, pushlex("}", "block"), block); + } + if (content == "mutable" || (content.match(/^\w+$/) && cx.stream.peek() == ":" + && !cx.stream.match("::", false))) + return pass(record_of(expression)); + return pass(block); + } + function record_of(comb) { + function ro(type) { + if (content == "mutable" || content == "with") {cx.marked = "keyword"; return cont(ro);} + if (content.match(/^\w*$/)) {cx.marked = "variable"; return cont(ro);} + if (type == ":") return cont(comb, ro); + if (type == "}") return cont(); + return cont(ro); + } + return ro; + } + function blockvars(type) { + if (type == "name") {cx.marked = "def"; return cont(blockvars);} + if (type == "op" && content == "|") return cont(); + return cont(blockvars); + } + + function letdef1(type) { + if (type.match(/[\]\)\};]/)) return cont(); + if (content == "=") return cont(expression, letdef2); + if (type == ",") return cont(letdef1); + return pass(pattern, maybetype, letdef1); + } + function letdef2(type) { + if (type.match(/[\]\)\};,]/)) return pass(letdef1); + else return pass(expression, letdef2); + } + function maybetype(type) { + if (type == ":") return cont(typecx, rtype, valcx); + return pass(); + } + function inop(type) { + if (type == "name" && content == "in") {cx.marked = "keyword"; return cont();} + return pass(); + } + function fndef(type) { + if (content == "@" || content == "~") {cx.marked = "keyword"; return cont(fndef);} + if (type == "name") {cx.marked = "def"; return cont(fndef);} + if (content == "<") return cont(typarams, fndef); + if (type == "{") return pass(expression); + if (type == "(") return cont(pushlex(")"), commasep(argdef, ")"), poplex, fndef); + if (type == "->") return cont(typecx, rtype, valcx, fndef); + if (type == ";") return cont(); + return cont(fndef); + } + function tydef(type) { + if (type == "name") {cx.marked = "def"; return cont(tydef);} + if (content == "<") return cont(typarams, tydef); + if (content == "=") return cont(typecx, rtype, valcx); + return cont(tydef); + } + function enumdef(type) { + if (type == "name") {cx.marked = "def"; return cont(enumdef);} + if (content == "<") return cont(typarams, enumdef); + if (content == "=") return cont(typecx, rtype, valcx, endstatement); + if (type == "{") return cont(pushlex("}"), typecx, enumblock, valcx, poplex); + return cont(enumdef); + } + function enumblock(type) { + if (type == "}") return cont(); + if (type == "(") return cont(pushlex(")"), commasep(rtype, ")"), poplex, enumblock); + if (content.match(/^\w+$/)) cx.marked = "def"; + return cont(enumblock); + } + function mod(type) { + if (type == "name") {cx.marked = "def"; return cont(mod);} + if (type == "{") return cont(pushlex("}"), block, poplex); + return pass(); + } + function iface(type) { + if (type == "name") {cx.marked = "def"; return cont(iface);} + if (content == "<") return cont(typarams, iface); + if (type == "{") return cont(pushlex("}"), block, poplex); + return pass(); + } + function impl(type) { + if (content == "<") return cont(typarams, impl); + if (content == "of" || content == "for") {cx.marked = "keyword"; return cont(rtype, impl);} + if (type == "name") {cx.marked = "def"; return cont(impl);} + if (type == "{") return cont(pushlex("}"), block, poplex); + return pass(); + } + function typarams() { + if (content == ">") return cont(); + if (content == ",") return cont(typarams); + if (content == ":") return cont(rtype, typarams); + return pass(rtype, typarams); + } + function argdef(type) { + if (type == "name") {cx.marked = "def"; return cont(argdef);} + if (type == ":") return cont(typecx, rtype, valcx); + return pass(); + } + function rtype(type) { + if (type == "name") {cx.marked = "variable-3"; return cont(rtypemaybeparam); } + if (content == "mutable") {cx.marked = "keyword"; return cont(rtype);} + if (type == "atom") return cont(rtypemaybeparam); + if (type == "op" || type == "obj") return cont(rtype); + if (type == "fn") return cont(fntype); + if (type == "{") return cont(pushlex("{"), record_of(rtype), poplex); + return matchBrackets(type, rtype); + } + function rtypemaybeparam() { + if (content == "<") return cont(typarams); + return pass(); + } + function fntype(type) { + if (type == "(") return cont(pushlex("("), commasep(rtype, ")"), poplex, fntype); + if (type == "->") return cont(rtype); + return pass(); + } + function pattern(type) { + if (type == "name") {cx.marked = "def"; return cont(patternmaybeop);} + if (type == "atom") return cont(patternmaybeop); + if (type == "op") return cont(pattern); + if (type.match(/[\]\)\};,]/)) return pass(); + return matchBrackets(type, pattern); + } + function patternmaybeop(type) { + if (type == "op" && content == ".") return cont(); + if (content == "to") {cx.marked = "keyword"; return cont(pattern);} + else return pass(); + } + function altbody(type) { + if (type == "{") return cont(pushlex("}", "alt"), altblock1, poplex); + return pass(); + } + function altblock1(type) { + if (type == "}") return cont(); + if (type == "|") return cont(altblock1); + if (content == "when") {cx.marked = "keyword"; return cont(expression, altblock2);} + if (type.match(/[\]\);,]/)) return cont(altblock1); + return pass(pattern, altblock2); + } + function altblock2(type) { + if (type == "{") return cont(pushlex("}", "alt"), block, poplex, altblock1); + else return pass(altblock1); + } + + function macro(type) { + if (type.match(/[\[\(\{]/)) return matchBrackets(type, expression); + return pass(); + } + function matchBrackets(type, comb) { + if (type == "[") return cont(pushlex("]"), commasep(comb, "]"), poplex); + if (type == "(") return cont(pushlex(")"), commasep(comb, ")"), poplex); + if (type == "{") return cont(pushlex("}"), commasep(comb, "}"), poplex); + return cont(); + } + + function parse(state, stream, style) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; + + while (true) { + var combinator = cc.length ? cc.pop() : block; + if (combinator(tcat)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + return cx.marked || style; + } + } + } + + return { + startState: function() { + return { + tokenize: tokenBase, + cc: [], + lexical: {indented: -indentUnit, column: 0, type: "top", align: false}, + keywords: valKeywords, + indented: 0 + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + tcat = content = null; + var style = state.tokenize(stream, state); + if (style == "comment") return style; + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + if (tcat == "prefix") return style; + if (!content) content = stream.current(); + return parse(state, stream, style); + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, + type = lexical.type, closing = firstChar == type; + if (type == "stat") return lexical.indented + indentUnit; + if (lexical.align) return lexical.column + (closing ? 0 : 1); + return lexical.indented + (closing ? 0 : (lexical.info == "alt" ? altIndentUnit : indentUnit)); + }, + + electricChars: "{}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "brace" + }; +}); + +CodeMirror.defineMIME("text/x-rustsrc", "rust"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/index.html new file mode 100644 index 0000000..9f4a790 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/index.html @@ -0,0 +1,66 @@ + + +CodeMirror: Sass mode + + + + + + + + + + +
    +

    Sass mode

    +
    + + +

    MIME types defined: text/x-sass.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/sass.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/sass.js new file mode 100644 index 0000000..52a6682 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sass/sass.js @@ -0,0 +1,414 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sass", function(config) { + function tokenRegexp(words) { + return new RegExp("^" + words.join("|")); + } + + var keywords = ["true", "false", "null", "auto"]; + var keywordsRegexp = new RegExp("^" + keywords.join("|")); + + var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", + "\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"]; + var opRegexp = tokenRegexp(operators); + + var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/; + + function urlTokens(stream, state) { + var ch = stream.peek(); + + if (ch === ")") { + stream.next(); + state.tokenizer = tokenBase; + return "operator"; + } else if (ch === "(") { + stream.next(); + stream.eatSpace(); + + return "operator"; + } else if (ch === "'" || ch === '"') { + state.tokenizer = buildStringTokenizer(stream.next()); + return "string"; + } else { + state.tokenizer = buildStringTokenizer(")", false); + return "string"; + } + } + function comment(indentation, multiLine) { + return function(stream, state) { + if (stream.sol() && stream.indentation() <= indentation) { + state.tokenizer = tokenBase; + return tokenBase(stream, state); + } + + if (multiLine && stream.skipTo("*/")) { + stream.next(); + stream.next(); + state.tokenizer = tokenBase; + } else { + stream.skipToEnd(); + } + + return "comment"; + }; + } + + function buildStringTokenizer(quote, greedy) { + if (greedy == null) { greedy = true; } + + function stringTokenizer(stream, state) { + var nextChar = stream.next(); + var peekChar = stream.peek(); + var previousChar = stream.string.charAt(stream.pos-2); + + var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\")); + + if (endingString) { + if (nextChar !== quote && greedy) { stream.next(); } + state.tokenizer = tokenBase; + return "string"; + } else if (nextChar === "#" && peekChar === "{") { + state.tokenizer = buildInterpolationTokenizer(stringTokenizer); + stream.next(); + return "operator"; + } else { + return "string"; + } + } + + return stringTokenizer; + } + + function buildInterpolationTokenizer(currentTokenizer) { + return function(stream, state) { + if (stream.peek() === "}") { + stream.next(); + state.tokenizer = currentTokenizer; + return "operator"; + } else { + return tokenBase(stream, state); + } + }; + } + + function indent(state) { + if (state.indentCount == 0) { + state.indentCount++; + var lastScopeOffset = state.scopes[0].offset; + var currentOffset = lastScopeOffset + config.indentUnit; + state.scopes.unshift({ offset:currentOffset }); + } + } + + function dedent(state) { + if (state.scopes.length == 1) return; + + state.scopes.shift(); + } + + function tokenBase(stream, state) { + var ch = stream.peek(); + + // Comment + if (stream.match("/*")) { + state.tokenizer = comment(stream.indentation(), true); + return state.tokenizer(stream, state); + } + if (stream.match("//")) { + state.tokenizer = comment(stream.indentation(), false); + return state.tokenizer(stream, state); + } + + // Interpolation + if (stream.match("#{")) { + state.tokenizer = buildInterpolationTokenizer(tokenBase); + return "operator"; + } + + // Strings + if (ch === '"' || ch === "'") { + stream.next(); + state.tokenizer = buildStringTokenizer(ch); + return "string"; + } + + if(!state.cursorHalf){// state.cursorHalf === 0 + // first half i.e. before : for key-value pairs + // including selectors + + if (ch === ".") { + stream.next(); + if (stream.match(/^[\w-]+/)) { + indent(state); + return "atom"; + } else if (stream.peek() === "#") { + indent(state); + return "atom"; + } + } + + if (ch === "#") { + stream.next(); + // ID selectors + if (stream.match(/^[\w-]+/)) { + indent(state); + return "atom"; + } + if (stream.peek() === "#") { + indent(state); + return "atom"; + } + } + + // Variables + if (ch === "$") { + stream.next(); + stream.eatWhile(/[\w-]/); + return "variable-2"; + } + + // Numbers + if (stream.match(/^-?[0-9\.]+/)) + return "number"; + + // Units + if (stream.match(/^(px|em|in)\b/)) + return "unit"; + + if (stream.match(keywordsRegexp)) + return "keyword"; + + if (stream.match(/^url/) && stream.peek() === "(") { + state.tokenizer = urlTokens; + return "atom"; + } + + if (ch === "=") { + // Match shortcut mixin definition + if (stream.match(/^=[\w-]+/)) { + indent(state); + return "meta"; + } + } + + if (ch === "+") { + // Match shortcut mixin definition + if (stream.match(/^\+[\w-]+/)){ + return "variable-3"; + } + } + + if(ch === "@"){ + if(stream.match(/@extend/)){ + if(!stream.match(/\s*[\w]/)) + dedent(state); + } + } + + + // Indent Directives + if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) { + indent(state); + return "meta"; + } + + // Other Directives + if (ch === "@") { + stream.next(); + stream.eatWhile(/[\w-]/); + return "meta"; + } + + if (stream.eatWhile(/[\w-]/)){ + if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){ + return "propery"; + } + else if(stream.match(/ *:/,false)){ + indent(state); + state.cursorHalf = 1; + return "atom"; + } + else if(stream.match(/ *,/,false)){ + return "atom"; + } + else{ + indent(state); + return "atom"; + } + } + + if(ch === ":"){ + if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element + return "keyword"; + } + stream.next(); + state.cursorHalf=1; + return "operator"; + } + + } // cursorHalf===0 ends here + else{ + + if (ch === "#") { + stream.next(); + // Hex numbers + if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){ + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "number"; + } + } + + // Numbers + if (stream.match(/^-?[0-9\.]+/)){ + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "number"; + } + + // Units + if (stream.match(/^(px|em|in)\b/)){ + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "unit"; + } + + if (stream.match(keywordsRegexp)){ + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "keyword"; + } + + if (stream.match(/^url/) && stream.peek() === "(") { + state.tokenizer = urlTokens; + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "atom"; + } + + // Variables + if (ch === "$") { + stream.next(); + stream.eatWhile(/[\w-]/); + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "variable-3"; + } + + // bang character for !important, !default, etc. + if (ch === "!") { + stream.next(); + if(!stream.peek()){ + state.cursorHalf = 0; + } + return stream.match(/^[\w]+/) ? "keyword": "operator"; + } + + if (stream.match(opRegexp)){ + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "operator"; + } + + // attributes + if (stream.eatWhile(/[\w-]/)) { + if(!stream.peek()){ + state.cursorHalf = 0; + } + return "attribute"; + } + + //stream.eatSpace(); + if(!stream.peek()){ + state.cursorHalf = 0; + return null; + } + + } // else ends here + + if (stream.match(opRegexp)) + return "operator"; + + // If we haven't returned by now, we move 1 character + // and return an error + stream.next(); + return null; + } + + function tokenLexer(stream, state) { + if (stream.sol()) state.indentCount = 0; + var style = state.tokenizer(stream, state); + var current = stream.current(); + + if (current === "@return" || current === "}"){ + dedent(state); + } + + if (style !== null) { + var startOfToken = stream.pos - current.length; + + var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount); + + var newScopes = []; + + for (var i = 0; i < state.scopes.length; i++) { + var scope = state.scopes[i]; + + if (scope.offset <= withCurrentIndent) + newScopes.push(scope); + } + + state.scopes = newScopes; + } + + + return style; + } + + return { + startState: function() { + return { + tokenizer: tokenBase, + scopes: [{offset: 0, type: "sass"}], + indentCount: 0, + cursorHalf: 0, // cursor half tells us if cursor lies after (1) + // or before (0) colon (well... more or less) + definedVars: [], + definedMixins: [] + }; + }, + token: function(stream, state) { + var style = tokenLexer(stream, state); + + state.lastToken = { style: style, content: stream.current() }; + + return style; + }, + + indent: function(state) { + return state.scopes[0].offset; + } + }; +}); + +CodeMirror.defineMIME("text/x-sass", "sass"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/index.html new file mode 100644 index 0000000..04d5c6a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/index.html @@ -0,0 +1,77 @@ + + +CodeMirror: Scheme mode + + + + + + + + + +
    +

    Scheme mode

    +
    + + +

    MIME types defined: text/x-scheme.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/scheme.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/scheme.js new file mode 100644 index 0000000..979edc0 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/scheme/scheme.js @@ -0,0 +1,248 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/** + * Author: Koh Zi Han, based on implementation by Koh Zi Chun + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("scheme", function () { + var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", + ATOM = "atom", NUMBER = "number", BRACKET = "bracket"; + var INDENT_WORD_SKIP = 2; + + function makeKeywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"); + var indentKeys = makeKeywords("define let letrec let* lambda"); + + function stateStack(indent, type, prev) { // represents a state stack object + this.indent = indent; + this.type = type; + this.prev = prev; + } + + function pushStack(state, indent, type) { + state.indentStack = new stateStack(indent, type, state.indentStack); + } + + function popStack(state) { + state.indentStack = state.indentStack.prev; + } + + var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i); + var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i); + var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i); + var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i); + + function isBinaryNumber (stream) { + return stream.match(binaryMatcher); + } + + function isOctalNumber (stream) { + return stream.match(octalMatcher); + } + + function isDecimalNumber (stream, backup) { + if (backup === true) { + stream.backUp(1); + } + return stream.match(decimalMatcher); + } + + function isHexNumber (stream) { + return stream.match(hexMatcher); + } + + return { + startState: function () { + return { + indentStack: null, + indentation: 0, + mode: false, + sExprComment: false + }; + }, + + token: function (stream, state) { + if (state.indentStack == null && stream.sol()) { + // update indentation, but only if indentStack is empty + state.indentation = stream.indentation(); + } + + // skip spaces + if (stream.eatSpace()) { + return null; + } + var returnType = null; + + switch(state.mode){ + case "string": // multi-line string parsing mode + var next, escaped = false; + while ((next = stream.next()) != null) { + if (next == "\"" && !escaped) { + + state.mode = false; + break; + } + escaped = !escaped && next == "\\"; + } + returnType = STRING; // continue on in scheme-string mode + break; + case "comment": // comment parsing mode + var next, maybeEnd = false; + while ((next = stream.next()) != null) { + if (next == "#" && maybeEnd) { + + state.mode = false; + break; + } + maybeEnd = (next == "|"); + } + returnType = COMMENT; + break; + case "s-expr-comment": // s-expr commenting mode + state.mode = false; + if(stream.peek() == "(" || stream.peek() == "["){ + // actually start scheme s-expr commenting mode + state.sExprComment = 0; + }else{ + // if not we just comment the entire of the next token + stream.eatWhile(/[^/s]/); // eat non spaces + returnType = COMMENT; + break; + } + default: // default parsing mode + var ch = stream.next(); + + if (ch == "\"") { + state.mode = "string"; + returnType = STRING; + + } else if (ch == "'") { + returnType = ATOM; + } else if (ch == '#') { + if (stream.eat("|")) { // Multi-line comment + state.mode = "comment"; // toggle to comment mode + returnType = COMMENT; + } else if (stream.eat(/[tf]/i)) { // #t/#f (atom) + returnType = ATOM; + } else if (stream.eat(';')) { // S-Expr comment + state.mode = "s-expr-comment"; + returnType = COMMENT; + } else { + var numTest = null, hasExactness = false, hasRadix = true; + if (stream.eat(/[ei]/i)) { + hasExactness = true; + } else { + stream.backUp(1); // must be radix specifier + } + if (stream.match(/^#b/i)) { + numTest = isBinaryNumber; + } else if (stream.match(/^#o/i)) { + numTest = isOctalNumber; + } else if (stream.match(/^#x/i)) { + numTest = isHexNumber; + } else if (stream.match(/^#d/i)) { + numTest = isDecimalNumber; + } else if (stream.match(/^[-+0-9.]/, false)) { + hasRadix = false; + numTest = isDecimalNumber; + // re-consume the intial # if all matches failed + } else if (!hasExactness) { + stream.eat('#'); + } + if (numTest != null) { + if (hasRadix && !hasExactness) { + // consume optional exactness after radix + stream.match(/^#[ei]/i); + } + if (numTest(stream)) + returnType = NUMBER; + } + } + } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal + returnType = NUMBER; + } else if (ch == ";") { // comment + stream.skipToEnd(); // rest of the line is a comment + returnType = COMMENT; + } else if (ch == "(" || ch == "[") { + var keyWord = ''; var indentTemp = stream.column(), letter; + /** + Either + (indent-word .. + (non-indent-word .. + (;something else, bracket, etc. + */ + + while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) { + keyWord += letter; + } + + if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word + + pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); + } else { // non-indent word + // we continue eating the spaces + stream.eatSpace(); + if (stream.eol() || stream.peek() == ";") { + // nothing significant after + // we restart indentation 1 space after + pushStack(state, indentTemp + 1, ch); + } else { + pushStack(state, indentTemp + stream.current().length, ch); // else we match + } + } + stream.backUp(stream.current().length - 1); // undo all the eating + + if(typeof state.sExprComment == "number") state.sExprComment++; + + returnType = BRACKET; + } else if (ch == ")" || ch == "]") { + returnType = BRACKET; + if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) { + popStack(state); + + if(typeof state.sExprComment == "number"){ + if(--state.sExprComment == 0){ + returnType = COMMENT; // final closing bracket + state.sExprComment = false; // turn off s-expr commenting mode + } + } + } + } else { + stream.eatWhile(/[\w\$_\-!$%&*+\.\/:<=>?@\^~]/); + + if (keywords && keywords.propertyIsEnumerable(stream.current())) { + returnType = BUILTIN; + } else returnType = "variable"; + } + } + return (typeof state.sExprComment == "number") ? COMMENT : returnType; + }, + + indent: function (state) { + if (state.indentStack == null) return state.indentation; + return state.indentStack.indent; + }, + + lineComment: ";;" + }; +}); + +CodeMirror.defineMIME("text/x-scheme", "scheme"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/index.html new file mode 100644 index 0000000..0b56300 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/index.html @@ -0,0 +1,66 @@ + + +CodeMirror: Shell mode + + + + + + + + + + +
    +

    Shell mode

    + + + + + + +

    MIME types defined: text/x-sh.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/shell.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/shell.js new file mode 100644 index 0000000..a684e8c --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/shell.js @@ -0,0 +1,139 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('shell', function() { + + var words = {}; + function define(style, string) { + var split = string.split(' '); + for(var i = 0; i < split.length; i++) { + words[split[i]] = style; + } + }; + + // Atoms + define('atom', 'true false'); + + // Keywords + define('keyword', 'if then do else elif while until for in esac fi fin ' + + 'fil done exit set unset export function'); + + // Commands + define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' + + 'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' + + 'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' + + 'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' + + 'touch vi vim wall wc wget who write yes zsh'); + + function tokenBase(stream, state) { + if (stream.eatSpace()) return null; + + var sol = stream.sol(); + var ch = stream.next(); + + if (ch === '\\') { + stream.next(); + return null; + } + if (ch === '\'' || ch === '"' || ch === '`') { + state.tokens.unshift(tokenString(ch)); + return tokenize(stream, state); + } + if (ch === '#') { + if (sol && stream.eat('!')) { + stream.skipToEnd(); + return 'meta'; // 'comment'? + } + stream.skipToEnd(); + return 'comment'; + } + if (ch === '$') { + state.tokens.unshift(tokenDollar); + return tokenize(stream, state); + } + if (ch === '+' || ch === '=') { + return 'operator'; + } + if (ch === '-') { + stream.eat('-'); + stream.eatWhile(/\w/); + return 'attribute'; + } + if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + if(stream.eol() || !/\w/.test(stream.peek())) { + return 'number'; + } + } + stream.eatWhile(/[\w-]/); + var cur = stream.current(); + if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; + return words.hasOwnProperty(cur) ? words[cur] : null; + } + + function tokenString(quote) { + return function(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === quote && !escaped) { + end = true; + break; + } + if (next === '$' && !escaped && quote !== '\'') { + escaped = true; + stream.backUp(1); + state.tokens.unshift(tokenDollar); + break; + } + escaped = !escaped && next === '\\'; + } + if (end || !escaped) { + state.tokens.shift(); + } + return (quote === '`' || quote === ')' ? 'quote' : 'string'); + }; + }; + + var tokenDollar = function(stream, state) { + if (state.tokens.length > 1) stream.eat('$'); + var ch = stream.next(), hungry = /\w/; + if (ch === '{') hungry = /[^}]/; + if (ch === '(') { + state.tokens[0] = tokenString(')'); + return tokenize(stream, state); + } + if (!/\d/.test(ch)) { + stream.eatWhile(hungry); + stream.eat('}'); + } + state.tokens.shift(); + return 'def'; + }; + + function tokenize(stream, state) { + return (state.tokens[0] || tokenBase) (stream, state); + }; + + return { + startState: function() {return {tokens:[]};}, + token: function(stream, state) { + return tokenize(stream, state); + }, + lineComment: '#', + fold: "brace" + }; +}); + +CodeMirror.defineMIME('text/x-sh', 'shell'); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/test.js new file mode 100644 index 0000000..a413b5a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/shell/test.js @@ -0,0 +1,58 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({}, "shell"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT("var", + "text [def $var] text"); + MT("varBraces", + "text[def ${var}]text"); + MT("varVar", + "text [def $a$b] text"); + MT("varBracesVarBraces", + "text[def ${a}${b}]text"); + + MT("singleQuotedVar", + "[string 'text $var text']"); + MT("singleQuotedVarBraces", + "[string 'text ${var} text']"); + + MT("doubleQuotedVar", + '[string "text ][def $var][string text"]'); + MT("doubleQuotedVarBraces", + '[string "text][def ${var}][string text"]'); + MT("doubleQuotedVarPunct", + '[string "text ][def $@][string text"]'); + MT("doubleQuotedVarVar", + '[string "][def $a$b][string "]'); + MT("doubleQuotedVarBracesVarBraces", + '[string "][def ${a}${b}][string "]'); + + MT("notAString", + "text\\'text"); + MT("escapes", + "outside\\'\\\"\\`\\\\[string \"inside\\`\\'\\\"\\\\`\\$notAVar\"]outside\\$\\(notASubShell\\)"); + + MT("subshell", + "[builtin echo] [quote $(whoami)] s log, stardate [quote `date`]."); + MT("doubleQuotedSubshell", + "[builtin echo] [string \"][quote $(whoami)][string 's log, stardate `date`.\"]"); + + MT("hashbang", + "[meta #!/bin/bash]"); + MT("comment", + "text [comment # Blurb]"); + + MT("numbers", + "[number 0] [number 1] [number 2]"); + MT("keywords", + "[keyword while] [atom true]; [keyword do]", + " [builtin sleep] [number 3]", + "[keyword done]"); + MT("options", + "[builtin ls] [attribute -l] [attribute --human-readable]"); + MT("operator", + "[def var][operator =]value"); +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/index.html new file mode 100644 index 0000000..6f029b6 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/index.html @@ -0,0 +1,93 @@ + + +CodeMirror: Sieve (RFC5228) mode + + + + + + + + + +
    +

    Sieve (RFC5228) mode

    +
    + + +

    MIME types defined: application/sieve.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/sieve.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/sieve.js new file mode 100644 index 0000000..f67db2f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sieve/sieve.js @@ -0,0 +1,193 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sieve", function(config) { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = words("if elsif else stop require"); + var atoms = words("true false not"); + var indentUnit = config.indentUnit; + + function tokenBase(stream, state) { + + var ch = stream.next(); + if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + + if (ch === '#') { + stream.skipToEnd(); + return "comment"; + } + + if (ch == "\"") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + + if (ch == "(") { + state._indent.push("("); + // add virtual angel wings so that editor behaves... + // ...more sane incase of broken brackets + state._indent.push("{"); + return null; + } + + if (ch === "{") { + state._indent.push("{"); + return null; + } + + if (ch == ")") { + state._indent.pop(); + state._indent.pop(); + } + + if (ch === "}") { + state._indent.pop(); + return null; + } + + if (ch == ",") + return null; + + if (ch == ";") + return null; + + + if (/[{}\(\),;]/.test(ch)) + return null; + + // 1*DIGIT "K" / "M" / "G" + if (/\d/.test(ch)) { + stream.eatWhile(/[\d]/); + stream.eat(/[KkMmGg]/); + return "number"; + } + + // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_") + if (ch == ":") { + stream.eatWhile(/[a-zA-Z_]/); + stream.eatWhile(/[a-zA-Z0-9_]/); + + return "operator"; + } + + stream.eatWhile(/\w/); + var cur = stream.current(); + + // "text:" *(SP / HTAB) (hash-comment / CRLF) + // *(multiline-literal / multiline-dotstart) + // "." CRLF + if ((cur == "text") && stream.eat(":")) + { + state.tokenize = tokenMultiLineString; + return "string"; + } + + if (keywords.propertyIsEnumerable(cur)) + return "keyword"; + + if (atoms.propertyIsEnumerable(cur)) + return "atom"; + + return null; + } + + function tokenMultiLineString(stream, state) + { + state._multiLineString = true; + // the first line is special it may contain a comment + if (!stream.sol()) { + stream.eatSpace(); + + if (stream.peek() == "#") { + stream.skipToEnd(); + return "comment"; + } + + stream.skipToEnd(); + return "string"; + } + + if ((stream.next() == ".") && (stream.eol())) + { + state._multiLineString = false; + state.tokenize = tokenBase; + } + + return "string"; + } + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) + break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return "string"; + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + _indent: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) + return null; + + return (state.tokenize || tokenBase)(stream, state);; + }, + + indent: function(state, _textAfter) { + var length = state._indent.length; + if (_textAfter && (_textAfter[0] == "}")) + length--; + + if (length <0) + length = 0; + + return length * indentUnit; + }, + + electricChars: "}" + }; +}); + +CodeMirror.defineMIME("application/sieve", "sieve"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/index.html new file mode 100644 index 0000000..7fa4e50 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/index.html @@ -0,0 +1,96 @@ + + +CodeMirror: SLIM mode + + + + + + + + + + + + + + + + + + + + +
    +

    SLIM mode

    +
    + + +

    MIME types defined: application/x-slim.

    + +

    + Parsing/Highlighting Tests: + normal, + verbose. +

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/slim.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/slim.js new file mode 100644 index 0000000..164464d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/slim.js @@ -0,0 +1,575 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + + CodeMirror.defineMode("slim", function(config) { + var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); + var rubyMode = CodeMirror.getMode(config, "ruby"); + var modes = { html: htmlMode, ruby: rubyMode }; + var embedded = { + ruby: "ruby", + javascript: "javascript", + css: "text/css", + sass: "text/x-sass", + scss: "text/x-scss", + less: "text/x-less", + styl: "text/x-styl", // no highlighting so far + coffee: "coffeescript", + asciidoc: "text/x-asciidoc", + markdown: "text/x-markdown", + textile: "text/x-textile", // no highlighting so far + creole: "text/x-creole", // no highlighting so far + wiki: "text/x-wiki", // no highlighting so far + mediawiki: "text/x-mediawiki", // no highlighting so far + rdoc: "text/x-rdoc", // no highlighting so far + builder: "text/x-builder", // no highlighting so far + nokogiri: "text/x-nokogiri", // no highlighting so far + erb: "application/x-erb" + }; + var embeddedRegexp = function(map){ + var arr = []; + for(var key in map) arr.push(key); + return new RegExp("^("+arr.join('|')+"):"); + }(embedded); + + var styleMap = { + "commentLine": "comment", + "slimSwitch": "operator special", + "slimTag": "tag", + "slimId": "attribute def", + "slimClass": "attribute qualifier", + "slimAttribute": "attribute", + "slimSubmode": "keyword special", + "closeAttributeTag": null, + "slimDoctype": null, + "lineContinuation": null + }; + var closing = { + "{": "}", + "[": "]", + "(": ")" + }; + + var nameStartChar = "_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"; + var nameChar = nameStartChar + "\\-0-9\xB7\u0300-\u036F\u203F-\u2040"; + var nameRegexp = new RegExp("^[:"+nameStartChar+"](?::["+nameChar+"]|["+nameChar+"]*)"); + var attributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*(?=\\s*=)"); + var wrappedAttributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*"); + var classNameRegexp = /^\.-?[_a-zA-Z]+[\w\-]*/; + var classIdRegexp = /^#[_a-zA-Z]+[\w\-]*/; + + function backup(pos, tokenize, style) { + var restore = function(stream, state) { + state.tokenize = tokenize; + if (stream.pos < pos) { + stream.pos = pos; + return style; + } + return state.tokenize(stream, state); + }; + return function(stream, state) { + state.tokenize = restore; + return tokenize(stream, state); + }; + } + + function maybeBackup(stream, state, pat, offset, style) { + var cur = stream.current(); + var idx = cur.search(pat); + if (idx > -1) { + state.tokenize = backup(stream.pos, state.tokenize, style); + stream.backUp(cur.length - idx - offset); + } + return style; + } + + function continueLine(state, column) { + state.stack = { + parent: state.stack, + style: "continuation", + indented: column, + tokenize: state.line + }; + state.line = state.tokenize; + } + function finishContinue(state) { + if (state.line == state.tokenize) { + state.line = state.stack.tokenize; + state.stack = state.stack.parent; + } + } + + function lineContinuable(column, tokenize) { + return function(stream, state) { + finishContinue(state); + if (stream.match(/^\\$/)) { + continueLine(state, column); + return "lineContinuation"; + } + var style = tokenize(stream, state); + if (stream.eol() && stream.current().match(/(?:^|[^\\])(?:\\\\)*\\$/)) { + stream.backUp(1); + } + return style; + }; + } + function commaContinuable(column, tokenize) { + return function(stream, state) { + finishContinue(state); + var style = tokenize(stream, state); + if (stream.eol() && stream.current().match(/,$/)) { + continueLine(state, column); + } + return style; + }; + } + + function rubyInQuote(endQuote, tokenize) { + // TODO: add multi line support + return function(stream, state) { + var ch = stream.peek(); + if (ch == endQuote && state.rubyState.tokenize.length == 1) { + // step out of ruby context as it seems to complete processing all the braces + stream.next(); + state.tokenize = tokenize; + return "closeAttributeTag"; + } else { + return ruby(stream, state); + } + }; + } + function startRubySplat(tokenize) { + var rubyState; + var runSplat = function(stream, state) { + if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) { + stream.backUp(1); + if (stream.eatSpace()) { + state.rubyState = rubyState; + state.tokenize = tokenize; + return tokenize(stream, state); + } + stream.next(); + } + return ruby(stream, state); + }; + return function(stream, state) { + rubyState = state.rubyState; + state.rubyState = rubyMode.startState(); + state.tokenize = runSplat; + return ruby(stream, state); + }; + } + + function ruby(stream, state) { + return rubyMode.token(stream, state.rubyState); + } + + function htmlLine(stream, state) { + if (stream.match(/^\\$/)) { + return "lineContinuation"; + } + return html(stream, state); + } + function html(stream, state) { + if (stream.match(/^#\{/)) { + state.tokenize = rubyInQuote("}", state.tokenize); + return null; + } + return maybeBackup(stream, state, /[^\\]#\{/, 1, htmlMode.token(stream, state.htmlState)); + } + + function startHtmlLine(lastTokenize) { + return function(stream, state) { + var style = htmlLine(stream, state); + if (stream.eol()) state.tokenize = lastTokenize; + return style; + }; + } + + function startHtmlMode(stream, state, offset) { + state.stack = { + parent: state.stack, + style: "html", + indented: stream.column() + offset, // pipe + space + tokenize: state.line + }; + state.line = state.tokenize = html; + return null; + } + + function comment(stream, state) { + stream.skipToEnd(); + return state.stack.style; + } + + function commentMode(stream, state) { + state.stack = { + parent: state.stack, + style: "comment", + indented: state.indented + 1, + tokenize: state.line + }; + state.line = comment; + return comment(stream, state); + } + + function attributeWrapper(stream, state) { + if (stream.eat(state.stack.endQuote)) { + state.line = state.stack.line; + state.tokenize = state.stack.tokenize; + state.stack = state.stack.parent; + return null; + } + if (stream.match(wrappedAttributeNameRegexp)) { + state.tokenize = attributeWrapperAssign; + return "slimAttribute"; + } + stream.next(); + return null; + } + function attributeWrapperAssign(stream, state) { + if (stream.match(/^==?/)) { + state.tokenize = attributeWrapperValue; + return null; + } + return attributeWrapper(stream, state); + } + function attributeWrapperValue(stream, state) { + var ch = stream.peek(); + if (ch == '"' || ch == "\'") { + state.tokenize = readQuoted(ch, "string", true, false, attributeWrapper); + stream.next(); + return state.tokenize(stream, state); + } + if (ch == '[') { + return startRubySplat(attributeWrapper)(stream, state); + } + if (stream.match(/^(true|false|nil)\b/)) { + state.tokenize = attributeWrapper; + return "keyword"; + } + return startRubySplat(attributeWrapper)(stream, state); + } + + function startAttributeWrapperMode(state, endQuote, tokenize) { + state.stack = { + parent: state.stack, + style: "wrapper", + indented: state.indented + 1, + tokenize: tokenize, + line: state.line, + endQuote: endQuote + }; + state.line = state.tokenize = attributeWrapper; + return null; + } + + function sub(stream, state) { + if (stream.match(/^#\{/)) { + state.tokenize = rubyInQuote("}", state.tokenize); + return null; + } + var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize); + subStream.pos = stream.pos - state.stack.indented; + subStream.start = stream.start - state.stack.indented; + subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented; + subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented; + var style = state.subMode.token(subStream, state.subState); + stream.pos = subStream.pos + state.stack.indented; + return style; + } + function firstSub(stream, state) { + state.stack.indented = stream.column(); + state.line = state.tokenize = sub; + return state.tokenize(stream, state); + } + + function createMode(mode) { + var query = embedded[mode]; + var spec = CodeMirror.mimeModes[query]; + if (spec) { + return CodeMirror.getMode(config, spec); + } + var factory = CodeMirror.modes[query]; + if (factory) { + return factory(config, {name: query}); + } + return CodeMirror.getMode(config, "null"); + } + + function getMode(mode) { + if (!modes.hasOwnProperty(mode)) { + return modes[mode] = createMode(mode); + } + return modes[mode]; + } + + function startSubMode(mode, state) { + var subMode = getMode(mode); + var subState = subMode.startState && subMode.startState(); + + state.subMode = subMode; + state.subState = subState; + + state.stack = { + parent: state.stack, + style: "sub", + indented: state.indented + 1, + tokenize: state.line + }; + state.line = state.tokenize = firstSub; + return "slimSubmode"; + } + + function doctypeLine(stream, _state) { + stream.skipToEnd(); + return "slimDoctype"; + } + + function startLine(stream, state) { + var ch = stream.peek(); + if (ch == '<') { + return (state.tokenize = startHtmlLine(state.tokenize))(stream, state); + } + if (stream.match(/^[|']/)) { + return startHtmlMode(stream, state, 1); + } + if (stream.match(/^\/(!|\[\w+])?/)) { + return commentMode(stream, state); + } + if (stream.match(/^(-|==?[<>]?)/)) { + state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby)); + return "slimSwitch"; + } + if (stream.match(/^doctype\b/)) { + state.tokenize = doctypeLine; + return "keyword"; + } + + var m = stream.match(embeddedRegexp); + if (m) { + return startSubMode(m[1], state); + } + + return slimTag(stream, state); + } + + function slim(stream, state) { + if (state.startOfLine) { + return startLine(stream, state); + } + return slimTag(stream, state); + } + + function slimTag(stream, state) { + if (stream.eat('*')) { + state.tokenize = startRubySplat(slimTagExtras); + return null; + } + if (stream.match(nameRegexp)) { + state.tokenize = slimTagExtras; + return "slimTag"; + } + return slimClass(stream, state); + } + function slimTagExtras(stream, state) { + if (stream.match(/^(<>?|> state.indented && state.last != "slimSubmode") { + state.line = state.tokenize = state.stack.tokenize; + state.stack = state.stack.parent; + state.subMode = null; + state.subState = null; + } + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + state.startOfLine = false; + if (style) state.last = style; + return styleMap.hasOwnProperty(style) ? styleMap[style] : style; + }, + + blankLine: function(state) { + if (state.subMode && state.subMode.blankLine) { + return state.subMode.blankLine(state.subState); + } + }, + + innerMode: function(state) { + if (state.subMode) return {state: state.subState, mode: state.subMode}; + return {state: state, mode: mode}; + } + + //indent: function(state) { + // return state.indented; + //} + }; + return mode; + }, "htmlmixed", "ruby"); + + CodeMirror.defineMIME("text/x-slim", "slim"); + CodeMirror.defineMIME("application/x-slim", "slim"); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/test.js new file mode 100644 index 0000000..be4ddac --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/slim/test.js @@ -0,0 +1,96 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh + +(function() { + var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "slim"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + // Requires at least one media query + MT("elementName", + "[tag h1] Hey There"); + + MT("oneElementPerLine", + "[tag h1] Hey There .h2"); + + MT("idShortcut", + "[attribute&def #test] Hey There"); + + MT("tagWithIdShortcuts", + "[tag h1][attribute&def #test] Hey There"); + + MT("classShortcut", + "[attribute&qualifier .hello] Hey There"); + + MT("tagWithIdAndClassShortcuts", + "[tag h1][attribute&def #test][attribute&qualifier .hello] Hey There"); + + MT("docType", + "[keyword doctype] xml"); + + MT("comment", + "[comment / Hello WORLD]"); + + MT("notComment", + "[tag h1] This is not a / comment "); + + MT("attributes", + "[tag a]([attribute title]=[string \"test\"]) [attribute href]=[string \"link\"]}"); + + MT("multiLineAttributes", + "[tag a]([attribute title]=[string \"test\"]", + " ) [attribute href]=[string \"link\"]}"); + + MT("htmlCode", + "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket ]"); + + MT("rubyBlock", + "[operator&special =][variable-2 @item]"); + + MT("selectorRubyBlock", + "[tag a][attribute&qualifier .test][operator&special =] [variable-2 @item]"); + + MT("nestedRubyBlock", + "[tag a]", + " [operator&special =][variable puts] [string \"test\"]"); + + MT("multilinePlaintext", + "[tag p]", + " | Hello,", + " World"); + + MT("multilineRuby", + "[tag p]", + " [comment /# this is a comment]", + " [comment and this is a comment too]", + " | Date/Time", + " [operator&special -] [variable now] [operator =] [tag DateTime][operator .][property now]", + " [tag strong][operator&special =] [variable now]", + " [operator&special -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])", + " [operator&special =][string \"Happy\"]", + " [operator&special =][string \"Belated\"]", + " [operator&special =][string \"Birthday\"]"); + + MT("multilineComment", + "[comment /]", + " [comment Multiline]", + " [comment Comment]"); + + MT("hamlAfterRubyTag", + "[attribute&qualifier .block]", + " [tag strong][operator&special =] [variable now]", + " [attribute&qualifier .test]", + " [operator&special =][variable now]", + " [attribute&qualifier .right]"); + + MT("stretchedRuby", + "[operator&special =] [variable puts] [string \"Hello\"],", + " [string \"World\"]"); + + MT("interpolationInHashAttribute", + "[tag div]{[attribute id] = [string \"]#{[variable test]}[string _]#{[variable ting]}[string \"]} test"); + + MT("interpolationInHTMLAttribute", + "[tag div]([attribute title]=[string \"]#{[variable test]}[string _]#{[variable ting]()}[string \"]) Test"); +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/index.html new file mode 100644 index 0000000..2155ebc --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/index.html @@ -0,0 +1,68 @@ + + +CodeMirror: Smalltalk mode + + + + + + + + + + +
    +

    Smalltalk mode

    +
    + + + +

    Simple Smalltalk mode.

    + +

    MIME types defined: text/x-stsrc.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/smalltalk.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/smalltalk.js new file mode 100644 index 0000000..bb510ba --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smalltalk/smalltalk.js @@ -0,0 +1,168 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('smalltalk', function(config) { + + var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/; + var keywords = /true|false|nil|self|super|thisContext/; + + var Context = function(tokenizer, parent) { + this.next = tokenizer; + this.parent = parent; + }; + + var Token = function(name, context, eos) { + this.name = name; + this.context = context; + this.eos = eos; + }; + + var State = function() { + this.context = new Context(next, null); + this.expectVariable = true; + this.indentation = 0; + this.userIndentationDelta = 0; + }; + + State.prototype.userIndent = function(indentation) { + this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0; + }; + + var next = function(stream, context, state) { + var token = new Token(null, context, false); + var aChar = stream.next(); + + if (aChar === '"') { + token = nextComment(stream, new Context(nextComment, context)); + + } else if (aChar === '\'') { + token = nextString(stream, new Context(nextString, context)); + + } else if (aChar === '#') { + if (stream.peek() === '\'') { + stream.next(); + token = nextSymbol(stream, new Context(nextSymbol, context)); + } else { + if (stream.eatWhile(/[^\s.{}\[\]()]/)) + token.name = 'string-2'; + else + token.name = 'meta'; + } + + } else if (aChar === '$') { + if (stream.next() === '<') { + stream.eatWhile(/[^\s>]/); + stream.next(); + } + token.name = 'string-2'; + + } else if (aChar === '|' && state.expectVariable) { + token.context = new Context(nextTemporaries, context); + + } else if (/[\[\]{}()]/.test(aChar)) { + token.name = 'bracket'; + token.eos = /[\[{(]/.test(aChar); + + if (aChar === '[') { + state.indentation++; + } else if (aChar === ']') { + state.indentation = Math.max(0, state.indentation - 1); + } + + } else if (specialChars.test(aChar)) { + stream.eatWhile(specialChars); + token.name = 'operator'; + token.eos = aChar !== ';'; // ; cascaded message expression + + } else if (/\d/.test(aChar)) { + stream.eatWhile(/[\w\d]/); + token.name = 'number'; + + } else if (/[\w_]/.test(aChar)) { + stream.eatWhile(/[\w\d_]/); + token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null; + + } else { + token.eos = state.expectVariable; + } + + return token; + }; + + var nextComment = function(stream, context) { + stream.eatWhile(/[^"]/); + return new Token('comment', stream.eat('"') ? context.parent : context, true); + }; + + var nextString = function(stream, context) { + stream.eatWhile(/[^']/); + return new Token('string', stream.eat('\'') ? context.parent : context, false); + }; + + var nextSymbol = function(stream, context) { + stream.eatWhile(/[^']/); + return new Token('string-2', stream.eat('\'') ? context.parent : context, false); + }; + + var nextTemporaries = function(stream, context) { + var token = new Token(null, context, false); + var aChar = stream.next(); + + if (aChar === '|') { + token.context = context.parent; + token.eos = true; + + } else { + stream.eatWhile(/[^|]/); + token.name = 'variable'; + } + + return token; + }; + + return { + startState: function() { + return new State; + }, + + token: function(stream, state) { + state.userIndent(stream.indentation()); + + if (stream.eatSpace()) { + return null; + } + + var token = state.context.next(stream, state.context, state); + state.context = token.context; + state.expectVariable = token.eos; + + return token.name; + }, + + blankLine: function(state) { + state.userIndent(0); + }, + + indent: function(state, textAfter) { + var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta; + return (state.indentation + i) * config.indentUnit; + }, + + electricChars: ']' + }; + +}); + +CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'}); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/index.html new file mode 100644 index 0000000..8d88c9a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/index.html @@ -0,0 +1,136 @@ + + +CodeMirror: Smarty mode + + + + + + + + + +
    +

    Smarty mode

    +
    + + + +
    + +

    Smarty 2, custom delimiters

    +
    + + + +
    + +

    Smarty 3

    + + + + + + +

    A plain text/Smarty version 2 or 3 mode, which allows for custom delimiter tags.

    + +

    MIME types defined: text/x-smarty

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/smarty.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/smarty.js new file mode 100644 index 0000000..bb05324 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smarty/smarty.js @@ -0,0 +1,221 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/** + * Smarty 2 and 3 mode. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("smarty", function(config) { + "use strict"; + + // our default settings; check to see if they're overridden + var settings = { + rightDelimiter: '}', + leftDelimiter: '{', + smartyVersion: 2 // for backward compatibility + }; + if (config.hasOwnProperty("leftDelimiter")) { + settings.leftDelimiter = config.leftDelimiter; + } + if (config.hasOwnProperty("rightDelimiter")) { + settings.rightDelimiter = config.rightDelimiter; + } + if (config.hasOwnProperty("smartyVersion") && config.smartyVersion === 3) { + settings.smartyVersion = 3; + } + + var keyFunctions = ["debug", "extends", "function", "include", "literal"]; + var last; + var regs = { + operatorChars: /[+\-*&%=<>!?]/, + validIdentifier: /[a-zA-Z0-9_]/, + stringChar: /['"]/ + }; + + var helpers = { + cont: function(style, lastType) { + last = lastType; + return style; + }, + chain: function(stream, state, parser) { + state.tokenize = parser; + return parser(stream, state); + } + }; + + + // our various parsers + var parsers = { + + // the main tokenizer + tokenizer: function(stream, state) { + if (stream.match(settings.leftDelimiter, true)) { + if (stream.eat("*")) { + return helpers.chain(stream, state, parsers.inBlock("comment", "*" + settings.rightDelimiter)); + } else { + // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode + state.depth++; + var isEol = stream.eol(); + var isFollowedByWhitespace = /\s/.test(stream.peek()); + if (settings.smartyVersion === 3 && settings.leftDelimiter === "{" && (isEol || isFollowedByWhitespace)) { + state.depth--; + return null; + } else { + state.tokenize = parsers.smarty; + last = "startTag"; + return "tag"; + } + } + } else { + stream.next(); + return null; + } + }, + + // parsing Smarty content + smarty: function(stream, state) { + if (stream.match(settings.rightDelimiter, true)) { + if (settings.smartyVersion === 3) { + state.depth--; + if (state.depth <= 0) { + state.tokenize = parsers.tokenizer; + } + } else { + state.tokenize = parsers.tokenizer; + } + return helpers.cont("tag", null); + } + + if (stream.match(settings.leftDelimiter, true)) { + state.depth++; + return helpers.cont("tag", "startTag"); + } + + var ch = stream.next(); + if (ch == "$") { + stream.eatWhile(regs.validIdentifier); + return helpers.cont("variable-2", "variable"); + } else if (ch == "|") { + return helpers.cont("operator", "pipe"); + } else if (ch == ".") { + return helpers.cont("operator", "property"); + } else if (regs.stringChar.test(ch)) { + state.tokenize = parsers.inAttribute(ch); + return helpers.cont("string", "string"); + } else if (regs.operatorChars.test(ch)) { + stream.eatWhile(regs.operatorChars); + return helpers.cont("operator", "operator"); + } else if (ch == "[" || ch == "]") { + return helpers.cont("bracket", "bracket"); + } else if (ch == "(" || ch == ")") { + return helpers.cont("bracket", "operator"); + } else if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + return helpers.cont("number", "number"); + } else { + + if (state.last == "variable") { + if (ch == "@") { + stream.eatWhile(regs.validIdentifier); + return helpers.cont("property", "property"); + } else if (ch == "|") { + stream.eatWhile(regs.validIdentifier); + return helpers.cont("qualifier", "modifier"); + } + } else if (state.last == "pipe") { + stream.eatWhile(regs.validIdentifier); + return helpers.cont("qualifier", "modifier"); + } else if (state.last == "whitespace") { + stream.eatWhile(regs.validIdentifier); + return helpers.cont("attribute", "modifier"); + } if (state.last == "property") { + stream.eatWhile(regs.validIdentifier); + return helpers.cont("property", null); + } else if (/\s/.test(ch)) { + last = "whitespace"; + return null; + } + + var str = ""; + if (ch != "/") { + str += ch; + } + var c = null; + while (c = stream.eat(regs.validIdentifier)) { + str += c; + } + for (var i=0, j=keyFunctions.length; i + +CodeMirror: Smarty mixed mode + + + + + + + + + + + + + +
    +

    Smarty mixed mode

    +
    + + + +

    The Smarty mixed mode depends on the Smarty and HTML mixed modes. HTML + mixed mode itself depends on XML, JavaScript, and CSS modes.

    + +

    It takes the same options, as Smarty and HTML mixed modes.

    + +

    MIME types defined: text/x-smarty.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smartymixed/smartymixed.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smartymixed/smartymixed.js new file mode 100644 index 0000000..4fc7ca4 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/smartymixed/smartymixed.js @@ -0,0 +1,197 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/** +* @file smartymixed.js +* @brief Smarty Mixed Codemirror mode (Smarty + Mixed HTML) +* @author Ruslan Osmanov +* @version 3.0 +* @date 05.07.2013 +*/ + +// Warning: Don't base other modes on this one. This here is a +// terrible way to write a mixed mode. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../smarty/smarty")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../smarty/smarty"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("smartymixed", function(config) { + var htmlMixedMode = CodeMirror.getMode(config, "htmlmixed"); + var smartyMode = CodeMirror.getMode(config, "smarty"); + + var settings = { + rightDelimiter: '}', + leftDelimiter: '{' + }; + + if (config.hasOwnProperty("leftDelimiter")) { + settings.leftDelimiter = config.leftDelimiter; + } + if (config.hasOwnProperty("rightDelimiter")) { + settings.rightDelimiter = config.rightDelimiter; + } + + function reEsc(str) { return str.replace(/[^\s\w]/g, "\\$&"); } + + var reLeft = reEsc(settings.leftDelimiter), reRight = reEsc(settings.rightDelimiter); + var regs = { + smartyComment: new RegExp("^" + reRight + "\\*"), + literalOpen: new RegExp(reLeft + "literal" + reRight), + literalClose: new RegExp(reLeft + "\/literal" + reRight), + hasLeftDelimeter: new RegExp(".*" + reLeft), + htmlHasLeftDelimeter: new RegExp("[^<>]*" + reLeft) + }; + + var helpers = { + chain: function(stream, state, parser) { + state.tokenize = parser; + return parser(stream, state); + }, + + cleanChain: function(stream, state, parser) { + state.tokenize = null; + state.localState = null; + state.localMode = null; + return (typeof parser == "string") ? (parser ? parser : null) : parser(stream, state); + }, + + maybeBackup: function(stream, pat, style) { + var cur = stream.current(); + var close = cur.search(pat), + m; + if (close > - 1) stream.backUp(cur.length - close); + else if (m = cur.match(/<\/?$/)) { + stream.backUp(cur.length); + if (!stream.match(pat, false)) stream.match(cur[0]); + } + return style; + } + }; + + var parsers = { + html: function(stream, state) { + var htmlTagName = state.htmlMixedState.htmlState.context && state.htmlMixedState.htmlState.context.tagName + ? state.htmlMixedState.htmlState.context.tagName + : null; + + if (!state.inLiteral && stream.match(regs.htmlHasLeftDelimeter, false) && htmlTagName === null) { + state.tokenize = parsers.smarty; + state.localMode = smartyMode; + state.localState = smartyMode.startState(htmlMixedMode.indent(state.htmlMixedState, "")); + return helpers.maybeBackup(stream, settings.leftDelimiter, smartyMode.token(stream, state.localState)); + } else if (!state.inLiteral && stream.match(settings.leftDelimiter, false)) { + state.tokenize = parsers.smarty; + state.localMode = smartyMode; + state.localState = smartyMode.startState(htmlMixedMode.indent(state.htmlMixedState, "")); + return helpers.maybeBackup(stream, settings.leftDelimiter, smartyMode.token(stream, state.localState)); + } + return htmlMixedMode.token(stream, state.htmlMixedState); + }, + + smarty: function(stream, state) { + if (stream.match(settings.leftDelimiter, false)) { + if (stream.match(regs.smartyComment, false)) { + return helpers.chain(stream, state, parsers.inBlock("comment", "*" + settings.rightDelimiter)); + } + } else if (stream.match(settings.rightDelimiter, false)) { + stream.eat(settings.rightDelimiter); + state.tokenize = parsers.html; + state.localMode = htmlMixedMode; + state.localState = state.htmlMixedState; + return "tag"; + } + + return helpers.maybeBackup(stream, settings.rightDelimiter, smartyMode.token(stream, state.localState)); + }, + + inBlock: function(style, terminator) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + helpers.cleanChain(stream, state, ""); + break; + } + stream.next(); + } + return style; + }; + } + }; + + return { + startState: function() { + var state = htmlMixedMode.startState(); + return { + token: parsers.html, + localMode: null, + localState: null, + htmlMixedState: state, + tokenize: null, + inLiteral: false + }; + }, + + copyState: function(state) { + var local = null, tok = (state.tokenize || state.token); + if (state.localState) { + local = CodeMirror.copyState((tok != parsers.html ? smartyMode : htmlMixedMode), state.localState); + } + return { + token: state.token, + tokenize: state.tokenize, + localMode: state.localMode, + localState: local, + htmlMixedState: CodeMirror.copyState(htmlMixedMode, state.htmlMixedState), + inLiteral: state.inLiteral + }; + }, + + token: function(stream, state) { + if (stream.match(settings.leftDelimiter, false)) { + if (!state.inLiteral && stream.match(regs.literalOpen, true)) { + state.inLiteral = true; + return "keyword"; + } else if (state.inLiteral && stream.match(regs.literalClose, true)) { + state.inLiteral = false; + return "keyword"; + } + } + if (state.inLiteral && state.localState != state.htmlMixedState) { + state.tokenize = parsers.html; + state.localMode = htmlMixedMode; + state.localState = state.htmlMixedState; + } + + var style = (state.tokenize || state.token)(stream, state); + return style; + }, + + indent: function(state, textAfter) { + if (state.localMode == smartyMode + || (state.inLiteral && !state.localMode) + || regs.hasLeftDelimeter.test(textAfter)) { + return CodeMirror.Pass; + } + return htmlMixedMode.indent(state.htmlMixedState, textAfter); + }, + + innerMode: function(state) { + return { + state: state.localState || state.htmlMixedState, + mode: state.localMode || htmlMixedMode + }; + } + }; +}, "htmlmixed", "smarty"); + +CodeMirror.defineMIME("text/x-smarty", "smartymixed"); +// vim: et ts=2 sts=2 sw=2 + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/index.html new file mode 100644 index 0000000..4b18c25 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/index.html @@ -0,0 +1,57 @@ + + +CodeMirror: Solr mode + + + + + + + + + +
    +

    Solr mode

    + +
    + +
    + + + +

    MIME types defined: text/x-solr.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/solr.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/solr.js new file mode 100644 index 0000000..f7f7087 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/solr/solr.js @@ -0,0 +1,104 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("solr", function() { + "use strict"; + + var isStringChar = /[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\^\"\\]/; + var isOperatorChar = /[\|\!\+\-\*\?\~\^\&]/; + var isOperatorString = /^(OR|AND|NOT|TO)$/i; + + function isNumber(word) { + return parseFloat(word, 10).toString() === word; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + + if (!escaped) state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenOperator(operator) { + return function(stream, state) { + var style = "operator"; + if (operator == "+") + style += " positive"; + else if (operator == "-") + style += " negative"; + else if (operator == "|") + stream.eat(/\|/); + else if (operator == "&") + stream.eat(/\&/); + else if (operator == "^") + style += " boost"; + + state.tokenize = tokenBase; + return style; + }; + } + + function tokenWord(ch) { + return function(stream, state) { + var word = ch; + while ((ch = stream.peek()) && ch.match(isStringChar) != null) { + word += stream.next(); + } + + state.tokenize = tokenBase; + if (isOperatorString.test(word)) + return "operator"; + else if (isNumber(word)) + return "number"; + else if (stream.peek() == ":") + return "field"; + else + return "string"; + }; + } + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"') + state.tokenize = tokenString(ch); + else if (isOperatorChar.test(ch)) + state.tokenize = tokenOperator(ch); + else if (isStringChar.test(ch)) + state.tokenize = tokenWord(ch); + + return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null; + } + + return { + startState: function() { + return { + tokenize: tokenBase + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME("text/x-solr", "solr"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/index.html new file mode 100644 index 0000000..f0216f0 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/index.html @@ -0,0 +1,68 @@ + + +CodeMirror: Soy (Closure Template) mode + + + + + + + + + + + + + + +
    +

    Soy (Closure Template) mode

    +
    + + + +

    A mode for Closure Templates (Soy).

    +

    MIME type defined: text/x-soy.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/soy.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/soy.js new file mode 100644 index 0000000..7e81e8d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/soy/soy.js @@ -0,0 +1,198 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var indentingTags = ["template", "literal", "msg", "fallbackmsg", "let", "if", "elseif", + "else", "switch", "case", "default", "foreach", "ifempty", "for", + "call", "param", "deltemplate", "delcall", "log"]; + + CodeMirror.defineMode("soy", function(config) { + var textMode = CodeMirror.getMode(config, "text/plain"); + var modes = { + html: CodeMirror.getMode(config, {name: "text/html", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false}), + attributes: textMode, + text: textMode, + uri: textMode, + css: CodeMirror.getMode(config, "text/css"), + js: CodeMirror.getMode(config, {name: "text/javascript", statementIndent: 2 * config.indentUnit}) + }; + + function last(array) { + return array[array.length - 1]; + } + + function tokenUntil(stream, state, untilRegExp) { + var oldString = stream.string; + var match = untilRegExp.exec(oldString.substr(stream.pos)); + if (match) { + // We don't use backUp because it backs up just the position, not the state. + // This uses an undocumented API. + stream.string = oldString.substr(0, stream.pos + match.index); + } + var result = stream.hideFirstChars(state.indent, function() { + return state.localMode.token(stream, state.localState); + }); + stream.string = oldString; + return result; + } + + return { + startState: function() { + return { + kind: [], + kindTag: [], + soyState: [], + indent: 0, + localMode: modes.html, + localState: CodeMirror.startState(modes.html) + }; + }, + + copyState: function(state) { + return { + tag: state.tag, // Last seen Soy tag. + kind: state.kind.concat([]), // Values of kind="" attributes. + kindTag: state.kindTag.concat([]), // Opened tags with kind="" attributes. + soyState: state.soyState.concat([]), + indent: state.indent, // Indentation of the following line. + localMode: state.localMode, + localState: CodeMirror.copyState(state.localMode, state.localState) + }; + }, + + token: function(stream, state) { + var match; + + switch (last(state.soyState)) { + case "comment": + if (stream.match(/^.*?\*\//)) { + state.soyState.pop(); + } else { + stream.skipToEnd(); + } + return "comment"; + + case "variable": + if (stream.match(/^}/)) { + state.indent -= 2 * config.indentUnit; + state.soyState.pop(); + return "variable-2"; + } + stream.next(); + return null; + + case "tag": + if (stream.match(/^\/?}/)) { + if (state.tag == "/template" || state.tag == "/deltemplate") state.indent = 0; + else state.indent -= (stream.current() == "/}" || indentingTags.indexOf(state.tag) == -1 ? 2 : 1) * config.indentUnit; + state.soyState.pop(); + return "keyword"; + } else if (stream.match(/^(\w+)(?==)/)) { + if (stream.current() == "kind" && (match = stream.match(/^="([^"]+)/, false))) { + var kind = match[1]; + state.kind.push(kind); + state.kindTag.push(state.tag); + state.localMode = modes[kind] || modes.html; + state.localState = CodeMirror.startState(state.localMode); + } + return "attribute"; + } else if (stream.match(/^"/)) { + state.soyState.push("string"); + return "string"; + } + stream.next(); + return null; + + case "literal": + if (stream.match(/^(?=\{\/literal})/)) { + state.indent -= config.indentUnit; + state.soyState.pop(); + return this.token(stream, state); + } + return tokenUntil(stream, state, /\{\/literal}/); + + case "string": + if (stream.match(/^.*?"/)) { + state.soyState.pop(); + } else { + stream.skipToEnd(); + } + return "string"; + } + + if (stream.match(/^\/\*/)) { + state.soyState.push("comment"); + return "comment"; + } else if (stream.match(stream.sol() ? /^\s*\/\/.*/ : /^\s+\/\/.*/)) { + return "comment"; + } else if (stream.match(/^\{\$\w*/)) { + state.indent += 2 * config.indentUnit; + state.soyState.push("variable"); + return "variable-2"; + } else if (stream.match(/^\{literal}/)) { + state.indent += config.indentUnit; + state.soyState.push("literal"); + return "keyword"; + } else if (match = stream.match(/^\{([\/@\\]?\w*)/)) { + if (match[1] != "/switch") + state.indent += (/^(\/|(else|elseif|case|default)$)/.test(match[1]) && state.tag != "switch" ? 1 : 2) * config.indentUnit; + state.tag = match[1]; + if (state.tag == "/" + last(state.kindTag)) { + // We found the tag that opened the current kind="". + state.kind.pop(); + state.kindTag.pop(); + state.localMode = modes[last(state.kind)] || modes.html; + state.localState = CodeMirror.startState(state.localMode); + } + state.soyState.push("tag"); + return "keyword"; + } + + return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/); + }, + + indent: function(state, textAfter) { + var indent = state.indent, top = last(state.soyState); + if (top == "comment") return CodeMirror.Pass; + + if (top == "literal") { + if (/^\{\/literal}/.test(textAfter)) indent -= config.indentUnit; + } else { + if (/^\s*\{\/(template|deltemplate)\b/.test(textAfter)) return 0; + if (/^\{(\/|(fallbackmsg|elseif|else|ifempty)\b)/.test(textAfter)) indent -= config.indentUnit; + if (state.tag != "switch" && /^\{(case|default)\b/.test(textAfter)) indent -= config.indentUnit; + if (/^\{\/switch\b/.test(textAfter)) indent -= config.indentUnit; + } + if (indent && state.localMode.indent) + indent += state.localMode.indent(state.localState, textAfter); + return indent; + }, + + innerMode: function(state) { + if (state.soyState.length && last(state.soyState) != "literal") return null; + else return {state: state.localState, mode: state.localMode}; + }, + + electricInput: /^\s*\{(\/|\/template|\/deltemplate|\/switch|fallbackmsg|elseif|else|case|default|ifempty|\/literal\})$/, + lineComment: "//", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + fold: "indent" + }; + }, "htmlmixed"); + + CodeMirror.registerHelper("hintWords", "soy", indentingTags.concat( + ["delpackage", "namespace", "alias", "print", "css", "debugger"])); + + CodeMirror.defineMIME("text/x-soy", "soy"); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/index.html new file mode 100644 index 0000000..84ef4d3 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/index.html @@ -0,0 +1,61 @@ + + +CodeMirror: SPARQL mode + + + + + + + + + + +
    +

    SPARQL mode

    +
    + + +

    MIME types defined: application/sparql-query.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/sparql.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/sparql.js new file mode 100644 index 0000000..bbf8a76 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sparql/sparql.js @@ -0,0 +1,174 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sparql", function(config) { + var indentUnit = config.indentUnit; + var curPunc; + + function wordRegexp(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri", + "iri", "uri", "bnode", "count", "sum", "min", "max", "avg", "sample", + "group_concat", "rand", "abs", "ceil", "floor", "round", "concat", "substr", "strlen", + "replace", "ucase", "lcase", "encode_for_uri", "contains", "strstarts", "strends", + "strbefore", "strafter", "year", "month", "day", "hours", "minutes", "seconds", + "timezone", "tz", "now", "uuid", "struuid", "md5", "sha1", "sha256", "sha384", + "sha512", "coalesce", "if", "strlang", "strdt", "isnumeric", "regex", "exists", + "isblank", "isliteral", "a"]); + var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe", + "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional", + "graph", "by", "asc", "desc", "as", "having", "undef", "values", "group", + "minus", "in", "not", "service", "silent", "using", "insert", "delete", "union", + "true", "false", "with", + "data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]); + var operatorChars = /[*+\-<>=&|\^\/!\?]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + curPunc = null; + if (ch == "$" || ch == "?") { + if(ch == "?" && stream.match(/\s/, false)){ + return "operator"; + } + stream.match(/^[\w\d]*/); + return "variable-2"; + } + else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { + stream.match(/^[^\s\u00a0>]*>?/); + return "atom"; + } + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } + else if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return "bracket"; + } + else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return "operator"; + } + else if (ch == ":") { + stream.eatWhile(/[\w\d\._\-]/); + return "atom"; + } + else if (ch == "@") { + stream.eatWhile(/[a-z\d\-]/i); + return "meta"; + } + else { + stream.eatWhile(/[_\w\d]/); + if (stream.eat(":")) { + stream.eatWhile(/[\w\d_\-]/); + return "atom"; + } + var word = stream.current(); + if (ops.test(word)) + return "builtin"; + else if (keywords.test(word)) + return "keyword"; + else + return "variable"; + } + } + + function tokenLiteral(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return "string"; + }; + } + + function pushContext(state, type, col) { + state.context = {prev: state.context, indent: state.indent, col: col, type: type}; + } + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + context: null, + indent: 0, + col: 0}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) state.context.align = false; + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { + state.context.align = true; + } + + if (curPunc == "(") pushContext(state, ")", stream.column()); + else if (curPunc == "[") pushContext(state, "]", stream.column()); + else if (curPunc == "{") pushContext(state, "}", stream.column()); + else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type == "pattern") popContext(state); + if (state.context && curPunc == state.context.type) popContext(state); + } + else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); + else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) + pushContext(state, "pattern", stream.column()); + else if (state.context.type == "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + + return style; + }, + + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) + while (context && context.type == "pattern") context = context.prev; + + var closing = context && firstChar == context.type; + if (!context) + return 0; + else if (context.type == "pattern") + return context.col; + else if (context.align) + return context.col + (closing ? 0 : 1); + else + return context.indent + (closing ? 0 : indentUnit); + } + }; +}); + +CodeMirror.defineMIME("application/sparql-query", "sparql"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/index.html new file mode 100644 index 0000000..a52f76f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/index.html @@ -0,0 +1,42 @@ + + +CodeMirror: Spreadsheet mode + + + + + + + + + + +
    +

    Spreadsheet mode

    +
    + + + +

    MIME types defined: text/x-spreadsheet.

    + +

    The Spreadsheet Mode

    +

    Created by Robert Plummer

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/spreadsheet.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/spreadsheet.js new file mode 100644 index 0000000..6fab00f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/spreadsheet/spreadsheet.js @@ -0,0 +1,109 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("spreadsheet", function () { + return { + startState: function () { + return { + stringType: null, + stack: [] + }; + }, + token: function (stream, state) { + if (!stream) return; + + //check for state changes + if (state.stack.length === 0) { + //strings + if ((stream.peek() == '"') || (stream.peek() == "'")) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.stack.unshift("string"); + } + } + + //return state + //stack has + switch (state.stack[0]) { + case "string": + while (state.stack[0] === "string" && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.stack.shift(); // Clear flag + } else if (stream.peek() === "\\") { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return "string"; + + case "characterClass": + while (state.stack[0] === "characterClass" && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) + state.stack.shift(); + } + return "operator"; + } + + var peek = stream.peek(); + + //no stack + switch (peek) { + case "[": + stream.next(); + state.stack.unshift("characterClass"); + return "bracket"; + case ":": + stream.next(); + return "operator"; + case "\\": + if (stream.match(/\\[a-z]+/)) return "string-2"; + else return null; + case ".": + case ",": + case ";": + case "*": + case "-": + case "+": + case "^": + case "<": + case "/": + case "=": + stream.next(); + return "atom"; + case "$": + stream.next(); + return "builtin"; + } + + if (stream.match(/\d+/)) { + if (stream.match(/^\w+/)) return "error"; + return "number"; + } else if (stream.match(/^[a-zA-Z_]\w*/)) { + if (stream.match(/(?=[\(.])/, false)) return "keyword"; + return "variable-2"; + } else if (["[", "]", "(", ")", "{", "}"].indexOf(peek) != -1) { + stream.next(); + return "bracket"; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; + }); + + CodeMirror.defineMIME("text/x-spreadsheet", "spreadsheet"); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/index.html new file mode 100644 index 0000000..a0d8d9e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/index.html @@ -0,0 +1,84 @@ + + +CodeMirror: SQL Mode for CodeMirror + + + + + + + + + + + + +
    +

    SQL Mode for CodeMirror

    +
    + +
    +

    MIME types defined: + text/x-sql, + text/x-mysql, + text/x-mariadb, + text/x-cassandra, + text/x-plsql, + text/x-mssql, + text/x-hive. +

    + + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/sql.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/sql.js new file mode 100644 index 0000000..ee6c194 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/sql/sql.js @@ -0,0 +1,391 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sql", function(config, parserConfig) { + "use strict"; + + var client = parserConfig.client || {}, + atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, + builtin = parserConfig.builtin || {}, + keywords = parserConfig.keywords || {}, + operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^]/, + support = parserConfig.support || {}, + hooks = parserConfig.hooks || {}, + dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}; + + function tokenBase(stream, state) { + var ch = stream.next(); + + // call hooks from the mime type + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + + if (support.hexNumber == true && + ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) + || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { + // hex + // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html + return "number"; + } else if (support.binaryNumber == true && + (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) + || (ch == "0" && stream.match(/^b[01]+/)))) { + // bitstring + // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html + return "number"; + } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { + // numbers + // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html + stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/); + support.decimallessFloat == true && stream.eat('.'); + return "number"; + } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { + // placeholders + return "variable-3"; + } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { + // strings + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } else if ((((support.nCharCast == true && (ch == "n" || ch == "N")) + || (support.charsetCast == true && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) + && (stream.peek() == "'" || stream.peek() == '"'))) { + // charset casting: _utf8'str', N'str', n'str' + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + return "keyword"; + } else if (/^[\(\),\;\[\]]/.test(ch)) { + // no highlightning + return null; + } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { + // 1-line comment + stream.skipToEnd(); + return "comment"; + } else if ((support.commentHash && ch == "#") + || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { + // 1-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + stream.skipToEnd(); + return "comment"; + } else if (ch == "/" && stream.eat("*")) { + // multi-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } else if (ch == ".") { + // .1 for 0.1 + if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) { + return "number"; + } + // .table_name (ODBC) + // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) { + return "variable-2"; + } + } else if (operatorChars.test(ch)) { + // operators + stream.eatWhile(operatorChars); + return null; + } else if (ch == '{' && + (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { + // dates (weird ODBC syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + return "number"; + } else { + stream.eatWhile(/^[_\w\d]/); + var word = stream.current().toLowerCase(); + // dates (standard SQL syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) + return "number"; + if (atoms.hasOwnProperty(word)) return "atom"; + if (builtin.hasOwnProperty(word)) return "builtin"; + if (keywords.hasOwnProperty(word)) return "keyword"; + if (client.hasOwnProperty(word)) return "string-2"; + return null; + } + } + + // 'string', with char specified in quote escaped by '\' + function tokenLiteral(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return "string"; + }; + } + function tokenComment(stream, state) { + while (true) { + if (stream.skipTo("*")) { + stream.next(); + if (stream.eat("/")) { + state.tokenize = tokenBase; + break; + } + } else { + stream.skipToEnd(); + break; + } + } + return "comment"; + } + + function pushContext(stream, state, type) { + state.context = { + prev: state.context, + indent: stream.indentation(), + col: stream.column(), + type: type + }; + } + + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, context: null}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) + state.context.align = false; + } + if (stream.eatSpace()) return null; + + var style = state.tokenize(stream, state); + if (style == "comment") return style; + + if (state.context && state.context.align == null) + state.context.align = true; + + var tok = stream.current(); + if (tok == "(") + pushContext(stream, state, ")"); + else if (tok == "[") + pushContext(stream, state, "]"); + else if (state.context && state.context.type == tok) + popContext(state); + return style; + }, + + indent: function(state, textAfter) { + var cx = state.context; + if (!cx) return CodeMirror.Pass; + var closing = textAfter.charAt(0) == cx.type; + if (cx.align) return cx.col + (closing ? 0 : 1); + else return cx.indent + (closing ? 0 : config.indentUnit); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : null + }; +}); + +(function() { + "use strict"; + + // `identifier` + function hookIdentifier(stream) { + // MySQL/MariaDB identifiers + // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + var ch; + while ((ch = stream.next()) != null) { + if (ch == "`" && !stream.eat("`")) return "variable-2"; + } + stream.backUp(stream.current().length - 1); + return stream.eatWhile(/\w/) ? "variable-2" : null; + } + + // variable token + function hookVar(stream) { + // variables + // @@prefix.varName @varName + // varName can be quoted with ` or ' or " + // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html + if (stream.eat("@")) { + stream.match(/^session\./); + stream.match(/^local\./); + stream.match(/^global\./); + } + + if (stream.eat("'")) { + stream.match(/^.*'/); + return "variable-2"; + } else if (stream.eat('"')) { + stream.match(/^.*"/); + return "variable-2"; + } else if (stream.eat("`")) { + stream.match(/^.*`/); + return "variable-2"; + } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { + return "variable-2"; + } + return null; + }; + + // short client keyword token + function hookClient(stream) { + // \N means NULL + // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html + if (stream.eat("N")) { + return "atom"; + } + // \g, etc + // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html + return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; + } + + // these keywords are used by all SQL dialects (however, a mode can still overwrite it) + var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from having in insert into is join like not on or order select set table union update values where "; + + // turn a space-separated list into an array + function set(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // A generic SQL Mode. It's not a standard, it just try to support what is generally supported + CodeMirror.defineMIME("text/x-sql", { + name: "sql", + keywords: set(sqlKeywords + "begin"), + builtin: set("bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); + + CodeMirror.defineMIME("text/x-mssql", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered"), + builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=]/, + dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), + hooks: { + "@": hookVar + } + }); + + CodeMirror.defineMIME("text/x-mysql", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group groupby_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + CodeMirror.defineMIME("text/x-mariadb", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + // the query language used by Apache Cassandra is called CQL, but this mime type + // is called Cassandra to avoid confusion with Contextual Query Language + CodeMirror.defineMIME("text/x-cassandra", { + name: "sql", + client: { }, + keywords: set("use select from using consistency where limit first reversed first and in insert into values using consistency ttl update set delete truncate begin batch apply create keyspace with columnfamily primary key index on drop alter type add any one quorum all local_quorum each_quorum"), + builtin: set("ascii bigint blob boolean counter decimal double float int text timestamp uuid varchar varint"), + atoms: set("false true"), + operatorChars: /^[<>=]/, + dateSQL: { }, + support: set("commentSlashSlash decimallessFloat"), + hooks: { } + }); + + // this is based on Peter Raganitsch's 'plsql' mode + CodeMirror.defineMIME("text/x-plsql", { + name: "sql", + client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), + keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), + builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least lenght lenghtb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), + operatorChars: /^[*+\-%<>!=~]/, + dateSQL: set("date time timestamp"), + support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") + }); + + // Created to support specific hive keywords + CodeMirror.defineMIME("text/x-hive", { + name: "sql", + keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"), + builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=]/, + dateSQL: set("date timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); +}()); + +}); + +/* + How Properties of Mime Types are used by SQL Mode + ================================================= + + keywords: + A list of keywords you want to be highlighted. + builtin: + A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). + operatorChars: + All characters that must be handled as operators. + client: + Commands parsed and executed by the client (not the server). + support: + A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. + * ODBCdotTable: .tableName + * zerolessFloat: .1 + * doubleQuote + * nCharCast: N'string' + * charsetCast: _utf8'string' + * commentHash: use # char for comments + * commentSlashSlash: use // for comments + * commentSpaceRequired: require a space after -- for comments + atoms: + Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: + UNKNOWN, INFINITY, UNDERFLOW, NaN... + dateSQL: + Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. +*/ diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/index.html new file mode 100644 index 0000000..14679da --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/index.html @@ -0,0 +1,110 @@ + + +CodeMirror: sTeX mode + + + + + + + + + +
    +

    sTeX mode

    +
    + + +

    MIME types defined: text/x-stex.

    + +

    Parsing/Highlighting Tests: normal, verbose.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/stex.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/stex.js new file mode 100644 index 0000000..835ed46 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/stex.js @@ -0,0 +1,251 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/* + * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de) + * Licence: MIT + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("stex", function() { + "use strict"; + + function pushCommand(state, command) { + state.cmdState.push(command); + } + + function peekCommand(state) { + if (state.cmdState.length > 0) { + return state.cmdState[state.cmdState.length - 1]; + } else { + return null; + } + } + + function popCommand(state) { + var plug = state.cmdState.pop(); + if (plug) { + plug.closeBracket(); + } + } + + // returns the non-default plugin closest to the end of the list + function getMostPowerful(state) { + var context = state.cmdState; + for (var i = context.length - 1; i >= 0; i--) { + var plug = context[i]; + if (plug.name == "DEFAULT") { + continue; + } + return plug; + } + return { styleIdentifier: function() { return null; } }; + } + + function addPluginPattern(pluginName, cmdStyle, styles) { + return function () { + this.name = pluginName; + this.bracketNo = 0; + this.style = cmdStyle; + this.styles = styles; + this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin + + this.styleIdentifier = function() { + return this.styles[this.bracketNo - 1] || null; + }; + this.openBracket = function() { + this.bracketNo++; + return "bracket"; + }; + this.closeBracket = function() {}; + }; + } + + var plugins = {}; + + plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]); + plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]); + plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]); + plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]); + plugins["end"] = addPluginPattern("end", "tag", ["atom"]); + + plugins["DEFAULT"] = function () { + this.name = "DEFAULT"; + this.style = "tag"; + + this.styleIdentifier = this.openBracket = this.closeBracket = function() {}; + }; + + function setState(state, f) { + state.f = f; + } + + // called when in a normal (no environment) context + function normal(source, state) { + var plug; + // Do we look like '\command' ? If so, attempt to apply the plugin 'command' + if (source.match(/^\\[a-zA-Z@]+/)) { + var cmdName = source.current().slice(1); + plug = plugins[cmdName] || plugins["DEFAULT"]; + plug = new plug(); + pushCommand(state, plug); + setState(state, beginParams); + return plug.style; + } + + // escape characters + if (source.match(/^\\[$&%#{}_]/)) { + return "tag"; + } + + // white space control characters + if (source.match(/^\\[,;!\/\\]/)) { + return "tag"; + } + + // find if we're starting various math modes + if (source.match("\\[")) { + setState(state, function(source, state){ return inMathMode(source, state, "\\]"); }); + return "keyword"; + } + if (source.match("$$")) { + setState(state, function(source, state){ return inMathMode(source, state, "$$"); }); + return "keyword"; + } + if (source.match("$")) { + setState(state, function(source, state){ return inMathMode(source, state, "$"); }); + return "keyword"; + } + + var ch = source.next(); + if (ch == "%") { + source.skipToEnd(); + return "comment"; + } else if (ch == '}' || ch == ']') { + plug = peekCommand(state); + if (plug) { + plug.closeBracket(ch); + setState(state, beginParams); + } else { + return "error"; + } + return "bracket"; + } else if (ch == '{' || ch == '[') { + plug = plugins["DEFAULT"]; + plug = new plug(); + pushCommand(state, plug); + return "bracket"; + } else if (/\d/.test(ch)) { + source.eatWhile(/[\w.%]/); + return "atom"; + } else { + source.eatWhile(/[\w\-_]/); + plug = getMostPowerful(state); + if (plug.name == 'begin') { + plug.argument = source.current(); + } + return plug.styleIdentifier(); + } + } + + function inMathMode(source, state, endModeSeq) { + if (source.eatSpace()) { + return null; + } + if (source.match(endModeSeq)) { + setState(state, normal); + return "keyword"; + } + if (source.match(/^\\[a-zA-Z@]+/)) { + return "tag"; + } + if (source.match(/^[a-zA-Z]+/)) { + return "variable-2"; + } + // escape characters + if (source.match(/^\\[$&%#{}_]/)) { + return "tag"; + } + // white space control characters + if (source.match(/^\\[,;!\/]/)) { + return "tag"; + } + // special math-mode characters + if (source.match(/^[\^_&]/)) { + return "tag"; + } + // non-special characters + if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) { + return null; + } + if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) { + return "number"; + } + var ch = source.next(); + if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") { + return "bracket"; + } + + if (ch == "%") { + source.skipToEnd(); + return "comment"; + } + return "error"; + } + + function beginParams(source, state) { + var ch = source.peek(), lastPlug; + if (ch == '{' || ch == '[') { + lastPlug = peekCommand(state); + lastPlug.openBracket(ch); + source.eat(ch); + setState(state, normal); + return "bracket"; + } + if (/[ \t\r]/.test(ch)) { + source.eat(ch); + return null; + } + setState(state, normal); + popCommand(state); + + return normal(source, state); + } + + return { + startState: function() { + return { + cmdState: [], + f: normal + }; + }, + copyState: function(s) { + return { + cmdState: s.cmdState.slice(), + f: s.f + }; + }, + token: function(stream, state) { + return state.f(stream, state); + }, + blankLine: function(state) { + state.f = normal; + state.cmdState.length = 0; + }, + lineComment: "%" + }; + }); + + CodeMirror.defineMIME("text/x-stex", "stex"); + CodeMirror.defineMIME("text/x-latex", "stex"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/test.js new file mode 100644 index 0000000..22f027e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stex/test.js @@ -0,0 +1,123 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({tabSize: 4}, "stex"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT("word", + "foo"); + + MT("twoWords", + "foo bar"); + + MT("beginEndDocument", + "[tag \\begin][bracket {][atom document][bracket }]", + "[tag \\end][bracket {][atom document][bracket }]"); + + MT("beginEndEquation", + "[tag \\begin][bracket {][atom equation][bracket }]", + " E=mc^2", + "[tag \\end][bracket {][atom equation][bracket }]"); + + MT("beginModule", + "[tag \\begin][bracket {][atom module][bracket }[[]]]"); + + MT("beginModuleId", + "[tag \\begin][bracket {][atom module][bracket }[[]id=bbt-size[bracket ]]]"); + + MT("importModule", + "[tag \\importmodule][bracket [[][string b-b-t][bracket ]]{][builtin b-b-t][bracket }]"); + + MT("importModulePath", + "[tag \\importmodule][bracket [[][tag \\KWARCslides][bracket {][string dmath/en/cardinality][bracket }]]{][builtin card][bracket }]"); + + MT("psForPDF", + "[tag \\PSforPDF][bracket [[][atom 1][bracket ]]{]#1[bracket }]"); + + MT("comment", + "[comment % foo]"); + + MT("tagComment", + "[tag \\item][comment % bar]"); + + MT("commentTag", + " [comment % \\item]"); + + MT("commentLineBreak", + "[comment %]", + "foo"); + + MT("tagErrorCurly", + "[tag \\begin][error }][bracket {]"); + + MT("tagErrorSquare", + "[tag \\item][error ]]][bracket {]"); + + MT("commentCurly", + "[comment % }]"); + + MT("tagHash", + "the [tag \\#] key"); + + MT("tagNumber", + "a [tag \\$][atom 5] stetson"); + + MT("tagPercent", + "[atom 100][tag \\%] beef"); + + MT("tagAmpersand", + "L [tag \\&] N"); + + MT("tagUnderscore", + "foo[tag \\_]bar"); + + MT("tagBracketOpen", + "[tag \\emph][bracket {][tag \\{][bracket }]"); + + MT("tagBracketClose", + "[tag \\emph][bracket {][tag \\}][bracket }]"); + + MT("tagLetterNumber", + "section [tag \\S][atom 1]"); + + MT("textTagNumber", + "para [tag \\P][atom 2]"); + + MT("thinspace", + "x[tag \\,]y"); + + MT("thickspace", + "x[tag \\;]y"); + + MT("negativeThinspace", + "x[tag \\!]y"); + + MT("periodNotSentence", + "J.\\ L.\\ is"); + + MT("periodSentence", + "X[tag \\@]. The"); + + MT("italicCorrection", + "[bracket {][tag \\em] If[tag \\/][bracket }] I"); + + MT("tagBracket", + "[tag \\newcommand][bracket {][tag \\pop][bracket }]"); + + MT("inlineMathTagFollowedByNumber", + "[keyword $][tag \\pi][number 2][keyword $]"); + + MT("inlineMath", + "[keyword $][number 3][variable-2 x][tag ^][number 2.45]-[tag \\sqrt][bracket {][tag \\$\\alpha][bracket }] = [number 2][keyword $] other text"); + + MT("displayMath", + "More [keyword $$]\t[variable-2 S][tag ^][variable-2 n][tag \\sum] [variable-2 i][keyword $$] other text"); + + MT("mathWithComment", + "[keyword $][variable-2 x] [comment % $]", + "[variable-2 y][keyword $] other text"); + + MT("lineBreakArgument", + "[tag \\\\][bracket [[][atom 1cm][bracket ]]]"); +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/index.html new file mode 100644 index 0000000..354bf30 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/index.html @@ -0,0 +1,104 @@ + + +CodeMirror: Stylus mode + + + + + + + + + + + +
    +

    Stylus mode

    +
    +
    + + +

    MIME types defined: text/x-styl.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/stylus.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/stylus.js new file mode 100644 index 0000000..6f7c754 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/stylus/stylus.js @@ -0,0 +1,444 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("stylus", function(config) { + + var operatorsRegexp = /^(\?:?|\+[+=]?|-[\-=]?|\*[\*=]?|\/=?|[=!:\?]?=|<=?|>=?|%=?|&&|\|=?|\~|!|\^|\\)/, + delimitersRegexp = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/, + wordOperatorsRegexp = wordRegexp(wordOperators), + commonKeywordsRegexp = wordRegexp(commonKeywords), + commonAtomsRegexp = wordRegexp(commonAtoms), + commonDefRegexp = wordRegexp(commonDef), + vendorPrefixesRegexp = new RegExp(/^\-(moz|ms|o|webkit)-/), + cssValuesWithBracketsRegexp = new RegExp("^(" + cssValuesWithBrackets_.join("|") + ")\\([\\w\-\\#\\,\\.\\%\\s\\(\\)]*\\)"); + + var tokenBase = function(stream, state) { + + if (stream.eatSpace()) return null; + + var ch = stream.peek(); + + // Single line Comment + if (stream.match('//')) { + stream.skipToEnd(); + return "comment"; + } + + // Multiline Comment + if (stream.match('/*')) { + state.tokenizer = multilineComment; + return state.tokenizer(stream, state); + } + + // Strings + if (ch === '"' || ch === "'") { + stream.next(); + state.tokenizer = buildStringTokenizer(ch); + return "string"; + } + + // Def + if (ch === "@") { + stream.next(); + if (stream.match(/extend/)) { + dedent(state); // remove indentation after selectors + } else if (stream.match(/media[\w-\s]*[\w-]/)) { + indent(state); + } else if(stream.eatWhile(/[\w-]/)) { + if(stream.current().match(commonDefRegexp)) { + indent(state); + } + } + return "def"; + } + + // Number + if (stream.match(/^-?[0-9\.]/, false)) { + + // Floats + if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i) || stream.match(/^-?\d+\.\d*/)) { + + // Prevent from getting extra . on 1.. + if (stream.peek() == ".") { + stream.backUp(1); + } + // Units + stream.eatWhile(/[a-z%]/i); + return "number"; + } + // Integers + if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/) || stream.match(/^-?0(?![\dx])/i)) { + // Units + stream.eatWhile(/[a-z%]/i); + return "number"; + } + } + + // Hex color and id selector + if (ch === "#") { + stream.next(); + + // Hex color + if (stream.match(/^[0-9a-f]{6}|[0-9a-f]{3}/i)) { + return "atom"; + } + + // ID selector + if (stream.match(/^[\w-]+/i)) { + indent(state); + return "builtin"; + } + } + + // Vendor prefixes + if (stream.match(vendorPrefixesRegexp)) { + return "meta"; + } + + // Gradients and animation as CSS value + if (stream.match(cssValuesWithBracketsRegexp)) { + return "atom"; + } + + // Mixins / Functions with indentation + if (stream.sol() && stream.match(/^\.?[a-z][\w-]*\(/i)) { + stream.backUp(1); + indent(state); + return "keyword"; + } + + // Mixins / Functions + if (stream.match(/^\.?[a-z][\w-]*\(/i)) { + stream.backUp(1); + return "keyword"; + } + + // +Block mixins + if (stream.match(/^(\+|\-)[a-z][\w-]+\(/i)) { + stream.backUp(1); + indent(state); + return "keyword"; + } + + // url tokens + if (stream.match(/^url/) && stream.peek() === "(") { + state.tokenizer = urlTokens; + if(!stream.peek()) { + state.cursorHalf = 0; + } + return "atom"; + } + + // Class + if (stream.match(/^\.[a-z][\w-]*/i)) { + indent(state); + return "qualifier"; + } + + // & Parent Reference with BEM naming + if (stream.match(/^(_|__|-|--)[a-z0-9-]+/)) { + return "qualifier"; + } + + // Pseudo elements/classes + if (ch == ':' && stream.match(/^::?[\w-]+/)) { + indent(state); + return "variable-3"; + } + + // Conditionals + if (stream.match(wordRegexp(["for", "if", "else", "unless"]))) { + indent(state); + return "keyword"; + } + + // Keywords + if (stream.match(commonKeywordsRegexp)) { + return "keyword"; + } + + // Atoms + if (stream.match(commonAtomsRegexp)) { + return "atom"; + } + + // Variables + if (stream.match(/^\$?[a-z][\w-]+\s?=(\s|[\w-'"\$])/i)) { + stream.backUp(2); + var cssPropertie = stream.current().toLowerCase().match(/[\w-]+/)[0]; + return cssProperties[cssPropertie] === undefined ? "variable-2" : "property"; + } else if (stream.match(/\$[\w-\.]+/i)) { + return "variable-2"; + } else if (stream.match(/\$?[\w-]+\.[\w-]+/i)) { + var cssTypeSelector = stream.current().toLowerCase().match(/[\w]+/)[0]; + if(cssTypeSelectors[cssTypeSelector] === undefined) { + return "variable-2"; + } else stream.backUp(stream.current().length); + } + + // !important + if (ch === "!") { + stream.next(); + return stream.match(/^[\w]+/) ? "keyword": "operator"; + } + + // / Root Reference + if (stream.match(/^\/(:|\.|#|[a-z])/)) { + stream.backUp(1); + return "variable-3"; + } + + // Operators and delimiters + if (stream.match(operatorsRegexp) || stream.match(wordOperatorsRegexp)) { + return "operator"; + } + if (stream.match(delimitersRegexp)) { + return null; + } + + // & Parent Reference + if (ch === "&") { + stream.next(); + return "variable-3"; + } + + // Font family + if (stream.match(/^[A-Z][a-z0-9-]+/)) { + return "string"; + } + + // CSS rule + // NOTE: Some css selectors and property values have the same name + // (embed, menu, pre, progress, sub, table), + // so they will have the same color (.cm-atom). + if (stream.match(/[\w-]*/i)) { + + var word = stream.current().toLowerCase(); + + if(cssProperties[word] !== undefined) { + // CSS property + if(!stream.eol()) + return "property"; + else + return "variable-2"; + + } else if(cssValues[word] !== undefined) { + // CSS value + return "atom"; + + } else if(cssTypeSelectors[word] !== undefined) { + // CSS type selectors + indent(state); + return "tag"; + + } else if(word) { + // By default variable-2 + return "variable-2"; + } + } + + // Handle non-detected items + stream.next(); + return null; + + }; + + var tokenLexer = function(stream, state) { + + if (stream.sol()) { + state.indentCount = 0; + } + + var style = state.tokenizer(stream, state); + var current = stream.current(); + + if (stream.eol() && (current === "}" || current === ",")) { + dedent(state); + } + + if (style !== null) { + var startOfToken = stream.pos - current.length; + var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount); + + var newScopes = []; + + for (var i = 0; i < state.scopes.length; i++) { + var scope = state.scopes[i]; + + if (scope.offset <= withCurrentIndent) { + newScopes.push(scope); + } + } + + state.scopes = newScopes; + } + + return style; + }; + + return { + startState: function() { + return { + tokenizer: tokenBase, + scopes: [{offset: 0, type: 'styl'}] + }; + }, + + token: function(stream, state) { + var style = tokenLexer(stream, state); + state.lastToken = { style: style, content: stream.current() }; + return style; + }, + + indent: function(state) { + return state.scopes[0].offset; + }, + + lineComment: "//", + fold: "indent" + + }; + + function urlTokens(stream, state) { + var ch = stream.peek(); + + if (ch === ")") { + stream.next(); + state.tokenizer = tokenBase; + return "operator"; + } else if (ch === "(") { + stream.next(); + stream.eatSpace(); + + return "operator"; + } else if (ch === "'" || ch === '"') { + state.tokenizer = buildStringTokenizer(stream.next()); + return "string"; + } else { + state.tokenizer = buildStringTokenizer(")", false); + return "string"; + } + } + + function multilineComment(stream, state) { + if (stream.skipTo("*/")) { + stream.next(); + stream.next(); + state.tokenizer = tokenBase; + } else { + stream.next(); + } + return "comment"; + } + + function buildStringTokenizer(quote, greedy) { + + if(greedy == null) { + greedy = true; + } + + function stringTokenizer(stream, state) { + var nextChar = stream.next(); + var peekChar = stream.peek(); + var previousChar = stream.string.charAt(stream.pos-2); + + var endingString = ((nextChar !== "\\" && peekChar === quote) || + (nextChar === quote && previousChar !== "\\")); + + if (endingString) { + if (nextChar !== quote && greedy) { + stream.next(); + } + state.tokenizer = tokenBase; + return "string"; + } else if (nextChar === "#" && peekChar === "{") { + state.tokenizer = buildInterpolationTokenizer(stringTokenizer); + stream.next(); + return "operator"; + } else { + return "string"; + } + } + + return stringTokenizer; + } + + function buildInterpolationTokenizer(currentTokenizer) { + return function(stream, state) { + if (stream.peek() === "}") { + stream.next(); + state.tokenizer = currentTokenizer; + return "operator"; + } else { + return tokenBase(stream, state); + } + }; + } + + function indent(state) { + if (state.indentCount == 0) { + state.indentCount++; + var lastScopeOffset = state.scopes[0].offset; + var currentOffset = lastScopeOffset + config.indentUnit; + state.scopes.unshift({ offset:currentOffset }); + } + } + + function dedent(state) { + if (state.scopes.length == 1) { return true; } + state.scopes.shift(); + } + + }); + + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element + var cssTypeSelectors_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi","bdo","bgsound","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"]; + // https://github.com/csscomb/csscomb.js/blob/master/config/zen.json + var cssProperties_ = ["position","top","right","bottom","left","z-index","display","visibility","flex-direction","flex-order","flex-pack","float","clear","flex-align","overflow","overflow-x","overflow-y","overflow-scrolling","clip","box-sizing","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","min-width","min-height","max-width","max-height","width","height","outline","outline-width","outline-style","outline-color","outline-offset","border","border-spacing","border-collapse","border-width","border-style","border-color","border-top","border-top-width","border-top-style","border-top-color","border-right","border-right-width","border-right-style","border-right-color","border-bottom","border-bottom-width","border-bottom-style","border-bottom-color","border-left","border-left-width","border-left-style","border-left-color","border-radius","border-top-left-radius","border-top-right-radius","border-bottom-right-radius","border-bottom-left-radius","border-image","border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat","border-top-image","border-right-image","border-bottom-image","border-left-image","border-corner-image","border-top-left-image","border-top-right-image","border-bottom-right-image","border-bottom-left-image","background","filter:progid:DXImageTransform\\.Microsoft\\.AlphaImageLoader","background-color","background-image","background-attachment","background-position","background-position-x","background-position-y","background-clip","background-origin","background-size","background-repeat","box-decoration-break","box-shadow","color","table-layout","caption-side","empty-cells","list-style","list-style-position","list-style-type","list-style-image","quotes","content","counter-increment","counter-reset","writing-mode","vertical-align","text-align","text-align-last","text-decoration","text-emphasis","text-emphasis-position","text-emphasis-style","text-emphasis-color","text-indent","-ms-text-justify","text-justify","text-outline","text-transform","text-wrap","text-overflow","text-overflow-ellipsis","text-overflow-mode","text-size-adjust","text-shadow","white-space","word-spacing","word-wrap","word-break","tab-size","hyphens","letter-spacing","font","font-weight","font-style","font-variant","font-size-adjust","font-stretch","font-size","font-family","src","line-height","opacity","filter:\\\\\\\\'progid:DXImageTransform.Microsoft.Alpha","filter:progid:DXImageTransform.Microsoft.Alpha\\(Opacity","interpolation-mode","filter","resize","cursor","nav-index","nav-up","nav-right","nav-down","nav-left","transition","transition-delay","transition-timing-function","transition-duration","transition-property","transform","transform-origin","animation","animation-name","animation-duration","animation-play-state","animation-timing-function","animation-delay","animation-iteration-count","animation-direction","pointer-events","unicode-bidi","direction","columns","column-span","column-width","column-count","column-fill","column-gap","column-rule","column-rule-width","column-rule-style","column-rule-color","break-before","break-inside","break-after","page-break-before","page-break-inside","page-break-after","orphans","widows","zoom","max-zoom","min-zoom","user-zoom","orientation","text-rendering","speak","animation-fill-mode","backface-visibility","user-drag","user-select","appearance"]; + // https://github.com/codemirror/CodeMirror/blob/master/mode/css/css.js#L501 + var cssValues_ = ["above","absolute","activeborder","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","cambodian","capitalize","caps-lock-indicator","captiontext","caret","cell","center","checkbox","circle","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","cover","crop","cross","crosshair","currentcolor","cursive","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ew-resize","expanded","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-table","inset","inside","intrinsic","invert","italic","justify","kannada","katakana","katakana-iroha","keep-all","khmer","landscape","lao","large","larger","left","level","lighter","line-through","linear","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","single","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","telugu","text","text-bottom","text-top","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale"]; + var cssColorValues_ = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; + var cssValuesWithBrackets_ = ["gradient","linear-gradient","radial-gradient","repeating-linear-gradient","repeating-radial-gradient","cubic-bezier","translateX","translateY","translate3d","rotate3d","scale","scale3d","perspective","skewX"]; + + var wordOperators = ["in", "and", "or", "not", "is a", "is", "isnt", "defined", "if unless"], + commonKeywords = ["for", "if", "else", "unless", "return"], + commonAtoms = ["null", "true", "false", "href", "title", "type", "not-allowed", "readonly", "disabled"], + commonDef = ["@font-face", "@keyframes", "@media", "@viewport", "@page", "@host", "@supports", "@block", "@css"], + cssTypeSelectors = keySet(cssTypeSelectors_), + cssProperties = keySet(cssProperties_), + cssValues = keySet(cssValues_.concat(cssColorValues_)), + hintWords = wordOperators.concat(commonKeywords, + commonAtoms, + commonDef, + cssTypeSelectors_, + cssProperties_, + cssValues_, + cssValuesWithBrackets_, + cssColorValues_); + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + }; + + function keySet(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) { + keys[array[i]] = true; + } + return keys; + }; + + CodeMirror.registerHelper("hintWords", "stylus", hintWords); + CodeMirror.defineMIME("text/x-styl", "stylus"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/index.html new file mode 100644 index 0000000..ce4ad34 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/index.html @@ -0,0 +1,142 @@ + + +CodeMirror: Tcl mode + + + + + + + + + + +
    +

    Tcl mode

    +
    + + +

    MIME types defined: text/x-tcl.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/tcl.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/tcl.js new file mode 100644 index 0000000..056accb --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tcl/tcl.js @@ -0,0 +1,147 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +//tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("tcl", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " + + "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " + + "binary break catch cd close concat continue dde eof encoding error " + + "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " + + "filename flush for foreach format gets glob global history http if " + + "incr info interp join lappend lindex linsert list llength load lrange " + + "lreplace lsearch lset lsort memory msgcat namespace open package parray " + + "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " + + "registry regsub rename resource return scan seek set socket source split " + + "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " + + "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " + + "tclvars tell time trace unknown unset update uplevel upvar variable " + + "vwait"); + var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); + var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + if ((ch == '"' || ch == "'") && state.inParams) + return chain(stream, state, tokenString(ch)); + else if (/[\[\]{}\(\),;\.]/.test(ch)) { + if (ch == "(" && beforeParams) state.inParams = true; + else if (ch == ")") state.inParams = false; + return null; + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + else if (ch == "#" && stream.eat("*")) { + return chain(stream, state, tokenComment); + } + else if (ch == "#" && stream.match(/ *\[ *\[/)) { + return chain(stream, state, tokenUnparsed); + } + else if (ch == "#" && stream.eat("#")) { + stream.skipToEnd(); + return "comment"; + } + else if (ch == '"') { + stream.skipTo(/"/); + return "comment"; + } + else if (ch == "$") { + stream.eatWhile(/[$_a-z0-9A-Z\.{:]/); + stream.eatWhile(/}/); + state.beforeParams = true; + return "builtin"; + } + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "comment"; + } + else { + stream.eatWhile(/[\w\$_{}\xa1-\uffff]/); + var word = stream.current().toLowerCase(); + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + if (functions && functions.propertyIsEnumerable(word)) { + state.beforeParams = true; + return "keyword"; + } + return null; + } + } + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize = tokenBase; + return "string"; + }; + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == "]") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + } + }; +}); +CodeMirror.defineMIME("text/x-tcl", "tcl"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/index.html new file mode 100644 index 0000000..42b156b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/index.html @@ -0,0 +1,191 @@ + + +CodeMirror: Textile mode + + + + + + + + + +
    +

    Textile mode

    +
    + + +

    MIME types defined: text/x-textile.

    + +

    Parsing/Highlighting Tests: normal, verbose.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/test.js new file mode 100644 index 0000000..49cdaf9 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/test.js @@ -0,0 +1,417 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({tabSize: 4}, 'textile'); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT('simpleParagraphs', + 'Some text.', + '', + 'Some more text.'); + + /* + * Phrase Modifiers + */ + + MT('em', + 'foo [em _bar_]'); + + MT('emBoogus', + 'code_mirror'); + + MT('strong', + 'foo [strong *bar*]'); + + MT('strongBogus', + '3 * 3 = 9'); + + MT('italic', + 'foo [em __bar__]'); + + MT('italicBogus', + 'code__mirror'); + + MT('bold', + 'foo [strong **bar**]'); + + MT('boldBogus', + '3 ** 3 = 27'); + + MT('simpleLink', + '[link "CodeMirror":http://codemirror.net]'); + + MT('referenceLink', + '[link "CodeMirror":code_mirror]', + 'Normal Text.', + '[link [[code_mirror]]http://codemirror.net]'); + + MT('footCite', + 'foo bar[qualifier [[1]]]'); + + MT('footCiteBogus', + 'foo bar[[1a2]]'); + + MT('special-characters', + 'Registered [tag (r)], ' + + 'Trademark [tag (tm)], and ' + + 'Copyright [tag (c)] 2008'); + + MT('cite', + "A book is [keyword ??The Count of Monte Cristo??] by Dumas."); + + MT('additionAndDeletion', + 'The news networks declared [negative -Al Gore-] ' + + '[positive +George W. Bush+] the winner in Florida.'); + + MT('subAndSup', + 'f(x, n) = log [builtin ~4~] x [builtin ^n^]'); + + MT('spanAndCode', + 'A [quote %span element%] and [atom @code element@]'); + + MT('spanBogus', + 'Percentage 25% is not a span.'); + + MT('citeBogus', + 'Question? is not a citation.'); + + MT('codeBogus', + 'user@example.com'); + + MT('subBogus', + '~username'); + + MT('supBogus', + 'foo ^ bar'); + + MT('deletionBogus', + '3 - 3 = 0'); + + MT('additionBogus', + '3 + 3 = 6'); + + MT('image', + 'An image: [string !http://www.example.com/image.png!]'); + + MT('imageWithAltText', + 'An image: [string !http://www.example.com/image.png (Alt Text)!]'); + + MT('imageWithUrl', + 'An image: [string !http://www.example.com/image.png!:http://www.example.com/]'); + + /* + * Headers + */ + + MT('h1', + '[header&header-1 h1. foo]'); + + MT('h2', + '[header&header-2 h2. foo]'); + + MT('h3', + '[header&header-3 h3. foo]'); + + MT('h4', + '[header&header-4 h4. foo]'); + + MT('h5', + '[header&header-5 h5. foo]'); + + MT('h6', + '[header&header-6 h6. foo]'); + + MT('h7Bogus', + 'h7. foo'); + + MT('multipleHeaders', + '[header&header-1 h1. Heading 1]', + '', + 'Some text.', + '', + '[header&header-2 h2. Heading 2]', + '', + 'More text.'); + + MT('h1inline', + '[header&header-1 h1. foo ][header&header-1&em _bar_][header&header-1 baz]'); + + /* + * Lists + */ + + MT('ul', + 'foo', + 'bar', + '', + '[variable-2 * foo]', + '[variable-2 * bar]'); + + MT('ulNoBlank', + 'foo', + 'bar', + '[variable-2 * foo]', + '[variable-2 * bar]'); + + MT('ol', + 'foo', + 'bar', + '', + '[variable-2 # foo]', + '[variable-2 # bar]'); + + MT('olNoBlank', + 'foo', + 'bar', + '[variable-2 # foo]', + '[variable-2 # bar]'); + + MT('ulFormatting', + '[variable-2 * ][variable-2&em _foo_][variable-2 bar]', + '[variable-2 * ][variable-2&strong *][variable-2&em&strong _foo_]' + + '[variable-2&strong *][variable-2 bar]', + '[variable-2 * ][variable-2&strong *foo*][variable-2 bar]'); + + MT('olFormatting', + '[variable-2 # ][variable-2&em _foo_][variable-2 bar]', + '[variable-2 # ][variable-2&strong *][variable-2&em&strong _foo_]' + + '[variable-2&strong *][variable-2 bar]', + '[variable-2 # ][variable-2&strong *foo*][variable-2 bar]'); + + MT('ulNested', + '[variable-2 * foo]', + '[variable-3 ** bar]', + '[keyword *** bar]', + '[variable-2 **** bar]', + '[variable-3 ** bar]'); + + MT('olNested', + '[variable-2 # foo]', + '[variable-3 ## bar]', + '[keyword ### bar]', + '[variable-2 #### bar]', + '[variable-3 ## bar]'); + + MT('ulNestedWithOl', + '[variable-2 * foo]', + '[variable-3 ## bar]', + '[keyword *** bar]', + '[variable-2 #### bar]', + '[variable-3 ** bar]'); + + MT('olNestedWithUl', + '[variable-2 # foo]', + '[variable-3 ** bar]', + '[keyword ### bar]', + '[variable-2 **** bar]', + '[variable-3 ## bar]'); + + MT('definitionList', + '[number - coffee := Hot ][number&em _and_][number black]', + '', + 'Normal text.'); + + MT('definitionListSpan', + '[number - coffee :=]', + '', + '[number Hot ][number&em _and_][number black =:]', + '', + 'Normal text.'); + + MT('boo', + '[number - dog := woof woof]', + '[number - cat := meow meow]', + '[number - whale :=]', + '[number Whale noises.]', + '', + '[number Also, ][number&em _splashing_][number . =:]'); + + /* + * Attributes + */ + + MT('divWithAttribute', + '[punctuation div][punctuation&attribute (#my-id)][punctuation . foo bar]'); + + MT('divWithAttributeAnd2emRightPadding', + '[punctuation div][punctuation&attribute (#my-id)((][punctuation . foo bar]'); + + MT('divWithClassAndId', + '[punctuation div][punctuation&attribute (my-class#my-id)][punctuation . foo bar]'); + + MT('paragraphWithCss', + 'p[attribute {color:red;}]. foo bar'); + + MT('paragraphNestedStyles', + 'p. [strong *foo ][strong&em _bar_][strong *]'); + + MT('paragraphWithLanguage', + 'p[attribute [[fr]]]. Parlez-vous français?'); + + MT('paragraphLeftAlign', + 'p[attribute <]. Left'); + + MT('paragraphRightAlign', + 'p[attribute >]. Right'); + + MT('paragraphRightAlign', + 'p[attribute =]. Center'); + + MT('paragraphJustified', + 'p[attribute <>]. Justified'); + + MT('paragraphWithLeftIndent1em', + 'p[attribute (]. Left'); + + MT('paragraphWithRightIndent1em', + 'p[attribute )]. Right'); + + MT('paragraphWithLeftIndent2em', + 'p[attribute ((]. Left'); + + MT('paragraphWithRightIndent2em', + 'p[attribute ))]. Right'); + + MT('paragraphWithLeftIndent3emRightIndent2em', + 'p[attribute ((())]. Right'); + + MT('divFormatting', + '[punctuation div. ][punctuation&strong *foo ]' + + '[punctuation&strong&em _bar_][punctuation&strong *]'); + + MT('phraseModifierAttributes', + 'p[attribute (my-class)]. This is a paragraph that has a class and' + + ' this [em _][em&attribute (#special-phrase)][em emphasized phrase_]' + + ' has an id.'); + + MT('linkWithClass', + '[link "(my-class). This is a link with class":http://redcloth.org]'); + + /* + * Layouts + */ + + MT('paragraphLayouts', + 'p. This is one paragraph.', + '', + 'p. This is another.'); + + MT('div', + '[punctuation div. foo bar]'); + + MT('pre', + '[operator pre. Text]'); + + MT('bq.', + '[bracket bq. foo bar]', + '', + 'Normal text.'); + + MT('footnote', + '[variable fn123. foo ][variable&strong *bar*]'); + + /* + * Spanning Layouts + */ + + MT('bq..ThenParagraph', + '[bracket bq.. foo bar]', + '', + '[bracket More quote.]', + 'p. Normal Text'); + + MT('bq..ThenH1', + '[bracket bq.. foo bar]', + '', + '[bracket More quote.]', + '[header&header-1 h1. Header Text]'); + + MT('bc..ThenParagraph', + '[atom bc.. # Some ruby code]', + '[atom obj = {foo: :bar}]', + '[atom puts obj]', + '', + '[atom obj[[:love]] = "*love*"]', + '[atom puts obj.love.upcase]', + '', + 'p. Normal text.'); + + MT('fn1..ThenParagraph', + '[variable fn1.. foo bar]', + '', + '[variable More.]', + 'p. Normal Text'); + + MT('pre..ThenParagraph', + '[operator pre.. foo bar]', + '', + '[operator More.]', + 'p. Normal Text'); + + /* + * Tables + */ + + MT('table', + '[variable-3&operator |_. name |_. age|]', + '[variable-3 |][variable-3&strong *Walter*][variable-3 | 5 |]', + '[variable-3 |Florence| 6 |]', + '', + 'p. Normal text.'); + + MT('tableWithAttributes', + '[variable-3&operator |_. name |_. age|]', + '[variable-3 |][variable-3&attribute /2.][variable-3 Jim |]', + '[variable-3 |][variable-3&attribute \\2{color: red}.][variable-3 Sam |]'); + + /* + * HTML + */ + + MT('html', + '[comment
    ]', + '[comment
    ]', + '', + '[header&header-1 h1. Welcome]', + '', + '[variable-2 * Item one]', + '[variable-2 * Item two]', + '', + '[comment Example]', + '', + '[comment
    ]', + '[comment
    ]'); + + MT('inlineHtml', + 'I can use HTML directly in my [comment Textile].'); + + /* + * No-Textile + */ + + MT('notextile', + '[string-2 notextile. *No* formatting]'); + + MT('notextileInline', + 'Use [string-2 ==*asterisks*==] for [strong *strong*] text.'); + + MT('notextileWithPre', + '[operator pre. *No* formatting]'); + + MT('notextileWithSpanningPre', + '[operator pre.. *No* formatting]', + '', + '[operator *No* formatting]'); + + /* Only toggling phrases between non-word chars. */ + + MT('phrase-in-word', + 'foo_bar_baz'); + + MT('phrase-non-word', + '[negative -x-] aaa-bbb ccc-ddd [negative -eee-] fff [negative -ggg-]'); + + MT('phrase-lone-dash', + 'foo - bar - baz'); +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/textile.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/textile.js new file mode 100644 index 0000000..a6f7576 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/textile/textile.js @@ -0,0 +1,469 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") { // CommonJS + mod(require("../../lib/codemirror")); + } else if (typeof define == "function" && define.amd) { // AMD + define(["../../lib/codemirror"], mod); + } else { // Plain browser env + mod(CodeMirror); + } +})(function(CodeMirror) { + "use strict"; + + var TOKEN_STYLES = { + addition: "positive", + attributes: "attribute", + bold: "strong", + cite: "keyword", + code: "atom", + definitionList: "number", + deletion: "negative", + div: "punctuation", + em: "em", + footnote: "variable", + footCite: "qualifier", + header: "header", + html: "comment", + image: "string", + italic: "em", + link: "link", + linkDefinition: "link", + list1: "variable-2", + list2: "variable-3", + list3: "keyword", + notextile: "string-2", + pre: "operator", + p: "property", + quote: "bracket", + span: "quote", + specialChar: "tag", + strong: "strong", + sub: "builtin", + sup: "builtin", + table: "variable-3", + tableHeading: "operator" + }; + + function startNewLine(stream, state) { + state.mode = Modes.newLayout; + state.tableHeading = false; + + if (state.layoutType === "definitionList" && state.spanningLayout && + stream.match(RE("definitionListEnd"), false)) + state.spanningLayout = false; + } + + function handlePhraseModifier(stream, state, ch) { + if (ch === "_") { + if (stream.eat("_")) + return togglePhraseModifier(stream, state, "italic", /__/, 2); + else + return togglePhraseModifier(stream, state, "em", /_/, 1); + } + + if (ch === "*") { + if (stream.eat("*")) { + return togglePhraseModifier(stream, state, "bold", /\*\*/, 2); + } + return togglePhraseModifier(stream, state, "strong", /\*/, 1); + } + + if (ch === "[") { + if (stream.match(/\d+\]/)) state.footCite = true; + return tokenStyles(state); + } + + if (ch === "(") { + var spec = stream.match(/^(r|tm|c)\)/); + if (spec) + return tokenStylesWith(state, TOKEN_STYLES.specialChar); + } + + if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/)) + return tokenStylesWith(state, TOKEN_STYLES.html); + + if (ch === "?" && stream.eat("?")) + return togglePhraseModifier(stream, state, "cite", /\?\?/, 2); + + if (ch === "=" && stream.eat("=")) + return togglePhraseModifier(stream, state, "notextile", /==/, 2); + + if (ch === "-" && !stream.eat("-")) + return togglePhraseModifier(stream, state, "deletion", /-/, 1); + + if (ch === "+") + return togglePhraseModifier(stream, state, "addition", /\+/, 1); + + if (ch === "~") + return togglePhraseModifier(stream, state, "sub", /~/, 1); + + if (ch === "^") + return togglePhraseModifier(stream, state, "sup", /\^/, 1); + + if (ch === "%") + return togglePhraseModifier(stream, state, "span", /%/, 1); + + if (ch === "@") + return togglePhraseModifier(stream, state, "code", /@/, 1); + + if (ch === "!") { + var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1); + stream.match(/^:\S+/); // optional Url portion + return type; + } + return tokenStyles(state); + } + + function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) { + var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null; + var charAfter = stream.peek(); + if (state[phraseModifier]) { + if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) { + var type = tokenStyles(state); + state[phraseModifier] = false; + return type; + } + } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) && + stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) { + state[phraseModifier] = true; + state.mode = Modes.attributes; + } + return tokenStyles(state); + }; + + function tokenStyles(state) { + var disabled = textileDisabled(state); + if (disabled) return disabled; + + var styles = []; + if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]); + + styles = styles.concat(activeStyles( + state, "addition", "bold", "cite", "code", "deletion", "em", "footCite", + "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading")); + + if (state.layoutType === "header") + styles.push(TOKEN_STYLES.header + "-" + state.header); + + return styles.length ? styles.join(" ") : null; + } + + function textileDisabled(state) { + var type = state.layoutType; + + switch(type) { + case "notextile": + case "code": + case "pre": + return TOKEN_STYLES[type]; + default: + if (state.notextile) + return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : ""); + return null; + } + } + + function tokenStylesWith(state, extraStyles) { + var disabled = textileDisabled(state); + if (disabled) return disabled; + + var type = tokenStyles(state); + if (extraStyles) + return type ? (type + " " + extraStyles) : extraStyles; + else + return type; + } + + function activeStyles(state) { + var styles = []; + for (var i = 1; i < arguments.length; ++i) { + if (state[arguments[i]]) + styles.push(TOKEN_STYLES[arguments[i]]); + } + return styles; + } + + function blankLine(state) { + var spanningLayout = state.spanningLayout, type = state.layoutType; + + for (var key in state) if (state.hasOwnProperty(key)) + delete state[key]; + + state.mode = Modes.newLayout; + if (spanningLayout) { + state.layoutType = type; + state.spanningLayout = true; + } + } + + var REs = { + cache: {}, + single: { + bc: "bc", + bq: "bq", + definitionList: /- [^(?::=)]+:=+/, + definitionListEnd: /.*=:\s*$/, + div: "div", + drawTable: /\|.*\|/, + foot: /fn\d+/, + header: /h[1-6]/, + html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/, + link: /[^"]+":\S/, + linkDefinition: /\[[^\s\]]+\]\S+/, + list: /(?:#+|\*+)/, + notextile: "notextile", + para: "p", + pre: "pre", + table: "table", + tableCellAttributes: /[\/\\]\d+/, + tableHeading: /\|_\./, + tableText: /[^"_\*\[\(\?\+~\^%@|-]+/, + text: /[^!"_=\*\[\(<\?\+~\^%@-]+/ + }, + attributes: { + align: /(?:<>|<|>|=)/, + selector: /\([^\(][^\)]+\)/, + lang: /\[[^\[\]]+\]/, + pad: /(?:\(+|\)+){1,2}/, + css: /\{[^\}]+\}/ + }, + createRe: function(name) { + switch (name) { + case "drawTable": + return REs.makeRe("^", REs.single.drawTable, "$"); + case "html": + return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$"); + case "linkDefinition": + return REs.makeRe("^", REs.single.linkDefinition, "$"); + case "listLayout": + return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+"); + case "tableCellAttributes": + return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes, + RE("allAttributes")), "+\\."); + case "type": + return REs.makeRe("^", RE("allTypes")); + case "typeLayout": + return REs.makeRe("^", RE("allTypes"), RE("allAttributes"), + "*\\.\\.?", "(\\s+|$)"); + case "attributes": + return REs.makeRe("^", RE("allAttributes"), "+"); + + case "allTypes": + return REs.choiceRe(REs.single.div, REs.single.foot, + REs.single.header, REs.single.bc, REs.single.bq, + REs.single.notextile, REs.single.pre, REs.single.table, + REs.single.para); + + case "allAttributes": + return REs.choiceRe(REs.attributes.selector, REs.attributes.css, + REs.attributes.lang, REs.attributes.align, REs.attributes.pad); + + default: + return REs.makeRe("^", REs.single[name]); + } + }, + makeRe: function() { + var pattern = ""; + for (var i = 0; i < arguments.length; ++i) { + var arg = arguments[i]; + pattern += (typeof arg === "string") ? arg : arg.source; + } + return new RegExp(pattern); + }, + choiceRe: function() { + var parts = [arguments[0]]; + for (var i = 1; i < arguments.length; ++i) { + parts[i * 2 - 1] = "|"; + parts[i * 2] = arguments[i]; + } + + parts.unshift("(?:"); + parts.push(")"); + return REs.makeRe.apply(null, parts); + } + }; + + function RE(name) { + return (REs.cache[name] || (REs.cache[name] = REs.createRe(name))); + } + + var Modes = { + newLayout: function(stream, state) { + if (stream.match(RE("typeLayout"), false)) { + state.spanningLayout = false; + return (state.mode = Modes.blockType)(stream, state); + } + var newMode; + if (!textileDisabled(state)) { + if (stream.match(RE("listLayout"), false)) + newMode = Modes.list; + else if (stream.match(RE("drawTable"), false)) + newMode = Modes.table; + else if (stream.match(RE("linkDefinition"), false)) + newMode = Modes.linkDefinition; + else if (stream.match(RE("definitionList"))) + newMode = Modes.definitionList; + else if (stream.match(RE("html"), false)) + newMode = Modes.html; + } + return (state.mode = (newMode || Modes.text))(stream, state); + }, + + blockType: function(stream, state) { + var match, type; + state.layoutType = null; + + if (match = stream.match(RE("type"))) + type = match[0]; + else + return (state.mode = Modes.text)(stream, state); + + if (match = type.match(RE("header"))) { + state.layoutType = "header"; + state.header = parseInt(match[0][1]); + } else if (type.match(RE("bq"))) { + state.layoutType = "quote"; + } else if (type.match(RE("bc"))) { + state.layoutType = "code"; + } else if (type.match(RE("foot"))) { + state.layoutType = "footnote"; + } else if (type.match(RE("notextile"))) { + state.layoutType = "notextile"; + } else if (type.match(RE("pre"))) { + state.layoutType = "pre"; + } else if (type.match(RE("div"))) { + state.layoutType = "div"; + } else if (type.match(RE("table"))) { + state.layoutType = "table"; + } + + state.mode = Modes.attributes; + return tokenStyles(state); + }, + + text: function(stream, state) { + if (stream.match(RE("text"))) return tokenStyles(state); + + var ch = stream.next(); + if (ch === '"') + return (state.mode = Modes.link)(stream, state); + return handlePhraseModifier(stream, state, ch); + }, + + attributes: function(stream, state) { + state.mode = Modes.layoutLength; + + if (stream.match(RE("attributes"))) + return tokenStylesWith(state, TOKEN_STYLES.attributes); + else + return tokenStyles(state); + }, + + layoutLength: function(stream, state) { + if (stream.eat(".") && stream.eat(".")) + state.spanningLayout = true; + + state.mode = Modes.text; + return tokenStyles(state); + }, + + list: function(stream, state) { + var match = stream.match(RE("list")); + state.listDepth = match[0].length; + var listMod = (state.listDepth - 1) % 3; + if (!listMod) + state.layoutType = "list1"; + else if (listMod === 1) + state.layoutType = "list2"; + else + state.layoutType = "list3"; + + state.mode = Modes.attributes; + return tokenStyles(state); + }, + + link: function(stream, state) { + state.mode = Modes.text; + if (stream.match(RE("link"))) { + stream.match(/\S+/); + return tokenStylesWith(state, TOKEN_STYLES.link); + } + return tokenStyles(state); + }, + + linkDefinition: function(stream, state) { + stream.skipToEnd(); + return tokenStylesWith(state, TOKEN_STYLES.linkDefinition); + }, + + definitionList: function(stream, state) { + stream.match(RE("definitionList")); + + state.layoutType = "definitionList"; + + if (stream.match(/\s*$/)) + state.spanningLayout = true; + else + state.mode = Modes.attributes; + + return tokenStyles(state); + }, + + html: function(stream, state) { + stream.skipToEnd(); + return tokenStylesWith(state, TOKEN_STYLES.html); + }, + + table: function(stream, state) { + state.layoutType = "table"; + return (state.mode = Modes.tableCell)(stream, state); + }, + + tableCell: function(stream, state) { + if (stream.match(RE("tableHeading"))) + state.tableHeading = true; + else + stream.eat("|"); + + state.mode = Modes.tableCellAttributes; + return tokenStyles(state); + }, + + tableCellAttributes: function(stream, state) { + state.mode = Modes.tableText; + + if (stream.match(RE("tableCellAttributes"))) + return tokenStylesWith(state, TOKEN_STYLES.attributes); + else + return tokenStyles(state); + }, + + tableText: function(stream, state) { + if (stream.match(RE("tableText"))) + return tokenStyles(state); + + if (stream.peek() === "|") { // end of cell + state.mode = Modes.tableCell; + return tokenStyles(state); + } + return handlePhraseModifier(stream, state, stream.next()); + } + }; + + CodeMirror.defineMode("textile", function() { + return { + startState: function() { + return { mode: Modes.newLayout }; + }, + token: function(stream, state) { + if (stream.sol()) startNewLine(stream, state); + return state.mode(stream, state); + }, + blankLine: blankLine + }; + }); + + CodeMirror.defineMIME("text/x-textile", "textile"); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/index.html new file mode 100644 index 0000000..77dd045 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/index.html @@ -0,0 +1,154 @@ + + +CodeMirror: TiddlyWiki mode + + + + + + + + + + + +
    +

    TiddlyWiki mode

    + + +
    + + + +

    TiddlyWiki mode supports a single configuration.

    + +

    MIME types defined: text/x-tiddlywiki.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.css b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.css new file mode 100644 index 0000000..9a69b63 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.css @@ -0,0 +1,14 @@ +span.cm-underlined { + text-decoration: underline; +} +span.cm-strikethrough { + text-decoration: line-through; +} +span.cm-brace { + color: #170; + font-weight: bold; +} +span.cm-table { + color: blue; + font-weight: bold; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.js new file mode 100644 index 0000000..88c9768 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiddlywiki/tiddlywiki.js @@ -0,0 +1,369 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/*** + |''Name''|tiddlywiki.js| + |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror| + |''Author''|PMario| + |''Version''|0.1.7| + |''Status''|''stable''| + |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]| + |''Documentation''|http://codemirror.tiddlyspace.com/| + |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]| + |''CoreVersion''|2.5.0| + |''Requires''|codemirror.js| + |''Keywords''|syntax highlighting color code mirror codemirror| + ! Info + CoreVersion parameter is needed for TiddlyWiki only! +***/ +//{{{ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("tiddlywiki", function () { + // Tokenizer + var textwords = {}; + + var keywords = function () { + function kw(type) { + return { type: type, style: "macro"}; + } + return { + "allTags": kw('allTags'), "closeAll": kw('closeAll'), "list": kw('list'), + "newJournal": kw('newJournal'), "newTiddler": kw('newTiddler'), + "permaview": kw('permaview'), "saveChanges": kw('saveChanges'), + "search": kw('search'), "slider": kw('slider'), "tabs": kw('tabs'), + "tag": kw('tag'), "tagging": kw('tagging'), "tags": kw('tags'), + "tiddler": kw('tiddler'), "timeline": kw('timeline'), + "today": kw('today'), "version": kw('version'), "option": kw('option'), + + "with": kw('with'), + "filter": kw('filter') + }; + }(); + + var isSpaceName = /[\w_\-]/i, + reHR = /^\-\-\-\-+$/, //
    + reWikiCommentStart = /^\/\*\*\*$/, // /*** + reWikiCommentStop = /^\*\*\*\/$/, // ***/ + reBlockQuote = /^<<<$/, + + reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start + reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop + reXmlCodeStart = /^$/, // xml block start + reXmlCodeStop = /^$/, // xml stop + + reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start + reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop + + reUntilCodeStop = /.*?\}\}\}/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + + function ret(tp, style, cont) { + type = tp; + content = cont; + return style; + } + + function jsTokenBase(stream, state) { + var sol = stream.sol(), ch; + + state.block = false; // indicates the start of a code block. + + ch = stream.peek(); // don't eat, to make matching simpler + + // check start of blocks + if (sol && /[<\/\*{}\-]/.test(ch)) { + if (stream.match(reCodeBlockStart)) { + state.block = true; + return chain(stream, state, twTokenCode); + } + if (stream.match(reBlockQuote)) { + return ret('quote', 'quote'); + } + if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) { + return ret('code', 'comment'); + } + if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) { + return ret('code', 'comment'); + } + if (stream.match(reHR)) { + return ret('hr', 'hr'); + } + } // sol + ch = stream.next(); + + if (sol && /[\/\*!#;:>|]/.test(ch)) { + if (ch == "!") { // tw header + stream.skipToEnd(); + return ret("header", "header"); + } + if (ch == "*") { // tw list + stream.eatWhile('*'); + return ret("list", "comment"); + } + if (ch == "#") { // tw numbered list + stream.eatWhile('#'); + return ret("list", "comment"); + } + if (ch == ";") { // definition list, term + stream.eatWhile(';'); + return ret("list", "comment"); + } + if (ch == ":") { // definition list, description + stream.eatWhile(':'); + return ret("list", "comment"); + } + if (ch == ">") { // single line quote + stream.eatWhile(">"); + return ret("quote", "quote"); + } + if (ch == '|') { + return ret('table', 'header'); + } + } + + if (ch == '{' && stream.match(/\{\{/)) { + return chain(stream, state, twTokenCode); + } + + // rudimentary html:// file:// link matching. TW knows much more ... + if (/[hf]/i.test(ch)) { + if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) { + return ret("link", "link"); + } + } + // just a little string indicator, don't want to have the whole string covered + if (ch == '"') { + return ret('string', 'string'); + } + if (ch == '~') { // _no_ CamelCase indicator should be bold + return ret('text', 'brace'); + } + if (/[\[\]]/.test(ch)) { // check for [[..]] + if (stream.peek() == ch) { + stream.next(); + return ret('brace', 'brace'); + } + } + if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting + stream.eatWhile(isSpaceName); + return ret("link", "link"); + } + if (/\d/.test(ch)) { // numbers + stream.eatWhile(/\d/); + return ret("number", "number"); + } + if (ch == "/") { // tw invisible comment + if (stream.eat("%")) { + return chain(stream, state, twTokenComment); + } + else if (stream.eat("/")) { // + return chain(stream, state, twTokenEm); + } + } + if (ch == "_") { // tw underline + if (stream.eat("_")) { + return chain(stream, state, twTokenUnderline); + } + } + // strikethrough and mdash handling + if (ch == "-") { + if (stream.eat("-")) { + // if strikethrough looks ugly, change CSS. + if (stream.peek() != ' ') + return chain(stream, state, twTokenStrike); + // mdash + if (stream.peek() == ' ') + return ret('text', 'brace'); + } + } + if (ch == "'") { // tw bold + if (stream.eat("'")) { + return chain(stream, state, twTokenStrong); + } + } + if (ch == "<") { // tw macro + if (stream.eat("<")) { + return chain(stream, state, twTokenMacro); + } + } + else { + return ret(ch); + } + + // core macro handling + stream.eatWhile(/[\w\$_]/); + var word = stream.current(), + known = textwords.propertyIsEnumerable(word) && textwords[word]; + + return known ? ret(known.type, known.style, word) : ret("text", null, word); + + } // jsTokenBase() + + // tw invisible comment + function twTokenComment(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = jsTokenBase; + break; + } + maybeEnd = (ch == "%"); + } + return ret("comment", "comment"); + } + + // tw strong / bold + function twTokenStrong(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "'" && maybeEnd) { + state.tokenize = jsTokenBase; + break; + } + maybeEnd = (ch == "'"); + } + return ret("text", "strong"); + } + + // tw code + function twTokenCode(stream, state) { + var ch, sb = state.block; + + if (sb && stream.current()) { + return ret("code", "comment"); + } + + if (!sb && stream.match(reUntilCodeStop)) { + state.tokenize = jsTokenBase; + return ret("code", "comment"); + } + + if (sb && stream.sol() && stream.match(reCodeBlockStop)) { + state.tokenize = jsTokenBase; + return ret("code", "comment"); + } + + ch = stream.next(); + return (sb) ? ret("code", "comment") : ret("code", "comment"); + } + + // tw em / italic + function twTokenEm(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = jsTokenBase; + break; + } + maybeEnd = (ch == "/"); + } + return ret("text", "em"); + } + + // tw underlined text + function twTokenUnderline(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "_" && maybeEnd) { + state.tokenize = jsTokenBase; + break; + } + maybeEnd = (ch == "_"); + } + return ret("text", "underlined"); + } + + // tw strike through text looks ugly + // change CSS if needed + function twTokenStrike(stream, state) { + var maybeEnd = false, ch; + + while (ch = stream.next()) { + if (ch == "-" && maybeEnd) { + state.tokenize = jsTokenBase; + break; + } + maybeEnd = (ch == "-"); + } + return ret("text", "strikethrough"); + } + + // macro + function twTokenMacro(stream, state) { + var ch, word, known; + + if (stream.current() == '<<') { + return ret('brace', 'macro'); + } + + ch = stream.next(); + if (!ch) { + state.tokenize = jsTokenBase; + return ret(ch); + } + if (ch == ">") { + if (stream.peek() == '>') { + stream.next(); + state.tokenize = jsTokenBase; + return ret("brace", "macro"); + } + } + + stream.eatWhile(/[\w\$_]/); + word = stream.current(); + known = keywords.propertyIsEnumerable(word) && keywords[word]; + + if (known) { + return ret(known.type, known.style, word); + } + else { + return ret("macro", null, word); + } + } + + // Interface + return { + startState: function () { + return { + tokenize: jsTokenBase, + indented: 0, + level: 0 + }; + }, + + token: function (stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + }, + + electricChars: "" + }; +}); + +CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki"); +}); + +//}}} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/index.html new file mode 100644 index 0000000..091c5fb --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/index.html @@ -0,0 +1,95 @@ + + +CodeMirror: Tiki wiki mode + + + + + + + + + + +
    +

    Tiki wiki mode

    + + +
    + + + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.css b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.css new file mode 100644 index 0000000..0dbc3ea --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.css @@ -0,0 +1,26 @@ +.cm-tw-syntaxerror { + color: #FFF; + background-color: #900; +} + +.cm-tw-deleted { + text-decoration: line-through; +} + +.cm-tw-header5 { + font-weight: bold; +} +.cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/ + padding-left: 10px; +} + +.cm-tw-box { + border-top-width: 0px ! important; + border-style: solid; + border-width: 1px; + border-color: inherit; +} + +.cm-tw-underline { + text-decoration: underline; +} \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.js new file mode 100644 index 0000000..c90aac9 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tiki/tiki.js @@ -0,0 +1,323 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('tiki', function(config) { + function inBlock(style, terminator, returnTokenizer) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = inText; + break; + } + stream.next(); + } + + if (returnTokenizer) state.tokenize = returnTokenizer; + + return style; + }; + } + + function inLine(style) { + return function(stream, state) { + while(!stream.eol()) { + stream.next(); + } + state.tokenize = inText; + return style; + }; + } + + function inText(stream, state) { + function chain(parser) { + state.tokenize = parser; + return parser(stream, state); + } + + var sol = stream.sol(); + var ch = stream.next(); + + //non start of line + switch (ch) { //switch is generally much faster than if, so it is used here + case "{": //plugin + stream.eat("/"); + stream.eatSpace(); + var tagName = ""; + var c; + while ((c = stream.eat(/[^\s\u00a0=\"\'\/?(}]/))) tagName += c; + state.tokenize = inPlugin; + return "tag"; + break; + case "_": //bold + if (stream.eat("_")) { + return chain(inBlock("strong", "__", inText)); + } + break; + case "'": //italics + if (stream.eat("'")) { + // Italic text + return chain(inBlock("em", "''", inText)); + } + break; + case "(":// Wiki Link + if (stream.eat("(")) { + return chain(inBlock("variable-2", "))", inText)); + } + break; + case "[":// Weblink + return chain(inBlock("variable-3", "]", inText)); + break; + case "|": //table + if (stream.eat("|")) { + return chain(inBlock("comment", "||")); + } + break; + case "-": + if (stream.eat("=")) {//titleBar + return chain(inBlock("header string", "=-", inText)); + } else if (stream.eat("-")) {//deleted + return chain(inBlock("error tw-deleted", "--", inText)); + } + break; + case "=": //underline + if (stream.match("==")) { + return chain(inBlock("tw-underline", "===", inText)); + } + break; + case ":": + if (stream.eat(":")) { + return chain(inBlock("comment", "::")); + } + break; + case "^": //box + return chain(inBlock("tw-box", "^")); + break; + case "~": //np + if (stream.match("np~")) { + return chain(inBlock("meta", "~/np~")); + } + break; + } + + //start of line types + if (sol) { + switch (ch) { + case "!": //header at start of line + if (stream.match('!!!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!')) { + return chain(inLine("header string")); + } else { + return chain(inLine("header string")); + } + break; + case "*": //unordered list line item, or
  • at start of line + case "#": //ordered list line item, or
  • at start of line + case "+": //ordered list line item, or
  • at start of line + return chain(inLine("tw-listitem bracket")); + break; + } + } + + //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki + return null; + } + + var indentUnit = config.indentUnit; + + // Return variables for tokenizers + var pluginName, type; + function inPlugin(stream, state) { + var ch = stream.next(); + var peek = stream.peek(); + + if (ch == "}") { + state.tokenize = inText; + //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin + return "tag"; + } else if (ch == "(" || ch == ")") { + return "bracket"; + } else if (ch == "=") { + type = "equals"; + + if (peek == ">") { + ch = stream.next(); + peek = stream.peek(); + } + + //here we detect values directly after equal character with no quotes + if (!/[\'\"]/.test(peek)) { + state.tokenize = inAttributeNoQuote(); + } + //end detect values + + return "operator"; + } else if (/[\'\"]/.test(ch)) { + state.tokenize = inAttribute(ch); + return state.tokenize(stream, state); + } else { + stream.eatWhile(/[^\s\u00a0=\"\'\/?]/); + return "keyword"; + } + } + + function inAttribute(quote) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.next() == quote) { + state.tokenize = inPlugin; + break; + } + } + return "string"; + }; + } + + function inAttributeNoQuote() { + return function(stream, state) { + while (!stream.eol()) { + var ch = stream.next(); + var peek = stream.peek(); + if (ch == " " || ch == "," || /[ )}]/.test(peek)) { + state.tokenize = inPlugin; + break; + } + } + return "string"; +}; + } + +var curState, setStyle; +function pass() { + for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); +} + +function cont() { + pass.apply(null, arguments); + return true; +} + +function pushContext(pluginName, startOfLine) { + var noIndent = curState.context && curState.context.noIndent; + curState.context = { + prev: curState.context, + pluginName: pluginName, + indent: curState.indented, + startOfLine: startOfLine, + noIndent: noIndent + }; +} + +function popContext() { + if (curState.context) curState.context = curState.context.prev; +} + +function element(type) { + if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));} + else if (type == "closePlugin") { + var err = false; + if (curState.context) { + err = curState.context.pluginName != pluginName; + popContext(); + } else { + err = true; + } + if (err) setStyle = "error"; + return cont(endcloseplugin(err)); + } + else if (type == "string") { + if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata"); + if (curState.tokenize == inText) popContext(); + return cont(); + } + else return cont(); +} + +function endplugin(startOfLine) { + return function(type) { + if ( + type == "selfclosePlugin" || + type == "endPlugin" + ) + return cont(); + if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();} + return cont(); + }; +} + +function endcloseplugin(err) { + return function(type) { + if (err) setStyle = "error"; + if (type == "endPlugin") return cont(); + return pass(); + }; +} + +function attributes(type) { + if (type == "keyword") {setStyle = "attribute"; return cont(attributes);} + if (type == "equals") return cont(attvalue, attributes); + return pass(); +} +function attvalue(type) { + if (type == "keyword") {setStyle = "string"; return cont();} + if (type == "string") return cont(attvaluemaybe); + return pass(); +} +function attvaluemaybe(type) { + if (type == "string") return cont(attvaluemaybe); + else return pass(); +} +return { + startState: function() { + return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null}; + }, + token: function(stream, state) { + if (stream.sol()) { + state.startOfLine = true; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + + setStyle = type = pluginName = null; + var style = state.tokenize(stream, state); + if ((style || type) && style != "comment") { + curState = state; + while (true) { + var comb = state.cc.pop() || element; + if (comb(type || style)) break; + } + } + state.startOfLine = false; + return setStyle || style; + }, + indent: function(state, textAfter) { + var context = state.context; + if (context && context.noIndent) return 0; + if (context && /^{\//.test(textAfter)) + context = context.prev; + while (context && !context.startOfLine) + context = context.prev; + if (context) return context.indent + indentUnit; + else return 0; + }, + electricChars: "/" + }; +}); + +CodeMirror.defineMIME("text/tiki", "tiki"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/index.html new file mode 100644 index 0000000..90a2a02 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/index.html @@ -0,0 +1,73 @@ + + +CodeMirror: TOML Mode + + + + + + + + + +
    +

    TOML Mode

    +
    + +

    The TOML Mode

    +

    Created by Forbes Lindesay.

    +

    MIME type defined: text/x-toml.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/toml.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/toml.js new file mode 100644 index 0000000..baeca15 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/toml/toml.js @@ -0,0 +1,88 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("toml", function () { + return { + startState: function () { + return { + inString: false, + stringType: "", + lhs: true, + inArray: 0 + }; + }, + token: function (stream, state) { + //check for state changes + if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.inString = true; // Update state + } + if (stream.sol() && state.inArray === 0) { + state.lhs = true; + } + //return state + if (state.inString) { + while (state.inString && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.inString = false; // Clear flag + } else if (stream.peek() === '\\') { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + } else if (state.inArray && stream.peek() === ']') { + stream.next(); + state.inArray--; + return 'bracket'; + } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) { + stream.next();//skip closing ] + // array of objects has an extra open & close [] + if (stream.peek() === ']') stream.next(); + return "atom"; + } else if (stream.peek() === "#") { + stream.skipToEnd(); + return "comment"; + } else if (stream.eatSpace()) { + return null; + } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) { + return "property"; + } else if (state.lhs && stream.peek() === "=") { + stream.next(); + state.lhs = false; + return null; + } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) { + return 'atom'; //date + } else if (!state.lhs && (stream.match('true') || stream.match('false'))) { + return 'atom'; + } else if (!state.lhs && stream.peek() === '[') { + state.inArray++; + stream.next(); + return 'bracket'; + } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) { + return 'number'; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; +}); + +CodeMirror.defineMIME('text/x-toml', 'toml'); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/index.html new file mode 100644 index 0000000..8ee7ef5 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/index.html @@ -0,0 +1,63 @@ + + +CodeMirror: Tornado template mode + + + + + + + + + + + + +
    +

    Tornado template mode

    +
    + + + +

    Mode for HTML with embedded Tornado template markup.

    + +

    MIME types defined: text/x-tornado

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/tornado.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/tornado.js new file mode 100644 index 0000000..dbfbc34 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/tornado/tornado.js @@ -0,0 +1,68 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("tornado:inner", function() { + var keywords = ["and","as","assert","autoescape","block","break","class","comment","context", + "continue","datetime","def","del","elif","else","end","escape","except", + "exec","extends","false","finally","for","from","global","if","import","in", + "include","is","json_encode","lambda","length","linkify","load","module", + "none","not","or","pass","print","put","raise","raw","return","self","set", + "squeeze","super","true","try","url_escape","while","with","without","xhtml_escape","yield"]; + keywords = new RegExp("^((" + keywords.join(")|(") + "))\\b"); + + function tokenBase (stream, state) { + stream.eatWhile(/[^\{]/); + var ch = stream.next(); + if (ch == "{") { + if (ch = stream.eat(/\{|%|#/)) { + state.tokenize = inTag(ch); + return "tag"; + } + } + } + function inTag (close) { + if (close == "{") { + close = "}"; + } + return function (stream, state) { + var ch = stream.next(); + if ((ch == close) && stream.eat("}")) { + state.tokenize = tokenBase; + return "tag"; + } + if (stream.match(keywords)) { + return "keyword"; + } + return close == "#" ? "comment" : "string"; + }; + } + return { + startState: function () { + return {tokenize: tokenBase}; + }, + token: function (stream, state) { + return state.tokenize(stream, state); + } + }; + }); + + CodeMirror.defineMode("tornado", function(config) { + var htmlBase = CodeMirror.getMode(config, "text/html"); + var tornadoInner = CodeMirror.getMode(config, "tornado:inner"); + return CodeMirror.overlayMode(htmlBase, tornadoInner); + }); + + CodeMirror.defineMIME("text/x-tornado", "tornado"); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/index.html new file mode 100644 index 0000000..a4962b6 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/index.html @@ -0,0 +1,50 @@ + + +CodeMirror: Turtle mode + + + + + + + + + +
    +

    Turtle mode

    +
    + + +

    MIME types defined: text/turtle.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/turtle.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/turtle.js new file mode 100644 index 0000000..0988f0a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/turtle/turtle.js @@ -0,0 +1,162 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("turtle", function(config) { + var indentUnit = config.indentUnit; + var curPunc; + + function wordRegexp(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var ops = wordRegexp([]); + var keywords = wordRegexp(["@prefix", "@base", "a"]); + var operatorChars = /[*+\-<>=&|]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + curPunc = null; + if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { + stream.match(/^[^\s\u00a0>]*>?/); + return "atom"; + } + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } + else if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return null; + } + else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return null; + } + else if (ch == ":") { + return "operator"; + } else { + stream.eatWhile(/[_\w\d]/); + if(stream.peek() == ":") { + return "variable-3"; + } else { + var word = stream.current(); + + if(keywords.test(word)) { + return "meta"; + } + + if(ch >= "A" && ch <= "Z") { + return "comment"; + } else { + return "keyword"; + } + } + var word = stream.current(); + if (ops.test(word)) + return null; + else if (keywords.test(word)) + return "meta"; + else + return "variable"; + } + } + + function tokenLiteral(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return "string"; + }; + } + + function pushContext(state, type, col) { + state.context = {prev: state.context, indent: state.indent, col: col, type: type}; + } + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + context: null, + indent: 0, + col: 0}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) state.context.align = false; + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { + state.context.align = true; + } + + if (curPunc == "(") pushContext(state, ")", stream.column()); + else if (curPunc == "[") pushContext(state, "]", stream.column()); + else if (curPunc == "{") pushContext(state, "}", stream.column()); + else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type == "pattern") popContext(state); + if (state.context && curPunc == state.context.type) popContext(state); + } + else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); + else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) + pushContext(state, "pattern", stream.column()); + else if (state.context.type == "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + + return style; + }, + + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) + while (context && context.type == "pattern") context = context.prev; + + var closing = context && firstChar == context.type; + if (!context) + return 0; + else if (context.type == "pattern") + return context.col; + else if (context.align) + return context.col + (closing ? 0 : 1); + else + return context.indent + (closing ? 0 : indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/turtle", "turtle"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/index.html new file mode 100644 index 0000000..adcc44f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/index.html @@ -0,0 +1,102 @@ + + +CodeMirror: VB.NET mode + + + + + + + + + + + +
    +

    VB.NET mode

    + + + +
    + +
    +
    
    +  

    MIME type defined: text/x-vb.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/vb.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/vb.js new file mode 100644 index 0000000..902203e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vb/vb.js @@ -0,0 +1,274 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("vb", function(conf, parserConf) { + var ERRORCLASS = 'error'; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]"); + var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]'); + var doubleOperators = new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); + var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); + var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); + + var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try']; + var middleKeywords = ['else','elseif','case', 'catch']; + var endKeywords = ['next','loop']; + + var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'in']); + var commonkeywords = ['as', 'dim', 'break', 'continue','optional', 'then', 'until', + 'goto', 'byval','byref','new','handles','property', 'return', + 'const','private', 'protected', 'friend', 'public', 'shared', 'static', 'true','false']; + var commontypes = ['integer','string','double','decimal','boolean','short','char', 'float','single']; + + var keywords = wordRegexp(commonkeywords); + var types = wordRegexp(commontypes); + var stringPrefixes = '"'; + + var opening = wordRegexp(openingKeywords); + var middle = wordRegexp(middleKeywords); + var closing = wordRegexp(endKeywords); + var doubleClosing = wordRegexp(['end']); + var doOpening = wordRegexp(['do']); + + var indentInfo = null; + + + + + function indent(_stream, state) { + state.currentIndent++; + } + + function dedent(_stream, state) { + state.currentIndent--; + } + // tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle Comments + if (ch === "'") { + stream.skipToEnd(); + return 'comment'; + } + + + // Handle Number Literals + if (stream.match(/^((&H)|(&O))?[0-9\.a-f]/i, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+F?/i)) { floatLiteral = true; } + else if (stream.match(/^\d+\.\d*F?/)) { floatLiteral = true; } + else if (stream.match(/^\.\d+F?/)) { floatLiteral = true; } + + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return 'number'; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } + // Octal + else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } + // Decimal + else if (stream.match(/^[1-9]\d*F?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return 'number'; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) { + return null; + } + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) { + return 'operator'; + } + if (stream.match(singleDelimiters)) { + return null; + } + if (stream.match(doOpening)) { + indent(stream,state); + state.doInCurrentLine = true; + return 'keyword'; + } + if (stream.match(opening)) { + if (! state.doInCurrentLine) + indent(stream,state); + else + state.doInCurrentLine = false; + return 'keyword'; + } + if (stream.match(middle)) { + return 'keyword'; + } + + if (stream.match(doubleClosing)) { + dedent(stream,state); + dedent(stream,state); + return 'keyword'; + } + if (stream.match(closing)) { + dedent(stream,state); + return 'keyword'; + } + + if (stream.match(types)) { + return 'keyword'; + } + + if (stream.match(keywords)) { + return 'keyword'; + } + + if (stream.match(identifiers)) { + return 'variable'; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + var singleline = delimiter.length == 1; + var OUTCLASS = 'string'; + + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"]/); + if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + return ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return OUTCLASS; + }; + } + + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current === '.') { + style = state.tokenize(stream, state); + current = stream.current(); + if (style === 'variable') { + return 'variable'; + } else { + return ERRORCLASS; + } + } + + + var delimiter_index = '[({'.indexOf(current); + if (delimiter_index !== -1) { + indent(stream, state ); + } + if (indentInfo === 'dedent') { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + delimiter_index = '])}'.indexOf(current); + if (delimiter_index !== -1) { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + + return style; + } + + var external = { + electricChars:"dDpPtTfFeE ", + startState: function() { + return { + tokenize: tokenBase, + lastToken: null, + currentIndent: 0, + nextLineIndent: 0, + doInCurrentLine: false + + + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.currentIndent += state.nextLineIndent; + state.nextLineIndent = 0; + state.doInCurrentLine = 0; + } + var style = tokenLexer(stream, state); + + state.lastToken = {style:style, content: stream.current()}; + + + + return style; + }, + + indent: function(state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; + if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); + if(state.currentIndent < 0) return 0; + return state.currentIndent * conf.indentUnit; + } + + }; + return external; +}); + +CodeMirror.defineMIME("text/x-vb", "vb"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/index.html new file mode 100644 index 0000000..ad7532d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/index.html @@ -0,0 +1,55 @@ + + +CodeMirror: VBScript mode + + + + + + + + + +
    +

    VBScript mode

    + + +
    + + + +

    MIME types defined: text/vbscript.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/vbscript.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/vbscript.js new file mode 100644 index 0000000..b66df22 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/vbscript/vbscript.js @@ -0,0 +1,350 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/* +For extra ASP classic objects, initialize CodeMirror instance with this option: + isASP: true + +E.G.: + var editor = CodeMirror.fromTextArea(document.getElementById("code"), { + lineNumbers: true, + isASP: true + }); +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("vbscript", function(conf, parserConf) { + var ERRORCLASS = 'error'; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]"); + var doubleOperators = new RegExp("^((<>)|(<=)|(>=))"); + var singleDelimiters = new RegExp('^[\\.,]'); + var brakets = new RegExp('^[\\(\\)]'); + var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*"); + + var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for']; + var middleKeywords = ['else','elseif','case']; + var endKeywords = ['next','loop','wend']; + + var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']); + var commonkeywords = ['dim', 'redim', 'then', 'until', 'randomize', + 'byval','byref','new','property', 'exit', 'in', + 'const','private', 'public', + 'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me']; + + //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx + var atomWords = ['true', 'false', 'nothing', 'empty', 'null']; + //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx + var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart', + 'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject', + 'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left', + 'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round', + 'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp', + 'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year']; + + //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx + var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare', + 'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek', + 'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError', + 'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2', + 'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo', + 'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse', + 'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray']; + //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx + var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp']; + var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count']; + var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit']; + + var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application']; + var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response + 'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request + 'contents', 'staticobjects', //application + 'codepage', 'lcid', 'sessionid', 'timeout', //session + 'scripttimeout']; //server + var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response + 'binaryread', //request + 'remove', 'removeall', 'lock', 'unlock', //application + 'abandon', //session + 'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server + + var knownWords = knownMethods.concat(knownProperties); + + builtinObjsWords = builtinObjsWords.concat(builtinConsts); + + if (conf.isASP){ + builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords); + knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties); + }; + + var keywords = wordRegexp(commonkeywords); + var atoms = wordRegexp(atomWords); + var builtinFuncs = wordRegexp(builtinFuncsWords); + var builtinObjs = wordRegexp(builtinObjsWords); + var known = wordRegexp(knownWords); + var stringPrefixes = '"'; + + var opening = wordRegexp(openingKeywords); + var middle = wordRegexp(middleKeywords); + var closing = wordRegexp(endKeywords); + var doubleClosing = wordRegexp(['end']); + var doOpening = wordRegexp(['do']); + var noIndentWords = wordRegexp(['on error resume next', 'exit']); + var comment = wordRegexp(['rem']); + + + function indent(_stream, state) { + state.currentIndent++; + } + + function dedent(_stream, state) { + state.currentIndent--; + } + // tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return 'space'; + //return null; + } + + var ch = stream.peek(); + + // Handle Comments + if (ch === "'") { + stream.skipToEnd(); + return 'comment'; + } + if (stream.match(comment)){ + stream.skipToEnd(); + return 'comment'; + } + + + // Handle Number Literals + if (stream.match(/^((&H)|(&O))?[0-9\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+/i)) { floatLiteral = true; } + else if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } + else if (stream.match(/^\.\d+/)) { floatLiteral = true; } + + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return 'number'; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } + // Octal + else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } + // Decimal + else if (stream.match(/^[1-9]\d*F?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return 'number'; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) { + return 'operator'; + } + if (stream.match(singleDelimiters)) { + return null; + } + + if (stream.match(brakets)) { + return "bracket"; + } + + if (stream.match(noIndentWords)) { + state.doInCurrentLine = true; + + return 'keyword'; + } + + if (stream.match(doOpening)) { + indent(stream,state); + state.doInCurrentLine = true; + + return 'keyword'; + } + if (stream.match(opening)) { + if (! state.doInCurrentLine) + indent(stream,state); + else + state.doInCurrentLine = false; + + return 'keyword'; + } + if (stream.match(middle)) { + return 'keyword'; + } + + + if (stream.match(doubleClosing)) { + dedent(stream,state); + dedent(stream,state); + + return 'keyword'; + } + if (stream.match(closing)) { + if (! state.doInCurrentLine) + dedent(stream,state); + else + state.doInCurrentLine = false; + + return 'keyword'; + } + + if (stream.match(keywords)) { + return 'keyword'; + } + + if (stream.match(atoms)) { + return 'atom'; + } + + if (stream.match(known)) { + return 'variable-2'; + } + + if (stream.match(builtinFuncs)) { + return 'builtin'; + } + + if (stream.match(builtinObjs)){ + return 'variable-2'; + } + + if (stream.match(identifiers)) { + return 'variable'; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + var singleline = delimiter.length == 1; + var OUTCLASS = 'string'; + + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"]/); + if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + return ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return OUTCLASS; + }; + } + + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current === '.') { + style = state.tokenize(stream, state); + + current = stream.current(); + if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) { + if (style === 'builtin' || style === 'keyword') style='variable'; + if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2'; + + return style; + } else { + return ERRORCLASS; + } + } + + return style; + } + + var external = { + electricChars:"dDpPtTfFeE ", + startState: function() { + return { + tokenize: tokenBase, + lastToken: null, + currentIndent: 0, + nextLineIndent: 0, + doInCurrentLine: false, + ignoreKeyword: false + + + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.currentIndent += state.nextLineIndent; + state.nextLineIndent = 0; + state.doInCurrentLine = 0; + } + var style = tokenLexer(stream, state); + + state.lastToken = {style:style, content: stream.current()}; + + if (style==='space') style=null; + + return style; + }, + + indent: function(state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; + if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); + if(state.currentIndent < 0) return 0; + return state.currentIndent * conf.indentUnit; + } + + }; + return external; +}); + +CodeMirror.defineMIME("text/vbscript", "vbscript"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/index.html new file mode 100644 index 0000000..2747878 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/index.html @@ -0,0 +1,118 @@ + + +CodeMirror: Velocity mode + + + + + + + + + + +
    +

    Velocity mode

    +
    + + +

    MIME types defined: text/velocity.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/velocity.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/velocity.js new file mode 100644 index 0000000..8fc4f95 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/velocity/velocity.js @@ -0,0 +1,201 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("velocity", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = parseWords("#end #else #break #stop #[[ #]] " + + "#{end} #{else} #{break} #{stop}"); + var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " + + "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"); + var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"); + var isOperatorChar = /[+\-*&%=<>!?:\/|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + // start of unparsed string? + if ((ch == "'") && state.inParams) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenString(ch)); + } + // start of parsed string? + else if ((ch == '"')) { + state.lastTokenWasBuiltin = false; + if (state.inString) { + state.inString = false; + return "string"; + } + else if (state.inParams) + return chain(stream, state, tokenString(ch)); + } + // is it one of the special signs []{}().,;? Seperator? + else if (/[\[\]{}\(\),;\.]/.test(ch)) { + if (ch == "(" && beforeParams) + state.inParams = true; + else if (ch == ")") { + state.inParams = false; + state.lastTokenWasBuiltin = true; + } + return null; + } + // start of a number value? + else if (/\d/.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(/[\w\.]/); + return "number"; + } + // multi line comment? + else if (ch == "#" && stream.eat("*")) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenComment); + } + // unparsed content? + else if (ch == "#" && stream.match(/ *\[ *\[/)) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenUnparsed); + } + // single line comment? + else if (ch == "#" && stream.eat("#")) { + state.lastTokenWasBuiltin = false; + stream.skipToEnd(); + return "comment"; + } + // variable? + else if (ch == "$") { + stream.eatWhile(/[\w\d\$_\.{}]/); + // is it one of the specials? + if (specials && specials.propertyIsEnumerable(stream.current())) { + return "keyword"; + } + else { + state.lastTokenWasBuiltin = true; + state.beforeParams = true; + return "builtin"; + } + } + // is it a operator? + else if (isOperatorChar.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + // get the whole word + stream.eatWhile(/[\w\$_{}@]/); + var word = stream.current(); + // is it one of the listed keywords? + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + // is it one of the listed functions? + if (functions && functions.propertyIsEnumerable(word) || + (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") && + !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) { + state.beforeParams = true; + state.lastTokenWasBuiltin = false; + return "keyword"; + } + if (state.inString) { + state.lastTokenWasBuiltin = false; + return "string"; + } + if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin) + return "builtin"; + // default: just a "word" + state.lastTokenWasBuiltin = false; + return null; + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if ((next == quote) && !escaped) { + end = true; + break; + } + if (quote=='"' && stream.peek() == '$' && !escaped) { + state.inString = true; + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == "]") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + // Interface + + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false, + inString: false, + lastTokenWasBuiltin: false + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + blockCommentStart: "#*", + blockCommentEnd: "*#", + lineComment: "##", + fold: "velocity" + }; +}); + +CodeMirror.defineMIME("text/velocity", "velocity"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/index.html new file mode 100644 index 0000000..96b3d64 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/index.html @@ -0,0 +1,120 @@ + + +CodeMirror: Verilog/SystemVerilog mode + + + + + + + + + + +
    +

    SystemVerilog mode

    + +
    + + + +

    +Syntax highlighting and indentation for the Verilog and SystemVerilog languages (IEEE 1800). +

    Configuration options:

    +
      +
    • noIndentKeywords - List of keywords which should not cause identation to increase. E.g. ["package", "module"]. Default: None
    • +
    +

    + +

    MIME types defined: text/x-verilog and text/x-systemverilog.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/test.js new file mode 100644 index 0000000..9c8c094 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/test.js @@ -0,0 +1,273 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 4}, "verilog"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT("binary_literals", + "[number 1'b0]", + "[number 1'b1]", + "[number 1'bx]", + "[number 1'bz]", + "[number 1'bX]", + "[number 1'bZ]", + "[number 1'B0]", + "[number 1'B1]", + "[number 1'Bx]", + "[number 1'Bz]", + "[number 1'BX]", + "[number 1'BZ]", + "[number 1'b0]", + "[number 1'b1]", + "[number 2'b01]", + "[number 2'bxz]", + "[number 2'b11]", + "[number 2'b10]", + "[number 2'b1Z]", + "[number 12'b0101_0101_0101]", + "[number 1'b 0]", + "[number 'b0101]" + ); + + MT("octal_literals", + "[number 3'o7]", + "[number 3'O7]", + "[number 3'so7]", + "[number 3'SO7]" + ); + + MT("decimal_literals", + "[number 0]", + "[number 1]", + "[number 7]", + "[number 123_456]", + "[number 'd33]", + "[number 8'd255]", + "[number 8'D255]", + "[number 8'sd255]", + "[number 8'SD255]", + "[number 32'd123]", + "[number 32 'd123]", + "[number 32 'd 123]" + ); + + MT("hex_literals", + "[number 4'h0]", + "[number 4'ha]", + "[number 4'hF]", + "[number 4'hx]", + "[number 4'hz]", + "[number 4'hX]", + "[number 4'hZ]", + "[number 32'hdc78]", + "[number 32'hDC78]", + "[number 32 'hDC78]", + "[number 32'h DC78]", + "[number 32 'h DC78]", + "[number 32'h44x7]", + "[number 32'hFFF?]" + ); + + MT("real_number_literals", + "[number 1.2]", + "[number 0.1]", + "[number 2394.26331]", + "[number 1.2E12]", + "[number 1.2e12]", + "[number 1.30e-2]", + "[number 0.1e-0]", + "[number 23E10]", + "[number 29E-2]", + "[number 236.123_763_e-12]" + ); + + MT("operators", + "[meta ^]" + ); + + MT("keywords", + "[keyword logic]", + "[keyword logic] [variable foo]", + "[keyword reg] [variable abc]" + ); + + MT("variables", + "[variable _leading_underscore]", + "[variable _if]", + "[number 12] [variable foo]", + "[variable foo] [number 14]" + ); + + MT("tick_defines", + "[def `FOO]", + "[def `foo]", + "[def `FOO_bar]" + ); + + MT("system_calls", + "[meta $display]", + "[meta $vpi_printf]" + ); + + MT("line_comment", "[comment // Hello world]"); + + // Alignment tests + MT("align_port_map_style1", + /** + * mod mod(.a(a), + * .b(b) + * ); + */ + "[variable mod] [variable mod][bracket (].[variable a][bracket (][variable a][bracket )],", + " .[variable b][bracket (][variable b][bracket )]", + " [bracket )];", + "" + ); + + MT("align_port_map_style2", + /** + * mod mod( + * .a(a), + * .b(b) + * ); + */ + "[variable mod] [variable mod][bracket (]", + " .[variable a][bracket (][variable a][bracket )],", + " .[variable b][bracket (][variable b][bracket )]", + "[bracket )];", + "" + ); + + // Indentation tests + MT("indent_single_statement_if", + "[keyword if] [bracket (][variable foo][bracket )]", + " [keyword break];", + "" + ); + + MT("no_indent_after_single_line_if", + "[keyword if] [bracket (][variable foo][bracket )] [keyword break];", + "" + ); + + MT("indent_after_if_begin_same_line", + "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", + " [keyword break];", + " [keyword break];", + "[keyword end]", + "" + ); + + MT("indent_after_if_begin_next_line", + "[keyword if] [bracket (][variable foo][bracket )]", + " [keyword begin]", + " [keyword break];", + " [keyword break];", + " [keyword end]", + "" + ); + + MT("indent_single_statement_if_else", + "[keyword if] [bracket (][variable foo][bracket )]", + " [keyword break];", + "[keyword else]", + " [keyword break];", + "" + ); + + MT("indent_if_else_begin_same_line", + "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", + " [keyword break];", + " [keyword break];", + "[keyword end] [keyword else] [keyword begin]", + " [keyword break];", + " [keyword break];", + "[keyword end]", + "" + ); + + MT("indent_if_else_begin_next_line", + "[keyword if] [bracket (][variable foo][bracket )]", + " [keyword begin]", + " [keyword break];", + " [keyword break];", + " [keyword end]", + "[keyword else]", + " [keyword begin]", + " [keyword break];", + " [keyword break];", + " [keyword end]", + "" + ); + + MT("indent_if_nested_without_begin", + "[keyword if] [bracket (][variable foo][bracket )]", + " [keyword if] [bracket (][variable foo][bracket )]", + " [keyword if] [bracket (][variable foo][bracket )]", + " [keyword break];", + "" + ); + + MT("indent_case", + "[keyword case] [bracket (][variable state][bracket )]", + " [variable FOO]:", + " [keyword break];", + " [variable BAR]:", + " [keyword break];", + "[keyword endcase]", + "" + ); + + MT("unindent_after_end_with_preceding_text", + "[keyword begin]", + " [keyword break]; [keyword end]", + "" + ); + + MT("export_function_one_line_does_not_indent", + "[keyword export] [string \"DPI-C\"] [keyword function] [variable helloFromSV];", + "" + ); + + MT("export_task_one_line_does_not_indent", + "[keyword export] [string \"DPI-C\"] [keyword task] [variable helloFromSV];", + "" + ); + + MT("export_function_two_lines_indents_properly", + "[keyword export]", + " [string \"DPI-C\"] [keyword function] [variable helloFromSV];", + "" + ); + + MT("export_task_two_lines_indents_properly", + "[keyword export]", + " [string \"DPI-C\"] [keyword task] [variable helloFromSV];", + "" + ); + + MT("import_function_one_line_does_not_indent", + "[keyword import] [string \"DPI-C\"] [keyword function] [variable helloFromC];", + "" + ); + + MT("import_task_one_line_does_not_indent", + "[keyword import] [string \"DPI-C\"] [keyword task] [variable helloFromC];", + "" + ); + + MT("import_package_single_line_does_not_indent", + "[keyword import] [variable p]::[variable x];", + "[keyword import] [variable p]::[variable y];", + "" + ); + + MT("covergoup_with_function_indents_properly", + "[keyword covergroup] [variable cg] [keyword with] [keyword function] [variable sample][bracket (][keyword bit] [variable b][bracket )];", + " [variable c] : [keyword coverpoint] [variable c];", + "[keyword endgroup]: [variable cg]", + "" + ); + +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/verilog.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/verilog.js new file mode 100644 index 0000000..96b9f24 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/verilog/verilog.js @@ -0,0 +1,537 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("verilog", function(config, parserConfig) { + + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + dontAlignCalls = parserConfig.dontAlignCalls, + noIndentKeywords = parserConfig.noIndentKeywords || [], + multiLineStrings = parserConfig.multiLineStrings, + hooks = parserConfig.hooks || {}; + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + /** + * Keywords from IEEE 1800-2012 + */ + var keywords = words( + "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " + + "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " + + "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " + + "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " + + "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " + + "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " + + "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " + + "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " + + "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " + + "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " + + "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " + + "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " + + "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " + + "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " + + "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " + + "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " + + "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " + + "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor"); + + /** Operators from IEEE 1800-2012 + unary_operator ::= + + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ + binary_operator ::= + + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | ** + | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<< + | -> | <-> + inc_or_dec_operator ::= ++ | -- + unary_module_path_operator ::= + ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ + binary_module_path_operator ::= + == | != | && | || | & | | | ^ | ^~ | ~^ + */ + var isOperatorChar = /[\+\-\*\/!~&|^%=?:]/; + var isBracketChar = /[\[\]{}()]/; + + var unsignedNumber = /\d[0-9_]*/; + var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i; + var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i; + var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i; + var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i; + var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i; + + var closingBracketOrWord = /^((\w+)|[)}\]])/; + var closingBracket = /[)}\]]/; + + var curPunc; + var curKeyword; + + // Block openings which are closed by a matching keyword in the form of ("end" + keyword) + // E.g. "task" => "endtask" + var blockKeywords = words( + "case checker class clocking config function generate interface module package" + + "primitive program property specify sequence table task" + ); + + // Opening/closing pairs + var openClose = {}; + for (var keyword in blockKeywords) { + openClose[keyword] = "end" + keyword; + } + openClose["begin"] = "end"; + openClose["casex"] = "endcase"; + openClose["casez"] = "endcase"; + openClose["do" ] = "while"; + openClose["fork" ] = "join;join_any;join_none"; + openClose["covergroup"] = "endgroup"; + + for (var i in noIndentKeywords) { + var keyword = noIndentKeywords[i]; + if (openClose[keyword]) { + openClose[keyword] = undefined; + } + } + + // Keywords which open statements that are ended with a semi-colon + var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while"); + + function tokenBase(stream, state) { + var ch = stream.peek(), style; + if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style; + if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false) + return style; + + if (/[,;:\.]/.test(ch)) { + curPunc = stream.next(); + return null; + } + if (isBracketChar.test(ch)) { + curPunc = stream.next(); + return "bracket"; + } + // Macros (tick-defines) + if (ch == '`') { + stream.next(); + if (stream.eatWhile(/[\w\$_]/)) { + return "def"; + } else { + return null; + } + } + // System calls + if (ch == '$') { + stream.next(); + if (stream.eatWhile(/[\w\$_]/)) { + return "meta"; + } else { + return null; + } + } + // Time literals + if (ch == '#') { + stream.next(); + stream.eatWhile(/[\d_.]/); + return "def"; + } + // Strings + if (ch == '"') { + stream.next(); + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + // Comments + if (ch == "/") { + stream.next(); + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + stream.backUp(1); + } + + // Numeric literals + if (stream.match(realLiteral) || + stream.match(decimalLiteral) || + stream.match(binaryLiteral) || + stream.match(octLiteral) || + stream.match(hexLiteral) || + stream.match(unsignedNumber) || + stream.match(realLiteral)) { + return "number"; + } + + // Operators + if (stream.eatWhile(isOperatorChar)) { + return "meta"; + } + + // Keywords / plain variables + if (stream.eatWhile(/[\w\$_]/)) { + var cur = stream.current(); + if (keywords[cur]) { + if (openClose[cur]) { + curPunc = "newblock"; + } + if (statementKeywords[cur]) { + curPunc = "newstatement"; + } + curKeyword = cur; + return "keyword"; + } + return "variable"; + } + + stream.next(); + return null; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + var indent = state.indented; + var c = new Context(indent, col, type, null, state.context); + return state.context = c; + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") { + state.indented = state.context.indented; + } + return state.context = state.context.prev; + } + + function isClosing(text, contextClosing) { + if (text == contextClosing) { + return true; + } else { + // contextClosing may be mulitple keywords separated by ; + var closingKeywords = contextClosing.split(";"); + for (var i in closingKeywords) { + if (text == closingKeywords[i]) { + return true; + } + } + return false; + } + } + + function buildElectricInputRegEx() { + // Reindentation should occur on any bracket char: {}()[] + // or on a match of any of the block closing keywords, at + // the end of a line + var allClosings = []; + for (var i in openClose) { + if (openClose[i]) { + var closings = openClose[i].split(";"); + for (var j in closings) { + allClosings.push(closings[j]); + } + } + } + var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$"); + return re; + } + + // Interface + return { + + // Regex to force current line to reindent + electricInput: buildElectricInputRegEx(), + + startState: function(basecolumn) { + var state = { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + if (hooks.startState) hooks.startState(state); + return state; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (hooks.token) hooks.token(stream, state); + if (stream.eatSpace()) return null; + curPunc = null; + curKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta" || style == "variable") return style; + if (ctx.align == null) ctx.align = true; + + if (curPunc == ctx.type) { + popContext(state); + } else if ((curPunc == ";" && ctx.type == "statement") || + (ctx.type && isClosing(curKeyword, ctx.type))) { + ctx = popContext(state); + while (ctx && ctx.type == "statement") ctx = popContext(state); + } else if (curPunc == "{") { + pushContext(state, stream.column(), "}"); + } else if (curPunc == "[") { + pushContext(state, stream.column(), "]"); + } else if (curPunc == "(") { + pushContext(state, stream.column(), ")"); + } else if (ctx && ctx.type == "endcase" && curPunc == ":") { + pushContext(state, stream.column(), "statement"); + } else if (curPunc == "newstatement") { + pushContext(state, stream.column(), "statement"); + } else if (curPunc == "newblock") { + if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) { + // The 'function' keyword can appear in some other contexts where it actually does not + // indicate a function (import/export DPI and covergroup definitions). + // Do nothing in this case + } else if (curKeyword == "task" && ctx && ctx.type == "statement") { + // Same thing for task + } else { + var close = openClose[curKeyword]; + pushContext(state, stream.column(), close); + } + } + + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; + if (hooks.indent) { + var fromHook = hooks.indent(state); + if (fromHook >= 0) return fromHook; + } + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + var closing = false; + var possibleClosing = textAfter.match(closingBracketOrWord); + if (possibleClosing) + closing = isClosing(possibleClosing[0], ctx.type); + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + else if (closingBracket.test(ctx.type) && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1); + else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + + CodeMirror.defineMIME("text/x-verilog", { + name: "verilog" + }); + + CodeMirror.defineMIME("text/x-systemverilog", { + name: "verilog" + }); + + // SVXVerilog mode + + var svxchScopePrefixes = { + ">": "property", "->": "property", "-": "hr", "|": "link", "?$": "qualifier", "?*": "qualifier", + "@-": "variable-3", "@": "variable-3", "?": "qualifier" + }; + + function svxGenIndent(stream, state) { + var svxindentUnit = 2; + var rtnIndent = -1, indentUnitRq = 0, curIndent = stream.indentation(); + switch (state.svxCurCtlFlowChar) { + case "\\": + curIndent = 0; + break; + case "|": + if (state.svxPrevPrevCtlFlowChar == "@") { + indentUnitRq = -2; //-2 new pipe rq after cur pipe + break; + } + if (svxchScopePrefixes[state.svxPrevCtlFlowChar]) + indentUnitRq = 1; // +1 new scope + break; + case "M": // m4 + if (state.svxPrevPrevCtlFlowChar == "@") { + indentUnitRq = -2; //-2 new inst rq after pipe + break; + } + if (svxchScopePrefixes[state.svxPrevCtlFlowChar]) + indentUnitRq = 1; // +1 new scope + break; + case "@": + if (state.svxPrevCtlFlowChar == "S") + indentUnitRq = -1; // new pipe stage after stmts + if (state.svxPrevCtlFlowChar == "|") + indentUnitRq = 1; // 1st pipe stage + break; + case "S": + if (state.svxPrevCtlFlowChar == "@") + indentUnitRq = 1; // flow in pipe stage + if (svxchScopePrefixes[state.svxPrevCtlFlowChar]) + indentUnitRq = 1; // +1 new scope + break; + } + var statementIndentUnit = svxindentUnit; + rtnIndent = curIndent + (indentUnitRq*statementIndentUnit); + return rtnIndent >= 0 ? rtnIndent : curIndent; + } + + CodeMirror.defineMIME("text/x-svx", { + name: "verilog", + hooks: { + "\\": function(stream, state) { + var vxIndent = 0, style = false; + var curPunc = stream.string; + if ((stream.sol()) && (/\\SV/.test(stream.string))) { + curPunc = (/\\SVX_version/.test(stream.string)) + ? "\\SVX_version" : stream.string; + stream.skipToEnd(); + if (curPunc == "\\SV" && state.vxCodeActive) {state.vxCodeActive = false;}; + if ((/\\SVX/.test(curPunc) && !state.vxCodeActive) + || (curPunc=="\\SVX_version" && state.vxCodeActive)) {state.vxCodeActive = true;}; + style = "keyword"; + state.svxCurCtlFlowChar = state.svxPrevPrevCtlFlowChar + = state.svxPrevCtlFlowChar = ""; + if (state.vxCodeActive == true) { + state.svxCurCtlFlowChar = "\\"; + vxIndent = svxGenIndent(stream, state); + } + state.vxIndentRq = vxIndent; + } + return style; + }, + tokenBase: function(stream, state) { + var vxIndent = 0, style = false; + var svxisOperatorChar = /[\[\]=:]/; + var svxkpScopePrefixs = { + "**":"variable-2", "*":"variable-2", "$$":"variable", "$":"variable", + "^^":"attribute", "^":"attribute"}; + var ch = stream.peek(); + var vxCurCtlFlowCharValueAtStart = state.svxCurCtlFlowChar; + if (state.vxCodeActive == true) { + if (/[\[\]{}\(\);\:]/.test(ch)) { + // bypass nesting and 1 char punc + style = "meta"; + stream.next(); + } else if (ch == "/") { + stream.next(); + if (stream.eat("/")) { + stream.skipToEnd(); + style = "comment"; + state.svxCurCtlFlowChar = "S"; + } else { + stream.backUp(1); + } + } else if (ch == "@") { + // pipeline stage + style = svxchScopePrefixes[ch]; + state.svxCurCtlFlowChar = "@"; + stream.next(); + stream.eatWhile(/[\w\$_]/); + } else if (stream.match(/\b[mM]4+/, true)) { // match: function(pattern, consume, caseInsensitive) + // m4 pre proc + stream.skipTo("("); + style = "def"; + state.svxCurCtlFlowChar = "M"; + } else if (ch == "!" && stream.sol()) { + // v stmt in svx region + // state.svxCurCtlFlowChar = "S"; + style = "comment"; + stream.next(); + } else if (svxisOperatorChar.test(ch)) { + // operators + stream.eatWhile(svxisOperatorChar); + style = "operator"; + } else if (ch == "#") { + // phy hier + state.svxCurCtlFlowChar = (state.svxCurCtlFlowChar == "") + ? ch : state.svxCurCtlFlowChar; + stream.next(); + stream.eatWhile(/[+-]\d/); + style = "tag"; + } else if (svxkpScopePrefixs.propertyIsEnumerable(ch)) { + // special SVX operators + style = svxkpScopePrefixs[ch]; + state.svxCurCtlFlowChar = state.svxCurCtlFlowChar == "" ? "S" : state.svxCurCtlFlowChar; // stmt + stream.next(); + stream.match(/[a-zA-Z_0-9]+/); + } else if (style = svxchScopePrefixes[ch] || false) { + // special SVX operators + state.svxCurCtlFlowChar = state.svxCurCtlFlowChar == "" ? ch : state.svxCurCtlFlowChar; + stream.next(); + stream.match(/[a-zA-Z_0-9]+/); + } + if (state.svxCurCtlFlowChar != vxCurCtlFlowCharValueAtStart) { // flow change + vxIndent = svxGenIndent(stream, state); + state.vxIndentRq = vxIndent; + } + } + return style; + }, + token: function(stream, state) { + if (state.vxCodeActive == true && stream.sol() && state.svxCurCtlFlowChar != "") { + state.svxPrevPrevCtlFlowChar = state.svxPrevCtlFlowChar; + state.svxPrevCtlFlowChar = state.svxCurCtlFlowChar; + state.svxCurCtlFlowChar = ""; + } + }, + indent: function(state) { + return (state.vxCodeActive == true) ? state.vxIndentRq : -1; + }, + startState: function(state) { + state.svxCurCtlFlowChar = ""; + state.svxPrevCtlFlowChar = ""; + state.svxPrevPrevCtlFlowChar = ""; + state.vxCodeActive = true; + state.vxIndentRq = 0; + } + } + }); +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/index.html new file mode 100644 index 0000000..7149f06 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/index.html @@ -0,0 +1,57 @@ + + +CodeMirror: XML mode + + + + + + + + + +
    +

    XML mode

    +
    + +

    The XML mode supports two configuration parameters:

    +
    +
    htmlMode (boolean)
    +
    This switches the mode to parse HTML instead of XML. This + means attributes do not have to be quoted, and some elements + (such as br) do not require a closing tag.
    +
    alignCDATA (boolean)
    +
    Setting this to true will force the opening tag of CDATA + blocks to not be indented.
    +
    + +

    MIME types defined: application/xml, text/html.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/test.js new file mode 100644 index 0000000..f48156b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/test.js @@ -0,0 +1,51 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "xml"), mname = "xml"; + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), mname); } + + MT("matching", + "[tag&bracket <][tag top][tag&bracket >]", + " text", + " [tag&bracket <][tag inner][tag&bracket />]", + "[tag&bracket ]"); + + MT("nonmatching", + "[tag&bracket <][tag top][tag&bracket >]", + " [tag&bracket <][tag inner][tag&bracket />]", + " [tag&bracket ]"); + + MT("doctype", + "[meta ]", + "[tag&bracket <][tag top][tag&bracket />]"); + + MT("cdata", + "[tag&bracket <][tag top][tag&bracket >]", + " [atom ]", + "[tag&bracket ]"); + + // HTML tests + mode = CodeMirror.getMode({indentUnit: 2}, "text/html"); + + MT("selfclose", + "[tag&bracket <][tag html][tag&bracket >]", + " [tag&bracket <][tag link] [attribute rel]=[string stylesheet] [attribute href]=[string \"/foobar\"][tag&bracket >]", + "[tag&bracket ]"); + + MT("list", + "[tag&bracket <][tag ol][tag&bracket >]", + " [tag&bracket <][tag li][tag&bracket >]one", + " [tag&bracket <][tag li][tag&bracket >]two", + "[tag&bracket ]"); + + MT("valueless", + "[tag&bracket <][tag input] [attribute type]=[string checkbox] [attribute checked][tag&bracket />]"); + + MT("pThenArticle", + "[tag&bracket <][tag p][tag&bracket >]", + " foo", + "[tag&bracket <][tag article][tag&bracket >]bar"); + +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/xml.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/xml.js new file mode 100644 index 0000000..2f3b8f8 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xml/xml.js @@ -0,0 +1,384 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("xml", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var multilineTagIndentFactor = parserConfig.multilineTagIndentFactor || 1; + var multilineTagIndentPastTag = parserConfig.multilineTagIndentPastTag; + if (multilineTagIndentPastTag == null) multilineTagIndentPastTag = true; + + var Kludges = parserConfig.htmlMode ? { + autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, + 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, + 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, + 'track': true, 'wbr': true, 'menuitem': true}, + implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, + 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, + 'th': true, 'tr': true}, + contextGrabbers: { + 'dd': {'dd': true, 'dt': true}, + 'dt': {'dd': true, 'dt': true}, + 'li': {'li': true}, + 'option': {'option': true, 'optgroup': true}, + 'optgroup': {'optgroup': true}, + 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, + 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, + 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, + 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, + 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, + 'rp': {'rp': true, 'rt': true}, + 'rt': {'rp': true, 'rt': true}, + 'tbody': {'tbody': true, 'tfoot': true}, + 'td': {'td': true, 'th': true}, + 'tfoot': {'tbody': true}, + 'th': {'td': true, 'th': true}, + 'thead': {'tbody': true, 'tfoot': true}, + 'tr': {'tr': true} + }, + doNotIndent: {"pre": true}, + allowUnquoted: true, + allowMissing: true, + caseFold: true + } : { + autoSelfClosers: {}, + implicitlyClosed: {}, + contextGrabbers: {}, + doNotIndent: {}, + allowUnquoted: false, + allowMissing: false, + caseFold: false + }; + var alignCDATA = parserConfig.alignCDATA; + + // Return variables for tokenizers + var type, setStyle; + + function inText(stream, state) { + function chain(parser) { + state.tokenize = parser; + return parser(stream, state); + } + + var ch = stream.next(); + if (ch == "<") { + if (stream.eat("!")) { + if (stream.eat("[")) { + if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); + else return null; + } else if (stream.match("--")) { + return chain(inBlock("comment", "-->")); + } else if (stream.match("DOCTYPE", true, true)) { + stream.eatWhile(/[\w\._\-]/); + return chain(doctype(1)); + } else { + return null; + } + } else if (stream.eat("?")) { + stream.eatWhile(/[\w\._\-]/); + state.tokenize = inBlock("meta", "?>"); + return "meta"; + } else { + type = stream.eat("/") ? "closeTag" : "openTag"; + state.tokenize = inTag; + return "tag bracket"; + } + } else if (ch == "&") { + var ok; + if (stream.eat("#")) { + if (stream.eat("x")) { + ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); + } else { + ok = stream.eatWhile(/[\d]/) && stream.eat(";"); + } + } else { + ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); + } + return ok ? "atom" : "error"; + } else { + stream.eatWhile(/[^&<]/); + return null; + } + } + + function inTag(stream, state) { + var ch = stream.next(); + if (ch == ">" || (ch == "/" && stream.eat(">"))) { + state.tokenize = inText; + type = ch == ">" ? "endTag" : "selfcloseTag"; + return "tag bracket"; + } else if (ch == "=") { + type = "equals"; + return null; + } else if (ch == "<") { + state.tokenize = inText; + state.state = baseState; + state.tagName = state.tagStart = null; + var next = state.tokenize(stream, state); + return next ? next + " tag error" : "tag error"; + } else if (/[\'\"]/.test(ch)) { + state.tokenize = inAttribute(ch); + state.stringStartCol = stream.column(); + return state.tokenize(stream, state); + } else { + stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); + return "word"; + } + } + + function inAttribute(quote) { + var closure = function(stream, state) { + while (!stream.eol()) { + if (stream.next() == quote) { + state.tokenize = inTag; + break; + } + } + return "string"; + }; + closure.isInAttribute = true; + return closure; + } + + function inBlock(style, terminator) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = inText; + break; + } + stream.next(); + } + return style; + }; + } + function doctype(depth) { + return function(stream, state) { + var ch; + while ((ch = stream.next()) != null) { + if (ch == "<") { + state.tokenize = doctype(depth + 1); + return state.tokenize(stream, state); + } else if (ch == ">") { + if (depth == 1) { + state.tokenize = inText; + break; + } else { + state.tokenize = doctype(depth - 1); + return state.tokenize(stream, state); + } + } + } + return "meta"; + }; + } + + function Context(state, tagName, startOfLine) { + this.prev = state.context; + this.tagName = tagName; + this.indent = state.indented; + this.startOfLine = startOfLine; + if (Kludges.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent)) + this.noIndent = true; + } + function popContext(state) { + if (state.context) state.context = state.context.prev; + } + function maybePopContext(state, nextTagName) { + var parentTagName; + while (true) { + if (!state.context) { + return; + } + parentTagName = state.context.tagName; + if (!Kludges.contextGrabbers.hasOwnProperty(parentTagName) || + !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) { + return; + } + popContext(state); + } + } + + function baseState(type, stream, state) { + if (type == "openTag") { + state.tagStart = stream.column(); + return tagNameState; + } else if (type == "closeTag") { + return closeTagNameState; + } else { + return baseState; + } + } + function tagNameState(type, stream, state) { + if (type == "word") { + state.tagName = stream.current(); + setStyle = "tag"; + return attrState; + } else { + setStyle = "error"; + return tagNameState; + } + } + function closeTagNameState(type, stream, state) { + if (type == "word") { + var tagName = stream.current(); + if (state.context && state.context.tagName != tagName && + Kludges.implicitlyClosed.hasOwnProperty(state.context.tagName)) + popContext(state); + if (state.context && state.context.tagName == tagName) { + setStyle = "tag"; + return closeState; + } else { + setStyle = "tag error"; + return closeStateErr; + } + } else { + setStyle = "error"; + return closeStateErr; + } + } + + function closeState(type, _stream, state) { + if (type != "endTag") { + setStyle = "error"; + return closeState; + } + popContext(state); + return baseState; + } + function closeStateErr(type, stream, state) { + setStyle = "error"; + return closeState(type, stream, state); + } + + function attrState(type, _stream, state) { + if (type == "word") { + setStyle = "attribute"; + return attrEqState; + } else if (type == "endTag" || type == "selfcloseTag") { + var tagName = state.tagName, tagStart = state.tagStart; + state.tagName = state.tagStart = null; + if (type == "selfcloseTag" || + Kludges.autoSelfClosers.hasOwnProperty(tagName)) { + maybePopContext(state, tagName); + } else { + maybePopContext(state, tagName); + state.context = new Context(state, tagName, tagStart == state.indented); + } + return baseState; + } + setStyle = "error"; + return attrState; + } + function attrEqState(type, stream, state) { + if (type == "equals") return attrValueState; + if (!Kludges.allowMissing) setStyle = "error"; + return attrState(type, stream, state); + } + function attrValueState(type, stream, state) { + if (type == "string") return attrContinuedState; + if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return attrState;} + setStyle = "error"; + return attrState(type, stream, state); + } + function attrContinuedState(type, stream, state) { + if (type == "string") return attrContinuedState; + return attrState(type, stream, state); + } + + return { + startState: function() { + return {tokenize: inText, + state: baseState, + indented: 0, + tagName: null, tagStart: null, + context: null}; + }, + + token: function(stream, state) { + if (!state.tagName && stream.sol()) + state.indented = stream.indentation(); + + if (stream.eatSpace()) return null; + type = null; + var style = state.tokenize(stream, state); + if ((style || type) && style != "comment") { + setStyle = null; + state.state = state.state(type || style, stream, state); + if (setStyle) + style = setStyle == "error" ? style + " error" : setStyle; + } + return style; + }, + + indent: function(state, textAfter, fullLine) { + var context = state.context; + // Indent multi-line strings (e.g. css). + if (state.tokenize.isInAttribute) { + if (state.tagStart == state.indented) + return state.stringStartCol + 1; + else + return state.indented + indentUnit; + } + if (context && context.noIndent) return CodeMirror.Pass; + if (state.tokenize != inTag && state.tokenize != inText) + return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; + // Indent the starts of attribute names. + if (state.tagName) { + if (multilineTagIndentPastTag) + return state.tagStart + state.tagName.length + 2; + else + return state.tagStart + indentUnit * multilineTagIndentFactor; + } + if (alignCDATA && /$/, + blockCommentStart: "", + + configuration: parserConfig.htmlMode ? "html" : "xml", + helperType: parserConfig.htmlMode ? "html" : "xml" + }; +}); + +CodeMirror.defineMIME("text/xml", "xml"); +CodeMirror.defineMIME("application/xml", "xml"); +if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) + CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true}); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/index.html new file mode 100644 index 0000000..7ac5aae --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/index.html @@ -0,0 +1,210 @@ + + +CodeMirror: XQuery mode + + + + + + + + + + +
    +

    XQuery mode

    + + +
    + +
    + + + +

    MIME types defined: application/xquery.

    + +

    Development of the CodeMirror XQuery mode was sponsored by + MarkLogic and developed by + Mike Brevoort. +

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/test.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/test.js new file mode 100644 index 0000000..1f148cd --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/test.js @@ -0,0 +1,67 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Don't take these too seriously -- the expected results appear to be +// based on the results of actual runs without any serious manual +// verification. If a change you made causes them to fail, the test is +// as likely to wrong as the code. + +(function() { + var mode = CodeMirror.getMode({tabSize: 4}, "xquery"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT("eviltest", + "[keyword xquery] [keyword version] [variable "1][keyword .][atom 0][keyword -][variable ml"][def&variable ;] [comment (: this is : a \"comment\" :)]", + " [keyword let] [variable $let] [keyword :=] [variable <x] [variable attr][keyword =][variable "value">"test"<func>][def&variable ;function]() [variable $var] {[keyword function]()} {[variable $var]}[variable <][keyword /][variable func><][keyword /][variable x>]", + " [keyword let] [variable $joe][keyword :=][atom 1]", + " [keyword return] [keyword element] [variable element] {", + " [keyword attribute] [variable attribute] { [atom 1] },", + " [keyword element] [variable test] { [variable 'a'] }, [keyword attribute] [variable foo] { [variable "bar"] },", + " [def&variable fn:doc]()[[ [variable foo][keyword /][variable @bar] [keyword eq] [variable $let] ]],", + " [keyword //][variable x] } [comment (: a more 'evil' test :)]", + " [comment (: Modified Blakeley example (: with nested comment :) ... :)]", + " [keyword declare] [keyword private] [keyword function] [def&variable local:declare]() {()}[variable ;]", + " [keyword declare] [keyword private] [keyword function] [def&variable local:private]() {()}[variable ;]", + " [keyword declare] [keyword private] [keyword function] [def&variable local:function]() {()}[variable ;]", + " [keyword declare] [keyword private] [keyword function] [def&variable local:local]() {()}[variable ;]", + " [keyword let] [variable $let] [keyword :=] [variable <let>let] [variable $let] [keyword :=] [variable "let"<][keyword /let][variable >]", + " [keyword return] [keyword element] [variable element] {", + " [keyword attribute] [variable attribute] { [keyword try] { [def&variable xdmp:version]() } [keyword catch]([variable $e]) { [def&variable xdmp:log]([variable $e]) } },", + " [keyword attribute] [variable fn:doc] { [variable "bar"] [variable castable] [keyword as] [atom xs:string] },", + " [keyword element] [variable text] { [keyword text] { [variable "text"] } },", + " [def&variable fn:doc]()[[ [qualifier child::][variable eq][keyword /]([variable @bar] [keyword |] [qualifier attribute::][variable attribute]) [keyword eq] [variable $let] ]],", + " [keyword //][variable fn:doc]", + " }"); + + MT("testEmptySequenceKeyword", + "[string \"foo\"] [keyword instance] [keyword of] [keyword empty-sequence]()"); + + MT("testMultiAttr", + "[tag

    ][variable hello] [variable world][tag

    ]"); + + MT("test namespaced variable", + "[keyword declare] [keyword namespace] [variable e] [keyword =] [string \"http://example.com/ANamespace\"][variable ;declare] [keyword variable] [variable $e:exampleComThisVarIsNotRecognized] [keyword as] [keyword element]([keyword *]) [variable external;]"); + + MT("test EQName variable", + "[keyword declare] [keyword variable] [variable $\"http://www.example.com/ns/my\":var] [keyword :=] [atom 12][variable ;]", + "[tag ]{[variable $\"http://www.example.com/ns/my\":var]}[tag ]"); + + MT("test EQName function", + "[keyword declare] [keyword function] [def&variable \"http://www.example.com/ns/my\":fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", + " [variable $a] [keyword +] [atom 2]", + "}[variable ;]", + "[tag ]{[def&variable \"http://www.example.com/ns/my\":fn]([atom 12])}[tag ]"); + + MT("test EQName function with single quotes", + "[keyword declare] [keyword function] [def&variable 'http://www.example.com/ns/my':fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", + " [variable $a] [keyword +] [atom 2]", + "}[variable ;]", + "[tag ]{[def&variable 'http://www.example.com/ns/my':fn]([atom 12])}[tag ]"); + + MT("testProcessingInstructions", + "[def&variable data]([comment&meta ]) [keyword instance] [keyword of] [atom xs:string]"); + + MT("testQuoteEscapeDouble", + "[keyword let] [variable $rootfolder] [keyword :=] [string \"c:\\builds\\winnt\\HEAD\\qa\\scripts\\\"]", + "[keyword let] [variable $keysfolder] [keyword :=] [def&variable concat]([variable $rootfolder], [string \"keys\\\"])"); +})(); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/xquery.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/xquery.js new file mode 100644 index 0000000..c8f3d90 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/xquery/xquery.js @@ -0,0 +1,447 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("xquery", function() { + + // The keywords object is set to the result of this self executing + // function. Each keyword is a property of the keywords object whose + // value is {type: atype, style: astyle} + var keywords = function(){ + // conveinence functions used to build keywords object + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a") + , B = kw("keyword b") + , C = kw("keyword c") + , operator = kw("operator") + , atom = {type: "atom", style: "atom"} + , punctuation = {type: "punctuation", style: null} + , qualifier = {type: "axis_specifier", style: "qualifier"}; + + // kwObj is what is return from this function at the end + var kwObj = { + 'if': A, 'switch': A, 'while': A, 'for': A, + 'else': B, 'then': B, 'try': B, 'finally': B, 'catch': B, + 'element': C, 'attribute': C, 'let': C, 'implements': C, 'import': C, 'module': C, 'namespace': C, + 'return': C, 'super': C, 'this': C, 'throws': C, 'where': C, 'private': C, + ',': punctuation, + 'null': atom, 'fn:false()': atom, 'fn:true()': atom + }; + + // a list of 'basic' keywords. For each add a property to kwObj with the value of + // {type: basic[i], style: "keyword"} e.g. 'after' --> {type: "after", style: "keyword"} + var basic = ['after','ancestor','ancestor-or-self','and','as','ascending','assert','attribute','before', + 'by','case','cast','child','comment','declare','default','define','descendant','descendant-or-self', + 'descending','document','document-node','element','else','eq','every','except','external','following', + 'following-sibling','follows','for','function','if','import','in','instance','intersect','item', + 'let','module','namespace','node','node','of','only','or','order','parent','precedes','preceding', + 'preceding-sibling','processing-instruction','ref','return','returns','satisfies','schema','schema-element', + 'self','some','sortby','stable','text','then','to','treat','typeswitch','union','variable','version','where', + 'xquery', 'empty-sequence']; + for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);}; + + // a list of types. For each add a property to kwObj with the value of + // {type: "atom", style: "atom"} + var types = ['xs:string', 'xs:float', 'xs:decimal', 'xs:double', 'xs:integer', 'xs:boolean', 'xs:date', 'xs:dateTime', + 'xs:time', 'xs:duration', 'xs:dayTimeDuration', 'xs:time', 'xs:yearMonthDuration', 'numeric', 'xs:hexBinary', + 'xs:base64Binary', 'xs:anyURI', 'xs:QName', 'xs:byte','xs:boolean','xs:anyURI','xf:yearMonthDuration']; + for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;}; + + // each operator will add a property to kwObj with value of {type: "operator", style: "keyword"} + var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-']; + for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;}; + + // each axis_specifiers will add a property to kwObj with value of {type: "axis_specifier", style: "qualifier"} + var axis_specifiers = ["self::", "attribute::", "child::", "descendant::", "descendant-or-self::", "parent::", + "ancestor::", "ancestor-or-self::", "following::", "preceding::", "following-sibling::", "preceding-sibling::"]; + for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; }; + + return kwObj; + }(); + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + // the primary mode tokenizer + function tokenBase(stream, state) { + var ch = stream.next(), + mightBeFunction = false, + isEQName = isEQNameAhead(stream); + + // an XML tag (if not in some sub, chained tokenizer) + if (ch == "<") { + if(stream.match("!--", true)) + return chain(stream, state, tokenXMLComment); + + if(stream.match("![CDATA", false)) { + state.tokenize = tokenCDATA; + return ret("tag", "tag"); + } + + if(stream.match("?", false)) { + return chain(stream, state, tokenPreProcessing); + } + + var isclose = stream.eat("/"); + stream.eatSpace(); + var tagName = "", c; + while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; + + return chain(stream, state, tokenTag(tagName, isclose)); + } + // start code block + else if(ch == "{") { + pushStateStack(state,{ type: "codeblock"}); + return ret("", null); + } + // end code block + else if(ch == "}") { + popStateStack(state); + return ret("", null); + } + // if we're in an XML block + else if(isInXmlBlock(state)) { + if(ch == ">") + return ret("tag", "tag"); + else if(ch == "/" && stream.eat(">")) { + popStateStack(state); + return ret("tag", "tag"); + } + else + return ret("word", "variable"); + } + // if a number + else if (/\d/.test(ch)) { + stream.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/); + return ret("number", "atom"); + } + // comment start + else if (ch === "(" && stream.eat(":")) { + pushStateStack(state, { type: "comment"}); + return chain(stream, state, tokenComment); + } + // quoted string + else if ( !isEQName && (ch === '"' || ch === "'")) + return chain(stream, state, tokenString(ch)); + // variable + else if(ch === "$") { + return chain(stream, state, tokenVariable); + } + // assignment + else if(ch ===":" && stream.eat("=")) { + return ret("operator", "keyword"); + } + // open paren + else if(ch === "(") { + pushStateStack(state, { type: "paren"}); + return ret("", null); + } + // close paren + else if(ch === ")") { + popStateStack(state); + return ret("", null); + } + // open paren + else if(ch === "[") { + pushStateStack(state, { type: "bracket"}); + return ret("", null); + } + // close paren + else if(ch === "]") { + popStateStack(state); + return ret("", null); + } + else { + var known = keywords.propertyIsEnumerable(ch) && keywords[ch]; + + // if there's a EQName ahead, consume the rest of the string portion, it's likely a function + if(isEQName && ch === '\"') while(stream.next() !== '"'){} + if(isEQName && ch === '\'') while(stream.next() !== '\''){} + + // gobble up a word if the character is not known + if(!known) stream.eatWhile(/[\w\$_-]/); + + // gobble a colon in the case that is a lib func type call fn:doc + var foundColon = stream.eat(":"); + + // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier + // which should get matched as a keyword + if(!stream.eat(":") && foundColon) { + stream.eatWhile(/[\w\$_-]/); + } + // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort) + if(stream.match(/^[ \t]*\(/, false)) { + mightBeFunction = true; + } + // is the word a keyword? + var word = stream.current(); + known = keywords.propertyIsEnumerable(word) && keywords[word]; + + // if we think it's a function call but not yet known, + // set style to variable for now for lack of something better + if(mightBeFunction && !known) known = {type: "function_call", style: "variable def"}; + + // if the previous word was element, attribute, axis specifier, this word should be the name of that + if(isInXmlConstructor(state)) { + popStateStack(state); + return ret("word", "variable", word); + } + // as previously checked, if the word is element,attribute, axis specifier, call it an "xmlconstructor" and + // push the stack so we know to look for it on the next word + if(word == "element" || word == "attribute" || known.type == "axis_specifier") pushStateStack(state, {type: "xmlconstructor"}); + + // if the word is known, return the details of that else just call this a generic 'word' + return known ? ret(known.type, known.style, word) : + ret("word", "variable", word); + } + } + + // handle comments, including nested + function tokenComment(stream, state) { + var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; + while (ch = stream.next()) { + if (ch == ")" && maybeEnd) { + if(nestedCount > 0) + nestedCount--; + else { + popStateStack(state); + break; + } + } + else if(ch == ":" && maybeNested) { + nestedCount++; + } + maybeEnd = (ch == ":"); + maybeNested = (ch == "("); + } + + return ret("comment", "comment"); + } + + // tokenizer for string literals + // optionally pass a tokenizer function to set state.tokenize back to when finished + function tokenString(quote, f) { + return function(stream, state) { + var ch; + + if(isInString(state) && stream.current() == quote) { + popStateStack(state); + if(f) state.tokenize = f; + return ret("string", "string"); + } + + pushStateStack(state, { type: "string", name: quote, tokenize: tokenString(quote, f) }); + + // if we're in a string and in an XML block, allow an embedded code block + if(stream.match("{", false) && isInXmlAttributeBlock(state)) { + state.tokenize = tokenBase; + return ret("string", "string"); + } + + + while (ch = stream.next()) { + if (ch == quote) { + popStateStack(state); + if(f) state.tokenize = f; + break; + } + else { + // if we're in a string and in an XML block, allow an embedded code block in an attribute + if(stream.match("{", false) && isInXmlAttributeBlock(state)) { + state.tokenize = tokenBase; + return ret("string", "string"); + } + + } + } + + return ret("string", "string"); + }; + } + + // tokenizer for variables + function tokenVariable(stream, state) { + var isVariableChar = /[\w\$_-]/; + + // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote + if(stream.eat("\"")) { + while(stream.next() !== '\"'){}; + stream.eat(":"); + } else { + stream.eatWhile(isVariableChar); + if(!stream.match(":=", false)) stream.eat(":"); + } + stream.eatWhile(isVariableChar); + state.tokenize = tokenBase; + return ret("variable", "variable"); + } + + // tokenizer for XML tags + function tokenTag(name, isclose) { + return function(stream, state) { + stream.eatSpace(); + if(isclose && stream.eat(">")) { + popStateStack(state); + state.tokenize = tokenBase; + return ret("tag", "tag"); + } + // self closing tag without attributes? + if(!stream.eat("/")) + pushStateStack(state, { type: "tag", name: name, tokenize: tokenBase}); + if(!stream.eat(">")) { + state.tokenize = tokenAttribute; + return ret("tag", "tag"); + } + else { + state.tokenize = tokenBase; + } + return ret("tag", "tag"); + }; + } + + // tokenizer for XML attributes + function tokenAttribute(stream, state) { + var ch = stream.next(); + + if(ch == "/" && stream.eat(">")) { + if(isInXmlAttributeBlock(state)) popStateStack(state); + if(isInXmlBlock(state)) popStateStack(state); + return ret("tag", "tag"); + } + if(ch == ">") { + if(isInXmlAttributeBlock(state)) popStateStack(state); + return ret("tag", "tag"); + } + if(ch == "=") + return ret("", null); + // quoted string + if (ch == '"' || ch == "'") + return chain(stream, state, tokenString(ch, tokenAttribute)); + + if(!isInXmlAttributeBlock(state)) + pushStateStack(state, { type: "attribute", tokenize: tokenAttribute}); + + stream.eat(/[a-zA-Z_:]/); + stream.eatWhile(/[-a-zA-Z0-9_:.]/); + stream.eatSpace(); + + // the case where the attribute has not value and the tag was closed + if(stream.match(">", false) || stream.match("/", false)) { + popStateStack(state); + state.tokenize = tokenBase; + } + + return ret("attribute", "attribute"); + } + + // handle comments, including nested + function tokenXMLComment(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "-" && stream.match("->", true)) { + state.tokenize = tokenBase; + return ret("comment", "comment"); + } + } + } + + + // handle CDATA + function tokenCDATA(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "]" && stream.match("]", true)) { + state.tokenize = tokenBase; + return ret("comment", "comment"); + } + } + } + + // handle preprocessing instructions + function tokenPreProcessing(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "?" && stream.match(">", true)) { + state.tokenize = tokenBase; + return ret("comment", "comment meta"); + } + } + } + + + // functions to test the current context of the state + function isInXmlBlock(state) { return isIn(state, "tag"); } + function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); } + function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"); } + function isInString(state) { return isIn(state, "string"); } + + function isEQNameAhead(stream) { + // assume we've already eaten a quote (") + if(stream.current() === '"') + return stream.match(/^[^\"]+\"\:/, false); + else if(stream.current() === '\'') + return stream.match(/^[^\"]+\'\:/, false); + else + return false; + } + + function isIn(state, type) { + return (state.stack.length && state.stack[state.stack.length - 1].type == type); + } + + function pushStateStack(state, newState) { + state.stack.push(newState); + } + + function popStateStack(state) { + state.stack.pop(); + var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize; + state.tokenize = reinstateTokenize || tokenBase; + } + + // the interface for the mode API + return { + startState: function() { + return { + tokenize: tokenBase, + cc: [], + stack: [] + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + }, + + blockCommentStart: "(:", + blockCommentEnd: ":)" + + }; + +}); + +CodeMirror.defineMIME("application/xquery", "xquery"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/index.html new file mode 100644 index 0000000..be9b632 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/index.html @@ -0,0 +1,80 @@ + + +CodeMirror: YAML mode + + + + + + + + + +
    +

    YAML mode

    +
    + + +

    MIME types defined: text/x-yaml.

    + +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/yaml.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/yaml.js new file mode 100644 index 0000000..b7015e5 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/yaml/yaml.js @@ -0,0 +1,117 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("yaml", function() { + + var cons = ['true', 'false', 'on', 'off', 'yes', 'no']; + var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i'); + + return { + token: function(stream, state) { + var ch = stream.peek(); + var esc = state.escaped; + state.escaped = false; + /* comments */ + if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) { + stream.skipToEnd(); + return "comment"; + } + + if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)) + return "string"; + + if (state.literal && stream.indentation() > state.keyCol) { + stream.skipToEnd(); return "string"; + } else if (state.literal) { state.literal = false; } + if (stream.sol()) { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + /* document start */ + if(stream.match(/---/)) { return "def"; } + /* document end */ + if (stream.match(/\.\.\./)) { return "def"; } + /* array list item */ + if (stream.match(/\s*-\s+/)) { return 'meta'; } + } + /* inline pairs/lists */ + if (stream.match(/^(\{|\}|\[|\])/)) { + if (ch == '{') + state.inlinePairs++; + else if (ch == '}') + state.inlinePairs--; + else if (ch == '[') + state.inlineList++; + else + state.inlineList--; + return 'meta'; + } + + /* list seperator */ + if (state.inlineList > 0 && !esc && ch == ',') { + stream.next(); + return 'meta'; + } + /* pairs seperator */ + if (state.inlinePairs > 0 && !esc && ch == ',') { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + stream.next(); + return 'meta'; + } + + /* start of value of a pair */ + if (state.pairStart) { + /* block literals */ + if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; }; + /* references */ + if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; } + /* numbers */ + if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; } + if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; } + /* keywords */ + if (stream.match(keywordRegex)) { return 'keyword'; } + } + + /* pairs (associative arrays) -> key */ + if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) { + state.pair = true; + state.keyCol = stream.indentation(); + return "atom"; + } + if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; } + + /* nothing found, continue */ + state.pairStart = false; + state.escaped = (ch == '\\'); + stream.next(); + return null; + }, + startState: function() { + return { + pair: false, + pairStart: false, + keyCol: 0, + inlinePairs: 0, + inlineList: 0, + literal: false, + escaped: false + }; + } + }; +}); + +CodeMirror.defineMIME("text/x-yaml", "yaml"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/index.html b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/index.html new file mode 100644 index 0000000..1ad3ace --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/index.html @@ -0,0 +1,52 @@ + + +CodeMirror: Z80 assembly mode + + + + + + + + + +
    +

    Z80 assembly mode

    + + +
    + + + +

    MIME type defined: text/x-z80.

    +
    diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/z80.js b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/z80.js new file mode 100644 index 0000000..ec41d05 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/mode/z80/z80.js @@ -0,0 +1,100 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('z80', function() { + var keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i; + var keywords2 = /^(call|j[pr]|ret[in]?)\b/i; + var keywords3 = /^b_?(call|jump)\b/i; + var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i; + var variables2 = /^(n?[zc]|p[oe]?|m)\b/i; + var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i; + var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+)\b/i; + + return { + startState: function() { + return {context: 0}; + }, + token: function(stream, state) { + if (!stream.column()) + state.context = 0; + + if (stream.eatSpace()) + return null; + + var w; + + if (stream.eatWhile(/\w/)) { + w = stream.current(); + + if (stream.indentation()) { + if (state.context == 1 && variables1.test(w)) + return 'variable-2'; + + if (state.context == 2 && variables2.test(w)) + return 'variable-3'; + + if (keywords1.test(w)) { + state.context = 1; + return 'keyword'; + } else if (keywords2.test(w)) { + state.context = 2; + return 'keyword'; + } else if (keywords3.test(w)) { + state.context = 3; + return 'keyword'; + } + + if (errors.test(w)) + return 'error'; + } else if (numbers.test(w)) { + return 'number'; + } else { + return null; + } + } else if (stream.eat(';')) { + stream.skipToEnd(); + return 'comment'; + } else if (stream.eat('"')) { + while (w = stream.next()) { + if (w == '"') + break; + + if (w == '\\') + stream.next(); + } + return 'string'; + } else if (stream.eat('\'')) { + if (stream.match(/\\?.'/)) + return 'number'; + } else if (stream.eat('.') || stream.sol() && stream.eat('#')) { + state.context = 4; + + if (stream.eatWhile(/\w/)) + return 'def'; + } else if (stream.eat('$')) { + if (stream.eatWhile(/[\da-f]/i)) + return 'number'; + } else if (stream.eat('%')) { + if (stream.eatWhile(/[01]/)) + return 'number'; + } else { + stream.next(); + } + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-z80", "z80"); + +}); diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/modes.min.js b/src/collectedstatic/mdeditor/js/lib/codemirror/modes.min.js new file mode 100644 index 0000000..aa5f193 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/modes.min.js @@ -0,0 +1,10 @@ +/*! Editor.md v1.5.0 | modes.min.js | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 */ +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../lib/codemirror")):"function"==typeof define&&define.amd?define(["../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj"]},{name:"CoffeeScript",mime:"text/x-coffeescript",mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Embedded Javascript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history).md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy"]},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Jade",mime:"text/x-jade",mode:"jade",ext:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"Jinja2",mime:"null",mode:"jinja2"},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"kotlin",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NTriples",mime:"text/n-triples",mode:"ntriples",ext:["nt"]},{name:"Objective C",mime:"text/x-objectivec",mode:"clike",ext:["m","mm"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mime:"application/x-httpd-php",mode:"php",ext:["php","php3","php4","php5","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["py","pyw"]},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mime:"text/x-sh",mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"]},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"SmartyMixed",mime:"text/x-smarty",mode:"smartymixed"},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"MariaDB",mime:"text/x-mariadb",mode:"sql"},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki ",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog",ext:["v"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"YAML",mime:"text/x-yaml",mode:"yaml",ext:["yaml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]}];for(var t=0;t-1&&t.substring(i+1,t.length);return o?e.findModeByExtension(o):void 0},e.findModeByName=function(t){t=t.toLowerCase();for(var r=0;r")?(e.match("-->"),t.tokenize=null):e.skipToEnd(),["comment","comment"]}e.defineMode("css",function(t, r){function n(e, t){return m=t,e}function i(e, t){var r=e.next();if(g[r]){var i=g[r](e,t);if(i!==!1)return i}return"@"==r?(e.eatWhile(/[\w\\\-]/),n("def",e.current())):"="==r||("~"==r||"|"==r)&&e.eat("=")?n(null,"compare"):'"'==r||"'"==r?(t.tokenize=o(r),t.tokenize(e,t)):"#"==r?(e.eatWhile(/[\w\\\-]/),n("atom","hash")):"!"==r?(e.match(/^\s*\w*/),n("keyword","important")):/\d/.test(r)||"."==r&&e.eat(/\d/)?(e.eatWhile(/[\w.%]/),n("number","unit")):"-"!==r?/[,+>*\/]/.test(r)?n(null,"select-op"):"."==r&&e.match(/^-?[_a-z][_a-z0-9-]*/i)?n("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(r)?n(null,r):"u"==r&&e.match(/rl(-prefix)?\(/)||"d"==r&&e.match("omain(")||"r"==r&&e.match("egexp(")?(e.backUp(1),t.tokenize=a,n("property","word")):/[\w\\\-]/.test(r)?(e.eatWhile(/[\w\\\-]/),n("property","word")):n(null,null):/[\d.]/.test(e.peek())?(e.eatWhile(/[\w.%]/),n("number","unit")):e.match(/^-[\w\\\-]+/)?(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?n("variable-2","variable-definition"):n("variable-2","variable")):e.match(/^\w+-/)?n("meta","meta"):void 0}function o(e){return function(t,r){for(var i,o=!1;null!=(i=t.next());){if(i==e&&!o){")"==e&&t.backUp(1);break}o=!o&&"\\"==i}return(i==e||!o&&")"!=e)&&(r.tokenize=null),n("string","string")}}function a(e,t){return e.next(),e.match(/\s*[\"\')]/,!1)?t.tokenize=null:t.tokenize=o(")"),n(null,"(")}function s(e,t,r){this.type=e,this.indent=t,this.prev=r}function l(e,t,r){return e.context=new s(r,t.indentation()+p,e.context),r}function c(e){return e.context=e.context.prev,e.context.type}function u(e,t,r){return M[r.context.type](e,t,r)}function d(e,t,r,n){for(var i=n||1;i>0;i--)r.context=r.context.prev;return u(e,t,r)}function f(e){var t=e.current().toLowerCase();h=S.hasOwnProperty(t)?"atom":C.hasOwnProperty(t)?"keyword":"variable"}r.propertyKeywords||(r=e.resolveMode("text/css"));var m,h,p=t.indentUnit,g=r.tokenHooks,v=r.documentTypes||{},b=r.mediaTypes||{},y=r.mediaFeatures||{},x=r.propertyKeywords||{},k=r.nonStandardPropertyKeywords||{},w=r.fontProperties||{},_=r.counterDescriptors||{},C=r.colorKeywords||{},S=r.valueKeywords||{},T=r.allowNested,M={};return M.top=function(e,t,r){if("{"==e)return l(r,t,"block");if("}"==e&&r.context.prev)return c(r);if(/@(media|supports|(-moz-)?document)/.test(e))return l(r,t,"atBlock");if(/@(font-face|counter-style)/.test(e))return r.stateArg=e,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(e))return"keyframes";if(e&&"@"==e.charAt(0))return l(r,t,"at");if("hash"==e)h="builtin";else if("word"==e)h="tag";else{if("variable-definition"==e)return"maybeprop";if("interpolation"==e)return l(r,t,"interpolation");if(":"==e)return"pseudo";if(T&&"("==e)return l(r,t,"parens")}return r.context.type},M.block=function(e,t,r){if("word"==e){var n=t.current().toLowerCase();return x.hasOwnProperty(n)?(h="property","maybeprop"):k.hasOwnProperty(n)?(h="string-2","maybeprop"):T?(h=t.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(h+=" error","maybeprop")}return"meta"==e?"block":T||"hash"!=e&&"qualifier"!=e?M.top(e,t,r):(h="error","block")},M.maybeprop=function(e,t,r){return":"==e?l(r,t,"prop"):u(e,t,r)},M.prop=function(e,t,r){if(";"==e)return c(r);if("{"==e&&T)return l(r,t,"propBlock");if("}"==e||"{"==e)return d(e,t,r);if("("==e)return l(r,t,"parens");if("hash"!=e||/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(t.current())){if("word"==e)f(t);else if("interpolation"==e)return l(r,t,"interpolation")}else h+=" error";return"prop"},M.propBlock=function(e,t,r){return"}"==e?c(r):"word"==e?(h="property","maybeprop"):r.context.type},M.parens=function(e,t,r){return"{"==e||"}"==e?d(e,t,r):")"==e?c(r):"("==e?l(r,t,"parens"):("word"==e&&f(t),"parens")},M.pseudo=function(e,t,r){return"word"==e?(h="variable-3",r.context.type):u(e,t,r)},M.atBlock=function(e,t,r){if("("==e)return l(r,t,"atBlock_parens");if("}"==e)return d(e,t,r);if("{"==e)return c(r)&&l(r,t,T?"block":"top");if("word"==e){var n=t.current().toLowerCase();h="only"==n||"not"==n||"and"==n||"or"==n?"keyword":v.hasOwnProperty(n)?"tag":b.hasOwnProperty(n)?"attribute":y.hasOwnProperty(n)?"property":x.hasOwnProperty(n)?"property":k.hasOwnProperty(n)?"string-2":S.hasOwnProperty(n)?"atom":"error"}return r.context.type},M.atBlock_parens=function(e,t,r){return")"==e?c(r):"{"==e||"}"==e?d(e,t,r,2):M.atBlock(e,t,r)},M.restricted_atBlock_before=function(e,t,r){return"{"==e?l(r,t,"restricted_atBlock"):"word"==e&&"@counter-style"==r.stateArg?(h="variable","restricted_atBlock_before"):u(e,t,r)},M.restricted_atBlock=function(e,t,r){return"}"==e?(r.stateArg=null,c(r)):"word"==e?(h="@font-face"==r.stateArg&&!w.hasOwnProperty(t.current().toLowerCase())||"@counter-style"==r.stateArg&&!_.hasOwnProperty(t.current().toLowerCase())?"error":"property","maybeprop"):"restricted_atBlock"},M.keyframes=function(e,t,r){return"word"==e?(h="variable","keyframes"):"{"==e?l(r,t,"top"):u(e,t,r)},M.at=function(e,t,r){return";"==e?c(r):"{"==e||"}"==e?d(e,t,r):("word"==e?h="tag":"hash"==e&&(h="builtin"),"at")},M.interpolation=function(e,t,r){return"}"==e?c(r):"{"==e||";"==e?d(e,t,r):("variable"!=e&&(h="error"),"interpolation")},{startState:function(e){return{tokenize:null,state:"top",stateArg:null,context:new s("top",e||0,null)}},token:function(e,t){if(!t.tokenize&&e.eatSpace())return null;var r=(t.tokenize||i)(e,t);return r&&"object"==typeof r&&(m=r[1],r=r[0]),h=r,t.state=M[t.state](m,e,t),h},indent:function(e,t){var r=e.context,n=t&&t.charAt(0),i=r.indent;return"prop"!=r.type||"}"!=n&&")"!=n||(r=r.prev),!r.prev||("}"!=n||"block"!=r.type&&"top"!=r.type&&"interpolation"!=r.type&&"restricted_atBlock"!=r.type)&&(")"!=n||"parens"!=r.type&&"atBlock_parens"!=r.type)&&("{"!=n||"at"!=r.type&&"atBlock"!=r.type)||(i=r.indent-p,r=r.prev),i},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"}});var i=["domain","regexp","url","url-prefix"],o=t(i),a=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],s=t(a),l=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"],c=t(l),u=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],d=t(u),f=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],m=t(f),h=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],p=t(h),g=["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"],v=t(g),b=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],y=t(b),x=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small"],k=t(x),w=i.concat(a).concat(l).concat(u).concat(f).concat(b).concat(x);e.registerHelper("hintWords","css",w),e.defineMIME("text/css",{documentTypes:o,mediaTypes:s,mediaFeatures:c,propertyKeywords:d,nonStandardPropertyKeywords:m,fontProperties:p,counterDescriptors:v,colorKeywords:y,valueKeywords:k,tokenHooks:{"<":function(e,t){return e.match("!--")?(t.tokenize=n,n(e,t)):!1},"/":function(e,t){return e.eat("*")?(t.tokenize=r,r(e,t)):!1}},name:"css"}),e.defineMIME("text/x-scss",{mediaTypes:s,mediaFeatures:c,propertyKeywords:d,nonStandardPropertyKeywords:m,colorKeywords:y,valueKeywords:k,fontProperties:p,allowNested:!0,tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=r,r(e,t)):["operator","operator"]},":":function(e){return e.match(/\s*\{/)?[null,"{"]:!1},$:function(e){return e.match(/^[\w-]+/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"]},"#":function(e){return e.eat("{")?[null,"interpolation"]:!1}},name:"css",helperType:"scss"}),e.defineMIME("text/x-less",{mediaTypes:s,mediaFeatures:c,propertyKeywords:d,nonStandardPropertyKeywords:m,colorKeywords:y,valueKeywords:k,fontProperties:p,allowNested:!0,tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=r,r(e,t)):["operator","operator"]},"@":function(e){return e.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/,!1)?!1:(e.eatWhile(/[\w\\\-]/), +e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"])},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("sass",function(e){function t(e){return new RegExp("^"+e.join("|"))}function r(e, t){var r=e.peek();return")"===r?(e.next(),t.tokenizer=l,"operator"):"("===r?(e.next(),e.eatSpace(),"operator"):"'"===r||'"'===r?(t.tokenizer=i(e.next()),"string"):(t.tokenizer=i(")",!1),"string")}function n(e, t){return function(r, n){return r.sol()&&r.indentation()<=e?(n.tokenizer=l,l(r,n)):(t&&r.skipTo("*/")?(r.next(),r.next(),n.tokenizer=l):r.skipToEnd(),"comment")}}function i(e,t){function r(n,i){var a=n.next(),s=n.peek(),c=n.string.charAt(n.pos-2),u="\\"!==a&&s===e||a===e&&"\\"!==c;return u?(a!==e&&t&&n.next(),i.tokenizer=l,"string"):"#"===a&&"{"===s?(i.tokenizer=o(r),n.next(),"operator"):"string"}return null==t&&(t=!0),r}function o(e){return function(t,r){return"}"===t.peek()?(t.next(),r.tokenizer=e,"operator"):l(t,r)}}function a(t){if(0==t.indentCount){t.indentCount++;var r=t.scopes[0].offset,n=r+e.indentUnit;t.scopes.unshift({offset:n})}}function s(e){1!=e.scopes.length&&e.scopes.shift()}function l(e,t){var c=e.peek();if(e.match("/*"))return t.tokenizer=n(e.indentation(),!0),t.tokenizer(e,t);if(e.match("//"))return t.tokenizer=n(e.indentation(),!1),t.tokenizer(e,t);if(e.match("#{"))return t.tokenizer=o(l),"operator";if('"'===c||"'"===c)return e.next(),t.tokenizer=i(c),"string";if(t.cursorHalf){if("#"===c&&(e.next(),e.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)))return e.peek()||(t.cursorHalf=0),"number";if(e.match(/^-?[0-9\.]+/))return e.peek()||(t.cursorHalf=0),"number";if(e.match(/^(px|em|in)\b/))return e.peek()||(t.cursorHalf=0),"unit";if(e.match(d))return e.peek()||(t.cursorHalf=0),"keyword";if(e.match(/^url/)&&"("===e.peek())return t.tokenizer=r,e.peek()||(t.cursorHalf=0),"atom";if("$"===c)return e.next(),e.eatWhile(/[\w-]/),e.peek()||(t.cursorHalf=0),"variable-3";if("!"===c)return e.next(),e.peek()||(t.cursorHalf=0),e.match(/^[\w]+/)?"keyword":"operator";if(e.match(m))return e.peek()||(t.cursorHalf=0),"operator";if(e.eatWhile(/[\w-]/))return e.peek()||(t.cursorHalf=0),"attribute";if(!e.peek())return t.cursorHalf=0,null}else{if("."===c){if(e.next(),e.match(/^[\w-]+/))return a(t),"atom";if("#"===e.peek())return a(t),"atom"}if("#"===c){if(e.next(),e.match(/^[\w-]+/))return a(t),"atom";if("#"===e.peek())return a(t),"atom"}if("$"===c)return e.next(),e.eatWhile(/[\w-]/),"variable-2";if(e.match(/^-?[0-9\.]+/))return"number";if(e.match(/^(px|em|in)\b/))return"unit";if(e.match(d))return"keyword";if(e.match(/^url/)&&"("===e.peek())return t.tokenizer=r,"atom";if("="===c&&e.match(/^=[\w-]+/))return a(t),"meta";if("+"===c&&e.match(/^\+[\w-]+/))return"variable-3";if("@"===c&&e.match(/@extend/)&&(e.match(/\s*[\w]/)||s(t)),e.match(/^@(else if|if|media|else|for|each|while|mixin|function)/))return a(t),"meta";if("@"===c)return e.next(),e.eatWhile(/[\w-]/),"meta";if(e.eatWhile(/[\w-]/))return e.match(/ *: *[\w-\+\$#!\("']/,!1)?"propery":e.match(/ *:/,!1)?(a(t),t.cursorHalf=1,"atom"):e.match(/ *,/,!1)?"atom":(a(t),"atom");if(":"===c)return e.match(h)?"keyword":(e.next(),t.cursorHalf=1,"operator")}return e.match(m)?"operator":(e.next(),null)}function c(t,r){t.sol()&&(r.indentCount=0);var n=r.tokenizer(t,r),i=t.current();if(("@return"===i||"}"===i)&&s(r),null!==n){for(var o=t.pos-i.length,a=o+e.indentUnit*r.indentCount,l=[],c=0;c","<","==",">=","<=","\\+","-","\\!=","/","\\*","%","and","or","not",";","\\{","\\}",":"],m=t(f),h=/^::?[a-zA-Z_][\w\-]*/;return{startState:function(){return{tokenizer:l,scopes:[{offset:0,type:"sass"}],indentCount:0,cursorHalf:0,definedVars:[],definedMixins:[]}},token:function(e, t){var r=c(e,t);return t.lastToken={style:r,content:e.current()},r},indent:function(e){return e.scopes[0].offset}}}),e.defineMIME("text/x-sass","sass")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("shell",function(){function e(e, t){for(var r=t.split(" "),n=0; n1&&e.eat("$");var i=e.next(),o=/\w/;return"{"===i&&(o=/[^}]/),"("===i?(t.tokens[0]=r(")"),n(e,t)):(/\d/.test(i)||(e.eatWhile(o),e.eat("}")),t.tokens.shift(),"def")};return{startState:function(){return{tokens:[]}},token:function(e, t){return n(e,t)},lineComment:"#",fold:"brace"}}),e.defineMIME("text/x-sh","shell")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("sql",function(t, r){function n(e, t){var r=e.next();if(h[r]){var n=h[r](e,t);if(n!==!1)return n}if(1==m.hexNumber&&("0"==r&&e.match(/^[xX][0-9a-fA-F]+/)||("x"==r||"X"==r)&&e.match(/^'[0-9a-fA-F]+'/)))return"number";if(1==m.binaryNumber&&(("b"==r||"B"==r)&&e.match(/^'[01]+'/)||"0"==r&&e.match(/^b[01]+/)))return"number";if(r.charCodeAt(0)>47&&r.charCodeAt(0)<58)return e.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/),1==m.decimallessFloat&&e.eat("."),"number";if("?"==r&&(e.eatSpace()||e.eol()||e.eat(";")))return"variable-3";if("'"==r||'"'==r&&m.doubleQuote)return t.tokenize=i(r),t.tokenize(e,t);if((1==m.nCharCast&&("n"==r||"N"==r)||1==m.charsetCast&&"_"==r&&e.match(/[a-z][a-z0-9]*/i))&&("'"==e.peek()||'"'==e.peek()))return"keyword";if(/^[\(\),\;\[\]]/.test(r))return null;if(m.commentSlashSlash&&"/"==r&&e.eat("/"))return e.skipToEnd(),"comment";if(m.commentHash&&"#"==r||"-"==r&&e.eat("-")&&(!m.commentSpaceRequired||e.eat(" ")))return e.skipToEnd(),"comment";if("/"==r&&e.eat("*"))return t.tokenize=o,t.tokenize(e,t);if("."!=r){if(f.test(r))return e.eatWhile(f),null;if("{"==r&&(e.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/)||e.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/)))return"number";e.eatWhile(/^[_\w\d]/);var a=e.current().toLowerCase();return p.hasOwnProperty(a)&&(e.match(/^( )+'[^']*'/)||e.match(/^( )+"[^"]*"/))?"number":c.hasOwnProperty(a)?"atom":u.hasOwnProperty(a)?"builtin":d.hasOwnProperty(a)?"keyword":l.hasOwnProperty(a)?"string-2":null}return 1==m.zerolessFloat&&e.match(/^(?:\d+(?:e[+-]?\d+)?)/i)?"number":1==m.ODBCdotTable&&e.match(/^[a-zA-Z_]+/)?"variable-2":void 0}function i(e){return function(t,r){for(var i,o=!1;null!=(i=t.next());){if(i==e&&!o){r.tokenize=n;break}o=!o&&"\\"==i}return"string"}}function o(e,t){for(;;){if(!e.skipTo("*")){e.skipToEnd();break}if(e.next(),e.eat("/")){t.tokenize=n;break}}return"comment"}function a(e,t,r){t.context={prev:t.context,indent:e.indentation(),col:e.column(),type:r}}function s(e){e.indent=e.context.indent,e.context=e.context.prev}var l=r.client||{},c=r.atoms||{"false":!0,"true":!0,"null":!0},u=r.builtin||{},d=r.keywords||{},f=r.operatorChars||/^[*+\-%<>!=&|~^]/,m=r.support||{},h=r.hooks||{},p=r.dateSQL||{date:!0,time:!0,timestamp:!0};return{startState:function(){return{tokenize:n,context:null}},token:function(e,t){if(e.sol()&&t.context&&null==t.context.align&&(t.context.align=!1),e.eatSpace())return null;var r=t.tokenize(e,t);if("comment"==r)return r;t.context&&null==t.context.align&&(t.context.align=!0);var n=e.current();return"("==n?a(e,t,")"):"["==n?a(e,t,"]"):t.context&&t.context.type==n&&s(t),r},indent:function(r,n){var i=r.context;if(!i)return e.Pass;var o=n.charAt(0)==i.type;return i.align?i.col+(o?0:1):i.indent+(o?0:t.indentUnit)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:m.commentSlashSlash?"//":m.commentHash?"#":null}}),function(){function t(e){for(var t;null!=(t=e.next());)if("`"==t&&!e.eat("`"))return"variable-2";return e.backUp(e.current().length-1),e.eatWhile(/\w/)?"variable-2":null}function r(e){return e.eat("@")&&(e.match(/^session\./),e.match(/^local\./),e.match(/^global\./)),e.eat("'")?(e.match(/^.*'/),"variable-2"):e.eat('"')?(e.match(/^.*"/),"variable-2"):e.eat("`")?(e.match(/^.*`/),"variable-2"):e.match(/^[0-9a-zA-Z$\.\_]+/)?"variable-2":null}function n(e){return e.eat("N")?"atom":e.match(/^[a-zA-Z.#!?]/)?"variable-2":null}function i(e){for(var t={},r=e.split(" "),n=0;n!=]/,dateSQL:i("date time timestamp"),support:i("ODBCdotTable doubleQuote binaryNumber hexNumber")}),e.defineMIME("text/x-mssql",{name:"sql",client:i("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:i(o+"begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered"),builtin:i("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "),atoms:i("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:i("date datetimeoffset datetime2 smalldatetime datetime time"),hooks:{"@":r}}),e.defineMIME("text/x-mysql",{name:"sql",client:i("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:i(o+"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group groupby_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:i("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:i("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:i("date time timestamp"),support:i("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":r,"`":t,"\\":n}}),e.defineMIME("text/x-mariadb",{name:"sql",client:i("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:i(o+"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:i("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:i("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:i("date time timestamp"),support:i("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":r,"`":t,"\\":n}}),e.defineMIME("text/x-cassandra",{name:"sql",client:{},keywords:i("use select from using consistency where limit first reversed first and in insert into values using consistency ttl update set delete truncate begin batch apply create keyspace with columnfamily primary key index on drop alter type add any one quorum all local_quorum each_quorum"),builtin:i("ascii bigint blob boolean counter decimal double float int text timestamp uuid varchar varint"),atoms:i("false true"),operatorChars:/^[<>=]/,dateSQL:{},support:i("commentSlashSlash decimallessFloat"),hooks:{}}),e.defineMIME("text/x-plsql",{name:"sql",client:i("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"),keywords:i("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"),builtin:i("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least lenght lenghtb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"),operatorChars:/^[*+\-%<>!=~]/,dateSQL:i("date time timestamp"),support:i("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber")}),e.defineMIME("text/x-hive",{name:"sql",keywords:i("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"),builtin:i("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"),atoms:i("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:i("date timestamp"),support:i("ODBCdotTable doubleQuote binaryNumber hexNumber")})}()}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e){for(var t={},r=e.split(" "),n=0; n!?|\/]/;return{startState:function(e){return{tokenize:null,context:new a((e||0)-u,0,"top",!1),indented:0,startOfLine:!0}},token:function(e,t){var r=t.context;if(e.sol()&&(null==r.align&&(r.align=!1),t.indented=e.indentation(),t.startOfLine=!0),e.eatSpace())return null;c=null;var i=(t.tokenize||n)(e,t);if("comment"==i||"meta"==i)return i;if(null==r.align&&(r.align=!0),";"!=c&&":"!=c&&","!=c||"statement"!=r.type)if("{"==c)s(t,e.column(),"}");else if("["==c)s(t,e.column(),"]");else if("("==c)s(t,e.column(),")");else if("}"==c){for(;"statement"==r.type;)r=l(t);for("}"==r.type&&(r=l(t));"statement"==r.type;)r=l(t)}else c==r.type?l(t):y&&(("}"==r.type||"top"==r.type)&&";"!=c||"statement"==r.type&&"newstatement"==c)&&s(t,e.column(),"statement");else l(t);return t.startOfLine=!1,i},indent:function(t,r){if(t.tokenize!=n&&null!=t.tokenize)return e.Pass;var i=t.context,o=r&&r.charAt(0);"statement"==i.type&&"}"==o&&(i=i.prev);var a=o==i.type;return"statement"==i.type?i.indented+("{"==o?0:d):!i.align||f&&")"==i.type?")"!=i.type||a?i.indented+(a?0:u):i.indented+d:i.column+(a?0:1)},electricChars:"{}",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",fold:"brace"}});var l="auto if break int case long char register continue return default short do sizeof double static else struct entry switch extern typedef float union for unsigned goto while enum void const signed volatile";a(["text/x-csrc","text/x-c","text/x-chdr"],{name:"clike",keywords:t(l),blockKeywords:t("case do else for if switch while struct"),atoms:t("null"),hooks:{"#":r},modeProps:{fold:["brace","include"]}}),a(["text/x-c++src","text/x-c++hdr"],{name:"clike",keywords:t(l+" asm dynamic_cast namespace reinterpret_cast try bool explicit new static_cast typeid catch operator template typename class friend private this using const_cast inline public throw virtual delete mutable protected wchar_t alignas alignof constexpr decltype nullptr noexcept thread_local final static_assert override"),blockKeywords:t("catch class do else finally for if struct switch try while"),atoms:t("true false null"),hooks:{"#":r,u:n,U:n,L:n,R:n},modeProps:{fold:["brace","include"]}}),a("text/x-java",{name:"clike",keywords:t("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 transient try void volatile while"),blockKeywords:t("catch class do else finally for if switch try while"),atoms:t("true false null"),hooks:{"@":function(e){return e.eatWhile(/[\w\$_]/),"meta"}},modeProps:{fold:["brace","import"]}}),a("text/x-csharp",{name:"clike",keywords:t("abstract as base break case catch checked class const continue default delegate do else enum event explicit extern finally fixed for foreach goto if implicit in interface internal is lock namespace new operator out override params private protected public readonly ref return sealed sizeof stackalloc static struct switch this throw try typeof unchecked unsafe using virtual void volatile while add alias ascending descending dynamic from get global group into join let orderby partial remove select set value var yield"),blockKeywords:t("catch class do else finally for foreach if struct switch try while"),builtin:t("Boolean Byte Char DateTime DateTimeOffset Decimal Double Guid Int16 Int32 Int64 Object SByte Single String TimeSpan UInt16 UInt32 UInt64 bool byte char decimal double short int long object sbyte float string ushort uint ulong"),atoms:t("true false null"),hooks:{"@":function(e,t){return e.eat('"')?(t.tokenize=i,i(e,t)):(e.eatWhile(/[\w\$_]/),"meta")}}}),a("text/x-scala",{name:"clike",keywords:t("abstract case catch class def do else extends false final finally for forSome if implicit import lazy match new null object override package private protected return sealed super this throw trait try trye type val var while with yield _ : = => <- <: <% >: # @ assert assume require print println printf readLine readBoolean readByte readShort readChar readInt readLong readFloat readDouble AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either Enumeration Equiv Error Exception Fractional Function IndexedSeq Integral Iterable Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector :: #:: Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"), +multiLineStrings:!0,blockKeywords:t("catch class do else finally for forSome if match switch try while"),atoms:t("true false null"),indentStatements:!1,hooks:{"@":function(e){return e.eatWhile(/[\w\$_]/),"meta"},'"':function(e,t){return e.match('""')?(t.tokenize=s,t.tokenize(e,t)):!1},"'":function(e){return e.eatWhile(/[\w\$_\xa1-\uffff]/),"atom"}}}),a(["x-shader/x-vertex","x-shader/x-fragment"],{name:"clike",keywords:t("float int bool void vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 mat2 mat3 mat4 sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow const attribute uniform varying break continue discard return for while do if else struct in out inout"),blockKeywords:t("for while do if else struct"),builtin:t("radians degrees sin cos tan asin acos atan pow exp log exp2 sqrt inversesqrt abs sign floor ceil fract mod min max clamp mix step smoothstep length distance dot cross normalize ftransform faceforward reflect refract matrixCompMult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not texture1D texture1DProj texture1DLod texture1DProjLod texture2D texture2DProj texture2DLod texture2DProjLod texture3D texture3DProj texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod dFdx dFdy fwidth noise1 noise2 noise3 noise4"),atoms:t("true false gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord gl_PointCoord gl_Position gl_PointSize gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_FragCoord gl_FrontFacing gl_FragData gl_FragDepth gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_FogParameters gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits gl_MaxDrawBuffers"),hooks:{"#":r},modeProps:{fold:["brace","include"]}}),a("text/x-nesc",{name:"clike",keywords:t(l+"as atomic async call command component components configuration event generic implementation includes interface module new norace nx_struct nx_union post provides signal task uses abstract extends"),blockKeywords:t("case do else for if switch while struct"),atoms:t("null"),hooks:{"#":r},modeProps:{fold:["brace","include"]}}),a("text/x-objectivec",{name:"clike",keywords:t(l+"inline restrict _Bool _Complex _Imaginery BOOL Class bycopy byref id IMP in inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"),atoms:t("YES NO NULL NILL ON OFF"),hooks:{"@":function(e){return e.eatWhile(/[\w\$]/),"keyword"},"#":r},modeProps:{fold:"brace"}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("../htmlmixed/htmlmixed"),require("../clike/clike")):"function"==typeof define&&define.amd?define(["./lib/codemirror","../htmlmixed/htmlmixed","../clike/clike"],e):e(CodeMirror)}(function(e){"use strict";function t(e){for(var t={},r=e.split(" "),n=0; n\w/,!1)&&(t.tokenize=r([[["->",null]],[[/[\w]+/,"variable"]]],n)),"variable-2";for(var i=!1;!e.eol()&&(i||!e.match("{$",!1)&&!e.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/,!1));){if(!i&&e.match(n)){t.tokenize=null,t.tokStack.pop(),t.tokStack.pop();break}i="\\"==e.next()&&!i}return"string"}var o="abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally",a="true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__",s="func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";e.registerHelper("hintWords","php",[o,a,s].join(" ").split(" ")),e.registerHelper("wordChars","php",/[\w$]/);var l={name:"clike",helperType:"php",keywords:t(o),blockKeywords:t("catch do else elseif for foreach if switch try while finally"),atoms:t(a),builtin:t(s),multiLineStrings:!0,hooks:{$:function(e){return e.eatWhile(/[\w\$_]/),"variable-2"},"<":function(e,t){if(e.match(/<",!1);)e.next();return"comment"},"/":function(e){if(e.eat("/")){for(;!e.eol()&&!e.match("?>",!1);)e.next();return"comment"}return!1},'"':function(e,t){return(t.tokStack||(t.tokStack=[])).push('"',0),t.tokenize=n('"'),"string"},"{":function(e,t){return t.tokStack&&t.tokStack.length&&t.tokStack[t.tokStack.length-1]++,!1},"}":function(e,t){return t.tokStack&&t.tokStack.length>0&&!--t.tokStack[t.tokStack.length-1]&&(t.tokenize=n(t.tokStack[t.tokStack.length-2])),!1}}};e.defineMode("php",function(t,r){function n(e,t){var r=t.curMode==o;if(e.sol()&&t.pending&&'"'!=t.pending&&"'"!=t.pending&&(t.pending=null),r)return r&&null==t.php.tokenize&&e.match("?>")?(t.curMode=i,t.curState=t.html,"meta"):o.token(e,t.curState);if(e.match(/^<\?\w*/))return t.curMode=o,t.curState=t.php,"meta";if('"'==t.pending||"'"==t.pending){for(;!e.eol()&&e.next()!=t.pending;);var n="string"}else if(t.pending&&e.pos/.test(s)?t.pending=a[0]:t.pending={end:e.pos,style:n},e.backUp(s.length-l)),n}var i=e.getMode(t,"text/html"),o=e.getMode(t,l);return{startState:function(){var t=e.startState(i),n=e.startState(o);return{html:t,php:n,curMode:r.startOpen?o:i,curState:r.startOpen?n:t,pending:null}},copyState:function(t){var r,n=t.html,a=e.copyState(i,n),s=t.php,l=e.copyState(o,s);return r=t.curMode==i?a:l,{html:a,php:l,curMode:t.curMode,curState:r,pending:t.pending}},token:n,indent:function(e, t){return e.curMode!=o&&/^\s*<\//.test(t)||e.curMode==o&&/^\?>/.test(t)?i.indent(e.html,t):e.curMode.indent(e.curState,t)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",innerMode:function(e){return{state:e.curState,mode:e.curMode}}}},"htmlmixed","clike"),e.defineMIME("application/x-httpd-php","php"),e.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:!0}),e.defineMIME("text/x-php",l)}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("xml",function(t, r){function n(e, t){function r(r){return t.tokenize=r,r(e,t)}var n=e.next();if("<"==n)return e.eat("!")?e.eat("[")?e.match("CDATA[")?r(a("atom","]]>")):null:e.match("--")?r(a("comment","-->")):e.match("DOCTYPE",!0,!0)?(e.eatWhile(/[\w\._\-]/),r(s(1))):null:e.eat("?")?(e.eatWhile(/[\w\._\-]/),t.tokenize=a("meta","?>"),"meta"):(_=e.eat("/")?"closeTag":"openTag",t.tokenize=i,"tag bracket");if("&"==n){var o;return o=e.eat("#")?e.eat("x")?e.eatWhile(/[a-fA-F\d]/)&&e.eat(";"):e.eatWhile(/[\d]/)&&e.eat(";"):e.eatWhile(/[\w\.\-:]/)&&e.eat(";"),o?"atom":"error"}return e.eatWhile(/[^&<]/),null}function i(e,t){var r=e.next();if(">"==r||"/"==r&&e.eat(">"))return t.tokenize=n,_=">"==r?"endTag":"selfcloseTag","tag bracket";if("="==r)return _="equals",null;if("<"==r){t.tokenize=n,t.state=d,t.tagName=t.tagStart=null;var i=t.tokenize(e,t);return i?i+" tag error":"tag error"}return/[\'\"]/.test(r)?(t.tokenize=o(r),t.stringStartCol=e.column(),t.tokenize(e,t)):(e.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function o(e){var t=function(t,r){for(;!t.eol();)if(t.next()==e){r.tokenize=i;break}return"string"};return t.isInAttribute=!0,t}function a(e,t){return function(r,i){for(;!r.eol();){if(r.match(t)){i.tokenize=n;break}r.next()}return e}}function s(e){return function(t,r){for(var i;null!=(i=t.next());){if("<"==i)return r.tokenize=s(e+1),r.tokenize(t,r);if(">"==i){if(1==e){r.tokenize=n;break}return r.tokenize=s(e-1),r.tokenize(t,r)}}return"meta"}}function l(e,t,r){this.prev=e.context,this.tagName=t,this.indent=e.indented,this.startOfLine=r,(S.doNotIndent.hasOwnProperty(t)||e.context&&e.context.noIndent)&&(this.noIndent=!0)}function c(e){e.context&&(e.context=e.context.prev)}function u(e,t){for(var r;;){if(!e.context)return;if(r=e.context.tagName,!S.contextGrabbers.hasOwnProperty(r)||!S.contextGrabbers[r].hasOwnProperty(t))return;c(e)}}function d(e,t,r){return"openTag"==e?(r.tagStart=t.column(),f):"closeTag"==e?m:d}function f(e,t,r){return"word"==e?(r.tagName=t.current(),C="tag",g):(C="error",f)}function m(e,t,r){if("word"==e){var n=t.current();return r.context&&r.context.tagName!=n&&S.implicitlyClosed.hasOwnProperty(r.context.tagName)&&c(r),r.context&&r.context.tagName==n?(C="tag",h):(C="tag error",p)}return C="error",p}function h(e,t,r){return"endTag"!=e?(C="error",h):(c(r),d)}function p(e,t,r){return C="error",h(e,t,r)}function g(e,t,r){if("word"==e)return C="attribute",v;if("endTag"==e||"selfcloseTag"==e){var n=r.tagName,i=r.tagStart;return r.tagName=r.tagStart=null,"selfcloseTag"==e||S.autoSelfClosers.hasOwnProperty(n)?u(r,n):(u(r,n),r.context=new l(r,n,i==r.indented)),d}return C="error",g}function v(e,t,r){return"equals"==e?b:(S.allowMissing||(C="error"),g(e,t,r))}function b(e,t,r){return"string"==e?y:"word"==e&&S.allowUnquoted?(C="string",g):(C="error",g(e,t,r))}function y(e,t,r){return"string"==e?y:g(e,t,r)}var x=t.indentUnit,k=r.multilineTagIndentFactor||1,w=r.multilineTagIndentPastTag;null==w&&(w=!0);var _,C,S=r.htmlMode?{autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,caseFold:!1},T=r.alignCDATA;return{startState:function(){return{tokenize:n,state:d,indented:0,tagName:null,tagStart:null,context:null}},token:function(e,t){if(!t.tagName&&e.sol()&&(t.indented=e.indentation()),e.eatSpace())return null;_=null;var r=t.tokenize(e,t);return(r||_)&&"comment"!=r&&(C=null,t.state=t.state(_||r,e,t),C&&(r="error"==C?r+" error":C)),r},indent:function(t,r,o){var a=t.context;if(t.tokenize.isInAttribute)return t.tagStart==t.indented?t.stringStartCol+1:t.indented+x;if(a&&a.noIndent)return e.Pass;if(t.tokenize!=i&&t.tokenize!=n)return o?o.match(/^(\s*)/)[0].length:0;if(t.tagName)return w?t.tagStart+t.tagName.length+2:t.tagStart+x*k;if(T&&/$/,blockCommentStart:"",configuration:r.htmlMode?"html":"xml",helperType:r.htmlMode?"html":"xml"}}),e.defineMIME("text/xml","xml"),e.defineMIME("application/xml","xml"),e.mimeModes.hasOwnProperty("text/html")||e.defineMIME("text/html",{name:"xml",htmlMode:!0})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("../xml/xml"),require("../meta")):"function"==typeof define&&define.amd?define(["./lib/codemirror","../xml/xml","../meta"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("markdown",function(t, r){function n(r){if(e.findModeByName){var n=e.findModeByName(r);n&&(r=n.mime||n.mimes[0])}var i=e.getMode(t,r);return"null"==i.name?null:i}function i(e, t, r){return t.f=t.inline=r,r(e,t)}function o(e, t, r){return t.f=t.block=r,r(e,t)}function a(e){return e.linkTitle=!1,e.em=!1,e.strong=!1,e.strikethrough=!1,e.quote=0,k||e.f!=l||(e.f=m,e.block=s),e.trailingSpace=0,e.trailingSpaceNewLine=!1,e.thisLineHasContent=!1,null}function s(e,t){var o=e.sol(),a=t.list!==!1;t.list!==!1&&t.indentationDiff>=0?(t.indentationDiff<4&&(t.indentation-=t.indentationDiff),t.list=null):t.list!==!1&&t.indentation>0?(t.list=null,t.listDepth=Math.floor(t.indentation/4)):t.list!==!1&&(t.list=!1,t.listDepth=0);var s=null;if(t.indentationDiff>=4)return t.indentation-=4,e.skipToEnd(),S;if(e.eatSpace())return null;if(s=e.match(U))return t.header=s[0].length<=6?s[0].length:6,r.highlightFormatting&&(t.formatting="header"),t.f=t.inline,d(t);if(t.prevLineHasContent&&(s=e.match(W)))return t.header="="==s[0].charAt(0)?1:2,r.highlightFormatting&&(t.formatting="header"),t.f=t.inline,d(t);if(e.eat(">"))return t.indentation++,t.quote=o?1:t.quote+1,r.highlightFormatting&&(t.formatting="quote"),e.eatSpace(),d(t);if("["===e.peek())return i(e,t,v);if(e.match(F,!0))return q;if((!t.prevLineHasContent||a)&&(e.match(H,!1)||e.match(N,!1))){var l=null;return e.match(H,!0)?l="ul":(e.match(N,!0),l="ol"),t.indentation+=4,t.list=!0,t.listDepth++,r.taskLists&&e.match(B,!1)&&(t.taskList=!0),t.f=t.inline,r.highlightFormatting&&(t.formatting=["list","list-"+l]),d(t)}return r.fencedCodeBlocks&&e.match(/^```[ \t]*([\w+#]*)/,!0)?(t.localMode=n(RegExp.$1),t.localMode&&(t.localState=t.localMode.startState()),t.f=t.block=c,r.highlightFormatting&&(t.formatting="code-block"),t.code=!0,d(t)):i(e,t,t.inline)}function l(e,t){var r=w.token(e,t.htmlState);return(k&&null===t.htmlState.tagStart&&!t.htmlState.context||t.md_inside&&e.current().indexOf(">")>-1)&&(t.f=m,t.block=s,t.htmlState=null),r}function c(e,t){return e.sol()&&e.match("```",!1)?(t.localMode=t.localState=null,t.f=t.block=u,null):t.localMode?t.localMode.token(e,t.localState):(e.skipToEnd(),S)}function u(e,t){e.match("```"),t.block=s,t.f=m,r.highlightFormatting&&(t.formatting="code-block"),t.code=!0;var n=d(t);return t.code=!1,n}function d(e){var t=[];if(e.formatting){t.push(z),"string"==typeof e.formatting&&(e.formatting=[e.formatting]);for(var n=0;n=e.quote?z+"-"+e.formatting[n]+"-"+e.quote:"error")}if(e.taskOpen)return t.push("meta"),t.length?t.join(" "):null;if(e.taskClosed)return t.push("property"),t.length?t.join(" "):null;if(e.linkHref)return t.push(A),t.length?t.join(" "):null;if(e.strong&&t.push(O),e.em&&t.push($),e.strikethrough&&t.push(R),e.linkText&&t.push(D),e.code&&t.push(S),e.header&&(t.push(C),t.push(C+"-"+e.header)),e.quote&&(t.push(T),t.push(!r.maxBlockquoteDepth||r.maxBlockquoteDepth>=e.quote?T+"-"+e.quote:T+"-"+r.maxBlockquoteDepth)),e.list!==!1){var i=(e.listDepth-1)%3;t.push(i?1===i?L:E:M)}return e.trailingSpaceNewLine?t.push("trailing-space-new-line"):e.trailingSpace&&t.push("trailing-space-"+(e.trailingSpace%2?"a":"b")),t.length?t.join(" "):null}function f(e,t){return e.match(V,!0)?d(t):void 0}function m(t,n){var i=n.text(t,n);if("undefined"!=typeof i)return i;if(n.list)return n.list=null,d(n);if(n.taskList){var a="x"!==t.match(B,!0)[1];return a?n.taskOpen=!0:n.taskClosed=!0,r.highlightFormatting&&(n.formatting="task"),n.taskList=!1,d(n)}if(n.taskOpen=!1,n.taskClosed=!1,n.header&&t.match(/^#+$/,!0))return r.highlightFormatting&&(n.formatting="header"),d(n);var s=t.sol(),c=t.next();if("\\"===c&&(t.next(),r.highlightFormatting)){var u=d(n);return u?u+" formatting-escape":"formatting-escape"}if(n.linkTitle){n.linkTitle=!1;var f=c;"("===c&&(f=")"),f=(f+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1");var m="^\\s*(?:[^"+f+"\\\\]+|\\\\\\\\|\\\\.)"+f;if(t.match(new RegExp(m),!0))return A}if("`"===c){var g=n.formatting;r.highlightFormatting&&(n.formatting="code");var v=d(n),b=t.pos;t.eatWhile("`");var y=1+t.pos-b;return n.code?y===_?(n.code=!1,v):(n.formatting=g,d(n)):(_=y,n.code=!0,d(n))}if(n.code)return d(n);if("!"===c&&t.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return t.match(/\[[^\]]*\]/),n.inline=n.f=p,j;if("["===c&&t.match(/.*\](\(.*\)| ?\[.*\])/,!1))return n.linkText=!0,r.highlightFormatting&&(n.formatting="link"),d(n);if("]"===c&&n.linkText&&t.match(/\(.*\)| ?\[.*\]/,!1)){r.highlightFormatting&&(n.formatting="link");var u=d(n);return n.linkText=!1,n.inline=n.f=p,u}if("<"===c&&t.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1)){n.f=n.inline=h,r.highlightFormatting&&(n.formatting="link");var u=d(n);return u?u+=" ":u="",u+I}if("<"===c&&t.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1)){n.f=n.inline=h,r.highlightFormatting&&(n.formatting="link");var u=d(n);return u?u+=" ":u="",u+P}if("<"===c&&t.match(/^\w/,!1)){if(-1!=t.string.indexOf(">")){var x=t.string.substring(1,t.string.indexOf(">"));/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(x)&&(n.md_inside=!0)}return t.backUp(1),n.htmlState=e.startState(w),o(t,n,l)}if("<"===c&&t.match(/^\/\w*?>/))return n.md_inside=!1,"tag";var k=!1;if(!r.underscoresBreakWords&&"_"===c&&"_"!==t.peek()&&t.match(/(\w)/,!1)){var C=t.pos-2;if(C>=0){var S=t.string.charAt(C);"_"!==S&&S.match(/(\w)/,!1)&&(k=!0)}}if("*"===c||"_"===c&&!k)if(s&&" "===t.peek());else{if(n.strong===c&&t.eat(c)){r.highlightFormatting&&(n.formatting="strong");var v=d(n);return n.strong=!1,v}if(!n.strong&&t.eat(c))return n.strong=c,r.highlightFormatting&&(n.formatting="strong"),d(n);if(n.em===c){r.highlightFormatting&&(n.formatting="em");var v=d(n);return n.em=!1,v}if(!n.em)return n.em=c,r.highlightFormatting&&(n.formatting="em"),d(n)}else if(" "===c&&(t.eat("*")||t.eat("_"))){if(" "===t.peek())return d(n);t.backUp(1)}if(r.strikethrough)if("~"===c&&t.eatWhile(c)){if(n.strikethrough){r.highlightFormatting&&(n.formatting="strikethrough");var v=d(n);return n.strikethrough=!1,v}if(t.match(/^[^\s]/,!1))return n.strikethrough=!0,r.highlightFormatting&&(n.formatting="strikethrough"),d(n)}else if(" "===c&&t.match(/^~~/,!0)){if(" "===t.peek())return d(n);t.backUp(2)}return" "===c&&(t.match(/ +$/,!1)?n.trailingSpace++:n.trailingSpace&&(n.trailingSpaceNewLine=!0)),d(n)}function h(e,t){var n=e.next();if(">"===n){t.f=t.inline=m,r.highlightFormatting&&(t.formatting="link");var i=d(t);return i?i+=" ":i="",i+I}return e.match(/^[^>]+/,!0),I}function p(e,t){if(e.eatSpace())return null;var n=e.next();return"("===n||"["===n?(t.f=t.inline=g("("===n?")":"]"),r.highlightFormatting&&(t.formatting="link-string"),t.linkHref=!0,d(t)):"error"}function g(e){return function(t,n){var i=t.next();if(i===e){n.f=n.inline=m,r.highlightFormatting&&(n.formatting="link-string");var o=d(n);return n.linkHref=!1,o}return t.match(x(e),!0)&&t.backUp(1),n.linkHref=!0,d(n)}}function v(e,t){return e.match(/^[^\]]*\]:/,!1)?(t.f=b,e.next(),r.highlightFormatting&&(t.formatting="link"),t.linkText=!0,d(t)):i(e,t,m)}function b(e,t){if(e.match(/^\]:/,!0)){t.f=t.inline=y,r.highlightFormatting&&(t.formatting="link");var n=d(t);return t.linkText=!1,n}return e.match(/^[^\]]+/,!0),D}function y(e,t){return e.eatSpace()?null:(e.match(/^[^\s]+/,!0),void 0===e.peek()?t.linkTitle=!0:e.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/,!0),t.f=t.inline=m,A)}function x(e){return K[e]||(e=(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),K[e]=new RegExp("^(?:[^\\\\]|\\\\.)*?("+e+")")),K[e]}var k=e.modes.hasOwnProperty("xml"),w=e.getMode(t,k?{name:"xml",htmlMode:!0}:"text/plain");void 0===r.highlightFormatting&&(r.highlightFormatting=!1),void 0===r.maxBlockquoteDepth&&(r.maxBlockquoteDepth=0),void 0===r.underscoresBreakWords&&(r.underscoresBreakWords=!0),void 0===r.fencedCodeBlocks&&(r.fencedCodeBlocks=!1),void 0===r.taskLists&&(r.taskLists=!1),void 0===r.strikethrough&&(r.strikethrough=!1);var _=0,C="header",S="comment",T="quote",M="variable-2",L="variable-3",E="keyword",q="hr",j="tag",z="formatting",I="link",P="link",D="link",A="string",$="em",O="strong",R="strikethrough",F=/^([*\-=_])(?:\s*\1){2,}\s*$/,H=/^[*\-+]\s+/,N=/^[0-9]+\.\s+/,B=/^\[(x| )\](?=\s)/,U=/^#+/,W=/^(?:\={1,}|-{1,})$/,V=/^[^#!\[\]*_\\<>` "'(~]+/,K=[],Z={startState:function(){return{f:s,prevLineHasContent:!1,thisLineHasContent:!1,block:s,htmlState:null,indentation:0,inline:m,text:f,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,em:!1,strong:!1,header:0,taskList:!1,list:!1,listDepth:0,quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1}},copyState:function(t){return{f:t.f,prevLineHasContent:t.prevLineHasContent,thisLineHasContent:t.thisLineHasContent,block:t.block,htmlState:t.htmlState&&e.copyState(w,t.htmlState),indentation:t.indentation,localMode:t.localMode,localState:t.localMode?e.copyState(t.localMode,t.localState):null,inline:t.inline,text:t.text,formatting:!1,linkTitle:t.linkTitle,em:t.em,strong:t.strong,strikethrough:t.strikethrough,header:t.header,taskList:t.taskList,list:t.list,listDepth:t.listDepth,quote:t.quote, +trailingSpace:t.trailingSpace,trailingSpaceNewLine:t.trailingSpaceNewLine,md_inside:t.md_inside}},token:function(e,t){if(t.formatting=!1,e.sol()){var r=!!t.header;if(t.header=0,e.match(/^\s*$/,!0)||r)return t.prevLineHasContent=!1,a(t),r?this.token(e,t):null;t.prevLineHasContent=t.thisLineHasContent,t.thisLineHasContent=!0,t.taskList=!1,t.code=!1,t.trailingSpace=0,t.trailingSpaceNewLine=!1,t.f=t.block;var n=e.match(/^\s*/,!0)[0].replace(/\t/g," ").length,i=4*Math.floor((n-t.indentation)/4);i>4&&(i=4);var o=t.indentation+i;if(t.indentationDiff=o-t.indentation,t.indentation=o,n>0)return null}return t.f(e,t)},innerMode:function(e){return e.block==l?{state:e.htmlState,mode:w}:e.localState?{state:e.localState,mode:e.localMode}:{state:e,mode:Z}},blankLine:a,getType:d,fold:"markdown"};return Z},"xml"),e.defineMIME("text/x-markdown","markdown")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("javascript",function(t, r){function n(e){for(var t,r=!1,n=!1; null!=(t=e.next());){if(!r){if("/"==t&&!n)return;"["==t?n=!0:n&&"]"==t&&(n=!1)}r=!r&&"\\"==t}}function i(e, t, r){return pe=e,ge=r,t}function o(e, t){var r=e.next();if('"'==r||"'"==r)return t.tokenize=a(r),t.tokenize(e,t);if("."==r&&e.match(/^\d+(?:[eE][+\-]?\d+)?/))return i("number","number");if("."==r&&e.match(".."))return i("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(r))return i(r);if("="==r&&e.eat(">"))return i("=>","operator");if("0"==r&&e.eat(/x/i))return e.eatWhile(/[\da-f]/i),i("number","number");if(/\d/.test(r))return e.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),i("number","number");if("/"==r)return e.eat("*")?(t.tokenize=s,s(e,t)):e.eat("/")?(e.skipToEnd(),i("comment","comment")):"operator"==t.lastType||"keyword c"==t.lastType||"sof"==t.lastType||/^[\[{}\(,;:]$/.test(t.lastType)?(n(e),e.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/),i("regexp","string-2")):(e.eatWhile(Ce),i("operator","operator",e.current()));if("`"==r)return t.tokenize=l,l(e,t);if("#"==r)return e.skipToEnd(),i("error","error");if(Ce.test(r))return e.eatWhile(Ce),i("operator","operator",e.current());if(we.test(r)){e.eatWhile(we);var o=e.current(),c=_e.propertyIsEnumerable(o)&&_e[o];return c&&"."!=t.lastType?i(c.type,c.style,o):i("variable","variable",o)}}function a(e){return function(t,r){var n,a=!1;if(ye&&"@"==t.peek()&&t.match(Se))return r.tokenize=o,i("jsonld-keyword","meta");for(;null!=(n=t.next())&&(n!=e||a);)a=!a&&"\\"==n;return a||(r.tokenize=o),i("string","string")}}function s(e,t){for(var r,n=!1;r=e.next();){if("/"==r&&n){t.tokenize=o;break}n="*"==r}return i("comment","comment")}function l(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&("`"==r||"$"==r&&e.eat("{"))){t.tokenize=o;break}n=!n&&"\\"==r}return i("quasi","string-2",e.current())}function c(e,t){t.fatArrowAt&&(t.fatArrowAt=null);var r=e.string.indexOf("=>",e.start);if(!(0>r)){for(var n=0,i=!1,o=r-1;o>=0;--o){var a=e.string.charAt(o),s=Te.indexOf(a);if(s>=0&&3>s){if(!n){++o;break}if(0==--n)break}else if(s>=3&&6>s)++n;else if(we.test(a))i=!0;else{if(/["'\/]/.test(a))return;if(i&&!n){++o;break}}}i&&!n&&(t.fatArrowAt=o)}}function u(e,t,r,n,i,o){this.indented=e,this.column=t,this.type=r,this.prev=i,this.info=o,null!=n&&(this.align=n)}function d(e,t){for(var r=e.localVars;r;r=r.next)if(r.name==t)return!0;for(var n=e.context;n;n=n.prev)for(var r=n.vars;r;r=r.next)if(r.name==t)return!0}function f(e,t,r,n,i){var o=e.cc;for(Le.state=e,Le.stream=i,Le.marked=null,Le.cc=o,Le.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;){var a=o.length?o.pop():xe?w:k;if(a(r,n)){for(;o.length&&o[o.length-1].lex;)o.pop()();return Le.marked?Le.marked:"variable"==r&&d(e,n)?"variable-2":t}}}function m(){for(var e=arguments.length-1;e>=0;e--)Le.cc.push(arguments[e])}function h(){return m.apply(null,arguments),!0}function p(e){function t(t){for(var r=t;r;r=r.next)if(r.name==e)return!0;return!1}var n=Le.state;if(n.context){if(Le.marked="def",t(n.localVars))return;n.localVars={name:e,next:n.localVars}}else{if(t(n.globalVars))return;r.globalVars&&(n.globalVars={name:e,next:n.globalVars})}}function g(){Le.state.context={prev:Le.state.context,vars:Le.state.localVars},Le.state.localVars=Ee}function v(){Le.state.localVars=Le.state.context.vars,Le.state.context=Le.state.context.prev}function b(e,t){var r=function(){var r=Le.state,n=r.indented;if("stat"==r.lexical.type)n=r.lexical.indented;else for(var i=r.lexical;i&&")"==i.type&&i.align;i=i.prev)n=i.indented;r.lexical=new u(n,Le.stream.column(),e,null,r.lexical,t)};return r.lex=!0,r}function y(){var e=Le.state;e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function x(e){function t(r){return r==e?h():";"==e?m():h(t)}return t}function k(e,t){return"var"==e?h(b("vardef",t.length),B,x(";"),y):"keyword a"==e?h(b("form"),w,k,y):"keyword b"==e?h(b("form"),k,y):"{"==e?h(b("}"),F,y):";"==e?h():"if"==e?("else"==Le.state.lexical.info&&Le.state.cc[Le.state.cc.length-1]==y&&Le.state.cc.pop()(),h(b("form"),w,k,y,Z)):"function"==e?h(ee):"for"==e?h(b("form"),G,k,y):"variable"==e?h(b("stat"),I):"switch"==e?h(b("form"),w,b("}","switch"),x("{"),F,y,y):"case"==e?h(w,x(":")):"default"==e?h(x(":")):"catch"==e?h(b("form"),g,x("("),te,x(")"),k,y,v):"module"==e?h(b("form"),g,ae,v,y):"class"==e?h(b("form"),re,y):"export"==e?h(b("form"),se,y):"import"==e?h(b("form"),le,y):m(b("stat"),w,x(";"),y)}function w(e){return C(e,!1)}function _(e){return C(e,!0)}function C(e,t){if(Le.state.fatArrowAt==Le.stream.start){var r=t?z:j;if("("==e)return h(g,b(")"),O(U,")"),y,x("=>"),r,v);if("variable"==e)return m(g,U,x("=>"),r,v)}var n=t?L:M;return Me.hasOwnProperty(e)?h(n):"function"==e?h(ee,n):"keyword c"==e?h(t?T:S):"("==e?h(b(")"),S,me,x(")"),y,n):"operator"==e||"spread"==e?h(t?_:w):"["==e?h(b("]"),de,y,n):"{"==e?R(D,"}",null,n):"quasi"==e?m(E,n):h()}function S(e){return e.match(/[;\}\)\],]/)?m():m(w)}function T(e){return e.match(/[;\}\)\],]/)?m():m(_)}function M(e,t){return","==e?h(w):L(e,t,!1)}function L(e,t,r){var n=0==r?M:L,i=0==r?w:_;return"=>"==e?h(g,r?z:j,v):"operator"==e?/\+\+|--/.test(t)?h(n):"?"==t?h(w,x(":"),i):h(i):"quasi"==e?m(E,n):";"!=e?"("==e?R(_,")","call",n):"."==e?h(P,n):"["==e?h(b("]"),S,x("]"),y,n):void 0:void 0}function E(e,t){return"quasi"!=e?m():"${"!=t.slice(t.length-2)?h(E):h(w,q)}function q(e){return"}"==e?(Le.marked="string-2",Le.state.tokenize=l,h(E)):void 0}function j(e){return c(Le.stream,Le.state),m("{"==e?k:w)}function z(e){return c(Le.stream,Le.state),m("{"==e?k:_)}function I(e){return":"==e?h(y,k):m(M,x(";"),y)}function P(e){return"variable"==e?(Le.marked="property",h()):void 0}function D(e,t){return"variable"==e||"keyword"==Le.style?(Le.marked="property",h("get"==t||"set"==t?A:$)):"number"==e||"string"==e?(Le.marked=ye?"property":Le.style+" property",h($)):"jsonld-keyword"==e?h($):"["==e?h(w,x("]"),$):void 0}function A(e){return"variable"!=e?m($):(Le.marked="property",h(ee))}function $(e){return":"==e?h(_):"("==e?m(ee):void 0}function O(e,t){function r(n){if(","==n){var i=Le.state.lexical;return"call"==i.info&&(i.pos=(i.pos||0)+1),h(e,r)}return n==t?h():h(x(t))}return function(n){return n==t?h():m(e,r)}}function R(e,t,r){for(var n=3;n!?|~^]/,Se=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,Te="([{}])",Me={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0,"jsonld-keyword":!0},Le={state:null,column:null,marked:null,cc:null},Ee={name:"this",next:{name:"arguments"}};return y.lex=!0,{startState:function(e){var t={tokenize:o,lastType:"sof",cc:[],lexical:new u((e||0)-ve,0,"block",!1),localVars:r.localVars,context:r.localVars&&{vars:r.localVars},indented:0};return r.globalVars&&"object"==typeof r.globalVars&&(t.globalVars=r.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),c(e,t)),t.tokenize!=s&&e.eatSpace())return null;var r=t.tokenize(e,t);return"comment"==pe?r:(t.lastType="operator"!=pe||"++"!=ge&&"--"!=ge?pe:"incdec",f(t,r,pe,ge,e))},indent:function(t,n){if(t.tokenize==s)return e.Pass;if(t.tokenize!=o)return 0;var i=n&&n.charAt(0),a=t.lexical;if(!/^\s*else\b/.test(n))for(var l=t.cc.length-1;l>=0;--l){var c=t.cc[l];if(c==y)a=a.prev;else if(c!=Z)break}"stat"==a.type&&"}"==i&&(a=a.prev),be&&")"==a.type&&"stat"==a.prev.type&&(a=a.prev);var u=a.type,d=i==u;return"vardef"==u?a.indented+("operator"==t.lastType||","==t.lastType?a.info+1:0):"form"==u&&"{"==i?a.indented:"form"==u?a.indented+ve:"stat"==u?a.indented+(he(t,n)?be||ve:0):"switch"!=a.info||d||0==r.doubleIndentSwitch?a.align?a.column+(d?0:1):a.indented+(d?0:ve):a.indented+(/^(?:case|default)\b/.test(n)?ve:2*ve)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:xe?null:"/*",blockCommentEnd:xe?null:"*/",lineComment:xe?null:"//",fold:"brace",helperType:xe?"json":"javascript",jsonldMode:ye,jsonMode:xe}}),e.registerHelper("wordChars","javascript",/[\w$]/),e.defineMIME("text/javascript","javascript"),e.defineMIME("text/ecmascript","javascript"),e.defineMIME("application/javascript","javascript"),e.defineMIME("application/x-javascript","javascript"),e.defineMIME("application/ecmascript","javascript"),e.defineMIME("application/json",{name:"javascript",json:!0}),e.defineMIME("application/x-json",{name:"javascript",json:!0}),e.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),e.defineMIME("text/typescript",{name:"javascript",typescript:!0}),e.defineMIME("application/typescript",{name:"javascript",typescript:!0})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css")):"function"==typeof define&&define.amd?define(["./lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("htmlmixed",function(t, r){function n(e, t){var r=t.htmlState.tagName;r&&(r=r.toLowerCase());var n=s.token(e,t.htmlState);if("script"==r&&/\btag\b/.test(n)&&">"==e.current()){var i=e.string.slice(Math.max(0,e.pos-100),e.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);i=i?i[1]:"",i&&/[\"\']/.test(i.charAt(0))&&(i=i.slice(1,i.length-1));for(var u=0; u"==e.current()&&(t.token=a,t.localMode=l,t.localState=l.startState(s.indent(t.htmlState,"")));return n}function i(e,t,r){var n,i=e.current(),o=i.search(t);return o>-1?e.backUp(i.length-o):(n=i.match(/<\/?$/))&&(e.backUp(i.length),e.match(t,!1)||e.match(i)),r}function o(e,t){return e.match(/^<\/\s*script\s*>/i,!1)?(t.token=n,t.localState=t.localMode=null,null):i(e,/<\/\s*script\s*>/,t.localMode.token(e,t.localState))}function a(e,t){return e.match(/^<\/\s*style\s*>/i,!1)?(t.token=n,t.localState=t.localMode=null,null):i(e,/<\/\s*style\s*>/,l.token(e,t.localState))}var s=e.getMode(t,{name:"xml",htmlMode:!0,multilineTagIndentFactor:r.multilineTagIndentFactor,multilineTagIndentPastTag:r.multilineTagIndentPastTag}),l=e.getMode(t,"css"),c=[],u=r&&r.scriptTypes;if(c.push({matches:/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,mode:e.getMode(t,"javascript")}),u)for(var d=0;d]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i)&&"]("!=e.string.slice(e.start-2,e.start)?(t.combineTokens=!0,"link"):(e.next(),null)},blankLine:n},a={underscoresBreakWords:!1,taskLists:!0,fencedCodeBlocks:!0,strikethrough:!0};for(var s in r)a[s]=r[s];return a.name="markdown",e.defineMIME("gfmBase",a),e.overlayMode(e.getMode(t,"gfmBase"),o)},"markdown")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("http",function(){function e(e, t){return e.skipToEnd(),t.cur=a,"error"}function t(t, n){return t.match(/^HTTP\/\d\.\d/)?(n.cur=r,"keyword"):t.match(/^[A-Z]+/)&&/[ \t]/.test(t.peek())?(n.cur=i,"keyword"):e(t,n)}function r(t, r){var i=t.match(/^\d+/);if(!i)return e(t,r);r.cur=n;var o=Number(i[0]);return o>=100&&200>o?"positive informational":o>=200&&300>o?"positive success":o>=300&&400>o?"positive redirect":o>=400&&500>o?"negative client-error":o>=500&&600>o?"negative server-error":"error"}function n(e,t){return e.skipToEnd(),t.cur=a,null}function i(e,t){return e.eatWhile(/\S/),t.cur=o,"string-2"}function o(t, r){return t.match(/^HTTP\/\d\.\d$/)?(r.cur=a,"keyword"):e(t,r)}function a(e){return e.sol()&&!e.eat(/[ \t]/)?e.match(/^.*?:/)?"atom":(e.skipToEnd(),"error"):(e.skipToEnd(),"string")}function s(e){return e.skipToEnd(),null}return{token:function(e, t){var r=t.cur;return r!=a&&r!=s&&e.eatSpace()?null:r(e,t)},blankLine:function(e){e.cur=s},startState:function(){return{cur:t}}}}),e.defineMIME("message/http","http")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("go",function(e){function t(e, t){var i=e.next();if('"'==i||"'"==i||"`"==i)return t.tokenize=r(i),t.tokenize(e,t);if(/[\d\.]/.test(i))return"."==i?e.match(/^[0-9]+([eE][\-+]?[0-9]+)?/):"0"==i?e.match(/^[xX][0-9a-fA-F]+/)||e.match(/^0[0-7]+/):e.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/),"number";if(/[\[\]{}\(\),;\:\.]/.test(i))return s=i,null;if("/"==i){if(e.eat("*"))return t.tokenize=n,n(e,t);if(e.eat("/"))return e.skipToEnd(),"comment"}if(d.test(i))return e.eatWhile(d),"operator";e.eatWhile(/[\w\$_\xa1-\uffff]/);var o=e.current();return c.propertyIsEnumerable(o)?(("case"==o||"default"==o)&&(s="case"),"keyword"):u.propertyIsEnumerable(o)?"atom":"variable"}function r(e){return function(r,n){for(var i,o=!1,a=!1;null!=(i=r.next());){if(i==e&&!o){a=!0;break}o=!o&&"\\"==i}return(a||!o&&"`"!=e)&&(n.tokenize=t),"string"}}function n(e,r){for(var n,i=!1;n=e.next();){if("/"==n&&i){r.tokenize=t;break}i="*"==n}return"comment"}function i(e,t,r,n,i){this.indented=e,this.column=t,this.type=r,this.align=n,this.prev=i}function o(e,t,r){return e.context=new i(e.indented,t,r,null,e.context)}function a(e){if(e.context.prev){var t=e.context.type;return(")"==t||"]"==t||"}"==t)&&(e.indented=e.context.indented),e.context=e.context.prev}}var s,l=e.indentUnit,c={"break":!0,"case":!0,chan:!0,"const":!0,"continue":!0,"default":!0,defer:!0,"else":!0,fallthrough:!0,"for":!0,func:!0,go:!0,"goto":!0,"if":!0,"import":!0,"interface":!0,map:!0,"package":!0,range:!0,"return":!0,select:!0,struct:!0,"switch":!0,type:!0,"var":!0,bool:!0,"byte":!0,complex64:!0,complex128:!0,float32:!0,float64:!0,int8:!0,int16:!0,int32:!0,int64:!0,string:!0,uint8:!0,uint16:!0,uint32:!0,uint64:!0,"int":!0,uint:!0,uintptr:!0},u={"true":!0,"false":!0,iota:!0,nil:!0,append:!0,cap:!0,close:!0,complex:!0,copy:!0,imag:!0,len:!0,make:!0,"new":!0,panic:!0,print:!0,println:!0,real:!0,recover:!0},d=/[+\-*&^%:=<>!|\/]/;return{startState:function(e){return{tokenize:null,context:new i((e||0)-l,0,"top",!1),indented:0,startOfLine:!0}},token:function(e,r){var n=r.context;if(e.sol()&&(null==n.align&&(n.align=!1),r.indented=e.indentation(),r.startOfLine=!0,"case"==n.type&&(n.type="}")),e.eatSpace())return null;s=null;var i=(r.tokenize||t)(e,r);return"comment"==i?i:(null==n.align&&(n.align=!0),"{"==s?o(r,e.column(),"}"):"["==s?o(r,e.column(),"]"):"("==s?o(r,e.column(),")"):"case"==s?n.type="case":"}"==s&&"}"==n.type?n=a(r):s==n.type&&a(r),r.startOfLine=!1,i)},indent:function(e, r){if(e.tokenize!=t&&null!=e.tokenize)return 0;var n=e.context,i=r&&r.charAt(0);if("case"==n.type&&/^(?:case|default)\b/.test(r))return e.context.type="}",n.indented;var o=i==n.type;return n.align?n.column+(o?0:1):n.indented+(o?0:l)},electricChars:"{}):",fold:"brace",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//"}}),e.defineMIME("text/x-go","go")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("../clike/clike")):"function"==typeof define&&define.amd?define(["./lib/codemirror","../clike/clike"],e):e(CodeMirror)}(function(e){"use strict";function t(e){for(var t={},r=0; rr&&"coffee"==t.scope.type?"indent":r>n?"dedent":null}r>0&&s(e,t)}if(e.eatSpace())return null;var a=e.peek();if(e.match("####"))return e.skipToEnd(),"comment";if(e.match("###"))return t.tokenize=o,t.tokenize(e,t);if("#"===a)return e.skipToEnd(),"comment";if(e.match(/^-?[0-9\.]/,!1)){var l=!1;if(e.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)&&(l=!0),e.match(/^-?\d+\.\d*/)&&(l=!0),e.match(/^-?\.\d+/)&&(l=!0),l)return"."==e.peek()&&e.backUp(1),"number";var p=!1;if(e.match(/^-?0x[0-9a-f]+/i)&&(p=!0),e.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)&&(p=!0),e.match(/^-?0(?![\dx])/i)&&(p=!0),p)return"number"}if(e.match(b))return t.tokenize=i(e.current(),!1,"string"),t.tokenize(e,t);if(e.match(y)){if("/"!=e.current()||e.match(/^.*\//,!1))return t.tokenize=i(e.current(),!0,"string-2"),t.tokenize(e,t);e.backUp(1)}return e.match(u)||e.match(h)?"operator":e.match(d)?"punctuation":e.match(k)?"atom":e.match(v)?"keyword":e.match(f)?"variable":e.match(m)?"property":(e.next(),c)}function i(e,r,i){return function(o,a){for(;!o.eol();)if(o.eatWhile(/[^'"\/\\]/),o.eat("\\")){if(o.next(),r&&o.eol())return i}else{if(o.match(e))return a.tokenize=n,i;o.eat(/['"\/]/)}return r&&(t.singleLineStringErrors?i=c:a.tokenize=n),i}}function o(e,t){for(;!e.eol();){if(e.eatWhile(/[^#]/),e.match("###")){t.tokenize=n;break}e.eatWhile("#")}return"comment"}function a(t,r,n){n=n||"coffee";for(var i=0,o=!1,a=null,s=r.scope;s;s=s.prev)if("coffee"===s.type||"}"==s.type){i=s.offset+e.indentUnit;break}"coffee"!==n?(o=null,a=t.column()+t.current().length):r.scope.align&&(r.scope.align=!1),r.scope={offset:i,type:n,prev:r.scope,align:o,alignOffset:a}}function s(e,t){if(t.scope.prev){if("coffee"===t.scope.type){for(var r=e.indentation(),n=!1,i=t.scope;i;i=i.prev)if(r===i.offset){n=!0;break}if(!n)return!0;for(;t.scope.prev&&t.scope.offset!==r;)t.scope=t.scope.prev;return!1}return t.scope=t.scope.prev,!1}}function l(e,t){var r=t.tokenize(e,t),n=e.current();if("."===n)return r=t.tokenize(e,t),n=e.current(),/^\.[\w$]+$/.test(n)?"variable":c;"return"===n&&(t.dedent=!0),("->"!==n&&"=>"!==n||t.lambda||e.peek())&&"indent"!==r||a(e,t);var i="[({".indexOf(n);if(-1!==i&&a(e,t,"])}".slice(i,i+1)),p.exec(n)&&a(e,t),"then"==n&&s(e,t),"dedent"===r&&s(e,t))return c;if(i="])}".indexOf(n),-1!==i){for(;"coffee"==t.scope.type&&t.scope.prev;)t.scope=t.scope.prev;t.scope.type==n&&(t.scope=t.scope.prev)}return t.dedent&&e.eol()&&("coffee"==t.scope.type&&t.scope.prev&&(t.scope=t.scope.prev),t.dedent=!1),r}var c="error",u=/^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/,d=/^(?:[()\[\]{},:`=;]|\.\.?\.?)/,f=/^[_A-Za-z$][_A-Za-z$0-9]*/,m=/^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*/,h=r(["and","or","not","is","isnt","in","instanceof","typeof"]),p=["for","while","loop","if","unless","else","switch","try","catch","finally","class"],g=["break","by","continue","debugger","delete","do","in","of","new","return","then","this","@","throw","when","until","extends"],v=r(p.concat(g));p=r(p);var b=/^('{3}|\"{3}|['\"])/,y=/^(\/{3}|\/)/,x=["Infinity","NaN","undefined","null","true","false","on","off","yes","no"],k=r(x),w={startState:function(e){return{tokenize:n,scope:{offset:e||0,type:"coffee",prev:null,align:!1},lastToken:null,lambda:!1,dedent:0}},token:function(e,t){var r=null===t.scope.align&&t.scope;r&&e.sol()&&(r.align=!1);var n=l(e,t);return r&&n&&"comment"!=n&&(r.align=!0),t.lastToken={style:n,content:e.current()},e.eol()&&e.lambda&&(t.lambda=!1),n},indent:function(e, t){if(e.tokenize!=n)return 0;var r=e.scope,i=t&&"])}".indexOf(t.charAt(0))>-1;if(i)for(; "coffee"==r.type&&r.prev;)r=r.prev;var o=i&&r.type===t.charAt(0);return r.align?r.alignOffset-(o?1:0):(o?r.prev:r).offset},lineComment:"#",fold:"indent"};return w}),e.defineMIME("text/x-coffeescript","coffeescript")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("nginx",function(e){function t(e){for(var t={},r=e.split(" "),n=0; n*\/]/.test(s)?r(null,"select-op"):/[;{}:\[\]]/.test(s)?r(null,s):(e.eatWhile(/[\w\\\-]/),r("variable","variable")):r(null,"compare"):void r(null,"compare")}function i(e,t){for(var i,o=!1;null!=(i=e.next());){if(o&&"/"==i){t.tokenize=n;break}o="*"==i}return r("comment","comment")}function o(e,t){for(var i,o=0;null!=(i=e.next());){if(o>=2&&">"==i){t.tokenize=n;break}o="-"==i?o+1:0}return r("comment","comment")}function a(e){return function(t,i){for(var o,a=!1;null!=(o=t.next())&&(o!=e||a);)a=!a&&"\\"==o;return a||(i.tokenize=n),r("string","string")}}var s,l=t("break return rewrite set 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_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types 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 degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect 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 rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk 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 thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark 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 worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23"),c=t("http mail events server types location upstream charset_map limit_except if geo map"),u=t("include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files"),d=e.indentUnit; + +return{startState:function(e){return{tokenize:n,baseIndent:e||0,stack:[]}},token:function(e,t){if(e.eatSpace())return null;s=null;var r=t.tokenize(e,t),n=t.stack[t.stack.length-1];return"hash"==s&&"rule"==n?r="atom":"variable"==r&&("rule"==n?r="number":n&&"@media{"!=n||(r="tag")),"rule"==n&&/^[\{\};]$/.test(s)&&t.stack.pop(),"{"==s?"@media"==n?t.stack[t.stack.length-1]="@media{":t.stack.push("{"):"}"==s?t.stack.pop():"@media"==s?t.stack.push("@media"):"{"==n&&"comment"!=s&&t.stack.push("rule"),r},indent:function(e,t){var r=e.stack.length;return/^\}/.test(t)&&(r-="rule"==e.stack[e.stack.length-1]?2:1),e.baseIndent+r*d},electricChars:"}"}}),e.defineMIME("text/nginx","text/x-nginx-conf")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e){return new RegExp("^(("+e.join(")|(")+"))\\b")}function r(e){return e.scopes[e.scopes.length-1]}var n=t(["and","or","not","is"]),i=["as","assert","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","lambda","pass","raise","return","try","while","with","yield","in"],o=["abs","all","any","bin","bool","bytearray","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip","__import__","NotImplemented","Ellipsis","__debug__"],a={builtins:["apply","basestring","buffer","cmp","coerce","execfile","file","intern","long","raw_input","reduce","reload","unichr","unicode","xrange","False","True","None"],keywords:["exec","print"]},s={builtins:["ascii","bytes","exec","print"],keywords:["nonlocal","False","True","None"]};e.registerHelper("hintWords","python",i.concat(o)),e.defineMode("python",function(l,c){function u(e,t){if(e.sol()&&"py"==r(t).type){var n=r(t).offset;if(e.eatSpace()){var i=e.indentation();return i>n?m(e,t,"py"):n>i&&h(e,t)&&(t.errorToken=!0),null}var o=d(e,t);return n>0&&h(e,t)&&(o+=" "+g),o}return d(e,t)}function d(e,t){if(e.eatSpace())return null;var r=e.peek();if("#"==r)return e.skipToEnd(),"comment";if(e.match(/^[0-9\.]/,!1)){var i=!1;if(e.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)&&(i=!0),e.match(/^\d+\.\d*/)&&(i=!0),e.match(/^\.\d+/)&&(i=!0),i)return e.eat(/J/i),"number";var o=!1;if(e.match(/^0x[0-9a-f]+/i)&&(o=!0),e.match(/^0b[01]+/i)&&(o=!0),e.match(/^0o[0-7]+/i)&&(o=!0),e.match(/^[1-9]\d*(e[\+\-]?\d+)?/)&&(e.eat(/J/i),o=!0),e.match(/^0(?![\dx])/i)&&(o=!0),o)return e.eat(/L/i),"number"}return e.match(T)?(t.tokenize=f(e.current()),t.tokenize(e,t)):e.match(x)||e.match(y)?null:e.match(b)||e.match(k)||e.match(n)?"operator":e.match(v)?null:e.match(M)?"keyword":e.match(L)?"builtin":e.match(/^(self|cls)\b/)?"variable-2":e.match(w)?"def"==t.lastToken||"class"==t.lastToken?"def":"variable":(e.next(),g)}function f(e){function t(t,i){for(;!t.eol();)if(t.eatWhile(/[^'"\\]/),t.eat("\\")){if(t.next(),r&&t.eol())return n}else{if(t.match(e))return i.tokenize=u,n;t.eat(/['"]/)}if(r){if(c.singleLineStringErrors)return g;i.tokenize=u}return n}for(;"rub".indexOf(e.charAt(0).toLowerCase())>=0;)e=e.substr(1);var r=1==e.length,n="string";return t.isString=!0,t}function m(e,t,n){var i=0,o=null;if("py"==n)for(;"py"!=r(t).type;)t.scopes.pop();i=r(t).offset+("py"==n?l.indentUnit:_),"py"==n||e.match(/^(\s|#.*)*$/,!1)||(o=e.column()+1),t.scopes.push({offset:i,type:n,align:o})}function h(e,t){for(var n=e.indentation();r(t).offset>n;){if("py"!=r(t).type)return!0;t.scopes.pop()}return r(t).offset!=n}function p(e,t){var n=t.tokenize(e,t),i=e.current();if("."==i)return n=e.match(w,!1)?null:g,null==n&&"meta"==t.lastStyle&&(n="meta"),n;if("@"==i)return c.version&&3==parseInt(c.version,10)?e.match(w,!1)?"meta":"operator":e.match(w,!1)?"meta":g;"variable"!=n&&"builtin"!=n||"meta"!=t.lastStyle||(n="meta"),("pass"==i||"return"==i)&&(t.dedent+=1),"lambda"==i&&(t.lambda=!0),":"!=i||t.lambda||"py"!=r(t).type||m(e,t,"py");var o=1==i.length?"[({".indexOf(i):-1;if(-1!=o&&m(e,t,"])}".slice(o,o+1)),o="])}".indexOf(i),-1!=o){if(r(t).type!=i)return g;t.scopes.pop()}return t.dedent>0&&e.eol()&&"py"==r(t).type&&(t.scopes.length>1&&t.scopes.pop(),t.dedent-=1),n}var g="error",v=c.singleDelimiters||new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"),b=c.doubleOperators||new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"),y=c.doubleDelimiters||new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"),x=c.tripleDelimiters||new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");if(c.version&&3==parseInt(c.version,10))var k=c.singleOperators||new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]"),w=c.identifiers||new RegExp("^[_A-Za-z¡-￿][_A-Za-z0-9¡-￿]*");else var k=c.singleOperators||new RegExp("^[\\+\\-\\*/%&|\\^~<>!]"),w=c.identifiers||new RegExp("^[_A-Za-z][_A-Za-z0-9]*");var _=c.hangingIndent||l.indentUnit,C=i,S=o;if(void 0!=c.extra_keywords&&(C=C.concat(c.extra_keywords)),void 0!=c.extra_builtins&&(S=S.concat(c.extra_builtins)),c.version&&3==parseInt(c.version,10)){C=C.concat(s.keywords),S=S.concat(s.builtins);var T=new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))","i")}else{C=C.concat(a.keywords),S=S.concat(a.builtins);var T=new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))","i")}var M=t(C),L=t(S),E={startState:function(e){return{tokenize:u,scopes:[{offset:e||0,type:"py",align:null}],lastStyle:null,lastToken:null,lambda:!1,dedent:0}},token:function(e,t){var r=t.errorToken;r&&(t.errorToken=!1);var n=p(e,t);t.lastStyle=n;var i=e.current();return i&&n&&(t.lastToken=i),e.eol()&&t.lambda&&(t.lambda=!1),r?n+" "+g:n},indent:function(t,n){if(t.tokenize!=u)return t.tokenize.isString?e.Pass:0;var i=r(t),o=n&&n.charAt(0)==i.type;return null!=i.align?i.align-(o?1:0):o&&t.scopes.length>1?t.scopes[t.scopes.length-2].offset:i.offset},lineComment:"#",fold:"indent"};return E}),e.defineMIME("text/x-python","python");var l=function(e){return e.split(" ")};e.defineMIME("text/x-cython",{name:"python",extra_keywords:l("by cdef cimport cpdef ctypedef enum exceptextern gil include nogil property publicreadonly struct union DEF IF ELIF ELSE")})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e, t){return e.string.charAt(e.pos+(t||0))}function r(e, t){if(t){var r=e.pos-t;return e.string.substr(r>=0?r:0,t)}return e.string.substr(0,e.pos-1)}function n(e, t){var r=e.string.length,n=r-e.pos+1;return e.string.substr(e.pos,t&&r>t?t:n)}function i(e, t){var r,n=e.pos+t;0>=n?e.pos=0:n>=(r=e.string.length-1)?e.pos=r:e.pos=n}e.defineMode("perl",function(){function e(e, t, r, n, i){return t.chain=null,t.style=null,t.tail=null,t.tokenize=function(e, t){for(var o,s=!1,l=0;o=e.next();){if(o===r[l]&&!s)return void 0!==r[++l]?(t.chain=r[l],t.style=n,t.tail=i):i&&e.eatWhile(i),t.tokenize=a,n;s=!s&&"\\"==o}return n},t.tokenize(e,t)}function o(e,t,r){return t.tokenize=function(e,t){return e.string==r&&(t.tokenize=a),e.skipToEnd(),"string"},t.tokenize(e,t)}function a(a,u){if(a.eatSpace())return null;if(u.chain)return e(a,u,u.chain,u.style,u.tail);if(a.match(/^\-?[\d\.]/,!1)&&a.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))return"number";if(a.match(/^<<(?=\w)/))return a.eatWhile(/\w/),o(a,u,a.current().substr(2));if(a.sol()&&a.match(/^\=item(?!\w)/))return o(a,u,"=cut");var d=a.next();if('"'==d||"'"==d){if(r(a,3)=="<<"+d){var f=a.pos;a.eatWhile(/\w/);var m=a.current().substr(1);if(m&&a.eat(d))return o(a,u,m);a.pos=f}return e(a,u,[d],"string")}if("q"==d){var h=t(a,-2);if(!h||!/\w/.test(h))if(h=t(a,0),"x"==h){if(h=t(a,1),"("==h)return i(a,2),e(a,u,[")"],l,c);if("["==h)return i(a,2),e(a,u,["]"],l,c);if("{"==h)return i(a,2),e(a,u,["}"],l,c);if("<"==h)return i(a,2),e(a,u,[">"],l,c);if(/[\^'"!~\/]/.test(h))return i(a,1),e(a,u,[a.eat(h)],l,c)}else if("q"==h){if(h=t(a,1),"("==h)return i(a,2),e(a,u,[")"],"string");if("["==h)return i(a,2),e(a,u,["]"],"string");if("{"==h)return i(a,2),e(a,u,["}"],"string");if("<"==h)return i(a,2),e(a,u,[">"],"string");if(/[\^'"!~\/]/.test(h))return i(a,1),e(a,u,[a.eat(h)],"string")}else if("w"==h){if(h=t(a,1),"("==h)return i(a,2),e(a,u,[")"],"bracket");if("["==h)return i(a,2),e(a,u,["]"],"bracket");if("{"==h)return i(a,2),e(a,u,["}"],"bracket");if("<"==h)return i(a,2),e(a,u,[">"],"bracket");if(/[\^'"!~\/]/.test(h))return i(a,1),e(a,u,[a.eat(h)],"bracket")}else if("r"==h){if(h=t(a,1),"("==h)return i(a,2),e(a,u,[")"],l,c);if("["==h)return i(a,2),e(a,u,["]"],l,c);if("{"==h)return i(a,2),e(a,u,["}"],l,c);if("<"==h)return i(a,2),e(a,u,[">"],l,c);if(/[\^'"!~\/]/.test(h))return i(a,1),e(a,u,[a.eat(h)],l,c)}else if(/[\^'"!~\/(\[{<]/.test(h)){if("("==h)return i(a,1),e(a,u,[")"],"string");if("["==h)return i(a,1),e(a,u,["]"],"string");if("{"==h)return i(a,1),e(a,u,["}"],"string");if("<"==h)return i(a,1),e(a,u,[">"],"string");if(/[\^'"!~\/]/.test(h))return e(a,u,[a.eat(h)],"string")}}if("m"==d){var h=t(a,-2);if((!h||!/\w/.test(h))&&(h=a.eat(/[(\[{<\^'"!~\/]/))){if(/[\^'"!~\/]/.test(h))return e(a,u,[h],l,c);if("("==h)return e(a,u,[")"],l,c);if("["==h)return e(a,u,["]"],l,c);if("{"==h)return e(a,u,["}"],l,c);if("<"==h)return e(a,u,[">"],l,c)}}if("s"==d){var h=/[\/>\]})\w]/.test(t(a,-2));if(!h&&(h=a.eat(/[(\[{<\^'"!~\/]/)))return"["==h?e(a,u,["]","]"],l,c):"{"==h?e(a,u,["}","}"],l,c):"<"==h?e(a,u,[">",">"],l,c):"("==h?e(a,u,[")",")"],l,c):e(a,u,[h,h],l,c)}if("y"==d){var h=/[\/>\]})\w]/.test(t(a,-2));if(!h&&(h=a.eat(/[(\[{<\^'"!~\/]/)))return"["==h?e(a,u,["]","]"],l,c):"{"==h?e(a,u,["}","}"],l,c):"<"==h?e(a,u,[">",">"],l,c):"("==h?e(a,u,[")",")"],l,c):e(a,u,[h,h],l,c)}if("t"==d){var h=/[\/>\]})\w]/.test(t(a,-2));if(!h&&(h=a.eat("r"),h&&(h=a.eat(/[(\[{<\^'"!~\/]/))))return"["==h?e(a,u,["]","]"],l,c):"{"==h?e(a,u,["}","}"],l,c):"<"==h?e(a,u,[">",">"],l,c):"("==h?e(a,u,[")",")"],l,c):e(a,u,[h,h],l,c)}if("`"==d)return e(a,u,[d],"variable-2");if("/"==d)return/~\s*$/.test(r(a))?e(a,u,[d],l,c):"operator";if("$"==d){var f=a.pos;if(a.eatWhile(/\d/)||a.eat("{")&&a.eatWhile(/\d/)&&a.eat("}"))return"variable-2";a.pos=f}if(/[$@%]/.test(d)){var f=a.pos;if(a.eat("^")&&a.eat(/[A-Z]/)||!/[@$%&]/.test(t(a,-2))&&a.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){var h=a.current();if(s[h])return"variable-2"}a.pos=f}if(/[$@%&]/.test(d)&&(a.eatWhile(/[\w$\[\]]/)||a.eat("{")&&a.eatWhile(/[\w$\[\]]/)&&a.eat("}"))){var h=a.current();return s[h]?"variable-2":"variable"}if("#"==d&&"$"!=t(a,-2))return a.skipToEnd(),"comment";if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(d)){var f=a.pos;if(a.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/),s[a.current()])return"operator";a.pos=f}if("_"==d&&1==a.pos){if("_END__"==n(a,6))return e(a,u,["\x00"],"comment");if("_DATA__"==n(a,7))return e(a,u,["\x00"],"variable-2");if("_C__"==n(a,7))return e(a,u,["\x00"],"string")}if(/\w/.test(d)){var f=a.pos;if("{"==t(a,-2)&&("}"==t(a,0)||a.eatWhile(/\w/)&&"}"==t(a,0)))return"string";a.pos=f}if(/[A-Z]/.test(d)){var p=t(a,-2),f=a.pos;if(a.eatWhile(/[A-Z_]/),!/[\da-z]/.test(t(a,0))){var h=s[a.current()];return h?(h[1]&&(h=h[0]),":"!=p?1==h?"keyword":2==h?"def":3==h?"atom":4==h?"operator":5==h?"variable-2":"meta":"meta"):"meta"}a.pos=f}if(/[a-zA-Z_]/.test(d)){var p=t(a,-2);a.eatWhile(/\w/);var h=s[a.current()];return h?(h[1]&&(h=h[0]),":"!=p?1==h?"keyword":2==h?"def":3==h?"atom":4==h?"operator":5==h?"variable-2":"meta":"meta"):"meta"}return null}var s={"->":4,"++":4,"--":4,"**":4,"=~":4,"!~":4,"*":4,"/":4,"%":4,x:4,"+":4,"-":4,".":4,"<<":4,">>":4,"<":4,">":4,"<=":4,">=":4,lt:4,gt:4,le:4,ge:4,"==":4,"!=":4,"<=>":4,eq:4,ne:4,cmp:4,"~~":4,"&":4,"|":4,"^":4,"&&":4,"||":4,"//":4,"..":4,"...":4,"?":4,":":4,"=":4,"+=":4,"-=":4,"*=":4,",":4,"=>":4,"::":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,"@ARG":5,"@_":5,$LIST_SEPARATOR:5,'$"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,"$(":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,"$)":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,"$;":5,$REAL_USER_ID:5,$UID:5,"$<":5,$EFFECTIVE_USER_ID:5,$EUID:5,"$>":5,$a:5,$b:5,$COMPILING:5,"$^C":5,$DEBUGGING:5,"$^D":5,"${^ENCODING}":5,$ENV:5,"%ENV":5,$SYSTEM_FD_MAX:5,"$^F":5,"@F":5,"${^GLOBAL_PHASE}":5,"$^H":5,"%^H":5,"@INC":5,"%INC":5,$INPLACE_EDIT:5,"$^I":5,"$^M":5,$OSNAME:5,"$^O":5,"${^OPEN}":5,$PERLDB:5,"$^P":5,$SIG:5,"%SIG":5,$BASETIME:5,"$^T":5,"${^TAINT}":5,"${^UNICODE}":5,"${^UTF8CACHE}":5,"${^UTF8LOCALE}":5,$PERL_VERSION:5,"$^V":5,"${^WIN32_SLOPPY_STAT}":5,$EXECUTABLE_NAME:5,"$^X":5,$1:5,$MATCH:5,"$&":5,"${^MATCH}":5,$PREMATCH:5,"$`":5,"${^PREMATCH}":5,$POSTMATCH:5,"$'":5,"${^POSTMATCH}":5,$LAST_PAREN_MATCH:5,"$+":5,$LAST_SUBMATCH_RESULT:5,"$^N":5,"@LAST_MATCH_END":5,"@+":5,"%LAST_PAREN_MATCH":5,"%+":5,"@LAST_MATCH_START":5,"@-":5,"%LAST_MATCH_START":5,"%-":5,$LAST_REGEXP_CODE_RESULT:5,"$^R":5,"${^RE_DEBUG_FLAGS}":5,"${^RE_TRIE_MAXBUF}":5,$ARGV:5,"@ARGV":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,"$,":5,$INPUT_LINE_NUMBER:5,$NR:5,"$.":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,"$/":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,"$\\":5,$OUTPUT_AUTOFLUSH:5,"$|":5,$ACCUMULATOR:5,"$^A":5,$FORMAT_FORMFEED:5,"$^L":5,$FORMAT_PAGE_NUMBER:5,"$%":5,$FORMAT_LINES_LEFT:5,"$-":5,$FORMAT_LINE_BREAK_CHARACTERS:5,"$:":5,$FORMAT_LINES_PER_PAGE:5,"$=":5,$FORMAT_TOP_NAME:5,"$^":5,$FORMAT_NAME:5,"$~":5,"${^CHILD_ERROR_NATIVE}":5,$EXTENDED_OS_ERROR:5,"$^E":5,$EXCEPTIONS_BEING_CAUGHT:5,"$^S":5,$WARNING:5,"$^W":5,"${^WARNING_BITS}":5,$OS_ERROR:5,$ERRNO:5,"$!":5,"%OS_ERROR":5,"%ERRNO":5,"%!":5,$CHILD_ERROR:5,"$?":5,$EVAL_ERROR:5,"$@":5,$OFMT:5,"$#":5,"$*":5,$ARRAY_BASE:5,"$[":5,$OLD_PERL_VERSION:5,"$]":5,"if":[1,1],elsif:[1,1],"else":[1,1],"while":[1,1],unless:[1,1],"for":[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,bootstrap:1,"break":1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,"continue":[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,"default":1,defined:1,"delete":1,die:1,"do":1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,getnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,"goto":1,grep:1,hex:1,"import":1,index:1,"int":1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,"new":1,next:1,no:1,oct:1,open:1,opendir:1,ord:1,our:2,pack:1,"package":1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,"return":1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,shift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,y:null},l="string-2",c=/[goseximacplud]/;return{startState:function(){return{tokenize:a,chain:null,style:null,tail:null}},token:function(e, t){return(t.tokenize||a)(e,t)},lineComment:"#"}}),e.registerHelper("wordChars","perl",/[\w$]/),e.defineMIME("text/x-perl","perl")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("lua",function(e, t){function r(e){return new RegExp("^(?:"+e.join("|")+")","i")}function n(e){return new RegExp("^(?:"+e.join("|")+")$","i")}function i(e){for(var t=0; e.eat("=");)++t;return e.eat("["),t}function o(e, t){var r=e.next();return"-"==r&&e.eat("-")?e.eat("[")&&e.eat("[")?(t.cur=a(i(e),"comment"))(e,t):(e.skipToEnd(),"comment"):'"'==r||"'"==r?(t.cur=s(r))(e,t):"["==r&&/[\[=]/.test(e.peek())?(t.cur=a(i(e),"string"))(e,t):/\d/.test(r)?(e.eatWhile(/[\w.%]/),"number"):/[\w_]/.test(r)?(e.eatWhile(/[\w\\\-_.]/),"variable"):null}function a(e,t){return function(r,n){for(var i,a=null;null!=(i=r.next());)if(null==a)"]"==i&&(a=0);else if("="==i)++a;else{if("]"==i&&a==e){n.cur=o;break}a=null}return t}}function s(e){return function(t,r){for(var n,i=!1;null!=(n=t.next())&&(n!=e||i);)i=!i&&"\\"==n;return i||(r.cur=o),"string"}}var l=e.indentUnit,c=n(t.specials||[]),u=n(["_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load","loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require","select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall","coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield","debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable","debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable","debug.setupvalue","debug.traceback","close","flush","lines","read","seek","setvbuf","write","io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin","io.stdout","io.tmpfile","io.type","io.write","math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg","math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max","math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh","math.sqrt","math.tan","math.tanh","os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale","os.time","os.tmpname","package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload","package.seeall","string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub","string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper","table.concat","table.insert","table.maxn","table.remove","table.sort"]),d=n(["and","break","elseif","false","nil","not","or","return","true","function","end","if","then","else","do","while","repeat","until","for","in","local"]),f=n(["function","if","repeat","do","\\(","{"]),m=n(["end","until","\\)","}"]),h=r(["end","until","\\)","}","else","elseif"]);return{startState:function(e){return{basecol:e||0,indentDepth:0,cur:o}},token:function(e, t){if(e.eatSpace())return null;var r=t.cur(e,t),n=e.current();return"variable"==r&&(d.test(n)?r="keyword":u.test(n)?r="builtin":c.test(n)&&(r="variable-2")),"comment"!=r&&"string"!=r&&(f.test(n)?++t.indentDepth:m.test(n)&&--t.indentDepth),r},indent:function(e, t){var r=h.test(t);return e.basecol+l*(e.indentDepth-(r?1:0))},lineComment:"--",blockCommentStart:"--[[",blockCommentEnd:"]]"}}),e.defineMIME("text/x-lua","lua")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("r",function(e){function t(e){for(var t=e.split(" "),r={},n=0; n=!&|~$:]/;return{startState:function(){return{tokenize:r,ctx:{type:"top",indent:-e.indentUnit,align:!1},indent:0,afterIdent:!1}},token:function(e,t){if(e.sol()&&(null==t.ctx.align&&(t.ctx.align=!1),t.indent=e.indentation()),e.eatSpace())return null;var r=t.tokenize(e,t);"comment"!=r&&null==t.ctx.align&&(t.ctx.align=!0);var n=t.ctx.type;return";"!=a&&"{"!=a&&"}"!=a||"block"!=n||o(t),"{"==a?i(t,"}",e):"("==a?(i(t,")",e),t.afterIdent&&(t.ctx.argList=!0)):"["==a?i(t,"]",e):"block"==a?i(t,"block",e):a==n&&o(t),t.afterIdent="variable"==r||"keyword"==r,r},indent:function(t, n){if(t.tokenize!=r)return 0;var i=n&&n.charAt(0),o=t.ctx,a=i==o.type;return"block"==o.type?o.indent+("{"==i?0:e.indentUnit):o.align?o.column+(a?0:1):o.indent+(a?0:e.indentUnit)},lineComment:"#"}}),e.defineMIME("text/x-rsrc","r")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("ruby",function(e){function t(e){for(var t={},r=0,n=e.length; n>r; ++r)t[e[r]]=!0;return t}function r(e, t, r){return r.tokenize.push(e),e(t,r)}function n(e, t){if(c=null,e.sol()&&e.match("=begin")&&e.eol())return t.tokenize.push(l),"comment";if(e.eatSpace())return null;var n,i=e.next();if("`"==i||"'"==i||'"'==i)return r(a(i,"string",'"'==i||"`"==i),e,t);if("/"==i){var o=e.current().length;if(e.skipTo("/")){var u=e.current().length;e.backUp(e.current().length-o);for(var d=0;e.current().lengthd)break}if(e.backUp(e.current().length-o),0==d)return r(a(i,"string-2",!0),e,t)}return"operator"}if("%"==i){var h="string",p=!0;e.eat("s")?h="atom":e.eat(/[WQ]/)?h="string":e.eat(/[r]/)?h="string-2":e.eat(/[wxq]/)&&(h="string",p=!1);var g=e.eat(/[^\w\s=]/);return g?(m.propertyIsEnumerable(g)&&(g=m[g]),r(a(g,h,p,!0),e,t)):"operator"}if("#"==i)return e.skipToEnd(),"comment";if("<"==i&&(n=e.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/)))return r(s(n[1]),e,t);if("0"==i)return e.eatWhile(e.eat("x")?/[\da-fA-F]/:e.eat("b")?/[01]/:/[0-7]/),"number";if(/\d/.test(i))return e.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/),"number";if("?"==i){for(;e.match(/^\\[CM]-/););return e.eat("\\")?e.eatWhile(/\w/):e.next(),"string"}if(":"==i)return e.eat("'")?r(a("'","atom",!1),e,t):e.eat('"')?r(a('"',"atom",!0),e,t):e.eat(/[\<\>]/)?(e.eat(/[\<\>]/),"atom"):e.eat(/[\+\-\*\/\&\|\:\!]/)?"atom":e.eat(/[a-zA-Z$@_\xa1-\uffff]/)?(e.eatWhile(/[\w$\xa1-\uffff]/),e.eat(/[\?\!\=]/),"atom"):"operator";if("@"==i&&e.match(/^@?[a-zA-Z_\xa1-\uffff]/))return e.eat("@"),e.eatWhile(/[\w\xa1-\uffff]/),"variable-2";if("$"==i)return e.eat(/[a-zA-Z_]/)?e.eatWhile(/[\w]/):e.eat(/\d/)?e.eat(/\d/):e.next(),"variable-3";if(/[a-zA-Z_\xa1-\uffff]/.test(i))return e.eatWhile(/[\w\xa1-\uffff]/),e.eat(/[\?\!]/),e.eat(":")?"atom":"ident";if("|"!=i||!t.varList&&"{"!=t.lastTok&&"do"!=t.lastTok){if(/[\(\)\[\]{}\\;]/.test(i))return c=i,null;if("-"==i&&e.eat(">"))return"arrow";if(/[=+\-\/*:\.^%<>~|]/.test(i)){var v=e.eatWhile(/[=+\-\/*:\.^%<>~|]/);return"."!=i||v||(c="."),"operator"}return null}return c="|",null}function i(e){return e||(e=1),function(t,r){if("}"==t.peek()){if(1==e)return r.tokenize.pop(),r.tokenize[r.tokenize.length-1](t,r);r.tokenize[r.tokenize.length-1]=i(e-1)}else"{"==t.peek()&&(r.tokenize[r.tokenize.length-1]=i(e+1));return n(t,r)}}function o(){var e=!1;return function(t,r){return e?(r.tokenize.pop(),r.tokenize[r.tokenize.length-1](t,r)):(e=!0,n(t,r))}}function a(e,t,r,n){return function(a,s){var l,c=!1;for("read-quoted-paused"===s.context.type&&(s.context=s.context.prev,a.eat("}"));null!=(l=a.next());){if(l==e&&(n||!c)){s.tokenize.pop();break}if(r&&"#"==l&&!c){if(a.eat("{")){"}"==e&&(s.context={prev:s.context,type:"read-quoted-paused"}),s.tokenize.push(i());break}if(/[@\$]/.test(a.peek())){s.tokenize.push(o());break}}c=!c&&"\\"==l}return t}}function s(e){return function(t,r){return t.match(e)?r.tokenize.pop():t.skipToEnd(),"string"}}function l(e,t){return e.sol()&&e.match("=end")&&e.eol()&&t.tokenize.pop(),e.skipToEnd(),"comment"}var c,u=t(["alias","and","BEGIN","begin","break","case","class","def","defined?","do","else","elsif","END","end","ensure","false","for","if","in","module","next","not","or","redo","rescue","retry","return","self","super","then","true","undef","unless","until","when","while","yield","nil","raise","throw","catch","fail","loop","callcc","caller","lambda","proc","public","protected","private","require","load","require_relative","extend","autoload","__END__","__FILE__","__LINE__","__dir__"]),d=t(["def","class","case","for","while","module","then","catch","loop","proc","begin"]),f=t(["end","until"]),m={"[":"]","{":"}","(":")"};return{startState:function(){return{tokenize:[n],indented:0,context:{type:"top",indented:-e.indentUnit},continuedLine:!1,lastTok:null,varList:!1}},token:function(e,t){e.sol()&&(t.indented=e.indentation());var r,n=t.tokenize[t.tokenize.length-1](e,t),i=c;if("ident"==n){var o=e.current();n="."==t.lastTok?"property":u.propertyIsEnumerable(e.current())?"keyword":/^[A-Z]/.test(o)?"tag":"def"==t.lastTok||"class"==t.lastTok||t.varList?"def":"variable","keyword"==n&&(i=o,d.propertyIsEnumerable(o)?r="indent":f.propertyIsEnumerable(o)?r="dedent":"if"!=o&&"unless"!=o||e.column()!=e.indentation()?"do"==o&&t.context.indented\\?]*[^\\W_])?)",y=new RegExp(r("^{0}",b)),x="(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\./:;<=>\\?]*[^\\W_])?)",k=r("(?:{0}|`{1}`)",b,x),w="(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)",_="(?:[^\\`]+)",C=new RegExp(r("^{0}",_)),S=new RegExp("^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"),T=new RegExp(r("^\\.\\.{0}",p)),M=new RegExp(r("^_{0}:{1}|^__:{1}",k,g)),L=new RegExp(r("^{0}::{1}",k,g)),E=new RegExp(r("^\\|{0}\\|{1}{2}::{3}",w,p,k,g)),q=new RegExp(r("^\\[(?:\\d+|#{0}?|\\*)]{1}",k,g)),j=new RegExp(r("^\\[{0}\\]{1}",k,g)),z=new RegExp(r("^\\|{0}\\|",w)),I=new RegExp(r("^\\[(?:\\d+|#{0}?|\\*)]_",k)),P=new RegExp(r("^\\[{0}\\]_",k)),D=new RegExp(r("^{0}__?",k)),A=new RegExp(r("^`{0}`_",_)),$=new RegExp(r("^:{0}:`{1}`{2}",b,_,g)),O=new RegExp(r("^`{1}`:{0}:{2}",b,_,g)),R=new RegExp(r("^:{0}:{1}",b,g)),F=new RegExp(r("^{0}",k)),H=new RegExp(r("^::{0}",g)),N=new RegExp(r("^\\|{0}\\|",w)),B=new RegExp(r("^{0}",p)),U=new RegExp(r("^{0}",k)),W=new RegExp(r("^::{0}",g)),V=new RegExp("^_"),K=new RegExp(r("^{0}|_",k)),Z=new RegExp(r("^:{0}",g)),G=new RegExp("^::\\s*$"),X=new RegExp("^\\s+(?:>>>|In \\[\\d+\\]:)\\s");return{startState:function(){return{tok:n,ctx:c(void 0,0)}},copyState:function(t){var r=t.ctx,n=t.tmp;return r.local&&(r={mode:r.mode,local:e.copyState(r.mode,r.local)}),n&&(n={mode:n.mode,local:e.copyState(n.mode,n.local)}),{tok:t.tok,ctx:r,tmp:n}},innerMode:function(e){return e.tmp?{state:e.tmp.local,mode:e.tmp.mode}:e.ctx.mode?{state:e.ctx.local,mode:e.ctx.mode}:null},token:function(e,t){return t.tok(e,t)}}},"python","stex"),e.defineMIME("text/x-rst","rst")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("../htmlmixed/htmlmixed"),require("../smarty/smarty")):"function"==typeof define&&define.amd?define(["./lib/codemirror","../htmlmixed/htmlmixed","../smarty/smarty"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("smartymixed",function(t){function r(e){return e.replace(/[^\s\w]/g,"\\$&")}var n=e.getMode(t,"htmlmixed"),i=e.getMode(t,"smarty"),o={rightDelimiter:"}",leftDelimiter:"{"};t.hasOwnProperty("leftDelimiter")&&(o.leftDelimiter=t.leftDelimiter),t.hasOwnProperty("rightDelimiter")&&(o.rightDelimiter=t.rightDelimiter);var a=r(o.leftDelimiter),s=r(o.rightDelimiter),l={smartyComment:new RegExp("^"+s+"\\*"),literalOpen:new RegExp(a+"literal"+s),literalClose:new RegExp(a+"/literal"+s),hasLeftDelimeter:new RegExp(".*"+a),htmlHasLeftDelimeter:new RegExp("[^<>]*"+a)},c={chain:function(e,t,r){return t.tokenize=r,r(e,t)},cleanChain:function(e,t,r){return t.tokenize=null,t.localState=null,t.localMode=null,"string"==typeof r?r?r:null:r(e,t)},maybeBackup:function(e,t,r){var n,i=e.current(),o=i.search(t);return o>-1?e.backUp(i.length-o):(n=i.match(/<\/?$/))&&(e.backUp(i.length),e.match(t,!1)||e.match(i[0])),r}},u={html:function(e,t){var r=t.htmlMixedState.htmlState.context&&t.htmlMixedState.htmlState.context.tagName?t.htmlMixedState.htmlState.context.tagName:null;return!t.inLiteral&&e.match(l.htmlHasLeftDelimeter,!1)&&null===r?(t.tokenize=u.smarty,t.localMode=i,t.localState=i.startState(n.indent(t.htmlMixedState,"")),c.maybeBackup(e,o.leftDelimiter,i.token(e,t.localState))):!t.inLiteral&&e.match(o.leftDelimiter,!1)?(t.tokenize=u.smarty,t.localMode=i,t.localState=i.startState(n.indent(t.htmlMixedState,"")),c.maybeBackup(e,o.leftDelimiter,i.token(e,t.localState))):n.token(e,t.htmlMixedState)},smarty:function(e,t){if(e.match(o.leftDelimiter,!1)){if(e.match(l.smartyComment,!1))return c.chain(e,t,u.inBlock("comment","*"+o.rightDelimiter))}else if(e.match(o.rightDelimiter,!1))return e.eat(o.rightDelimiter),t.tokenize=u.html,t.localMode=n,t.localState=t.htmlMixedState,"tag";return c.maybeBackup(e,o.rightDelimiter,i.token(e,t.localState))},inBlock:function(e,t){return function(r,n){for(;!r.eol();){if(r.match(t)){c.cleanChain(r,n,"");break}r.next()}return e}}};return{startState:function(){var e=n.startState();return{token:u.html,localMode:null,localState:null,htmlMixedState:e,tokenize:null,inLiteral:!1}},copyState:function(t){var r=null,o=t.tokenize||t.token;return t.localState&&(r=e.copyState(o!=u.html?i:n,t.localState)),{token:t.token,tokenize:t.tokenize,localMode:t.localMode,localState:r,htmlMixedState:e.copyState(n,t.htmlMixedState),inLiteral:t.inLiteral}},token:function(e,t){if(e.match(o.leftDelimiter,!1)){if(!t.inLiteral&&e.match(l.literalOpen,!0))return t.inLiteral=!0,"keyword";if(t.inLiteral&&e.match(l.literalClose,!0))return t.inLiteral=!1,"keyword"}t.inLiteral&&t.localState!=t.htmlMixedState&&(t.tokenize=u.html,t.localMode=n,t.localState=t.htmlMixedState);var r=(t.tokenize||t.token)(e,t);return r},indent:function(t, r){return t.localMode==i||t.inLiteral&&!t.localMode||l.hasLeftDelimeter.test(r)?e.Pass:n.indent(t.htmlMixedState,r)},innerMode:function(e){return{state:e.localState||e.htmlMixedState,mode:e.localMode||n}}}},"htmlmixed","smarty"),e.defineMIME("text/x-smarty","smartymixed")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("vb",function(e, t){function r(e){return new RegExp("^(("+e.join(")|(")+"))\\b","i")}function n(e, t){t.currentIndent++}function i(e, t){t.currentIndent--}function o(e, t){if(e.eatSpace())return null;var r=e.peek();if("'"===r)return e.skipToEnd(),"comment";if(e.match(/^((&H)|(&O))?[0-9\.a-f]/i,!1)){var o=!1;if(e.match(/^\d*\.\d+F?/i)?o=!0:e.match(/^\d+\.\d*F?/)?o=!0:e.match(/^\.\d+F?/)&&(o=!0),o)return e.eat(/J/i),"number";var s=!1;if(e.match(/^&H[0-9a-f]+/i)?s=!0:e.match(/^&O[0-7]+/i)?s=!0:e.match(/^[1-9]\d*F?/)?(e.eat(/J/i),s=!0):e.match(/^0(?![\dx])/i)&&(s=!0),s)return e.eat(/L/i),"number"}return e.match(_)?(t.tokenize=a(e.current()),t.tokenize(e,t)):e.match(m)||e.match(f)?null:e.match(d)||e.match(c)||e.match(b)?"operator":e.match(u)?null:e.match(L)?(n(e,t),t.doInCurrentLine=!0,"keyword"):e.match(C)?(t.doInCurrentLine?t.doInCurrentLine=!1:n(e,t),"keyword"):e.match(S)?"keyword":e.match(M)?(i(e,t),i(e,t),"keyword"):e.match(T)?(i(e,t),"keyword"):e.match(w)?"keyword":e.match(k)?"keyword":e.match(h)?"variable":(e.next(),l)}function a(e){var r=1==e.length,n="string";return function(i,a){for(;!i.eol();){if(i.eatWhile(/[^'"]/),i.match(e))return a.tokenize=o,n;i.eat(/['"]/)}if(r){if(t.singleLineStringErrors)return l;a.tokenize=o}return n}}function s(e,t){var r=t.tokenize(e,t),o=e.current();if("."===o)return r=t.tokenize(e,t),o=e.current(),"variable"===r?"variable":l;var a="[({".indexOf(o);return-1!==a&&n(e,t),"dedent"===E&&i(e,t)?l:(a="])}".indexOf(o),-1!==a&&i(e,t)?l:r)}var l="error",c=new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]"),u=new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"),d=new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"),f=new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"),m=new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"),h=new RegExp("^[_A-Za-z][_A-Za-z0-9]*"),p=["class","module","sub","enum","select","while","if","function","get","set","property","try"],g=["else","elseif","case","catch"],v=["next","loop"],b=r(["and","or","not","xor","in"]),y=["as","dim","break","continue","optional","then","until","goto","byval","byref","new","handles","property","return","const","private","protected","friend","public","shared","static","true","false"],x=["integer","string","double","decimal","boolean","short","char","float","single"],k=r(y),w=r(x),_='"',C=r(p),S=r(g),T=r(v),M=r(["end"]),L=r(["do"]),E=null,q={electricChars:"dDpPtTfFeE ",startState:function(){return{tokenize:o,lastToken:null,currentIndent:0,nextLineIndent:0,doInCurrentLine:!1}},token:function(e, t){e.sol()&&(t.currentIndent+=t.nextLineIndent,t.nextLineIndent=0,t.doInCurrentLine=0);var r=s(e,t);return t.lastToken={style:r,content:e.current()},r},indent:function(t, r){var n=r.replace(/^\s+|\s+$/g,"");return n.match(T)||n.match(M)||n.match(S)?e.indentUnit*(t.currentIndent-1):t.currentIndent<0?0:t.currentIndent*e.indentUnit}};return q}),e.defineMIME("text/x-vb","vb")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("vbscript",function(e, t){function r(e){return new RegExp("^(("+e.join(")|(")+"))\\b","i")}function n(e, t){t.currentIndent++}function i(e, t){t.currentIndent--}function o(e, t){if(e.eatSpace())return"space";var r=e.peek();if("'"===r)return e.skipToEnd(),"comment";if(e.match(H))return e.skipToEnd(),"comment";if(e.match(/^((&H)|(&O))?[0-9\.]/i,!1)&&!e.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i,!1)){var o=!1;if(e.match(/^\d*\.\d+/i)?o=!0:e.match(/^\d+\.\d*/)?o=!0:e.match(/^\.\d+/)&&(o=!0),o)return e.eat(/J/i),"number";var s=!1;if(e.match(/^&H[0-9a-f]+/i)?s=!0:e.match(/^&O[0-7]+/i)?s=!0:e.match(/^[1-9]\d*F?/)?(e.eat(/J/i),s=!0):e.match(/^0(?![\dx])/i)&&(s=!0),s)return e.eat(/L/i),"number"}return e.match(P)?(t.tokenize=a(e.current()),t.tokenize(e,t)):e.match(u)||e.match(c)||e.match(v)?"operator":e.match(d)?null:e.match(f)?"bracket":e.match(F)?(t.doInCurrentLine=!0,"keyword"):e.match(R)?(n(e,t),t.doInCurrentLine=!0,"keyword"):e.match(D)?(t.doInCurrentLine?t.doInCurrentLine=!1:n(e,t),"keyword"):e.match(A)?"keyword":e.match(O)?(i(e,t),i(e,t),"keyword"):e.match($)?(t.doInCurrentLine?t.doInCurrentLine=!1:i(e,t),"keyword"):e.match(E)?"keyword":e.match(q)?"atom":e.match(I)?"variable-2":e.match(j)?"builtin":e.match(z)?"variable-2":e.match(m)?"variable":(e.next(),l)}function a(e){var r=1==e.length,n="string";return function(i,a){for(;!i.eol();){if(i.eatWhile(/[^'"]/),i.match(e))return a.tokenize=o,n;i.eat(/['"]/)}if(r){if(t.singleLineStringErrors)return l;a.tokenize=o}return n}}function s(e,t){var r=t.tokenize(e,t),n=e.current();return"."===n?(r=t.tokenize(e,t),n=e.current(),!r||"variable"!==r.substr(0,8)&&"builtin"!==r&&"keyword"!==r?l:(("builtin"===r||"keyword"===r)&&(r="variable"),L.indexOf(n.substr(1))>-1&&(r="variable-2"),r)):r}var l="error",c=new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]"),u=new RegExp("^((<>)|(<=)|(>=))"),d=new RegExp("^[\\.,]"),f=new RegExp("^[\\(\\)]"),m=new RegExp("^[A-Za-z][_A-Za-z0-9]*"),h=["class","sub","select","while","if","function","property","with","for"],p=["else","elseif","case"],g=["next","loop","wend"],v=r(["and","or","not","xor","is","mod","eqv","imp"]),b=["dim","redim","then","until","randomize","byval","byref","new","property","exit","in","const","private","public","get","set","let","stop","on error resume next","on error goto 0","option explicit","call","me"],y=["true","false","nothing","empty","null"],x=["abs","array","asc","atn","cbool","cbyte","ccur","cdate","cdbl","chr","cint","clng","cos","csng","cstr","date","dateadd","datediff","datepart","dateserial","datevalue","day","escape","eval","execute","exp","filter","formatcurrency","formatdatetime","formatnumber","formatpercent","getlocale","getobject","getref","hex","hour","inputbox","instr","instrrev","int","fix","isarray","isdate","isempty","isnull","isnumeric","isobject","join","lbound","lcase","left","len","loadpicture","log","ltrim","rtrim","trim","maths","mid","minute","month","monthname","msgbox","now","oct","replace","rgb","right","rnd","round","scriptengine","scriptenginebuildversion","scriptenginemajorversion","scriptengineminorversion","second","setlocale","sgn","sin","space","split","sqr","strcomp","string","strreverse","tan","time","timer","timeserial","timevalue","typename","ubound","ucase","unescape","vartype","weekday","weekdayname","year"],k=["vbBlack","vbRed","vbGreen","vbYellow","vbBlue","vbMagenta","vbCyan","vbWhite","vbBinaryCompare","vbTextCompare","vbSunday","vbMonday","vbTuesday","vbWednesday","vbThursday","vbFriday","vbSaturday","vbUseSystemDayOfWeek","vbFirstJan1","vbFirstFourDays","vbFirstFullWeek","vbGeneralDate","vbLongDate","vbShortDate","vbLongTime","vbShortTime","vbObjectError","vbOKOnly","vbOKCancel","vbAbortRetryIgnore","vbYesNoCancel","vbYesNo","vbRetryCancel","vbCritical","vbQuestion","vbExclamation","vbInformation","vbDefaultButton1","vbDefaultButton2","vbDefaultButton3","vbDefaultButton4","vbApplicationModal","vbSystemModal","vbOK","vbCancel","vbAbort","vbRetry","vbIgnore","vbYes","vbNo","vbCr","VbCrLf","vbFormFeed","vbLf","vbNewLine","vbNullChar","vbNullString","vbTab","vbVerticalTab","vbUseDefault","vbTrue","vbFalse","vbEmpty","vbNull","vbInteger","vbLong","vbSingle","vbDouble","vbCurrency","vbDate","vbString","vbObject","vbError","vbBoolean","vbVariant","vbDataObject","vbDecimal","vbByte","vbArray"],w=["WScript","err","debug","RegExp"],_=["description","firstindex","global","helpcontext","helpfile","ignorecase","length","number","pattern","source","value","count"],C=["clear","execute","raise","replace","test","write","writeline","close","open","state","eof","update","addnew","end","createobject","quit"],S=["server","response","request","session","application"],T=["buffer","cachecontrol","charset","contenttype","expires","expiresabsolute","isclientconnected","pics","status","clientcertificate","cookies","form","querystring","servervariables","totalbytes","contents","staticobjects","codepage","lcid","sessionid","timeout","scripttimeout"],M=["addheader","appendtolog","binarywrite","end","flush","redirect","binaryread","remove","removeall","lock","unlock","abandon","getlasterror","htmlencode","mappath","transfer","urlencode"],L=C.concat(_);w=w.concat(k),e.isASP&&(w=w.concat(S),L=L.concat(M,T));var E=r(b),q=r(y),j=r(x),z=r(w),I=r(L),P='"',D=r(h),A=r(p),$=r(g),O=r(["end"]),R=r(["do"]),F=r(["on error resume next","exit"]),H=r(["rem"]),N={electricChars:"dDpPtTfFeE ",startState:function(){return{tokenize:o,lastToken:null,currentIndent:0,nextLineIndent:0,doInCurrentLine:!1,ignoreKeyword:!1}},token:function(e, t){e.sol()&&(t.currentIndent+=t.nextLineIndent,t.nextLineIndent=0,t.doInCurrentLine=0);var r=s(e,t);return t.lastToken={style:r,content:e.current()},"space"===r&&(r=null),r},indent:function(t, r){var n=r.replace(/^\s+|\s+$/g,"");return n.match($)||n.match(O)||n.match(A)?e.indentUnit*(t.currentIndent-1):t.currentIndent<0?0:t.currentIndent*e.indentUnit}};return N}),e.defineMIME("text/vbscript","vbscript")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("velocity",function(){function e(e){for(var t={},r=e.split(" "),n=0; nf.length&&"."==e.string.charAt(e.pos-f.length-1)&&r.lastTokenWasBuiltin?"builtin":(r.lastTokenWasBuiltin=!1,null)}return r.lastTokenWasBuiltin=!1,r.inString?(r.inString=!1,"string"):r.inParams?t(e,r,n(d)):void 0}function n(e){return function(t,n){for(var i,o=!1,a=!1;null!=(i=t.next());){if(i==e&&!o){a=!0;break}if('"'==e&&"$"==t.peek()&&!o){n.inString=!0,a=!0;break}o=!o&&"\\"==i}return a&&(n.tokenize=r),"string"}}function i(e,t){for(var n,i=!1;n=e.next();){if("#"==n&&i){t.tokenize=r;break}i="*"==n}return"comment"}function o(e,t){for(var n,i=0;n=e.next();){if("#"==n&&2==i){t.tokenize=r;break}"]"==n?i++:" "!=n&&(i=0)}return"meta"}var a=e("#end #else #break #stop #[[ #]] #{end} #{else} #{break} #{stop}"),s=e("#if #elseif #foreach #set #include #parse #macro #define #evaluate #{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"),l=e("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"),c=/[+\-*&%=<>!?:\/|]/;return{startState:function(){return{tokenize:r,beforeParams:!1,inParams:!1,inString:!1,lastTokenWasBuiltin:!1}},token:function(e, t){return e.eatSpace()?null:t.tokenize(e,t)},blockCommentStart:"#*",blockCommentEnd:"*#",lineComment:"##",fold:"velocity"}}),e.defineMIME("text/velocity","velocity")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("xquery",function(){function e(e, t, r){return y=e,x=r,t}function t(e, t, r){return t.tokenize=r,r(e,t)}function r(r, s){var f=r.next(),h=!1,g=p(r);if("<"==f){if(r.match("!--",!0))return t(r,s,l);if(r.match("![CDATA",!1))return s.tokenize=c,e("tag","tag");if(r.match("?",!1))return t(r,s,u);var y=r.eat("/");r.eatSpace();for(var x,w=""; x=r.eat(/[^\s\u00a0=<>\"\'\/?]/);)w+=x;return t(r,s,a(w,y))}if("{"==f)return v(s,{type:"codeblock"}),e("",null);if("}"==f)return b(s),e("",null);if(d(s))return">"==f?e("tag","tag"):"/"==f&&r.eat(">")?(b(s),e("tag","tag")):e("word","variable");if(/\d/.test(f))return r.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/),e("number","atom");if("("===f&&r.eat(":"))return v(s,{type:"comment"}),t(r,s,n);if(g||'"'!==f&&"'"!==f){if("$"===f)return t(r,s,o);if(":"===f&&r.eat("="))return e("operator","keyword");if("("===f)return v(s,{type:"paren"}),e("",null);if(")"===f)return b(s),e("",null);if("["===f)return v(s,{type:"bracket"}),e("",null);if("]"===f)return b(s),e("",null);var _=k.propertyIsEnumerable(f)&&k[f];if(g&&'"'===f)for(;'"'!==r.next(););if(g&&"'"===f)for(;"'"!==r.next(););_||r.eatWhile(/[\w\$_-]/);var C=r.eat(":");!r.eat(":")&&C&&r.eatWhile(/[\w\$_-]/),r.match(/^[ \t]*\(/,!1)&&(h=!0);var S=r.current();return _=k.propertyIsEnumerable(S)&&k[S],h&&!_&&(_={type:"function_call",style:"variable def"}),m(s)?(b(s),e("word","variable",S)):(("element"==S||"attribute"==S||"axis_specifier"==_.type)&&v(s,{type:"xmlconstructor"}),_?e(_.type,_.style,S):e("word","variable",S))}return t(r,s,i(f))}function n(t,r){for(var n,i=!1,o=!1,a=0;n=t.next();){if(")"==n&&i){if(!(a>0)){b(r);break}a--}else":"==n&&o&&a++;i=":"==n,o="("==n}return e("comment","comment")}function i(t,n){return function(o,a){var s;if(h(a)&&o.current()==t)return b(a),n&&(a.tokenize=n),e("string","string");if(v(a,{type:"string",name:t,tokenize:i(t,n)}),o.match("{",!1)&&f(a))return a.tokenize=r,e("string","string");for(;s=o.next();){if(s==t){b(a),n&&(a.tokenize=n);break}if(o.match("{",!1)&&f(a))return a.tokenize=r,e("string","string")}return e("string","string")}}function o(t,n){var i=/[\w\$_-]/;if(t.eat('"')){for(;'"'!==t.next(););t.eat(":")}else t.eatWhile(i),t.match(":=",!1)||t.eat(":");return t.eatWhile(i),n.tokenize=r,e("variable","variable")}function a(t,n){return function(i,o){return i.eatSpace(),n&&i.eat(">")?(b(o),o.tokenize=r,e("tag","tag")):(i.eat("/")||v(o,{type:"tag",name:t,tokenize:r}),i.eat(">")?(o.tokenize=r,e("tag","tag")):(o.tokenize=s,e("tag","tag")))}}function s(n,o){var a=n.next();return"/"==a&&n.eat(">")?(f(o)&&b(o),d(o)&&b(o),e("tag","tag")):">"==a?(f(o)&&b(o),e("tag","tag")):"="==a?e("",null):'"'==a||"'"==a?t(n,o,i(a,s)):(f(o)||v(o,{type:"attribute",tokenize:s}),n.eat(/[a-zA-Z_:]/),n.eatWhile(/[-a-zA-Z0-9_:.]/),n.eatSpace(),(n.match(">",!1)||n.match("/",!1))&&(b(o),o.tokenize=r),e("attribute","attribute"))}function l(t,n){for(var i;i=t.next();)if("-"==i&&t.match("->",!0))return n.tokenize=r,e("comment","comment")}function c(t,n){for(var i;i=t.next();)if("]"==i&&t.match("]",!0))return n.tokenize=r,e("comment","comment")}function u(t,n){for(var i;i=t.next();)if("?"==i&&t.match(">",!0))return n.tokenize=r,e("comment","comment meta")}function d(e){return g(e,"tag")}function f(e){return g(e,"attribute")}function m(e){return g(e,"xmlconstructor")}function h(e){return g(e,"string")}function p(e){return'"'===e.current()?e.match(/^[^\"]+\"\:/,!1):"'"===e.current()?e.match(/^[^\"]+\'\:/,!1):!1}function g(e,t){return e.stack.length&&e.stack[e.stack.length-1].type==t}function v(e,t){e.stack.push(t)}function b(e){e.stack.pop();var t=e.stack.length&&e.stack[e.stack.length-1].tokenize;e.tokenize=t||r}var y,x,k=function(){function e(e){return{type:e,style:"keyword"}}for(var t=e("keyword a"),r=e("keyword b"),n=e("keyword c"),i=e("operator"),o={type:"atom",style:"atom"},a={type:"punctuation",style:null},s={type:"axis_specifier",style:"qualifier"},l={"if":t,"switch":t,"while":t,"for":t,"else":r,then:r,"try":r,"finally":r,"catch":r,element:n,attribute:n,let:n,"implements":n,"import":n,module:n,namespace:n,"return":n,"super":n,"this":n,"throws":n,where:n,"private":n,",":a,"null":o,"fn:false()":o,"fn:true()":o},c=["after","ancestor","ancestor-or-self","and","as","ascending","assert","attribute","before","by","case","cast","child","comment","declare","default","define","descendant","descendant-or-self","descending","document","document-node","element","else","eq","every","except","external","following","following-sibling","follows","for","function","if","import","in","instance","intersect","item","let","module","namespace","node","node","of","only","or","order","parent","precedes","preceding","preceding-sibling","processing-instruction","ref","return","returns","satisfies","schema","schema-element","self","some","sortby","stable","text","then","to","treat","typeswitch","union","variable","version","where","xquery","empty-sequence"],u=0,d=c.length;d>u;u++)l[c[u]]=e(c[u]);for(var f=["xs:string","xs:float","xs:decimal","xs:double","xs:integer","xs:boolean","xs:date","xs:dateTime","xs:time","xs:duration","xs:dayTimeDuration","xs:time","xs:yearMonthDuration","numeric","xs:hexBinary","xs:base64Binary","xs:anyURI","xs:QName","xs:byte","xs:boolean","xs:anyURI","xf:yearMonthDuration"],u=0,d=f.length;d>u;u++)l[f[u]]=o;for(var m=["eq","ne","lt","le","gt","ge",":=","=",">",">=","<","<=",".","|","?","and","or","div","idiv","mod","*","/","+","-"],u=0,d=m.length;d>u;u++)l[m[u]]=i;for(var h=["self::","attribute::","child::","descendant::","descendant-or-self::","parent::","ancestor::","ancestor-or-self::","following::","preceding::","following-sibling::","preceding-sibling::"],u=0,d=h.length; d>u; u++)l[h[u]]=s;return l}();return{startState:function(){return{tokenize:r,cc:[],stack:[]}},token:function(e, t){if(e.eatSpace())return null;var r=t.tokenize(e,t);return r},blockCommentStart:"(:",blockCommentEnd:":)"}}),e.defineMIME("application/xquery","xquery")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("yaml",function(){var e=["true","false","on","off","yes","no"],t=new RegExp("\\b(("+e.join(")|(")+"))$","i");return{token:function(e, r){var n=e.peek(),i=r.escaped;if(r.escaped=!1,"#"==n&&(0==e.pos||/\s/.test(e.string.charAt(e.pos-1))))return e.skipToEnd(),"comment";if(e.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(r.literal&&e.indentation()>r.keyCol)return e.skipToEnd(),"string";if(r.literal&&(r.literal=!1),e.sol()){if(r.keyCol=0,r.pair=!1,r.pairStart=!1,e.match(/---/))return"def";if(e.match(/\.\.\./))return"def";if(e.match(/\s*-\s+/))return"meta"}if(e.match(/^(\{|\}|\[|\])/))return"{"==n?r.inlinePairs++:"}"==n?r.inlinePairs--:"["==n?r.inlineList++:r.inlineList--,"meta";if(r.inlineList>0&&!i&&","==n)return e.next(),"meta";if(r.inlinePairs>0&&!i&&","==n)return r.keyCol=0,r.pair=!1,r.pairStart=!1,e.next(),"meta";if(r.pairStart){if(e.match(/^\s*(\||\>)\s*/))return r.literal=!0,"meta";if(e.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(0==r.inlinePairs&&e.match(/^\s*-?[0-9\.\,]+\s?$/))return"number";if(r.inlinePairs>0&&e.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(e.match(t))return"keyword"}return!r.pair&&e.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)?(r.pair=!0,r.keyCol=e.indentation(),"atom"):r.pair&&e.match(/^:\s*/)?(r.pairStart=!0,"meta"):(r.pairStart=!1,r.escaped="\\"==n,e.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}}}}),e.defineMIME("text/x-yaml","yaml")}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror")):"function"==typeof define&&define.amd?define(["./lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMIME("text/x-erlang","erlang"),e.defineMode("erlang",function(t){function r(e, t){if(t.in_string)return t.in_string=!o(e),u(t,e,"string");if(t.in_atom)return t.in_atom=!a(e),u(t,e,"atom");if(e.eatSpace())return u(t,e,"whitespace");if(!h(t)&&e.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/))return c(e.current(),T)?u(t,e,"type"):u(t,e,"attribute");var r=e.next();if("%"==r)return e.skipToEnd(),u(t,e,"comment");if(":"==r)return u(t,e,"colon");if("?"==r)return e.eatSpace(),e.eatWhile(R),u(t,e,"macro");if("#"==r)return e.eatSpace(),e.eatWhile(R),u(t,e,"record");if("$"==r)return"\\"!=e.next()||e.match(F)?u(t,e,"number"):u(t,e,"error");if("."==r)return u(t,e,"dot");if("'"==r){if(!(t.in_atom=!a(e))){if(e.match(/\s*\/\s*[0-9]/,!1))return e.match(/\s*\/\s*[0-9]/,!0),u(t,e,"fun");if(e.match(/\s*\(/,!1)||e.match(/\s*:/,!1))return u(t,e,"function")}return u(t,e,"atom")}if('"'==r)return t.in_string=!o(e),u(t,e,"string");if(/[A-Z_Ø-ÞÀ-Ö]/.test(r))return e.eatWhile(R),u(t,e,"variable");if(/[a-z_ß-öø-ÿ]/.test(r)){if(e.eatWhile(R),e.match(/\s*\/\s*[0-9]/,!1))return e.match(/\s*\/\s*[0-9]/,!0),u(t,e,"fun");var s=e.current();return c(s,M)?u(t,e,"keyword"):c(s,q)?u(t,e,"operator"):e.match(/\s*\(/,!1)?!c(s,O)||":"==h(t).token&&"erlang"!=h(t,2).token?c(s,$)?u(t,e,"guard"):u(t,e,"function"):u(t,e,"builtin"):c(s,q)?u(t,e,"operator"):":"==l(e)?"erlang"==s?u(t,e,"builtin"):u(t,e,"function"):c(s,["true","false"])?u(t,e,"boolean"):c(s,["true","false"])?u(t,e,"boolean"):u(t,e,"atom")}var d=/[0-9]/,f=/[0-9a-zA-Z]/;return d.test(r)?(e.eatWhile(d),e.eat("#")?e.eatWhile(f)||e.backUp(1):e.eat(".")&&(e.eatWhile(d)?e.eat(/[eE]/)&&(e.eat(/[-+]/)?e.eatWhile(d)||e.backUp(2):e.eatWhile(d)||e.backUp(1)):e.backUp(1)),u(t,e,"number")):n(e,I,P)?u(t,e,"open_paren"):n(e,D,A)?u(t,e,"close_paren"):i(e,L,E)?u(t,e,"separator"):i(e,j,z)?u(t,e,"operator"):u(t,e,null)}function n(e,t,r){if(1==e.current().length&&t.test(e.current())){for(e.backUp(1);t.test(e.peek());)if(e.next(),c(e.current(),r))return!0;e.backUp(e.current().length-1)}return!1}function i(e,t,r){if(1==e.current().length&&t.test(e.current())){for(;t.test(e.peek());)e.next();for(;0r?!1:e.tokenStack[r-n]}function p(e,t){"comment"!=t.type&&"whitespace"!=t.type&&(e.tokenStack=g(e.tokenStack,t),e.tokenStack=v(e.tokenStack))}function g(e,t){var r=e.length-1;return r>0&&"record"===e[r].type&&"dot"===t.type?e.pop():r>0&&"group"===e[r].type?(e.pop(),e.push(t)):e.push(t),e}function v(e){var t=e.length-1;if("dot"===e[t].type)return[];if("fun"===e[t].type&&"fun"===e[t-1].token)return e.slice(0,t-1);switch(e[e.length-1].token){case"}":return b(e,{g:["{"]});case"]":return b(e,{i:["["]});case")":return b(e,{i:["("]});case">>":return b(e,{i:["<<"]});case"end":return b(e,{i:["begin","case","fun","if","receive","try"]});case",":return b(e,{e:["begin","try","when","->",",","(","[","{","<<"]});case"->":return b(e,{r:["when"],m:["try","if","case","receive"]});case";":return b(e,{E:["case","fun","if","receive","try","when"]});case"catch":return b(e,{e:["try"]});case"of":return b(e,{e:["case"]});case"after":return b(e,{e:["receive","try"]});default:return e}}function b(e,t){for(var r in t)for(var n=e.length-1,i=t[r],o=n-1;o>-1;o--)if(c(e[o].token,i)){var a=e.slice(0,o);switch(r){case"m":return a.concat(e[o]).concat(e[n]);case"r":return a.concat(e[n]);case"i":return a;case"g":return a.concat(m("group"));case"E":return a.concat(e[o]);case"e":return a.concat(e[o])}}return"E"==r?[]:e}function y(r,n){var i,o=t.indentUnit,a=x(n),s=h(r,1),l=h(r,2);return r.in_string||r.in_atom?e.Pass:l?"when"==s.token?s.column+o:"when"===a&&"function"===l.type?l.indent+o:"("===a&&"fun"===s.token?s.column+3:"catch"===a&&(i=_(r,["try"]))?i.column:c(a,["end","after","of"])?(i=_(r,["begin","case","fun","if","receive","try"]),i?i.column:e.Pass):c(a,A)?(i=_(r,P),i?i.column:e.Pass):c(s.token,[",","|","||"])||c(a,[",","|","||"])?(i=k(r),i?i.column+i.token.length:o):"->"==s.token?c(l.token,["receive","case","if","try"])?l.column+o+o:l.column+o:c(s.token,P)?s.column+s.token.length:(i=w(r),S(i)?i.column+o:0):0}function x(e){var t=e.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/);return S(t)&&0===t.index?t[0]:""}function k(e){var t=e.tokenStack.slice(0,-1),r=C(t,"type",["open_paren"]);return S(t[r])?t[r]:!1}function w(e){var t=e.tokenStack,r=C(t,"type",["open_paren","separator","keyword"]),n=C(t,"type",["operator"]);return S(r)&&S(n)&&n>r?t[r+1]:S(r)?t[r]:!1}function _(e,t){var r=e.tokenStack,n=C(r,"token",t); + +return S(r[n])?r[n]:!1}function C(e,t,r){for(var n=e.length-1;n>-1;n--)if(c(e[n][t],r))return n;return!1}function S(e){return e!==!1&&null!=e}var T=["-type","-spec","-export_type","-opaque"],M=["after","begin","catch","case","cond","end","fun","if","let","of","query","receive","try","when"],L=/[\->,;]/,E=["->",";",","],q=["and","andalso","band","bnot","bor","bsl","bsr","bxor","div","not","or","orelse","rem","xor"],j=/[\+\-\*\/<>=\|:!]/,z=["=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"],I=/[<\(\[\{]/,P=["<<","(","[","{"],D=/[>\)\]\}]/,A=["}","]",")",">>"],$=["is_atom","is_binary","is_bitstring","is_boolean","is_float","is_function","is_integer","is_list","is_number","is_pid","is_port","is_record","is_reference","is_tuple","atom","binary","bitstring","boolean","function","integer","list","number","pid","port","record","reference","tuple"],O=["abs","adler32","adler32_combine","alive","apply","atom_to_binary","atom_to_list","binary_to_atom","binary_to_existing_atom","binary_to_list","binary_to_term","bit_size","bitstring_to_list","byte_size","check_process_code","contact_binary","crc32","crc32_combine","date","decode_packet","delete_module","disconnect_node","element","erase","exit","float","float_to_list","garbage_collect","get","get_keys","group_leader","halt","hd","integer_to_list","internal_bif","iolist_size","iolist_to_binary","is_alive","is_atom","is_binary","is_bitstring","is_boolean","is_float","is_function","is_integer","is_list","is_number","is_pid","is_port","is_process_alive","is_record","is_reference","is_tuple","length","link","list_to_atom","list_to_binary","list_to_bitstring","list_to_existing_atom","list_to_float","list_to_integer","list_to_pid","list_to_tuple","load_module","make_ref","module_loaded","monitor_node","node","node_link","node_unlink","nodes","notalive","now","open_port","pid_to_list","port_close","port_command","port_connect","port_control","pre_loaded","process_flag","process_info","processes","purge_module","put","register","registered","round","self","setelement","size","spawn","spawn_link","spawn_monitor","spawn_opt","split_binary","statistics","term_to_binary","time","throw","tl","trunc","tuple_size","tuple_to_list","unlink","unregister","whereis"],R=/[\w@Ø-ÞÀ-Öß-öø-ÿ]/,F=/[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;return{startState:function(){return{tokenStack:[],in_string:!1,in_atom:!1}},token:function(e,t){return r(e,t)},indent:function(e,t){return y(e,t)},lineComment:"%"}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("./lib/codemirror"),require("../javascript/javascript"),require("../css/css"),require("../htmlmixed/htmlmixed")):"function"==typeof define&&define.amd?define(["./lib/codemirror","../javascript/javascript","../css/css","../htmlmixed/htmlmixed"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("jade",function(t){function r(){this.javaScriptLine=!1,this.javaScriptLineExcludesColon=!1,this.javaScriptArguments=!1,this.javaScriptArgumentsDepth=0,this.isInterpolating=!1,this.interpolationNesting=0,this.jsState=Q.startState(),this.restOfLine="",this.isIncludeFiltered=!1,this.isEach=!1,this.lastTag="",this.scriptType="",this.isAttrs=!1,this.attrsNest=[],this.inAttributeName=!0,this.attributeIsType=!1,this.attrValue="",this.indentOf=1/0,this.indentToken="",this.innerMode=null,this.innerState=null,this.innerModeForLine=!1}function n(e,t){if(e.sol()&&(t.javaScriptLine=!1,t.javaScriptLineExcludesColon=!1),t.javaScriptLine){if(t.javaScriptLineExcludesColon&&":"===e.peek())return t.javaScriptLine=!1,void(t.javaScriptLineExcludesColon=!1);var r=Q.token(e,t.jsState);return e.eol()&&(t.javaScriptLine=!1),r||!0}}function i(e,t){if(t.javaScriptArguments){if(0===t.javaScriptArgumentsDepth&&"("!==e.peek())return void(t.javaScriptArguments=!1);if("("===e.peek()?t.javaScriptArgumentsDepth++:")"===e.peek()&&t.javaScriptArgumentsDepth--,0===t.javaScriptArgumentsDepth)return void(t.javaScriptArguments=!1);var r=Q.token(e,t.jsState);return r||!0}}function o(e){return e.match(/^yield\b/)?"keyword":void 0}function a(e){return e.match(/^(?:doctype) *([^\n]+)?/)?K:void 0}function s(e,t){return e.match("#{")?(t.isInterpolating=!0,t.interpolationNesting=0,"punctuation"):void 0}function l(e,t){if(t.isInterpolating){if("}"===e.peek()){if(t.interpolationNesting--,t.interpolationNesting<0)return e.next(),t.isInterpolating=!1,"puncutation"}else"{"===e.peek()&&t.interpolationNesting++;return Q.token(e,t.jsState)||!0}}function c(e,t){return e.match(/^case\b/)?(t.javaScriptLine=!0,V):void 0}function u(e,t){return e.match(/^when\b/)?(t.javaScriptLine=!0,t.javaScriptLineExcludesColon=!0,V):void 0}function d(e){return e.match(/^default\b/)?V:void 0}function f(e,t){return e.match(/^extends?\b/)?(t.restOfLine="string",V):void 0}function m(e,t){return e.match(/^append\b/)?(t.restOfLine="variable",V):void 0}function h(e,t){return e.match(/^prepend\b/)?(t.restOfLine="variable",V):void 0}function p(e,t){return e.match(/^block\b *(?:(prepend|append)\b)?/)?(t.restOfLine="variable",V):void 0}function g(e,t){return e.match(/^include\b/)?(t.restOfLine="string",V):void 0}function v(e,t){return e.match(/^include:([a-zA-Z0-9\-]+)/,!1)&&e.match("include")?(t.isIncludeFiltered=!0,V):void 0}function b(e,t){if(t.isIncludeFiltered){var r=M(e,t);return t.isIncludeFiltered=!1,t.restOfLine="string",r}}function y(e,t){return e.match(/^mixin\b/)?(t.javaScriptLine=!0,V):void 0}function x(e,t){return e.match(/^\+([-\w]+)/)?(e.match(/^\( *[-\w]+ *=/,!1)||(t.javaScriptArguments=!0,t.javaScriptArgumentsDepth=0),"variable"):e.match(/^\+#{/,!1)?(e.next(),t.mixinCallAfter=!0,s(e,t)):void 0}function k(e,t){return t.mixinCallAfter?(t.mixinCallAfter=!1,e.match(/^\( *[-\w]+ *=/,!1)||(t.javaScriptArguments=!0,t.javaScriptArgumentsDepth=0),!0):void 0}function w(e,t){return e.match(/^(if|unless|else if|else)\b/)?(t.javaScriptLine=!0,V):void 0}function _(e,t){return e.match(/^(- *)?(each|for)\b/)?(t.isEach=!0,V):void 0}function C(e,t){if(t.isEach){if(e.match(/^ in\b/))return t.javaScriptLine=!0,t.isEach=!1,V;if(e.sol()||e.eol())t.isEach=!1;else if(e.next()){for(;!e.match(/^ in\b/,!1)&&e.next(););return"variable"}}}function S(e,t){return e.match(/^while\b/)?(t.javaScriptLine=!0,V):void 0}function T(e,t){var r;return(r=e.match(/^(\w(?:[-:\w]*\w)?)\/?/))?(t.lastTag=r[1].toLowerCase(),"script"===t.lastTag&&(t.scriptType="application/javascript"),"tag"):void 0}function M(r,n){if(r.match(/^:([\w\-]+)/)){var i;return t&&t.innerModes&&(i=t.innerModes(r.current().substring(1))),i||(i=r.current().substring(1)),"string"==typeof i&&(i=e.getMode(t,i)),F(r,n,i),"atom"}}function L(e,t){return e.match(/^(!?=|-)/)?(t.javaScriptLine=!0,"punctuation"):void 0}function E(e){return e.match(/^#([\w-]+)/)?Z:void 0}function q(e){return e.match(/^\.([\w-]+)/)?G:void 0}function j(e,t){return"("==e.peek()?(e.next(),t.isAttrs=!0,t.attrsNest=[],t.inAttributeName=!0,t.attrValue="",t.attributeIsType=!1,"punctuation"):void 0}function z(e,t){if(t.isAttrs){if(X[e.peek()]&&t.attrsNest.push(X[e.peek()]),t.attrsNest[t.attrsNest.length-1]===e.peek())t.attrsNest.pop();else if(e.eat(")"))return t.isAttrs=!1,"punctuation";if(t.inAttributeName&&e.match(/^[^=,\)!]+/))return("="===e.peek()||"!"===e.peek())&&(t.inAttributeName=!1,t.jsState=Q.startState(),"script"===t.lastTag&&"type"===e.current().trim().toLowerCase()?t.attributeIsType=!0:t.attributeIsType=!1),"attribute";var r=Q.token(e,t.jsState);if(t.attributeIsType&&"string"===r&&(t.scriptType=e.current().toString()),0===t.attrsNest.length&&("string"===r||"variable"===r||"keyword"===r))try{return Function("","var x "+t.attrValue.replace(/,\s*$/,"").replace(/^!/,"")),t.inAttributeName=!0,t.attrValue="",e.backUp(e.current().length),z(e,t)}catch(n){}return t.attrValue+=e.current(),r||!0}}function I(e,t){return e.match(/^&attributes\b/)?(t.javaScriptArguments=!0,t.javaScriptArgumentsDepth=0,"keyword"):void 0}function P(e){return e.sol()&&e.eatSpace()?"indent":void 0}function D(e,t){return e.match(/^ *\/\/(-)?([^\n]*)/)?(t.indentOf=e.indentation(),t.indentToken="comment","comment"):void 0}function A(e){return e.match(/^: */)?"colon":void 0}function $(e,t){return e.match(/^(?:\| ?| )([^\n]+)/)?"string":e.match(/^(<[^\n]*)/,!1)?(F(e,t,"htmlmixed"),t.innerModeForLine=!0,H(e,t,!0)):void 0}function O(e,t){if(e.eat(".")){var r=null;return"script"===t.lastTag&&-1!=t.scriptType.toLowerCase().indexOf("javascript")?r=t.scriptType.toLowerCase().replace(/"|'/g,""):"style"===t.lastTag&&(r="css"),F(e,t,r),"dot"}}function R(e){return e.next(),null}function F(r,n,i){i=e.mimeModes[i]||i,i=t.innerModes?t.innerModes(i)||i:i,i=e.mimeModes[i]||i,i=e.getMode(t,i),n.indentOf=r.indentation(),i&&"null"!==i.name?n.innerMode=i:n.indentToken="string"}function H(e,t,r){return e.indentation()>t.indentOf||t.innerModeForLine&&!e.sol()||r?t.innerMode?(t.innerState||(t.innerState=t.innerMode.startState?t.innerMode.startState(e.indentation()):{}),e.hideFirstChars(t.indentOf+2,function(){return t.innerMode.token(e,t.innerState)||!0})):(e.skipToEnd(),t.indentToken):void(e.sol()&&(t.indentOf=1/0,t.indentToken=null,t.innerMode=null,t.innerState=null))}function N(e,t){if(e.sol()&&(t.restOfLine=""),t.restOfLine){e.skipToEnd();var r=t.restOfLine;return t.restOfLine="",r}}function B(){return new r}function U(e){return e.copy()}function W(e,t){var r=H(e,t)||N(e,t)||l(e,t)||b(e,t)||C(e,t)||z(e,t)||n(e,t)||i(e,t)||k(e,t)||o(e,t)||a(e,t)||s(e,t)||c(e,t)||u(e,t)||d(e,t)||f(e,t)||m(e,t)||h(e,t)||p(e,t)||g(e,t)||v(e,t)||y(e,t)||x(e,t)||w(e,t)||_(e,t)||S(e,t)||T(e,t)||M(e,t)||L(e,t)||E(e,t)||q(e,t)||j(e,t)||I(e,t)||P(e,t)||$(e,t)||D(e,t)||A(e,t)||O(e,t)||R(e,t);return r===!0?null:r}var V="keyword",K="meta",Z="builtin",G="qualifier",X={"{":"}","(":")","[":"]"},Q=e.getMode(t,"javascript");return r.prototype.copy=function(){var t=new r;return t.javaScriptLine=this.javaScriptLine,t.javaScriptLineExcludesColon=this.javaScriptLineExcludesColon,t.javaScriptArguments=this.javaScriptArguments,t.javaScriptArgumentsDepth=this.javaScriptArgumentsDepth,t.isInterpolating=this.isInterpolating,t.interpolationNesting=this.intpolationNesting,t.jsState=e.copyState(Q,this.jsState),t.innerMode=this.innerMode,this.innerMode&&this.innerState&&(t.innerState=e.copyState(this.innerMode,this.innerState)),t.restOfLine=this.restOfLine,t.isIncludeFiltered=this.isIncludeFiltered,t.isEach=this.isEach,t.lastTag=this.lastTag,t.scriptType=this.scriptType,t.isAttrs=this.isAttrs,t.attrsNest=this.attrsNest.slice(),t.inAttributeName=this.inAttributeName,t.attributeIsType=this.attributeIsType,t.attrValue=this.attrValue,t.indentOf=this.indentOf,t.indentToken=this.indentToken,t.innerModeForLine=this.innerModeForLine,t},{startState:B,copyState:U,token:W}}),e.defineMIME("text/x-jade","jade")}); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/package.json b/src/collectedstatic/mdeditor/js/lib/codemirror/package.json new file mode 100644 index 0000000..cfefb80 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/package.json @@ -0,0 +1,22 @@ +{ + "name": "codemirror", + "version":"5.0.0", + "main": "lib/codemirror.js", + "description": "In-browser code editing made bearable", + "licenses": [{"type": "MIT", + "url": "http://codemirror.net/LICENSE"}], + "directories": { + "lib": "./lib"}, + "scripts": {"test": "node ./test/run.js"}, + "devDependencies": {"node-static": "0.6.0", + "phantomjs": "1.9.2-5", + "blint": ">=0.1.1"}, + "bugs": "http://github.com/codemirror/CodeMirror/issues", + "keywords": ["JavaScript", "CodeMirror", "Editor"], + "homepage": "http://codemirror.net", + "maintainers":[{"name": "Marijn Haverbeke", + "email": "marijnh@gmail.com", + "web": "http://marijnhaverbeke.nl"}], + "repository": {"type": "git", + "url": "https://github.com/codemirror/CodeMirror.git"} +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-day.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-day.css new file mode 100644 index 0000000..3592816 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-day.css @@ -0,0 +1,40 @@ +/* + + Name: 3024 day + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-day.CodeMirror {background: #f7f7f7; color: #3a3432;} +.cm-s-3024-day div.CodeMirror-selected {background: #d6d5d4 !important;} +.cm-s-3024-day.CodeMirror ::selection { background: #d6d5d4; } +.cm-s-3024-day.CodeMirror ::-moz-selection { background: #d9d9d9; } + +.cm-s-3024-day .CodeMirror-gutters {background: #f7f7f7; border-right: 0px;} +.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; } +.cm-s-3024-day .CodeMirror-linenumber {color: #807d7c;} + +.cm-s-3024-day .CodeMirror-cursor {border-left: 1px solid #5c5855 !important;} + +.cm-s-3024-day span.cm-comment {color: #cdab53;} +.cm-s-3024-day span.cm-atom {color: #a16a94;} +.cm-s-3024-day span.cm-number {color: #a16a94;} + +.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute {color: #01a252;} +.cm-s-3024-day span.cm-keyword {color: #db2d20;} +.cm-s-3024-day span.cm-string {color: #fded02;} + +.cm-s-3024-day span.cm-variable {color: #01a252;} +.cm-s-3024-day span.cm-variable-2 {color: #01a0e4;} +.cm-s-3024-day span.cm-def {color: #e8bbd0;} +.cm-s-3024-day span.cm-bracket {color: #3a3432;} +.cm-s-3024-day span.cm-tag {color: #db2d20;} +.cm-s-3024-day span.cm-link {color: #a16a94;} +.cm-s-3024-day span.cm-error {background: #db2d20; color: #5c5855;} + +.cm-s-3024-day .CodeMirror-activeline-background {background: #e8f2ff !important;} +.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-night.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-night.css new file mode 100644 index 0000000..ccab9d5 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/3024-night.css @@ -0,0 +1,39 @@ +/* + + Name: 3024 night + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-night.CodeMirror {background: #090300; color: #d6d5d4;} +.cm-s-3024-night div.CodeMirror-selected {background: #3a3432 !important;} +.cm-s-3024-night.CodeMirror ::selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night.CodeMirror ::-moz-selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night .CodeMirror-gutters {background: #090300; border-right: 0px;} +.cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; } +.cm-s-3024-night .CodeMirror-linenumber {color: #5c5855;} + +.cm-s-3024-night .CodeMirror-cursor {border-left: 1px solid #807d7c !important;} + +.cm-s-3024-night span.cm-comment {color: #cdab53;} +.cm-s-3024-night span.cm-atom {color: #a16a94;} +.cm-s-3024-night span.cm-number {color: #a16a94;} + +.cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute {color: #01a252;} +.cm-s-3024-night span.cm-keyword {color: #db2d20;} +.cm-s-3024-night span.cm-string {color: #fded02;} + +.cm-s-3024-night span.cm-variable {color: #01a252;} +.cm-s-3024-night span.cm-variable-2 {color: #01a0e4;} +.cm-s-3024-night span.cm-def {color: #e8bbd0;} +.cm-s-3024-night span.cm-bracket {color: #d6d5d4;} +.cm-s-3024-night span.cm-tag {color: #db2d20;} +.cm-s-3024-night span.cm-link {color: #a16a94;} +.cm-s-3024-night span.cm-error {background: #db2d20; color: #807d7c;} + +.cm-s-3024-night .CodeMirror-activeline-background {background: #2F2F2F !important;} +.cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance-mobile.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance-mobile.css new file mode 100644 index 0000000..88d332e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance-mobile.css @@ -0,0 +1,5 @@ +.cm-s-ambiance.CodeMirror { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance.css new file mode 100644 index 0000000..afcf15a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/ambiance.css @@ -0,0 +1,75 @@ +/* ambiance theme for codemirror */ + +/* Color scheme */ + +.cm-s-ambiance .cm-keyword { color: #cda869; } +.cm-s-ambiance .cm-atom { color: #CF7EA9; } +.cm-s-ambiance .cm-number { color: #78CF8A; } +.cm-s-ambiance .cm-def { color: #aac6e3; } +.cm-s-ambiance .cm-variable { color: #ffb795; } +.cm-s-ambiance .cm-variable-2 { color: #eed1b3; } +.cm-s-ambiance .cm-variable-3 { color: #faded3; } +.cm-s-ambiance .cm-property { color: #eed1b3; } +.cm-s-ambiance .cm-operator {color: #fa8d6a;} +.cm-s-ambiance .cm-comment { color: #555; font-style:italic; } +.cm-s-ambiance .cm-string { color: #8f9d6a; } +.cm-s-ambiance .cm-string-2 { color: #9d937c; } +.cm-s-ambiance .cm-meta { color: #D2A8A1; } +.cm-s-ambiance .cm-qualifier { color: yellow; } +.cm-s-ambiance .cm-builtin { color: #9999cc; } +.cm-s-ambiance .cm-bracket { color: #24C2C7; } +.cm-s-ambiance .cm-tag { color: #fee4ff } +.cm-s-ambiance .cm-attribute { color: #9B859D; } +.cm-s-ambiance .cm-header {color: blue;} +.cm-s-ambiance .cm-quote { color: #24C2C7; } +.cm-s-ambiance .cm-hr { color: pink; } +.cm-s-ambiance .cm-link { color: #F4C20B; } +.cm-s-ambiance .cm-special { color: #FF9D00; } +.cm-s-ambiance .cm-error { color: #AF2018; } + +.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } +.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } + +.cm-s-ambiance .CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } +.cm-s-ambiance.CodeMirror-focused .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance.CodeMirror ::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance.CodeMirror ::-moz-selection { background: rgba(255, 255, 255, 0.10); } + +/* Editor styling */ + +.cm-s-ambiance.CodeMirror { + line-height: 1.40em; + color: #E6E1DC; + background-color: #202020; + -webkit-box-shadow: inset 0 0 10px black; + -moz-box-shadow: inset 0 0 10px black; + box-shadow: inset 0 0 10px black; +} + +.cm-s-ambiance .CodeMirror-gutters { + background: #3D3D3D; + border-right: 1px solid #4D4D4D; + box-shadow: 0 10px 20px black; +} + +.cm-s-ambiance .CodeMirror-linenumber { + text-shadow: 0px 1px 1px #4d4d4d; + color: #111; + padding: 0 5px; +} + +.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; } +.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; } + +.cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor { + border-left: 1px solid #7991E8; +} + +.cm-s-ambiance .CodeMirror-activeline-background { + background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); +} + +.cm-s-ambiance.CodeMirror, +.cm-s-ambiance .CodeMirror-gutters { + background-image: url("data:image/png;base64,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"); +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-dark.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-dark.css new file mode 100644 index 0000000..b009d2b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-dark.css @@ -0,0 +1,38 @@ +/* + + Name: Base16 Default Dark + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-dark.CodeMirror {background: #151515; color: #e0e0e0;} +.cm-s-base16-dark div.CodeMirror-selected {background: #303030 !important;} +.cm-s-base16-dark.CodeMirror ::selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark.CodeMirror ::-moz-selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark .CodeMirror-gutters {background: #151515; border-right: 0px;} +.cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; } +.cm-s-base16-dark .CodeMirror-linenumber {color: #505050;} +.cm-s-base16-dark .CodeMirror-cursor {border-left: 1px solid #b0b0b0 !important;} + +.cm-s-base16-dark span.cm-comment {color: #8f5536;} +.cm-s-base16-dark span.cm-atom {color: #aa759f;} +.cm-s-base16-dark span.cm-number {color: #aa759f;} + +.cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute {color: #90a959;} +.cm-s-base16-dark span.cm-keyword {color: #ac4142;} +.cm-s-base16-dark span.cm-string {color: #f4bf75;} + +.cm-s-base16-dark span.cm-variable {color: #90a959;} +.cm-s-base16-dark span.cm-variable-2 {color: #6a9fb5;} +.cm-s-base16-dark span.cm-def {color: #d28445;} +.cm-s-base16-dark span.cm-bracket {color: #e0e0e0;} +.cm-s-base16-dark span.cm-tag {color: #ac4142;} +.cm-s-base16-dark span.cm-link {color: #aa759f;} +.cm-s-base16-dark span.cm-error {background: #ac4142; color: #b0b0b0;} + +.cm-s-base16-dark .CodeMirror-activeline-background {background: #202020 !important;} +.cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-light.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-light.css new file mode 100644 index 0000000..15df6d3 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/base16-light.css @@ -0,0 +1,38 @@ +/* + + Name: Base16 Default Light + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-light.CodeMirror {background: #f5f5f5; color: #202020;} +.cm-s-base16-light div.CodeMirror-selected {background: #e0e0e0 !important;} +.cm-s-base16-light.CodeMirror ::selection { background: #e0e0e0; } +.cm-s-base16-light.CodeMirror ::-moz-selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-gutters {background: #f5f5f5; border-right: 0px;} +.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-linenumber {color: #b0b0b0;} +.cm-s-base16-light .CodeMirror-cursor {border-left: 1px solid #505050 !important;} + +.cm-s-base16-light span.cm-comment {color: #8f5536;} +.cm-s-base16-light span.cm-atom {color: #aa759f;} +.cm-s-base16-light span.cm-number {color: #aa759f;} + +.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute {color: #90a959;} +.cm-s-base16-light span.cm-keyword {color: #ac4142;} +.cm-s-base16-light span.cm-string {color: #f4bf75;} + +.cm-s-base16-light span.cm-variable {color: #90a959;} +.cm-s-base16-light span.cm-variable-2 {color: #6a9fb5;} +.cm-s-base16-light span.cm-def {color: #d28445;} +.cm-s-base16-light span.cm-bracket {color: #202020;} +.cm-s-base16-light span.cm-tag {color: #ac4142;} +.cm-s-base16-light span.cm-link {color: #aa759f;} +.cm-s-base16-light span.cm-error {background: #ac4142; color: #505050;} + +.cm-s-base16-light .CodeMirror-activeline-background {background: #DDDCDC !important;} +.cm-s-base16-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/blackboard.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/blackboard.css new file mode 100644 index 0000000..02289b6 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/blackboard.css @@ -0,0 +1,32 @@ +/* Port of TextMate's Blackboard theme */ + +.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } +.cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; } +.cm-s-blackboard.CodeMirror ::selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard.CodeMirror ::-moz-selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } +.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; } +.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; } +.cm-s-blackboard .CodeMirror-linenumber { color: #888; } +.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } + +.cm-s-blackboard .cm-keyword { color: #FBDE2D; } +.cm-s-blackboard .cm-atom { color: #D8FA3C; } +.cm-s-blackboard .cm-number { color: #D8FA3C; } +.cm-s-blackboard .cm-def { color: #8DA6CE; } +.cm-s-blackboard .cm-variable { color: #FF6400; } +.cm-s-blackboard .cm-operator { color: #FBDE2D;} +.cm-s-blackboard .cm-comment { color: #AEAEAE; } +.cm-s-blackboard .cm-string { color: #61CE3C; } +.cm-s-blackboard .cm-string-2 { color: #61CE3C; } +.cm-s-blackboard .cm-meta { color: #D8FA3C; } +.cm-s-blackboard .cm-builtin { color: #8DA6CE; } +.cm-s-blackboard .cm-tag { color: #8DA6CE; } +.cm-s-blackboard .cm-attribute { color: #8DA6CE; } +.cm-s-blackboard .cm-header { color: #FF6400; } +.cm-s-blackboard .cm-hr { color: #AEAEAE; } +.cm-s-blackboard .cm-link { color: #8DA6CE; } +.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } + +.cm-s-blackboard .CodeMirror-activeline-background {background: #3C3636 !important;} +.cm-s-blackboard .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/cobalt.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/cobalt.css new file mode 100644 index 0000000..3915589 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/cobalt.css @@ -0,0 +1,25 @@ +.cm-s-cobalt.CodeMirror { background: #002240; color: white; } +.cm-s-cobalt div.CodeMirror-selected { background: #b36539 !important; } +.cm-s-cobalt.CodeMirror ::selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt.CodeMirror ::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; } +.cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-cobalt span.cm-comment { color: #08f; } +.cm-s-cobalt span.cm-atom { color: #845dc4; } +.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } +.cm-s-cobalt span.cm-keyword { color: #ffee80; } +.cm-s-cobalt span.cm-string { color: #3ad900; } +.cm-s-cobalt span.cm-meta { color: #ff9d00; } +.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } +.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; } +.cm-s-cobalt span.cm-bracket { color: #d8d8d8; } +.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } +.cm-s-cobalt span.cm-link { color: #845dc4; } +.cm-s-cobalt span.cm-error { color: #9d1e15; } + +.cm-s-cobalt .CodeMirror-activeline-background {background: #002D57 !important;} +.cm-s-cobalt .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/colorforth.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/colorforth.css new file mode 100644 index 0000000..73fbf80 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/colorforth.css @@ -0,0 +1,33 @@ +.cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; } +.cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; } +.cm-s-colorforth .CodeMirror-linenumber { color: #bababa; } +.cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-colorforth span.cm-comment { color: #ededed; } +.cm-s-colorforth span.cm-def { color: #ff1c1c; font-weight:bold; } +.cm-s-colorforth span.cm-keyword { color: #ffd900; } +.cm-s-colorforth span.cm-builtin { color: #00d95a; } +.cm-s-colorforth span.cm-variable { color: #73ff00; } +.cm-s-colorforth span.cm-string { color: #007bff; } +.cm-s-colorforth span.cm-number { color: #00c4ff; } +.cm-s-colorforth span.cm-atom { color: #606060; } + +.cm-s-colorforth span.cm-variable-2 { color: #EEE; } +.cm-s-colorforth span.cm-variable-3 { color: #DDD; } +.cm-s-colorforth span.cm-property {} +.cm-s-colorforth span.cm-operator {} + +.cm-s-colorforth span.cm-meta { color: yellow; } +.cm-s-colorforth span.cm-qualifier { color: #FFF700; } +.cm-s-colorforth span.cm-bracket { color: #cc7; } +.cm-s-colorforth span.cm-tag { color: #FFBD40; } +.cm-s-colorforth span.cm-attribute { color: #FFF700; } +.cm-s-colorforth span.cm-error { color: #f00; } + +.cm-s-colorforth .CodeMirror-selected { background: #333d53 !important; } + +.cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); } + +.cm-s-colorforth .CodeMirror-activeline-background {background: #253540 !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/eclipse.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/eclipse.css new file mode 100644 index 0000000..317218e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/eclipse.css @@ -0,0 +1,23 @@ +.cm-s-eclipse span.cm-meta {color: #FF1717;} +.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } +.cm-s-eclipse span.cm-atom {color: #219;} +.cm-s-eclipse span.cm-number {color: #164;} +.cm-s-eclipse span.cm-def {color: #00f;} +.cm-s-eclipse span.cm-variable {color: black;} +.cm-s-eclipse span.cm-variable-2 {color: #0000C0;} +.cm-s-eclipse span.cm-variable-3 {color: #0000C0;} +.cm-s-eclipse span.cm-property {color: black;} +.cm-s-eclipse span.cm-operator {color: black;} +.cm-s-eclipse span.cm-comment {color: #3F7F5F;} +.cm-s-eclipse span.cm-string {color: #2A00FF;} +.cm-s-eclipse span.cm-string-2 {color: #f50;} +.cm-s-eclipse span.cm-qualifier {color: #555;} +.cm-s-eclipse span.cm-builtin {color: #30a;} +.cm-s-eclipse span.cm-bracket {color: #cc7;} +.cm-s-eclipse span.cm-tag {color: #170;} +.cm-s-eclipse span.cm-attribute {color: #00c;} +.cm-s-eclipse span.cm-link {color: #219;} +.cm-s-eclipse span.cm-error {color: #f00;} + +.cm-s-eclipse .CodeMirror-activeline-background {background: #e8f2ff !important;} +.cm-s-eclipse .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/elegant.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/elegant.css new file mode 100644 index 0000000..dd7df7b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/elegant.css @@ -0,0 +1,13 @@ +.cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;} +.cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;} +.cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;} +.cm-s-elegant span.cm-variable {color: black;} +.cm-s-elegant span.cm-variable-2 {color: #b11;} +.cm-s-elegant span.cm-qualifier {color: #555;} +.cm-s-elegant span.cm-keyword {color: #730;} +.cm-s-elegant span.cm-builtin {color: #30a;} +.cm-s-elegant span.cm-link {color: #762;} +.cm-s-elegant span.cm-error {background-color: #fdd;} + +.cm-s-elegant .CodeMirror-activeline-background {background: #e8f2ff !important;} +.cm-s-elegant .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/erlang-dark.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/erlang-dark.css new file mode 100644 index 0000000..25c7e0a --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/erlang-dark.css @@ -0,0 +1,34 @@ +.cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } +.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539 !important; } +.cm-s-erlang-dark.CodeMirror ::selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark.CodeMirror ::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; } +.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-erlang-dark span.cm-atom { color: #f133f1; } +.cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } +.cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } +.cm-s-erlang-dark span.cm-builtin { color: #eaa; } +.cm-s-erlang-dark span.cm-comment { color: #77f; } +.cm-s-erlang-dark span.cm-def { color: #e7a; } +.cm-s-erlang-dark span.cm-keyword { color: #ffee80; } +.cm-s-erlang-dark span.cm-meta { color: #50fefe; } +.cm-s-erlang-dark span.cm-number { color: #ffd0d0; } +.cm-s-erlang-dark span.cm-operator { color: #d55; } +.cm-s-erlang-dark span.cm-property { color: #ccc; } +.cm-s-erlang-dark span.cm-qualifier { color: #ccc; } +.cm-s-erlang-dark span.cm-quote { color: #ccc; } +.cm-s-erlang-dark span.cm-special { color: #ffbbbb; } +.cm-s-erlang-dark span.cm-string { color: #3ad900; } +.cm-s-erlang-dark span.cm-string-2 { color: #ccc; } +.cm-s-erlang-dark span.cm-tag { color: #9effff; } +.cm-s-erlang-dark span.cm-variable { color: #50fe50; } +.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } +.cm-s-erlang-dark span.cm-variable-3 { color: #ccc; } +.cm-s-erlang-dark span.cm-error { color: #9d1e15; } + +.cm-s-erlang-dark .CodeMirror-activeline-background {background: #013461 !important;} +.cm-s-erlang-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/lesser-dark.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/lesser-dark.css new file mode 100644 index 0000000..5af8b7f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/lesser-dark.css @@ -0,0 +1,47 @@ +/* +http://lesscss.org/ dark theme +Ported to CodeMirror by Peter Kroon +*/ +.cm-s-lesser-dark { + line-height: 1.3em; +} +.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } +.cm-s-lesser-dark div.CodeMirror-selected {background: #45443B !important;} /* 33322B*/ +.cm-s-lesser-dark.CodeMirror ::selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark.CodeMirror ::-moz-selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white !important; } +.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ + +.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ + +.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } +.cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; } +.cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } + +.cm-s-lesser-dark span.cm-keyword { color: #599eff; } +.cm-s-lesser-dark span.cm-atom { color: #C2B470; } +.cm-s-lesser-dark span.cm-number { color: #B35E4D; } +.cm-s-lesser-dark span.cm-def {color: white;} +.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } +.cm-s-lesser-dark span.cm-variable-2 { color: #669199; } +.cm-s-lesser-dark span.cm-variable-3 { color: white; } +.cm-s-lesser-dark span.cm-property {color: #92A75C;} +.cm-s-lesser-dark span.cm-operator {color: #92A75C;} +.cm-s-lesser-dark span.cm-comment { color: #666; } +.cm-s-lesser-dark span.cm-string { color: #BCD279; } +.cm-s-lesser-dark span.cm-string-2 {color: #f50;} +.cm-s-lesser-dark span.cm-meta { color: #738C73; } +.cm-s-lesser-dark span.cm-qualifier {color: #555;} +.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } +.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } +.cm-s-lesser-dark span.cm-tag { color: #669199; } +.cm-s-lesser-dark span.cm-attribute {color: #00c;} +.cm-s-lesser-dark span.cm-header {color: #a0a;} +.cm-s-lesser-dark span.cm-quote {color: #090;} +.cm-s-lesser-dark span.cm-hr {color: #999;} +.cm-s-lesser-dark span.cm-link {color: #00c;} +.cm-s-lesser-dark span.cm-error { color: #9d1e15; } + +.cm-s-lesser-dark .CodeMirror-activeline-background {background: #3C3A3A !important;} +.cm-s-lesser-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/mbo.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/mbo.css new file mode 100644 index 0000000..e398795 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/mbo.css @@ -0,0 +1,37 @@ +/****************************************************************/ +/* Based on mbonaci's Brackets mbo theme */ +/* https://github.com/mbonaci/global/blob/master/Mbo.tmTheme */ +/* Create your own: http://tmtheme-editor.herokuapp.com */ +/****************************************************************/ + +.cm-s-mbo.CodeMirror {background: #2c2c2c; color: #ffffec;} +.cm-s-mbo div.CodeMirror-selected {background: #716C62 !important;} +.cm-s-mbo.CodeMirror ::selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo.CodeMirror ::-moz-selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo .CodeMirror-gutters {background: #4e4e4e; border-right: 0px;} +.cm-s-mbo .CodeMirror-guttermarker { color: white; } +.cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; } +.cm-s-mbo .CodeMirror-linenumber {color: #dadada;} +.cm-s-mbo .CodeMirror-cursor {border-left: 1px solid #ffffec !important;} + +.cm-s-mbo span.cm-comment {color: #95958a;} +.cm-s-mbo span.cm-atom {color: #00a8c6;} +.cm-s-mbo span.cm-number {color: #00a8c6;} + +.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute {color: #9ddfe9;} +.cm-s-mbo span.cm-keyword {color: #ffb928;} +.cm-s-mbo span.cm-string {color: #ffcf6c;} +.cm-s-mbo span.cm-string.cm-property {color: #ffffec;} + +.cm-s-mbo span.cm-variable {color: #ffffec;} +.cm-s-mbo span.cm-variable-2 {color: #00a8c6;} +.cm-s-mbo span.cm-def {color: #ffffec;} +.cm-s-mbo span.cm-bracket {color: #fffffc; font-weight: bold;} +.cm-s-mbo span.cm-tag {color: #9ddfe9;} +.cm-s-mbo span.cm-link {color: #f54b07;} +.cm-s-mbo span.cm-error {border-bottom: #636363; color: #ffffec;} +.cm-s-mbo span.cm-qualifier {color: #ffffec;} + +.cm-s-mbo .CodeMirror-activeline-background {background: #494b41 !important;} +.cm-s-mbo .CodeMirror-matchingbracket {color: #222 !important;} +.cm-s-mbo .CodeMirror-matchingtag {background: rgba(255, 255, 255, .37);} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/mdn-like.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/mdn-like.css new file mode 100644 index 0000000..93293c0 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/mdn-like.css @@ -0,0 +1,46 @@ +/* + MDN-LIKE Theme - Mozilla + Ported to CodeMirror by Peter Kroon + Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues + GitHub: @peterkroon + + The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation + +*/ +.cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; } +.cm-s-mdn-like .CodeMirror-selected { background: #cfc !important; } +.cm-s-mdn-like.CodeMirror ::selection { background: #cfc; } +.cm-s-mdn-like.CodeMirror ::-moz-selection { background: #cfc; } + +.cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; } +.cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; margin-left: 3px; } +div.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; } + +.cm-s-mdn-like .cm-keyword { color: #6262FF; } +.cm-s-mdn-like .cm-atom { color: #F90; } +.cm-s-mdn-like .cm-number { color: #ca7841; } +.cm-s-mdn-like .cm-def { color: #8DA6CE; } +.cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } +.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def { color: #07a; } + +.cm-s-mdn-like .cm-variable { color: #07a; } +.cm-s-mdn-like .cm-property { color: #905; } +.cm-s-mdn-like .cm-qualifier { color: #690; } + +.cm-s-mdn-like .cm-operator { color: #cda869; } +.cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; } +.cm-s-mdn-like .cm-string { color:#07a; font-style:italic; } +.cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/ +.cm-s-mdn-like .cm-meta { color: #000; } /*?*/ +.cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/ +.cm-s-mdn-like .cm-tag { color: #997643; } +.cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-mdn-like .cm-header { color: #FF6400; } +.cm-s-mdn-like .cm-hr { color: #AEAEAE; } +.cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } +.cm-s-mdn-like .cm-error { border-bottom: 1px solid red; } + +div.cm-s-mdn-like .CodeMirror-activeline-background {background: #efefff;} +div.cm-s-mdn-like span.CodeMirror-matchingbracket {outline:1px solid grey; color: inherit;} + +.cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,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); } diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/midnight.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/midnight.css new file mode 100644 index 0000000..296af4f --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/midnight.css @@ -0,0 +1,47 @@ +/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */ + +/**/ +.cm-s-midnight span.CodeMirror-matchhighlight { background: #494949; } +.cm-s-midnight.CodeMirror-focused span.CodeMirror-matchhighlight { background: #314D67 !important; } + +/**/ +.cm-s-midnight .CodeMirror-activeline-background {background: #253540 !important;} + +.cm-s-midnight.CodeMirror { + background: #0F192A; + color: #D1EDFF; +} + +.cm-s-midnight.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;} + +.cm-s-midnight div.CodeMirror-selected {background: #314D67 !important;} +.cm-s-midnight.CodeMirror ::selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight.CodeMirror ::-moz-selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight .CodeMirror-gutters {background: #0F192A; border-right: 1px solid;} +.cm-s-midnight .CodeMirror-guttermarker { color: white; } +.cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-midnight .CodeMirror-linenumber {color: #D0D0D0;} +.cm-s-midnight .CodeMirror-cursor { + border-left: 1px solid #F8F8F0 !important; +} + +.cm-s-midnight span.cm-comment {color: #428BDD;} +.cm-s-midnight span.cm-atom {color: #AE81FF;} +.cm-s-midnight span.cm-number {color: #D1EDFF;} + +.cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute {color: #A6E22E;} +.cm-s-midnight span.cm-keyword {color: #E83737;} +.cm-s-midnight span.cm-string {color: #1DC116;} + +.cm-s-midnight span.cm-variable {color: #FFAA3E;} +.cm-s-midnight span.cm-variable-2 {color: #FFAA3E;} +.cm-s-midnight span.cm-def {color: #4DD;} +.cm-s-midnight span.cm-bracket {color: #D1EDFF;} +.cm-s-midnight span.cm-tag {color: #449;} +.cm-s-midnight span.cm-link {color: #AE81FF;} +.cm-s-midnight span.cm-error {background: #F92672; color: #F8F8F0;} + +.cm-s-midnight .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/monokai.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/monokai.css new file mode 100644 index 0000000..6dfcc73 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/monokai.css @@ -0,0 +1,33 @@ +/* Based on Sublime Text's Monokai theme */ + +.cm-s-monokai.CodeMirror {background: #272822; color: #f8f8f2;} +.cm-s-monokai div.CodeMirror-selected {background: #49483E !important;} +.cm-s-monokai.CodeMirror ::selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai.CodeMirror ::-moz-selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai .CodeMirror-gutters {background: #272822; border-right: 0px;} +.cm-s-monokai .CodeMirror-guttermarker { color: white; } +.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-monokai .CodeMirror-linenumber {color: #d0d0d0;} +.cm-s-monokai .CodeMirror-cursor {border-left: 1px solid #f8f8f0 !important;} + +.cm-s-monokai span.cm-comment {color: #75715e;} +.cm-s-monokai span.cm-atom {color: #ae81ff;} +.cm-s-monokai span.cm-number {color: #ae81ff;} + +.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute {color: #a6e22e;} +.cm-s-monokai span.cm-keyword {color: #f92672;} +.cm-s-monokai span.cm-string {color: #e6db74;} + +.cm-s-monokai span.cm-variable {color: #a6e22e;} +.cm-s-monokai span.cm-variable-2 {color: #9effff;} +.cm-s-monokai span.cm-def {color: #fd971f;} +.cm-s-monokai span.cm-bracket {color: #f8f8f2;} +.cm-s-monokai span.cm-tag {color: #f92672;} +.cm-s-monokai span.cm-link {color: #ae81ff;} +.cm-s-monokai span.cm-error {background: #f92672; color: #f8f8f0;} + +.cm-s-monokai .CodeMirror-activeline-background {background: #373831 !important;} +.cm-s-monokai .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/neat.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/neat.css new file mode 100644 index 0000000..115083b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/neat.css @@ -0,0 +1,12 @@ +.cm-s-neat span.cm-comment { color: #a86; } +.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } +.cm-s-neat span.cm-string { color: #a22; } +.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } +.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } +.cm-s-neat span.cm-variable { color: black; } +.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } +.cm-s-neat span.cm-meta {color: #555;} +.cm-s-neat span.cm-link { color: #3a3; } + +.cm-s-neat .CodeMirror-activeline-background {background: #e8f2ff !important;} +.cm-s-neat .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/neo.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/neo.css new file mode 100644 index 0000000..cecaaf2 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/neo.css @@ -0,0 +1,43 @@ +/* neo theme for codemirror */ + +/* Color scheme */ + +.cm-s-neo.CodeMirror { + background-color:#ffffff; + color:#2e383c; + line-height:1.4375; +} +.cm-s-neo .cm-comment {color:#75787b} +.cm-s-neo .cm-keyword, .cm-s-neo .cm-property {color:#1d75b3} +.cm-s-neo .cm-atom,.cm-s-neo .cm-number {color:#75438a} +.cm-s-neo .cm-node,.cm-s-neo .cm-tag {color:#9c3328} +.cm-s-neo .cm-string {color:#b35e14} +.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier {color:#047d65} + + +/* Editor styling */ + +.cm-s-neo pre { + padding:0; +} + +.cm-s-neo .CodeMirror-gutters { + border:none; + border-right:10px solid transparent; + background-color:transparent; +} + +.cm-s-neo .CodeMirror-linenumber { + padding:0; + color:#e0e2e5; +} + +.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } +.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } + +.cm-s-neo div.CodeMirror-cursor { + width: auto; + border: 0; + background: rgba(155,157,162,0.37); + z-index: 1; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/night.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/night.css new file mode 100644 index 0000000..6b2ac6c --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/night.css @@ -0,0 +1,28 @@ +/* Loosely based on the Midnight Textmate theme */ + +.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-night div.CodeMirror-selected { background: #447 !important; } +.cm-s-night.CodeMirror ::selection { background: rgba(68, 68, 119, .99); } +.cm-s-night.CodeMirror ::-moz-selection { background: rgba(68, 68, 119, .99); } +.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-night .CodeMirror-guttermarker { color: white; } +.cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; } +.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-night span.cm-comment { color: #6900a1; } +.cm-s-night span.cm-atom { color: #845dc4; } +.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } +.cm-s-night span.cm-keyword { color: #599eff; } +.cm-s-night span.cm-string { color: #37f14a; } +.cm-s-night span.cm-meta { color: #7678e2; } +.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } +.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; } +.cm-s-night span.cm-bracket { color: #8da6ce; } +.cm-s-night span.cm-comment { color: #6900a1; } +.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } +.cm-s-night span.cm-link { color: #845dc4; } +.cm-s-night span.cm-error { color: #9d1e15; } + +.cm-s-night .CodeMirror-activeline-background {background: #1C005A !important;} +.cm-s-night .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-dark.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-dark.css new file mode 100644 index 0000000..af914b6 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-dark.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Dark) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-dark.CodeMirror {background: #2f1e2e; color: #b9b6b0;} +.cm-s-paraiso-dark div.CodeMirror-selected {background: #41323f !important;} +.cm-s-paraiso-dark.CodeMirror ::selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark.CodeMirror ::-moz-selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark .CodeMirror-gutters {background: #2f1e2e; border-right: 0px;} +.cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; } +.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; } +.cm-s-paraiso-dark .CodeMirror-linenumber {color: #776e71;} +.cm-s-paraiso-dark .CodeMirror-cursor {border-left: 1px solid #8d8687 !important;} + +.cm-s-paraiso-dark span.cm-comment {color: #e96ba8;} +.cm-s-paraiso-dark span.cm-atom {color: #815ba4;} +.cm-s-paraiso-dark span.cm-number {color: #815ba4;} + +.cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute {color: #48b685;} +.cm-s-paraiso-dark span.cm-keyword {color: #ef6155;} +.cm-s-paraiso-dark span.cm-string {color: #fec418;} + +.cm-s-paraiso-dark span.cm-variable {color: #48b685;} +.cm-s-paraiso-dark span.cm-variable-2 {color: #06b6ef;} +.cm-s-paraiso-dark span.cm-def {color: #f99b15;} +.cm-s-paraiso-dark span.cm-bracket {color: #b9b6b0;} +.cm-s-paraiso-dark span.cm-tag {color: #ef6155;} +.cm-s-paraiso-dark span.cm-link {color: #815ba4;} +.cm-s-paraiso-dark span.cm-error {background: #ef6155; color: #8d8687;} + +.cm-s-paraiso-dark .CodeMirror-activeline-background {background: #4D344A !important;} +.cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-light.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-light.css new file mode 100644 index 0000000..e198066 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/paraiso-light.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Light) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-light.CodeMirror {background: #e7e9db; color: #41323f;} +.cm-s-paraiso-light div.CodeMirror-selected {background: #b9b6b0 !important;} +.cm-s-paraiso-light.CodeMirror ::selection { background: #b9b6b0; } +.cm-s-paraiso-light.CodeMirror ::-moz-selection { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-gutters {background: #e7e9db; border-right: 0px;} +.cm-s-paraiso-light .CodeMirror-guttermarker { color: black; } +.cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; } +.cm-s-paraiso-light .CodeMirror-linenumber {color: #8d8687;} +.cm-s-paraiso-light .CodeMirror-cursor {border-left: 1px solid #776e71 !important;} + +.cm-s-paraiso-light span.cm-comment {color: #e96ba8;} +.cm-s-paraiso-light span.cm-atom {color: #815ba4;} +.cm-s-paraiso-light span.cm-number {color: #815ba4;} + +.cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute {color: #48b685;} +.cm-s-paraiso-light span.cm-keyword {color: #ef6155;} +.cm-s-paraiso-light span.cm-string {color: #fec418;} + +.cm-s-paraiso-light span.cm-variable {color: #48b685;} +.cm-s-paraiso-light span.cm-variable-2 {color: #06b6ef;} +.cm-s-paraiso-light span.cm-def {color: #f99b15;} +.cm-s-paraiso-light span.cm-bracket {color: #41323f;} +.cm-s-paraiso-light span.cm-tag {color: #ef6155;} +.cm-s-paraiso-light span.cm-link {color: #815ba4;} +.cm-s-paraiso-light span.cm-error {background: #ef6155; color: #776e71;} + +.cm-s-paraiso-light .CodeMirror-activeline-background {background: #CFD1C4 !important;} +.cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/pastel-on-dark.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/pastel-on-dark.css new file mode 100644 index 0000000..0d06f63 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/pastel-on-dark.css @@ -0,0 +1,53 @@ +/** + * Pastel On Dark theme ported from ACE editor + * @license MIT + * @copyright AtomicPages LLC 2014 + * @author Dennis Thompson, AtomicPages LLC + * @version 1.1 + * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme + */ + +.cm-s-pastel-on-dark.CodeMirror { + background: #2c2827; + color: #8F938F; + line-height: 1.5; + font-size: 14px; +} +.cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2) !important; } +.cm-s-pastel-on-dark.CodeMirror ::selection { background: rgba(221,240,255,0.2); } +.cm-s-pastel-on-dark.CodeMirror ::-moz-selection { background: rgba(221,240,255,0.2); } + +.cm-s-pastel-on-dark .CodeMirror-gutters { + background: #34302f; + border-right: 0px; + padding: 0 3px; +} +.cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; } +.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } +.cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; } +.cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; } +.cm-s-pastel-on-dark span.cm-property { color: #8F938F; } +.cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; } +.cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-string { color: #66A968; } +.cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } +.cm-s-pastel-on-dark span.cm-variable-3 { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-def { color: #757aD8; } +.cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } +.cm-s-pastel-on-dark span.cm-tag { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-link { color: #ae81ff; } +.cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-error { + background: #757aD8; + color: #f8f8f0; +} +.cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031) !important; } +.cm-s-pastel-on-dark .CodeMirror-matchingbracket { + border: 1px solid rgba(255,255,255,0.25); + color: #8F938F !important; + margin: -1px -1px 0 -1px; +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/rubyblue.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/rubyblue.css new file mode 100644 index 0000000..d2fc0ec --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/rubyblue.css @@ -0,0 +1,25 @@ +.cm-s-rubyblue.CodeMirror { background: #112435; color: white; } +.cm-s-rubyblue div.CodeMirror-selected { background: #38566F !important; } +.cm-s-rubyblue.CodeMirror ::selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue.CodeMirror ::-moz-selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } +.cm-s-rubyblue .CodeMirror-guttermarker { color: white; } +.cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; } +.cm-s-rubyblue .CodeMirror-linenumber { color: white; } +.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } +.cm-s-rubyblue span.cm-atom { color: #F4C20B; } +.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } +.cm-s-rubyblue span.cm-keyword { color: #F0F; } +.cm-s-rubyblue span.cm-string { color: #F08047; } +.cm-s-rubyblue span.cm-meta { color: #F0F; } +.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } +.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; } +.cm-s-rubyblue span.cm-bracket { color: #F0F; } +.cm-s-rubyblue span.cm-link { color: #F4C20B; } +.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } +.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } +.cm-s-rubyblue span.cm-error { color: #AF2018; } + +.cm-s-rubyblue .CodeMirror-activeline-background {background: #173047 !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/solarized.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/solarized.css new file mode 100644 index 0000000..4a10b7c --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/solarized.css @@ -0,0 +1,165 @@ +/* +Solarized theme for code-mirror +http://ethanschoonover.com/solarized +*/ + +/* +Solarized color pallet +http://ethanschoonover.com/solarized/img/solarized-palette.png +*/ + +.solarized.base03 { color: #002b36; } +.solarized.base02 { color: #073642; } +.solarized.base01 { color: #586e75; } +.solarized.base00 { color: #657b83; } +.solarized.base0 { color: #839496; } +.solarized.base1 { color: #93a1a1; } +.solarized.base2 { color: #eee8d5; } +.solarized.base3 { color: #fdf6e3; } +.solarized.solar-yellow { color: #b58900; } +.solarized.solar-orange { color: #cb4b16; } +.solarized.solar-red { color: #dc322f; } +.solarized.solar-magenta { color: #d33682; } +.solarized.solar-violet { color: #6c71c4; } +.solarized.solar-blue { color: #268bd2; } +.solarized.solar-cyan { color: #2aa198; } +.solarized.solar-green { color: #859900; } + +/* Color scheme for code-mirror */ + +.cm-s-solarized { + line-height: 1.45em; + color-profile: sRGB; + rendering-intent: auto; +} +.cm-s-solarized.cm-s-dark { + color: #839496; + background-color: #002b36; + text-shadow: #002b36 0 1px; +} +.cm-s-solarized.cm-s-light { + background-color: #fdf6e3; + color: #657b83; + text-shadow: #eee8d5 0 1px; +} + +.cm-s-solarized .CodeMirror-widget { + text-shadow: none; +} + + +.cm-s-solarized .cm-keyword { color: #cb4b16 } +.cm-s-solarized .cm-atom { color: #d33682; } +.cm-s-solarized .cm-number { color: #d33682; } +.cm-s-solarized .cm-def { color: #2aa198; } + +.cm-s-solarized .cm-variable { color: #268bd2; } +.cm-s-solarized .cm-variable-2 { color: #b58900; } +.cm-s-solarized .cm-variable-3 { color: #6c71c4; } + +.cm-s-solarized .cm-property { color: #2aa198; } +.cm-s-solarized .cm-operator {color: #6c71c4;} + +.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } + +.cm-s-solarized .cm-string { color: #859900; } +.cm-s-solarized .cm-string-2 { color: #b58900; } + +.cm-s-solarized .cm-meta { color: #859900; } +.cm-s-solarized .cm-qualifier { color: #b58900; } +.cm-s-solarized .cm-builtin { color: #d33682; } +.cm-s-solarized .cm-bracket { color: #cb4b16; } +.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } +.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } +.cm-s-solarized .cm-tag { color: #93a1a1 } +.cm-s-solarized .cm-attribute { color: #2aa198; } +.cm-s-solarized .cm-header { color: #586e75; } +.cm-s-solarized .cm-quote { color: #93a1a1; } +.cm-s-solarized .cm-hr { + color: transparent; + border-top: 1px solid #586e75; + display: block; +} +.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } +.cm-s-solarized .cm-special { color: #6c71c4; } +.cm-s-solarized .cm-em { + color: #999; + text-decoration: underline; + text-decoration-style: dotted; +} +.cm-s-solarized .cm-strong { color: #eee; } +.cm-s-solarized .cm-error, +.cm-s-solarized .cm-invalidchar { + color: #586e75; + border-bottom: 1px dotted #dc322f; +} + +.cm-s-solarized.cm-s-dark .CodeMirror-selected { background: #073642; } +.cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); } +.cm-s-solarized.cm-s-dark.CodeMirror ::-moz-selection { background: rgba(7, 54, 66, 0.99); } + +.cm-s-solarized.cm-s-light .CodeMirror-selected { background: #eee8d5; } +.cm-s-solarized.cm-s-light.CodeMirror ::selection { background: #eee8d5; } +.cm-s-solarized.cm-s-lightCodeMirror ::-moz-selection { background: #eee8d5; } + +/* Editor styling */ + + + +/* Little shadow on the view-port of the buffer view */ +.cm-s-solarized.CodeMirror { + -moz-box-shadow: inset 7px 0 12px -6px #000; + -webkit-box-shadow: inset 7px 0 12px -6px #000; + box-shadow: inset 7px 0 12px -6px #000; +} + +/* Gutter border and some shadow from it */ +.cm-s-solarized .CodeMirror-gutters { + border-right: 1px solid; +} + +/* Gutter colors and line number styling based of color scheme (dark / light) */ + +/* Dark */ +.cm-s-solarized.cm-s-dark .CodeMirror-gutters { + background-color: #002b36; + border-color: #00232c; +} + +.cm-s-solarized.cm-s-dark .CodeMirror-linenumber { + text-shadow: #021014 0 -1px; +} + +/* Light */ +.cm-s-solarized.cm-s-light .CodeMirror-gutters { + background-color: #fdf6e3; + border-color: #eee8d5; +} + +/* Common */ +.cm-s-solarized .CodeMirror-linenumber { + color: #586e75; + padding: 0 5px; +} +.cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; } +.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; } +.cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; } + +.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { + color: #586e75; +} + +.cm-s-solarized .CodeMirror-lines .CodeMirror-cursor { + border-left: 1px solid #819090; +} + +/* +Active line. Negative margin compensates left padding of the text in the +view-port +*/ +.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background { + background: rgba(255, 255, 255, 0.10); +} +.cm-s-solarized.cm-s-light .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.10); +} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/the-matrix.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/the-matrix.css new file mode 100644 index 0000000..f29b22b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/the-matrix.css @@ -0,0 +1,30 @@ +.cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; } +.cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D !important; } +.cm-s-the-matrix.CodeMirror ::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix.CodeMirror ::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; } +.cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; } +.cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; } +.cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; } +.cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00 !important; } + +.cm-s-the-matrix span.cm-keyword {color: #008803; font-weight: bold;} +.cm-s-the-matrix span.cm-atom {color: #3FF;} +.cm-s-the-matrix span.cm-number {color: #FFB94F;} +.cm-s-the-matrix span.cm-def {color: #99C;} +.cm-s-the-matrix span.cm-variable {color: #F6C;} +.cm-s-the-matrix span.cm-variable-2 {color: #C6F;} +.cm-s-the-matrix span.cm-variable-3 {color: #96F;} +.cm-s-the-matrix span.cm-property {color: #62FFA0;} +.cm-s-the-matrix span.cm-operator {color: #999} +.cm-s-the-matrix span.cm-comment {color: #CCCCCC;} +.cm-s-the-matrix span.cm-string {color: #39C;} +.cm-s-the-matrix span.cm-meta {color: #C9F;} +.cm-s-the-matrix span.cm-qualifier {color: #FFF700;} +.cm-s-the-matrix span.cm-builtin {color: #30a;} +.cm-s-the-matrix span.cm-bracket {color: #cc7;} +.cm-s-the-matrix span.cm-tag {color: #FFBD40;} +.cm-s-the-matrix span.cm-attribute {color: #FFF700;} +.cm-s-the-matrix span.cm-error {color: #FF0000;} + +.cm-s-the-matrix .CodeMirror-activeline-background {background: #040;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-bright.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-bright.css new file mode 100644 index 0000000..decb82d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-bright.css @@ -0,0 +1,35 @@ +/* + + Name: Tomorrow Night - Bright + Author: Chris Kempson + + Port done by Gerard Braad + +*/ + +.cm-s-tomorrow-night-bright.CodeMirror {background: #000000; color: #eaeaea;} +.cm-s-tomorrow-night-bright div.CodeMirror-selected {background: #424242 !important;} +.cm-s-tomorrow-night-bright .CodeMirror-gutters {background: #000000; border-right: 0px;} +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; } +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-bright .CodeMirror-linenumber {color: #424242;} +.cm-s-tomorrow-night-bright .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;} + +.cm-s-tomorrow-night-bright span.cm-comment {color: #d27b53;} +.cm-s-tomorrow-night-bright span.cm-atom {color: #a16a94;} +.cm-s-tomorrow-night-bright span.cm-number {color: #a16a94;} + +.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute {color: #99cc99;} +.cm-s-tomorrow-night-bright span.cm-keyword {color: #d54e53;} +.cm-s-tomorrow-night-bright span.cm-string {color: #e7c547;} + +.cm-s-tomorrow-night-bright span.cm-variable {color: #b9ca4a;} +.cm-s-tomorrow-night-bright span.cm-variable-2 {color: #7aa6da;} +.cm-s-tomorrow-night-bright span.cm-def {color: #e78c45;} +.cm-s-tomorrow-night-bright span.cm-bracket {color: #eaeaea;} +.cm-s-tomorrow-night-bright span.cm-tag {color: #d54e53;} +.cm-s-tomorrow-night-bright span.cm-link {color: #a16a94;} +.cm-s-tomorrow-night-bright span.cm-error {background: #d54e53; color: #6A6A6A;} + +.cm-s-tomorrow-night-bright .CodeMirror-activeline-background {background: #2a2a2a !important;} +.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-eighties.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-eighties.css new file mode 100644 index 0000000..5fca3ca --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/tomorrow-night-eighties.css @@ -0,0 +1,38 @@ +/* + + Name: Tomorrow Night - Eighties + Author: Chris Kempson + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-tomorrow-night-eighties.CodeMirror {background: #000000; color: #CCCCCC;} +.cm-s-tomorrow-night-eighties div.CodeMirror-selected {background: #2D2D2D !important;} +.cm-s-tomorrow-night-eighties.CodeMirror ::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties.CodeMirror ::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties .CodeMirror-gutters {background: #000000; border-right: 0px;} +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; } +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-eighties .CodeMirror-linenumber {color: #515151;} +.cm-s-tomorrow-night-eighties .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;} + +.cm-s-tomorrow-night-eighties span.cm-comment {color: #d27b53;} +.cm-s-tomorrow-night-eighties span.cm-atom {color: #a16a94;} +.cm-s-tomorrow-night-eighties span.cm-number {color: #a16a94;} + +.cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute {color: #99cc99;} +.cm-s-tomorrow-night-eighties span.cm-keyword {color: #f2777a;} +.cm-s-tomorrow-night-eighties span.cm-string {color: #ffcc66;} + +.cm-s-tomorrow-night-eighties span.cm-variable {color: #99cc99;} +.cm-s-tomorrow-night-eighties span.cm-variable-2 {color: #6699cc;} +.cm-s-tomorrow-night-eighties span.cm-def {color: #f99157;} +.cm-s-tomorrow-night-eighties span.cm-bracket {color: #CCCCCC;} +.cm-s-tomorrow-night-eighties span.cm-tag {color: #f2777a;} +.cm-s-tomorrow-night-eighties span.cm-link {color: #a16a94;} +.cm-s-tomorrow-night-eighties span.cm-error {background: #f2777a; color: #6A6A6A;} + +.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background {background: #343600 !important;} +.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/twilight.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/twilight.css new file mode 100644 index 0000000..889a83d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/twilight.css @@ -0,0 +1,32 @@ +.cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ +.cm-s-twilight .CodeMirror-selected { background: #323232 !important; } /**/ +.cm-s-twilight.CodeMirror ::selection { background: rgba(50, 50, 50, 0.99); } +.cm-s-twilight.CodeMirror ::-moz-selection { background: rgba(50, 50, 50, 0.99); } + +.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } +.cm-s-twilight .CodeMirror-guttermarker { color: white; } +.cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; } +.cm-s-twilight .CodeMirror-linenumber { color: #aaa; } +.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ +.cm-s-twilight .cm-atom { color: #FC0; } +.cm-s-twilight .cm-number { color: #ca7841; } /**/ +.cm-s-twilight .cm-def { color: #8DA6CE; } +.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ +.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/ +.cm-s-twilight .cm-operator { color: #cda869; } /**/ +.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ +.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ +.cm-s-twilight .cm-string-2 { color:#bd6b18 } /*?*/ +.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ +.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ +.cm-s-twilight .cm-tag { color: #997643; } /**/ +.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-twilight .cm-header { color: #FF6400; } +.cm-s-twilight .cm-hr { color: #AEAEAE; } +.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ +.cm-s-twilight .cm-error { border-bottom: 1px solid red; } + +.cm-s-twilight .CodeMirror-activeline-background {background: #27282E !important;} +.cm-s-twilight .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/vibrant-ink.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/vibrant-ink.css new file mode 100644 index 0000000..8ea5359 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/vibrant-ink.css @@ -0,0 +1,34 @@ +/* Taken from the popular Visual Studio Vibrant Ink Schema */ + +.cm-s-vibrant-ink.CodeMirror { background: black; color: white; } +.cm-s-vibrant-ink .CodeMirror-selected { background: #35493c !important; } +.cm-s-vibrant-ink.CodeMirror ::selection { background: rgba(53, 73, 60, 0.99); } +.cm-s-vibrant-ink.CodeMirror ::-moz-selection { background: rgba(53, 73, 60, 0.99); } + +.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; } +.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-vibrant-ink .cm-keyword { color: #CC7832; } +.cm-s-vibrant-ink .cm-atom { color: #FC0; } +.cm-s-vibrant-ink .cm-number { color: #FFEE98; } +.cm-s-vibrant-ink .cm-def { color: #8DA6CE; } +.cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D } +.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def { color: #FFC66D } +.cm-s-vibrant-ink .cm-operator { color: #888; } +.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } +.cm-s-vibrant-ink .cm-string { color: #A5C25C } +.cm-s-vibrant-ink .cm-string-2 { color: red } +.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } +.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-header { color: #FF6400; } +.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } +.cm-s-vibrant-ink .cm-link { color: blue; } +.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } + +.cm-s-vibrant-ink .CodeMirror-activeline-background {background: #27282E !important;} +.cm-s-vibrant-ink .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-dark.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-dark.css new file mode 100644 index 0000000..d537993 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-dark.css @@ -0,0 +1,53 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-selected { background: #27007A !important; } +.cm-s-xq-dark.CodeMirror ::selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark.CodeMirror ::-moz-selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; } + +.cm-s-xq-dark span.cm-keyword {color: #FFBD40;} +.cm-s-xq-dark span.cm-atom {color: #6C8CD5;} +.cm-s-xq-dark span.cm-number {color: #164;} +.cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;} +.cm-s-xq-dark span.cm-variable {color: #FFF;} +.cm-s-xq-dark span.cm-variable-2 {color: #EEE;} +.cm-s-xq-dark span.cm-variable-3 {color: #DDD;} +.cm-s-xq-dark span.cm-property {} +.cm-s-xq-dark span.cm-operator {} +.cm-s-xq-dark span.cm-comment {color: gray;} +.cm-s-xq-dark span.cm-string {color: #9FEE00;} +.cm-s-xq-dark span.cm-meta {color: yellow;} +.cm-s-xq-dark span.cm-qualifier {color: #FFF700;} +.cm-s-xq-dark span.cm-builtin {color: #30a;} +.cm-s-xq-dark span.cm-bracket {color: #cc7;} +.cm-s-xq-dark span.cm-tag {color: #FFBD40;} +.cm-s-xq-dark span.cm-attribute {color: #FFF700;} +.cm-s-xq-dark span.cm-error {color: #f00;} + +.cm-s-xq-dark .CodeMirror-activeline-background {background: #27282E !important;} +.cm-s-xq-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-light.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-light.css new file mode 100644 index 0000000..20b5c79 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/xq-light.css @@ -0,0 +1,43 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-light span.cm-keyword {line-height: 1em; font-weight: bold; color: #5A5CAD; } +.cm-s-xq-light span.cm-atom {color: #6C8CD5;} +.cm-s-xq-light span.cm-number {color: #164;} +.cm-s-xq-light span.cm-def {text-decoration:underline;} +.cm-s-xq-light span.cm-variable {color: black; } +.cm-s-xq-light span.cm-variable-2 {color:black;} +.cm-s-xq-light span.cm-variable-3 {color: black; } +.cm-s-xq-light span.cm-property {} +.cm-s-xq-light span.cm-operator {} +.cm-s-xq-light span.cm-comment {color: #0080FF; font-style: italic;} +.cm-s-xq-light span.cm-string {color: red;} +.cm-s-xq-light span.cm-meta {color: yellow;} +.cm-s-xq-light span.cm-qualifier {color: grey} +.cm-s-xq-light span.cm-builtin {color: #7EA656;} +.cm-s-xq-light span.cm-bracket {color: #cc7;} +.cm-s-xq-light span.cm-tag {color: #3F7F7F;} +.cm-s-xq-light span.cm-attribute {color: #7F007F;} +.cm-s-xq-light span.cm-error {color: #f00;} + +.cm-s-xq-light .CodeMirror-activeline-background {background: #e8f2ff !important;} +.cm-s-xq-light .CodeMirror-matchingbracket {outline:1px solid grey;color:black !important;background:yellow;} \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/codemirror/theme/zenburn.css b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/zenburn.css new file mode 100644 index 0000000..f817198 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/codemirror/theme/zenburn.css @@ -0,0 +1,37 @@ +/** + * " + * Using Zenburn color palette from the Emacs Zenburn Theme + * https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el + * + * Also using parts of https://github.com/xavi/coderay-lighttable-theme + * " + * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css + */ + +.cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; } +.cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; } +.cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white !important; } +.cm-s-zenburn { background-color: #3f3f3f; color: #dcdccc; } +.cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; } +.cm-s-zenburn span.cm-comment { color: #7f9f7f; } +.cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; } +.cm-s-zenburn span.cm-atom { color: #bfebbf; } +.cm-s-zenburn span.cm-def { color: #dcdccc; } +.cm-s-zenburn span.cm-variable { color: #dfaf8f; } +.cm-s-zenburn span.cm-variable-2 { color: #dcdccc; } +.cm-s-zenburn span.cm-string { color: #cc9393; } +.cm-s-zenburn span.cm-string-2 { color: #cc9393; } +.cm-s-zenburn span.cm-number { color: #dcdccc; } +.cm-s-zenburn span.cm-tag { color: #93e0e3; } +.cm-s-zenburn span.cm-property { color: #dfaf8f; } +.cm-s-zenburn span.cm-attribute { color: #dfaf8f; } +.cm-s-zenburn span.cm-qualifier { color: #7cb8bb; } +.cm-s-zenburn span.cm-meta { color: #f0dfaf; } +.cm-s-zenburn span.cm-header { color: #f0efd0; } +.cm-s-zenburn span.cm-operator { color: #f0efd0; } +.cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; } +.cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; } +.cm-s-zenburn .CodeMirror-activeline { background: #000000; } +.cm-s-zenburn .CodeMirror-activeline-background { background: #000000; } +.cm-s-zenburn .CodeMirror-selected { background: #545454; } +.cm-s-zenburn .CodeMirror-focused .CodeMirror-selected { background: #4f4f4f; } diff --git a/src/collectedstatic/mdeditor/js/lib/flowchart.min.js b/src/collectedstatic/mdeditor/js/lib/flowchart.min.js new file mode 100644 index 0000000..7808021 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/flowchart.min.js @@ -0,0 +1,5 @@ +// flowchart, v1.3.4 +// Copyright (c)2014 Adriano Raiano (adrai). +// Distributed under MIT license +// http://adrai.github.io/flowchart.js +!function(){function a(b,c){if(!b||"function"==typeof b)return c;var d={};for(var e in c)d[e]=c[e];for(e in b)b[e]&&(d[e]="object"==typeof d[e]?a(d[e],b[e]):b[e]);return d}function b(a,b){if("function"==typeof Object.create)a.super_=b,a.prototype=Object.create(b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}});else{a.super_=b;var c=function(){};c.prototype=b.prototype,a.prototype=new c,a.prototype.constructor=a}}function c(a,b,c){var d,e,f="M{0},{1}";for(d=2,e=2*c.length+2;e>d;d+=2)f+=" L{"+d+"},{"+(d+1)+"}";var g=[b.x,b.y];for(d=0,e=c.length;e>d;d++)g.push(c[d].x),g.push(c[d].y);var h=a.paper.path(f,g);h.attr("stroke",a.options["element-color"]),h.attr("stroke-width",a.options["line-width"]);var i=a.options.font,j=a.options["font-family"],k=a.options["font-weight"];return i&&h.attr({font:i}),j&&h.attr({"font-family":j}),k&&h.attr({"font-weight":k}),h}function d(a,b,c,d){var e,f;"[object Array]"!==Object.prototype.toString.call(c)&&(c=[c]);var g="M{0},{1}";for(e=2,f=2*c.length+2;f>e;e+=2)g+=" L{"+e+"},{"+(e+1)+"}";var h=[b.x,b.y];for(e=0,f=c.length;f>e;e++)h.push(c[e].x),h.push(c[e].y);var i=a.paper.path(g,h);i.attr({stroke:a.options["line-color"],"stroke-width":a.options["line-width"],"arrow-end":a.options["arrow-end"]});var j=a.options.font,k=a.options["font-family"],l=a.options["font-weight"];if(j&&i.attr({font:j}),k&&i.attr({"font-family":k}),l&&i.attr({"font-weight":l}),d){var m=!1,n=a.paper.text(0,0,d),o=!1,p=c[0];b.y===p.y&&(o=!0);var q=0,r=0;m?(q=b.x>p.x?b.x-(b.x-p.x)/2:p.x-(p.x-b.x)/2,r=b.y>p.y?b.y-(b.y-p.y)/2:p.y-(p.y-b.y)/2,o?(q-=n.getBBox().width/2,r-=a.options["text-margin"]):(q+=a.options["text-margin"],r-=n.getBBox().height/2)):(q=b.x,r=b.y,o?(q+=a.options["text-margin"]/2,r-=a.options["text-margin"]):(q+=a.options["text-margin"]/2,r+=a.options["text-margin"])),n.attr({"text-anchor":"start","font-size":a.options["font-size"],fill:a.options["font-color"],x:q,y:r}),j&&n.attr({font:j}),k&&n.attr({"font-family":k}),l&&n.attr({"font-weight":l})}return i}function e(a,b,c,d,e,f,g,h){var i,j,k,l,m,n={x:null,y:null,onLine1:!1,onLine2:!1};return i=(h-f)*(c-a)-(g-e)*(d-b),0===i?n:(j=b-f,k=a-e,l=(g-e)*j-(h-f)*k,m=(c-a)*j-(d-b)*k,j=l/i,k=m/i,n.x=a+j*(c-a),n.y=b+j*(d-b),j>0&&1>j&&(n.onLine1=!0),k>0&&1>k&&(n.onLine2=!0),n)}function f(a,b){b=b||{},this.paper=new Raphael(a),this.options=r.defaults(b,q),this.symbols=[],this.lines=[],this.start=null}function g(a,b,c){this.chart=a,this.group=this.chart.paper.set(),this.symbol=c,this.connectedTo=[],this.symbolType=b.symbolType,this.flowstate=b.flowstate||"future",this.next_direction=b.next&&b.direction_next?b.direction_next:void 0,this.text=this.chart.paper.text(0,0,b.text),b.key&&(this.text.node.id=b.key+"t"),this.text.node.setAttribute("class",this.getAttr("class")+"t"),this.text.attr({"text-anchor":"start",x:this.getAttr("text-margin"),fill:this.getAttr("font-color"),"font-size":this.getAttr("font-size")});var d=this.getAttr("font"),e=this.getAttr("font-family"),f=this.getAttr("font-weight");d&&this.text.attr({font:d}),e&&this.text.attr({"font-family":e}),f&&this.text.attr({"font-weight":f}),b.link&&this.text.attr("href",b.link),b.target&&this.text.attr("target",b.target);var g=this.getAttr("maxWidth");if(g){for(var h=b.text.split(" "),i="",j=0,k=h.length;k>j;j++){var l=h[j];this.text.attr("text",i+" "+l),i+=this.text.getBBox().width>g?"\n"+l:" "+l}this.text.attr("text",i.substring(1))}if(this.group.push(this.text),c){var m=this.getAttr("text-margin");c.attr({fill:this.getAttr("fill"),stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),width:this.text.getBBox().width+2*m,height:this.text.getBBox().height+2*m}),c.node.setAttribute("class",this.getAttr("class")),b.link&&c.attr("href",b.link),b.target&&c.attr("target",b.target),b.key&&(c.node.id=b.key),this.group.push(c),c.insertBefore(this.text),this.text.attr({y:c.getBBox().height/2}),this.initialize()}}function h(a,b){var c=a.paper.rect(0,0,0,0,20);b=b||{},b.text=b.text||"Start",g.call(this,a,b,c)}function i(a,b){var c=a.paper.rect(0,0,0,0,20);b=b||{},b.text=b.text||"End",g.call(this,a,b,c)}function j(a,b){var c=a.paper.rect(0,0,0,0);b=b||{},g.call(this,a,b,c)}function k(a,b){var c=a.paper.rect(0,0,0,0);b=b||{},g.call(this,a,b,c),c.attr({width:this.text.getBBox().width+4*this.getAttr("text-margin")}),this.text.attr({x:2*this.getAttr("text-margin")});var d=a.paper.rect(0,0,0,0);d.attr({x:this.getAttr("text-margin"),stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),width:this.text.getBBox().width+2*this.getAttr("text-margin"),height:this.text.getBBox().height+2*this.getAttr("text-margin"),fill:this.getAttr("fill")}),b.key&&(d.node.id=b.key+"i");var e=this.getAttr("font"),f=this.getAttr("font-family"),h=this.getAttr("font-weight");e&&d.attr({font:e}),f&&d.attr({"font-family":f}),h&&d.attr({"font-weight":h}),b.link&&d.attr("href",b.link),b.target&&d.attr("target",b.target),this.group.push(d),d.insertBefore(this.text),this.initialize()}function l(a,b){b=b||{},g.call(this,a,b),this.textMargin=this.getAttr("text-margin"),this.text.attr({x:3*this.textMargin});var d=this.text.getBBox().width+4*this.textMargin,e=this.text.getBBox().height+2*this.textMargin,f=this.textMargin,h=e/2,i={x:f,y:h},j=[{x:f-this.textMargin,y:e},{x:f-this.textMargin+d,y:e},{x:f-this.textMargin+d+2*this.textMargin,y:0},{x:f-this.textMargin+2*this.textMargin,y:0},{x:f,y:h}],k=c(a,i,j);k.attr({stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),fill:this.getAttr("fill")}),b.link&&k.attr("href",b.link),b.target&&k.attr("target",b.target),b.key&&(k.node.id=b.key),k.node.setAttribute("class",this.getAttr("class")),this.text.attr({y:k.getBBox().height/2}),this.group.push(k),k.insertBefore(this.text),this.initialize()}function m(a,b){b=b||{},g.call(this,a,b),this.textMargin=this.getAttr("text-margin"),this.yes_direction="bottom",this.no_direction="right",b.yes&&b.direction_yes&&b.no&&!b.direction_no?"right"===b.direction_yes?(this.no_direction="bottom",this.yes_direction="right"):(this.no_direction="right",this.yes_direction="bottom"):b.yes&&!b.direction_yes&&b.no&&b.direction_no?"right"===b.direction_no?(this.yes_direction="bottom",this.no_direction="right"):(this.yes_direction="right",this.no_direction="bottom"):(this.yes_direction="bottom",this.no_direction="right"),this.yes_direction=this.yes_direction||"bottom",this.no_direction=this.no_direction||"right",this.text.attr({x:2*this.textMargin});var d=this.text.getBBox().width+3*this.textMargin;d+=d/2;var e=this.text.getBBox().height+2*this.textMargin;e+=e/2,e=Math.max(.5*d,e);var f=d/4,h=e/4;this.text.attr({x:f+this.textMargin/2});var i={x:f,y:h},j=[{x:f-d/4,y:h+e/4},{x:f-d/4+d/2,y:h+e/4+e/2},{x:f-d/4+d,y:h+e/4},{x:f-d/4+d/2,y:h+e/4-e/2},{x:f-d/4,y:h+e/4}],k=c(a,i,j);k.attr({stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),fill:this.getAttr("fill")}),b.link&&k.attr("href",b.link),b.target&&k.attr("target",b.target),b.key&&(k.node.id=b.key),k.node.setAttribute("class",this.getAttr("class")),this.text.attr({y:k.getBBox().height/2}),this.group.push(k),k.insertBefore(this.text),this.initialize()}function n(a){function b(a){var b=a.indexOf("(")+1,c=a.indexOf(")");return b>=0&&c>=0?d.symbols[a.substring(0,b-1)]:d.symbols[a]}function c(a){var b="next",c=a.indexOf("(")+1,d=a.indexOf(")");return c>=0&&d>=0&&(b=D.substring(c,d),b.indexOf(",")<0&&"yes"!==b&&"no"!==b&&(b="next, "+b)),b}a=a||"",a=a.trim();for(var d={symbols:{},start:null,drawSVG:function(a,b){function c(a){if(g[a.key])return g[a.key];switch(a.symbolType){case"start":g[a.key]=new h(e,a);break;case"end":g[a.key]=new i(e,a);break;case"operation":g[a.key]=new j(e,a);break;case"inputoutput":g[a.key]=new l(e,a);break;case"subroutine":g[a.key]=new k(e,a);break;case"condition":g[a.key]=new m(e,a);break;default:return new Error("Wrong symbol type!")}return g[a.key]}var d=this;this.diagram&&this.diagram.clean();var e=new f(a,b);this.diagram=e;var g={};!function n(a,b,f){var g=c(a);return d.start===a?e.startWith(g):b&&f&&!b.pathOk&&(b instanceof m?(f.yes===a&&b.yes(g),f.no===a&&b.no(g)):b.then(g)),g.pathOk?g:(g instanceof m?(a.yes&&n(a.yes,g,a),a.no&&n(a.no,g,a)):a.next&&n(a.next,g,a),g)}(this.start),e.render()},clean:function(){this.diagram.clean()}},e=[],g=0,n=1,o=a.length;o>n;n++)if("\n"===a[n]&&"\\"!==a[n-1]){var p=a.substring(g,n);g=n+1,e.push(p.replace(/\\\n/g,"\n"))}gq;){var s=e[q];s.indexOf(": ")<0&&s.indexOf("(")<0&&s.indexOf(")")<0&&s.indexOf("->")<0&&s.indexOf("=>")<0?(e[q-1]+="\n"+s,e.splice(q,1),r--):q++}for(;e.length>0;){var t=e.splice(0,1)[0];if(t.indexOf("=>")>=0){var u,v=t.split("=>"),w={key:v[0],symbolType:v[1],text:null,link:null,target:null,flowstate:null};if(w.symbolType.indexOf(": ")>=0&&(u=w.symbolType.split(": "),w.symbolType=u[0],w.text=u[1]),w.text&&w.text.indexOf(":>")>=0?(u=w.text.split(":>"),w.text=u[0],w.link=u[1]):w.symbolType.indexOf(":>")>=0&&(u=w.symbolType.split(":>"),w.symbolType=u[0],w.link=u[1]),w.symbolType.indexOf("\n")>=0&&(w.symbolType=w.symbolType.split("\n")[0]),w.link){var x=w.link.indexOf("[")+1,y=w.link.indexOf("]");x>=0&&y>=0&&(w.target=w.link.substring(x,y),w.link=w.link.substring(0,x-1))}if(w.text&&w.text.indexOf("|")>=0){var z=w.text.split("|");w.text=z[0],w.flowstate=z[1].trim()}d.symbols[w.key]=w}else if(t.indexOf("->")>=0)for(var A=t.split("->"),B=0,C=A.length;C>B;B++){var D=A[B],E=b(D),F=c(D),G=null;if(F.indexOf(",")>=0){var H=F.split(",");F=H[0],G=H[1].trim()}if(d.start||(d.start=E),C>B+1){var I=A[B+1];E[F]=b(I),E["direction_"+F]=G,G=null}}}return d}Array.prototype.indexOf||(Array.prototype.indexOf=function(a){"use strict";if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>0&&(d=Number(arguments[1]),d!=d?d=0:0!==d&&1/0!=d&&d!=-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(a){"use strict";if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=c;arguments.length>1&&(d=Number(arguments[1]),d!=d?d=0:0!==d&&d!=1/0&&d!=-(1/0)&&(d=(d>0||-1)*Math.floor(Math.abs(d))));for(var e=d>=0?Math.min(d,c-1):c-Math.abs(d);e>=0;e--)if(e in b&&b[e]===a)return e;return-1}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")});var o=this,p={};"undefined"!=typeof module&&module.exports?module.exports=p:o.flowchart=o.flowchart||p;var q={x:0,y:0,"line-width":3,"line-length":50,"text-margin":10,"font-size":14,"font-color":"black","line-color":"black","element-color":"black",fill:"white","yes-text":"yes","no-text":"no","arrow-end":"block","class":"flowchart",symbols:{start:{},end:{},condition:{},inputoutput:{},operation:{},subroutine:{}}},r={defaults:a,inherits:b};f.prototype.handle=function(a){this.symbols.indexOf(a)<=-1&&this.symbols.push(a);var b=this;return a instanceof m?(a.yes=function(c){return a.yes_symbol=c,a.no_symbol&&(a.pathOk=!0),b.handle(c)},a.no=function(c){return a.no_symbol=c,a.yes_symbol&&(a.pathOk=!0),b.handle(c)}):a.then=function(c){return a.next=c,a.pathOk=!0,b.handle(c)},a},f.prototype.startWith=function(a){return this.start=a,this.handle(a)},f.prototype.render=function(){var a,b=0,c=0,d=0,e=0,f=0,g=0;for(d=0,e=this.symbols.length;e>d;d++)a=this.symbols[d],a.width>b&&(b=a.width),a.height>c&&(c=a.height);for(d=0,e=this.symbols.length;e>d;d++)a=this.symbols[d],a.shiftX(this.options.x+(b-a.width)/2+this.options["line-width"]),a.shiftY(this.options.y+(c-a.height)/2+this.options["line-width"]);for(this.start.render(),d=0,e=this.symbols.length;e>d;d++)a=this.symbols[d],a.renderLines();for(f=this.maxXFromLine,d=0,e=this.symbols.length;e>d;d++){a=this.symbols[d];var h=a.getX()+a.width,i=a.getY()+a.height;h>f&&(f=h),i>g&&(g=i)}this.paper.setSize(f+this.options["line-width"],g+this.options["line-width"])},f.prototype.clean=function(){if(this.paper){var a=this.paper.canvas;a.parentNode.removeChild(a)}},g.prototype.getAttr=function(a){if(!this.chart)return void 0;var b,c=this.chart.options?this.chart.options[a]:void 0,d=this.chart.options.symbols?this.chart.options.symbols[this.symbolType][a]:void 0;return this.chart.options.flowstate&&this.chart.options.flowstate[this.flowstate]&&(b=this.chart.options.flowstate[this.flowstate][a]),b||d||c},g.prototype.initialize=function(){this.group.transform("t"+this.getAttr("line-width")+","+this.getAttr("line-width")),this.width=this.group.getBBox().width,this.height=this.group.getBBox().height},g.prototype.getCenter=function(){return{x:this.getX()+this.width/2,y:this.getY()+this.height/2}},g.prototype.getX=function(){return this.group.getBBox().x},g.prototype.getY=function(){return this.group.getBBox().y},g.prototype.shiftX=function(a){this.group.transform("t"+(this.getX()+a)+","+this.getY())},g.prototype.setX=function(a){this.group.transform("t"+a+","+this.getY())},g.prototype.shiftY=function(a){this.group.transform("t"+this.getX()+","+(this.getY()+a))},g.prototype.setY=function(a){this.group.transform("t"+this.getX()+","+a)},g.prototype.getTop=function(){var a=this.getY(),b=this.getX()+this.width/2;return{x:b,y:a}},g.prototype.getBottom=function(){var a=this.getY()+this.height,b=this.getX()+this.width/2;return{x:b,y:a}},g.prototype.getLeft=function(){var a=this.getY()+this.group.getBBox().height/2,b=this.getX();return{x:b,y:a}},g.prototype.getRight=function(){var a=this.getY()+this.group.getBBox().height/2,b=this.getX()+this.group.getBBox().width;return{x:b,y:a}},g.prototype.render=function(){if(this.next){var a=this.getAttr("line-length");if("right"===this.next_direction){var b=this.getRight();if(this.next.getLeft(),!this.next.isPositioned){this.next.setY(b.y-this.next.height/2),this.next.shiftX(this.group.getBBox().x+this.width+a);var c=this;!function e(){for(var b,d=!1,f=0,g=c.chart.symbols.length;g>f;f++){b=c.chart.symbols[f];var h=Math.abs(b.getCenter().x-c.next.getCenter().x);if(b.getCenter().y>c.next.getCenter().y&&h<=c.next.width/2){d=!0;break}}d&&(c.next.setX(b.getX()+b.width+a),e())}(),this.next.isPositioned=!0,this.next.render()}}else{var d=this.getBottom();this.next.getTop(),this.next.isPositioned||(this.next.shiftY(this.getY()+this.height+a),this.next.setX(d.x-this.next.width/2),this.next.isPositioned=!0,this.next.render())}}},g.prototype.renderLines=function(){this.next&&(this.next_direction?this.drawLineTo(this.next,"",this.next_direction):this.drawLineTo(this.next))},g.prototype.drawLineTo=function(a,b,c){this.connectedTo.indexOf(a)<0&&this.connectedTo.push(a);var f,g=this.getCenter().x,h=this.getCenter().y,i=(this.getTop(),this.getRight()),j=this.getBottom(),k=this.getLeft(),l=a.getCenter().x,m=a.getCenter().y,n=a.getTop(),o=a.getRight(),p=(a.getBottom(),a.getLeft()),q=g===l,r=h===m,s=m>h,t=h>m,u=g>l,v=l>g,w=0,x=this.getAttr("line-length"),y=this.getAttr("line-width");if(c&&"bottom"!==c||!q||!s)if(c&&"right"!==c||!r||!v)if(c&&"left"!==c||!r||!u)if(c&&"right"!==c||!q||!t)if(c&&"right"!==c||!q||!s)if(c&&"bottom"!==c||!u)if(c&&"bottom"!==c||!v)if(c&&"right"===c&&u)f=d(this.chart,i,[{x:i.x+x/2,y:i.y},{x:i.x+x/2,y:n.y-x/2},{x:n.x,y:n.y-x/2},{x:n.x,y:n.y}],b),this.rightStart=!0,a.topEnd=!0,w=i.x+x/2;else if(c&&"right"===c&&v)f=d(this.chart,i,[{x:n.x,y:i.y},{x:n.x,y:n.y}],b),this.rightStart=!0,a.topEnd=!0,w=i.x+x/2;else if(c&&"bottom"===c&&q&&t)f=d(this.chart,j,[{x:j.x,y:j.y+x/2},{x:i.x+x/2,y:j.y+x/2},{x:i.x+x/2,y:n.y-x/2},{x:n.x,y:n.y-x/2},{x:n.x,y:n.y}],b),this.bottomStart=!0,a.topEnd=!0,w=j.x+x/2;else if("left"===c&&q&&t){var z=k.x-x/2;p.xA;A++)for(var C,D=this.chart.lines[A],E=D.attr("path"),F=f.attr("path"),G=0,H=E.length-1;H>G;G++){var I=[];I.push(["M",E[G][1],E[G][2]]),I.push(["L",E[G+1][1],E[G+1][2]]);for(var J=I[0][1],K=I[0][2],L=I[1][1],M=I[1][2],N=0,O=F.length-1;O>N;N++){var P=[];P.push(["M",F[N][1],F[N][2]]),P.push(["L",F[N+1][1],F[N+1][2]]);var Q=P[0][1],R=P[0][2],S=P[1][1],T=P[1][2],U=e(J,K,L,M,Q,R,S,T);if(U.onLine1&&U.onLine2){var V;R===T?Q>S?(V=["L",U.x+2*y,R],F.splice(N+1,0,V),V=["C",U.x+2*y,R,U.x,R-4*y,U.x-2*y,R],F.splice(N+2,0,V),f.attr("path",F)):(V=["L",U.x-2*y,R],F.splice(N+1,0,V),V=["C",U.x-2*y,R,U.x,R-4*y,U.x+2*y,R],F.splice(N+2,0,V),f.attr("path",F)):R>T?(V=["L",Q,U.y+2*y],F.splice(N+1,0,V),V=["C",Q,U.y+2*y,Q+4*y,U.y,Q,U.y-2*y],F.splice(N+2,0,V),f.attr("path",F)):(V=["L",Q,U.y-2*y],F.splice(N+1,0,V),V=["C",Q,U.y-2*y,Q+4*y,U.y,Q,U.y+2*y],F.splice(N+2,0,V),f.attr("path",F)),N+=2,C+=2}}}this.chart.lines.push(f)}(!this.chart.maxXFromLine||this.chart.maxXFromLine&&w>this.chart.maxXFromLine)&&(this.chart.maxXFromLine=w)},r.inherits(h,g),r.inherits(i,g),r.inherits(j,g),r.inherits(k,g),r.inherits(l,g),l.prototype.getLeft=function(){var a=this.getY()+this.group.getBBox().height/2,b=this.getX()+this.textMargin;return{x:b,y:a}},l.prototype.getRight=function(){var a=this.getY()+this.group.getBBox().height/2,b=this.getX()+this.group.getBBox().width-this.textMargin;return{x:b,y:a}},r.inherits(m,g),m.prototype.render=function(){this.yes_direction&&(this[this.yes_direction+"_symbol"]=this.yes_symbol),this.no_direction&&(this[this.no_direction+"_symbol"]=this.no_symbol);var a=this.getAttr("line-length");if(this.bottom_symbol){var b=this.getBottom();this.bottom_symbol.getTop(),this.bottom_symbol.isPositioned||(this.bottom_symbol.shiftY(this.getY()+this.height+a),this.bottom_symbol.setX(b.x-this.bottom_symbol.width/2),this.bottom_symbol.isPositioned=!0,this.bottom_symbol.render())}if(this.right_symbol){var c=this.getRight();if(this.right_symbol.getLeft(),!this.right_symbol.isPositioned){this.right_symbol.setY(c.y-this.right_symbol.height/2),this.right_symbol.shiftX(this.group.getBBox().x+this.width+a);var d=this;!function e(){for(var b,c=!1,f=0,g=d.chart.symbols.length;g>f;f++){b=d.chart.symbols[f];var h=Math.abs(b.getCenter().x-d.right_symbol.getCenter().x);if(b.getCenter().y>d.right_symbol.getCenter().y&&h<=d.right_symbol.width/2){c=!0;break}}c&&(d.right_symbol.setX(b.getX()+b.width+a),e())}(),this.right_symbol.isPositioned=!0,this.right_symbol.render()}}},m.prototype.renderLines=function(){this.yes_symbol&&this.drawLineTo(this.yes_symbol,this.getAttr("yes-text"),this.yes_direction),this.no_symbol&&this.drawLineTo(this.no_symbol,this.getAttr("no-text"),this.no_direction)},p.parse=n}(); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/jquery.flowchart.min.js b/src/collectedstatic/mdeditor/js/lib/jquery.flowchart.min.js new file mode 100644 index 0000000..a30a8fd --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/jquery.flowchart.min.js @@ -0,0 +1,2 @@ +/*! jQuery.flowchart.js v1.1.0 | jquery.flowchart.min.js | jQuery plugin for flowchart.js. | MIT License | By: Pandao | https://github.com/pandao/jquery.flowchart.js | 2015-03-09 */ +(function(factory){if(typeof require==="function"&&typeof exports==="object"&&typeof module==="object"){module.exports=factory}else{if(typeof define==="function"){factory(jQuery,flowchart)}else{factory($,flowchart)}}}(function(jQuery,flowchart){(function($){$.fn.flowChart=function(options){options=options||{};var defaults={"x":0,"y":0,"line-width":2,"line-length":50,"text-margin":10,"font-size":14,"font-color":"black","line-color":"black","element-color":"black","fill":"white","yes-text":"yes","no-text":"no","arrow-end":"block","symbols":{"start":{"font-color":"black","element-color":"black","fill":"white"},"end":{"class":"end-element"}},"flowstate":{"past":{"fill":"#CCCCCC","font-size":12},"current":{"fill":"black","font-color":"white","font-weight":"bold"},"future":{"fill":"white"},"request":{"fill":"blue"},"invalid":{"fill":"#444444"},"approved":{"fill":"#58C4A3","font-size":12,"yes-text":"APPROVED","no-text":"n/a"},"rejected":{"fill":"#C45879","font-size":12,"yes-text":"n/a","no-text":"REJECTED"}}};return this.each(function(){var $this=$(this);var diagram=flowchart.parse($this.text());var settings=$.extend(true,defaults,options);$this.html("");diagram.drawSVG(this,settings)})}})(jQuery)})); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/marked.min.js b/src/collectedstatic/mdeditor/js/lib/marked.min.js new file mode 100644 index 0000000..5597fa4 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/marked.min.js @@ -0,0 +1,9 @@ +/** + * marked v0.3.3 - a markdown parser + * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed) + * https://github.com/chjj/marked + */ +(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose){loose=next}}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq); +this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script"||cap[1]==="style",text:cap[0]});continue}if((!bq&&top)&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else{if(this.options.pedantic){this.rules=inline.pedantic}}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^/i.test(cap[0])){this.inLink=false}}src=src.substring(cap[0].length);out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue +}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(this.smartypants(cap[0]));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants){return text}return text.replace(/--/g,"\u2014").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201c").replace(/"/g,"\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i0.5){ch="x"+ch.toString(16)}out+="&#"+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return"
    "+(escaped?code:escape(code,true))+"\n
    "}return'
    '+(escaped?code:escape(code,true))+"\n
    \n"};Renderer.prototype.blockquote=function(quote){return"
    \n"+quote+"
    \n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"'+text+"\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"
    \n":"
    \n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+"\n"};Renderer.prototype.listitem=function(text){return"
  • "+text+"
  • \n"};Renderer.prototype.paragraph=function(text){return"

    "+text+"

    \n"};Renderer.prototype.table=function(header,body){return"\n"+"\n"+header+"\n"+"\n"+body+"\n"+"
    \n"};Renderer.prototype.tablerow=function(content){return"\n"+content+"\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+"\n"};Renderer.prototype.strong=function(text){return""+text+""};Renderer.prototype.em=function(text){return""+text+""};Renderer.prototype.codespan=function(text){return""+text+""};Renderer.prototype.br=function(){return this.options.xhtml?"
    ":"
    "};Renderer.prototype.del=function(text){return""+text+""};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='
    ";return out};Renderer.prototype.image=function(href,title,text){var out=''+text+'":">";return out};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i/g,">").replace(/"/g,""").replace(/'/g,"'")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon"){return":"}if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name){return new RegExp(regex,opt)}val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;iAn error occured:

    "+escape(e.message+"",true)+"
    "}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else{if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/prettify.min.js b/src/collectedstatic/mdeditor/js/lib/prettify.min.js new file mode 100644 index 0000000..056f968 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/prettify.min.js @@ -0,0 +1,15 @@ +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +var IN_GLOBAL_SCOPE=true;window["PR_SHOULD_USE_CONTINUATION"]=true;var prettyPrintOne;var prettyPrint;(function(){var P=window;var i=["break,continue,do,else,for,if,return,while"];var u=[i,"auto,case,char,const,default,"+"double,enum,extern,float,goto,inline,int,long,register,short,signed,"+"sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,"+"new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,"+"concept,concept_map,const_cast,constexpr,decltype,delegate,"+"dynamic_cast,explicit,export,friend,generic,late_check,"+"mutable,namespace,nullptr,property,reinterpret_cast,static_assert,"+"static_cast,template,typeid,typename,using,virtual,where"];var y=[p,"abstract,assert,boolean,byte,extends,final,finally,implements,import,"+"instanceof,interface,null,native,package,strictfp,super,synchronized,"+"throws,transient"];var U=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,"+"fixed,foreach,from,group,implicit,in,internal,into,is,let,"+"lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,"+"sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,"+"var,virtual,where"];var r="all,and,by,catch,class,else,extends,false,finally,"+"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,"+"throw,true,try,unless,until,when,while,yes";var x=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,"+"Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,"+"goto,if,import,last,local,my,next,no,our,print,package,redo,require,"+"sub,undef,unless,until,use,wantarray,while,BEGIN,END";var K=[i,"and,as,assert,class,def,del,"+"elif,except,exec,finally,from,global,import,in,is,lambda,"+"nonlocal,not,or,pass,print,raise,try,with,yield,"+"False,True,None"];var g=[i,"alias,and,begin,case,class,"+"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,"+"rescue,retry,self,super,then,true,undef,unless,until,when,yield,"+"BEGIN,END"];var z=[i,"as,assert,const,copy,drop,"+"enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,"+"pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"];var J=[i,"case,done,elif,esac,eval,fi,"+"function,in,local,set,then,until"];var C=[l,U,x,s,K,g,J];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var E="str";var B="kwd";var j="com";var R="typ";var I="lit";var N="pun";var H="pln";var m="tag";var G="dec";var L="src";var S="atn";var n="atv";var Q="nocode";var O="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(ac){var ag=0;var V=false;var af=false;for(var Y=0,X=ac.length;Y122)){if(!(an<65||aj>90)){ai.push([Math.max(65,aj)|32,Math.min(an,90)|32])}if(!(an<97||aj>122)){ai.push([Math.max(97,aj)&~32,Math.min(an,122)&~32])}}}}ai.sort(function(ax,aw){return(ax[0]-aw[0])||(aw[1]-ax[1])});var al=[];var ar=[];for(var au=0;auav[0]){if(av[1]+1>av[0]){ap.push("-")}ap.push(W(av[1]))}}ap.push("]");return ap.join("")}function Z(ao){var am=ao.source.match(new RegExp("(?:"+"\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]"+"|\\\\u[A-Fa-f0-9]{4}"+"|\\\\x[A-Fa-f0-9]{2}"+"|\\\\[0-9]+"+"|\\\\[^ux0-9]"+"|\\(\\?[:!=]"+"|[\\(\\)\\^]"+"|[^\\x5B\\x5C\\(\\)\\^]+"+")","g"));var ak=am.length;var aq=[];for(var an=0,ap=0;an=2&&al==="["){am[an]=aa(aj)}else{if(al!=="\\"){am[an]=aj.replace(/[a-zA-Z]/g,function(ar){var at=ar.charCodeAt(0);return"["+String.fromCharCode(at&~32,at|32)+"]"})}}}}return am.join("")}var ad=[];for(var Y=0,X=ac.length;Y=0;){V[af.charAt(ah)]=ab}}var ai=ab[1];var ad=""+ai;if(!aj.hasOwnProperty(ad)){ak.push(ai);aj[ad]=null}}ak.push(/[\0-\uffff]/);Y=k(ak)})();var aa=W.length;var Z=function(ak){var ac=ak.sourceCode,ab=ak.basePos;var ag=[ab,H];var ai=0;var aq=ac.match(Y)||[];var am={};for(var ah=0,au=aq.length;ah=5&&"lang-"===at.substring(0,5);if(ap&&!(al&&typeof al[1]==="string")){ap=false;at=L}if(!ap){am[aj]=at}}var ae=ai;ai+=aj.length;if(!ap){ag.push(ab+ae,at)}else{var ao=al[1];var an=aj.indexOf(ao);var af=an+ao.length;if(al[2]){af=aj.length-al[2].length;an=af-ao.length}var av=at.substring(5);D(ab+ae,aj.substring(0,an),Z,ag);D(ab+ae+an,ao,q(av,ao),ag);D(ab+ae+af,aj.substring(af),Z,ag)}}ak.decorations=ag};return Z}function h(af){var X=[],ab=[];if(af["tripleQuotedStrings"]){X.push([E,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(af["multiLineStrings"]){X.push([E,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{X.push([E,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(af["verbatimStrings"]){ab.push([E,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ad=af["hashComments"];if(ad){if(af["cStyleComments"]){if(ad>1){X.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{X.push([j,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}ab.push([E,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{X.push([j,/^#[^\r\n]*/,null,"#"])}}if(af["cStyleComments"]){ab.push([j,/^\/\/[^\r\n]*/,null]);ab.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}var W=af["regexLiterals"];if(W){var Y=W>1?"":"\n\r";var aa=Y?".":"[\\S\\s]";var Z=("/(?=[^/*"+Y+"])"+"(?:[^/\\x5B\\x5C"+Y+"]"+"|\\x5C"+aa+"|\\x5B(?:[^\\x5C\\x5D"+Y+"]"+"|\\x5C"+aa+")*(?:\\x5D|$))+"+"/");ab.push(["lang-regex",RegExp("^"+O+"("+Z+")")])}var ae=af["types"];if(ae){ab.push([R,ae])}var ac=(""+af["keywords"]).replace(/^ | $/g,"");if(ac.length){ab.push([B,new RegExp("^(?:"+ac.replace(/[\s,]+/g,"|")+")\\b"),null])}X.push([H,/^\s+/,null," \r\n\t\xA0"]);var V="^.[^\\s\\w.$@'\"`/\\\\]*";if(af["regexLiterals"]){V+="(?!s*/)"}ab.push([I,/^@[a-z_$][a-z_$@0-9]*/i,null],[R,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[H,/^[a-z_$][a-z_$@0-9]*/i,null],[I,new RegExp("^(?:"+"0x[a-f0-9]+"+"|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)"+"(?:e[+\\-]?\\d+)?"+")"+"[a-z]*","i"),null,"0123456789"],[H,/^\\[\s\S]?/,null],[N,new RegExp(V),null]);return f(X,ab)}var M=h({"keywords":C,"hashComments":true,"cStyleComments":true,"multiLineStrings":true,"regexLiterals":true});function T(X,ai,ab){var W=/(?:^|\s)nocode(?:\s|$)/;var ad=/\r\n?|\n/;var ae=X.ownerDocument;var ah=ae.createElement("li");while(X.firstChild){ah.appendChild(X.firstChild)}var Y=[ah];function ag(ao){var an=ao.nodeType;if(an==1&&!W.test(ao.className)){if("br"===ao.nodeName){af(ao);if(ao.parentNode){ao.parentNode.removeChild(ao)}}else{for(var aq=ao.firstChild;aq;aq=aq.nextSibling){ag(aq)}}}else{if((an==3||an==4)&&ab){var ap=ao.nodeValue;var al=ap.match(ad);if(al){var ak=ap.substring(0,al.index);ao.nodeValue=ak;var aj=ap.substring(al.index+al[0].length);if(aj){var am=ao.parentNode;am.insertBefore(ae.createTextNode(aj),ao.nextSibling)}af(ao);if(!ak){ao.parentNode.removeChild(ao)}}}}}function af(am){while(!am.nextSibling){am=am.parentNode;if(!am){return}}function ak(an,au){var at=au?an.cloneNode(false):an;var aq=an.parentNode;if(aq){var ar=ak(aq,1);var ap=an.nextSibling;ar.appendChild(at);for(var ao=ap;ao;ao=ap){ap=ao.nextSibling;ar.appendChild(ao)}}return at}var aj=ak(am.nextSibling,0);for(var al;(al=aj.parentNode)&&al.nodeType===1;){aj=al}Y.push(aj)}for(var aa=0;aa=V){ak+=2}if(Z>=at){ad+=2}}}finally{if(av){av.style.display=al}}}var t={};function c(X,Y){for(var V=Y.length;--V>=0;){var W=Y[V];if(!t.hasOwnProperty(W)){t[W]=X}else{if(P["console"]){console["warn"]("cannot override language handler %s",W)}}}}function q(W,V){if(!(W&&t.hasOwnProperty(W))){W=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[N,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(f([[H,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[S,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[N,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(f([],[[n,/^[\s\S]+/]]),["uq.val"]);c(h({"keywords":l,"hashComments":true,"cStyleComments":true,"types":e}),["c","cc","cpp","cxx","cyc","m"]);c(h({"keywords":"null,true,false"}),["json"]);c(h({"keywords":U,"hashComments":true,"cStyleComments":true,"verbatimStrings":true,"types":e}),["cs"]);c(h({"keywords":y,"cStyleComments":true}),["java"]);c(h({"keywords":J,"hashComments":true,"multiLineStrings":true}),["bash","bsh","csh","sh"]);c(h({"keywords":K,"hashComments":true,"multiLineStrings":true,"tripleQuotedStrings":true}),["cv","py","python"]);c(h({"keywords":s,"hashComments":true,"multiLineStrings":true,"regexLiterals":2}),["perl","pl","pm"]);c(h({"keywords":g,"hashComments":true,"multiLineStrings":true,"regexLiterals":true}),["rb","ruby"]);c(h({"keywords":x,"cStyleComments":true,"regexLiterals":true}),["javascript","js"]);c(h({"keywords":r,"hashComments":3,"cStyleComments":true,"multilineStrings":true,"tripleQuotedStrings":true,"regexLiterals":true}),["coffee"]);c(h({"keywords":z,"cStyleComments":true,"multilineStrings":true}),["rc","rs","rust"]);c(f([],[[E,/^[\s\S]+/]]),["regex"]);function d(Y){var X=Y.langExtension;try{var V=b(Y.sourceNode,Y.pre);var W=V.sourceCode;Y.sourceCode=W;Y.spans=V.spans;Y.basePos=0;q(X,W)(Y);F(Y)}catch(Z){if(P["console"]){console["log"](Z&&Z["stack"]||Z)}}}function A(Z,Y,X){var V=document.createElement("div");V.innerHTML="
    "+Z+"
    ";V=V.firstChild;if(X){T(V,X,true)}var W={langExtension:Y,numberLines:X,sourceNode:V,pre:1};d(W);return V.innerHTML}function w(al,ab){var ah=ab||document.body;var ao=ah.ownerDocument||document;function aa(aq){return ah.getElementsByTagName(aq)}var ad=[aa("pre"),aa("code"),aa("xmp")];var ae=[];for(var ak=0;akp;p++)"zIndex"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],"zIndex"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return void(k._events=j={n:{}});var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;mi;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=k:"undefined"!=typeof define?define("eve",[],function(){return k}):a.eve=k}(window||this),function(a,b){"function"==typeof define&&define.amd?define(["eve"],function(c){return b(a,c)}):b(a,a.eve||"function"==typeof require&&require("eve"))}(this,function(a,b){function c(a){if(c.is(a,"function"))return u?a():b.on("raphael.DOMload",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],"function")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on("raphael.DOMload",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)O(e,g)||O(b,d)O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?"y":"x",y=Q(w.x-v.x)<.001?"y":"x",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if("M"==v[0])g=k=v[1],h=l=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+" × "+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case"colour":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case"path":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case"transform":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case"csv":var M=I(i[y])[J](w),N=I(r[y])[J](w);if("clip-rect"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b("raphael.anim.start."+d.id,d,a)}}function t(a){for(var b=0;be;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==c.type){var sb,tb=A.doc.createElement("div");if(tb.innerHTML='',sb=tb.firstChild,sb.style.behavior="url(#default#VML)",!sb||"object"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml="VML"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),"finite"==b?!Y[z](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return 180*a/S%360},c.snapTo=function(a,b,d){if(d=c.is(d,"finite")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b};c.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*N.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});c.setWindow=function(a){b("raphael.setWindow",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\s+|\s+$/g;try{var e=new ActiveXObject("htmlfile");e.write(""),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue("ForeColor");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,"#"+("000000"+c.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=A.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue("color")})}return ub(a)},vb=function(){return"hsb("+[this.h,this.s,this.b]+")"},wb=function(){return"hsl("+[this.h,this.s,this.l]+")"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,"finite")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,"string")&&(a=c.getRGB(a)),c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(",").replace(gb,"$1")};c._preload=function(a,b){var c=A.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a};c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex="#"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,"finite")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){{var e=[];M.call(c)}d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,"array")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.xb.x||b.xa.x)&&(a.yb.y||b.ya.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&n(a,[["M",b,d],["H",e.x2+10]],1)%2==1},c._removedFactory=function(a){return function(){b("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],"M"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case"M":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=["R"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][E](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][E](Fb(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][E](Fb(b.x,b.y,a[1],b.y));break;case"V":a=["C"][E](Fb(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)k[b]="A",e&&(l[b]="A"),a.splice(b++,0,["C"][E](c.splice(0,6)));a.splice(b,1),p=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],p=O(d.length,e&&e.length||0))},k=[],l=[],m="",n="",o=0,p=O(d.length,e&&e.length||0);p>o;o++){d[o]&&(m=d[o][0]),"C"!=m&&(k[o]=m,o&&(n=k[o-1])),d[o]=h(d[o],f,n),"A"!=k[o]&&"C"==m&&(k[o]="C"),i(d,o),e&&(e[o]&&(m=e[o][0]),"C"!=m&&(l[o]=m,o&&(n=l[o-1])),e[o]=h(e[o],g,n),"A"!=l[o]&&"C"==m&&(l[o]="C"),i(e,o)),j(d,e,f,g,o),j(e,d,g,f,o);var q=d[o],r=e&&e[o],s=q.length,t=e&&r.length;f.x=q[s-2],f.y=q[s-1],f.bx=_(q[s-4])||f.x,f.by=_(q[s-3])||f.y,g.bx=e&&(_(r[t-4])||g.x),g.by=e&&(_(r[t-3])||g.y),g.x=e&&r[t-2],g.y=e&&r[t-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+"%"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\.{3}|\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\.{3}|\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[]; +for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])}return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,"object")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?"r"+[b.rotate,0,0]:G)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);v.safari="Apple Computer, Inc."==navigator.vendor&&(Qb&&Qb[1]<4||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],f,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,b("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,"function")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c["un"+a]=$b["un"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,"undefined")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,"object")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b("raphael.data.get."+this.id,this,e[a],a),e[a]}return e[a]=d,b("raphael.data.set."+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("raphael.drag.start."+this.id,d),a&&b.on("raphael.drag.move."+this.id,a),e&&b.on("raphael.drag.end."+this.id,e),b("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on("raphael.drag.over."+this.id,a):b.unbind("raphael.drag.over."+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind("raphael.drag.*."+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||"about:blank",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type="set",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.getSize=function(){var a=this.canvas.parentNode;return{width:a.offsetWidth,height:a.offsetHeight}},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&"svg"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=c.transformPath(d,this.attr("transform"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},"<":function(a){return R(a,1.7)},">":function(a){return R(a,.48)},"<>":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin(2*(a-.075)*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc["ease-in"]=hc["<"],hc.easeOut=hc["ease-out"]=hc[">"],hc.easeInOut=hc["ease-in-out"]=hc["<>"],hc["back-in"]=hc.backIn,hc["back-out"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;dh))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case"colour":f="rgb("+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case"transform":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b("raphael.anim.frame."+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b("raphael.anim.frame."+d.id,d,e),b("raphael.anim.finish."+d.id,d,e),c.is(a,"function")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on("raphael.anim.frame."+this.id,a):b.unbind("raphael.anim.frame."+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+"%"!=g&&(f=!0,h[g]=a[g]);if(f)return d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b);if(e){var i=0;for(var j in a){var k=ab(j);a[z](j)&&k>i&&(i=k)}i+="%",!a[i].callback&&(a[i].callback=e)}return new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;cb;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;cc;c++)e.push(this[a+c]);for(;cc?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return"Raphaël‘s set"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=ab(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||"normal",d=d||"normal",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,G)+"(\\s|$)","i");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=b||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||"middle",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},v.add=function(a){if(c.is(a,"array"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,b.on("raphael.DOMload",function(){u=!0}),function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),function(){if(c.svg){var a="hasOwnProperty",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};c.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(a,e){var j="linear",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+"Gradient",{id:k}),a.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}return q(o,{fill:"url("+document.location+"#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y+"-obj"+d.id;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q("title");var w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=b(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=c.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C}if(!p){var D=i.getAttribute("clip-path");if(D){var E=c._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=b(p).match(c._ISURL);if(F){B=q("pattern");var G=q("image");B.id=c.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(a){c._preload(F[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(G,{width:b,height:c}),d.paper.safari()})}(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break}var H=c.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,"undefined")&&c.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!c.is(k["fill-opacity"],"undefined")&&c.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[a]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=c.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[a]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p);break; +case"opacity":k.gradient&&!k[a]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[a]("text")||f[a]("font")||f[a]("font-size")||f[a]("x")||f[a]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[a]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a){return a.parentNode&&"a"===a.parentNode.tagName.toLowerCase()?a.parentNode:a};Element=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},$b=c.el,Element.prototype=$b,$b.constructor=Element,c._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new Element(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},$b.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,c,e]])),this},$b.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this},$b.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]])),this)},$b.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},$b.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},$b.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},$b.remove=function(){var a=z(this.node);if(!this.removed&&a.parentNode){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),c._tear(this,b),a.parentNode.removeChild(a),this.removeData();for(var d in this)this[d]="function"==typeof this[d]?c._removedFactory(d):null;this.removed=!0}},$b._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b,c=!1;this.paper.canvas.parentElement?b=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(b=this.paper.canvas.parentNode.style),b&&"none"==b.display&&(c=!0,b.display="");var d={};try{d=this.node.getBBox()}catch(e){d={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{d=d||{},c&&(b.display="none")}return a&&this.hide(),d},$b.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if("fill"==b&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,"array")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,"object")&&(m=b);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},$b.toFront=function(){if(this.removed)return this;var a=z(this.node);a.parentNode.appendChild(a);var b=this.paper;return b.top!=this&&c._tofront(this,b),this},$b.toBack=function(){if(this.removed)return this;var a=z(this.node),b=a.parentNode;b.insertBefore(a,b.firstChild),c._toback(this,this.paper);this.paper;return this},$b.insertAfter=function(a){if(this.removed||!a)return this;var b=z(this.node),d=z(a.node||a[a.length-1].node);return d.nextSibling?d.parentNode.insertBefore(b,d.nextSibling):d.parentNode.appendChild(b),c._insertafter(this,a,this.paper),this},$b.insertBefore=function(a){if(this.removed||!a)return this;var b=z(this.node),d=z(a.node||a[0].node);return d.parentNode.insertBefore(b,d),c._insertbefore(this,a,this.paper),this},$b.blur=function(a){var b=this;if(0!==+a){var d=q("filter"),e=q("feGaussianBlur");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:"url(#"+d.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter");return b},c._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new Element(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new Element(g,a);return h.attrs={x:b,y:c,width:d,height:e,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new Element(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new Element(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},c._engine.text=function(a,b,d,e){var f=q("text");a.canvas&&a.canvas.appendChild(f);var g=new Element(f,a);return g.attrs={x:b,y:d,"text-anchor":"middle",text:e,"font-family":c._availableAttrs["font-family"],"font-size":c._availableAttrs["font-size"],stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==b?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=this.getSize(),j=g(c/i.width,d/i.height),l=this.top,n=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(j=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=j,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:n});j&&l;)h="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":h}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},c.prototype.clear=function(){c.eve("raphael.clear",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(c._g.doc.createTextNode("Created with Raphaël "+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q("defs"))},c.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null};var A=c.st;for(var B in $b)$b[a](B)&&!A[a](B)&&(A[B]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(B))}}(),function(){if(c.vml){var a="hasOwnProperty",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=c.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};c.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf("r")?c._pathToAbsolute(m.path):m.path),e._.dirty=1,"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=b(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement("div"),I=H.style;I.clip=c.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type="solid",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[a](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=c.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i="linear",j=".5 .5";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\.{3}|\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf("-"),l=!b(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return null!==d&&(this._.transform=d,c._extractTransform(this,d)),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E.auxGetBBox=c.el.getBBox,E.getBBox=function(){var a=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var b={},c=1/this.paper._viewBoxShift.scale;return b.x=a.x-this.paper._viewBoxShift.dx,b.x*=c,b.y=a.y-this.paper._viewBoxShift.dy,b.y*=c,b.width=a.width*c,b.height=a.height*c,b.x2=b.x+b.width,b.y2=b.y+b.height,b}return a},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind("raphael.*.*."+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if(b==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,"array")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,"object")&&(n=b);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+".Blur(pixelradius="+(+a||1.5)+")",b.margin=c.format("-{0}px 0 0 -{0}px",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},c._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=c.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,a),l={fill:"#000",stroke:"none",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),d.width=a,d.height=b,d.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve("raphael.setViewBox",this,this._viewBox,[a,b,d,e,f]);var g,h,i=this.getSize(),j=i.width,k=i.height;return f&&(g=k/e,h=j/d,j>d*g&&(a-=(j-d*g)/2/g),k>e*h&&(b-=(k-e*h)/2/h)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:size},this.forEach(function(a){a.transform("...")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.styleSheets.length<31?b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):b.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error("VML container not found.");var h=new c._Paper,i=h.canvas=c._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=c._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=c.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,"object"==typeof exports&&(module.exports=c),c}); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/sequence-diagram.min.js b/src/collectedstatic/mdeditor/js/lib/sequence-diagram.min.js new file mode 100644 index 0000000..521b782 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/sequence-diagram.min.js @@ -0,0 +1,7 @@ +/** js sequence diagrams 1.0.4 + * http://bramp.github.io/js-sequence-diagrams/ + * (c) 2012-2013 Andrew Brampton (bramp.net) + * @license Simplified BSD license. + */ +!function(){"use strict";function Diagram(){this.title=void 0,this.actors=[],this.signals=[]}function ParseError(message,hash){_.extend(this,hash),this.name="ParseError",this.message=message||""}Diagram.prototype.getActor=function(alias){var s=/^(.+) as (\S+)$/i.exec(alias.trim());s?(name=s[1].trim(),alias=s[2].trim()):name=alias.trim(),name=name.replace(/\\n/gm,"\n");var i,actors=this.actors;for(i in actors)if(actors[i].alias==alias)return actors[i];return i=actors.push(new Diagram.Actor(alias,name,actors.length)),actors[i-1]},Diagram.prototype.setTitle=function(title){this.title=title},Diagram.prototype.addSignal=function(signal){this.signals.push(signal)},Diagram.Actor=function(alias,name,index){this.alias=alias,this.name=name,this.index=index},Diagram.Signal=function(actorA,signaltype,actorB,message){this.type="Signal",this.actorA=actorA,this.actorB=actorB,this.linetype=3&signaltype,this.arrowtype=3&signaltype>>2,this.message=message},Diagram.Signal.prototype.isSelf=function(){return this.actorA.index==this.actorB.index},Diagram.Note=function(actor,placement,message){if(this.type="Note",this.actor=actor,this.placement=placement,this.message=message,this.hasManyActors()&&actor[0]==actor[1])throw new Error("Note should be over two different actors")},Diagram.Note.prototype.hasManyActors=function(){return _.isArray(this.actor)},Diagram.LINETYPE={SOLID:0,DOTTED:1},Diagram.ARROWTYPE={FILLED:0,OPEN:1},Diagram.PLACEMENT={LEFTOF:0,RIGHTOF:1,OVER:2};var grammar=function(){function Parser(){this.yy={}}var parser={trace:function(){},yy:{},symbols_:{error:2,start:3,document:4,EOF:5,line:6,statement:7,NL:8,participant:9,actor:10,signal:11,note_statement:12,title:13,message:14,note:15,placement:16,over:17,actor_pair:18,",":19,left_of:20,right_of:21,signaltype:22,ACTOR:23,linetype:24,arrowtype:25,LINE:26,DOTLINE:27,ARROW:28,OPENARROW:29,MESSAGE:30,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",8:"NL",9:"participant",13:"title",15:"note",17:"over",19:",",20:"left_of",21:"right_of",23:"ACTOR",26:"LINE",27:"DOTLINE",28:"ARROW",29:"OPENARROW",30:"MESSAGE"},productions_:[0,[3,2],[4,0],[4,2],[6,1],[6,1],[7,2],[7,1],[7,1],[7,2],[12,4],[12,4],[18,1],[18,3],[16,1],[16,1],[11,4],[10,1],[22,2],[22,1],[24,1],[24,1],[25,1],[25,1],[14,1]],performAction:function(yytext,yyleng,yylineno,yy,yystate,$$){var $0=$$.length-1;switch(yystate){case 1:return yy;case 4:break;case 6:$$[$0];break;case 7:yy.addSignal($$[$0]);break;case 8:yy.addSignal($$[$0]);break;case 9:yy.setTitle($$[$0]);break;case 10:this.$=new Diagram.Note($$[$0-1],$$[$0-2],$$[$0]);break;case 11:this.$=new Diagram.Note($$[$0-1],Diagram.PLACEMENT.OVER,$$[$0]);break;case 12:this.$=$$[$0];break;case 13:this.$=[$$[$0-2],$$[$0]];break;case 14:this.$=Diagram.PLACEMENT.LEFTOF;break;case 15:this.$=Diagram.PLACEMENT.RIGHTOF;break;case 16:this.$=new Diagram.Signal($$[$0-3],$$[$0-2],$$[$0-1],$$[$0]);break;case 17:this.$=yy.getActor($$[$0]);break;case 18:this.$=$$[$0-1]|$$[$0]<<2;break;case 19:this.$=$$[$0];break;case 20:this.$=Diagram.LINETYPE.SOLID;break;case 21:this.$=Diagram.LINETYPE.DOTTED;break;case 22:this.$=Diagram.ARROWTYPE.FILLED;break;case 23:this.$=Diagram.ARROWTYPE.OPEN;break;case 24:this.$=$$[$0].substring(1).trim().replace(/\\n/gm,"\n")}},table:[{3:1,4:2,5:[2,2],8:[2,2],9:[2,2],13:[2,2],15:[2,2],23:[2,2]},{1:[3]},{5:[1,3],6:4,7:5,8:[1,6],9:[1,7],10:11,11:8,12:9,13:[1,10],15:[1,12],23:[1,13]},{1:[2,1]},{5:[2,3],8:[2,3],9:[2,3],13:[2,3],15:[2,3],23:[2,3]},{5:[2,4],8:[2,4],9:[2,4],13:[2,4],15:[2,4],23:[2,4]},{5:[2,5],8:[2,5],9:[2,5],13:[2,5],15:[2,5],23:[2,5]},{10:14,23:[1,13]},{5:[2,7],8:[2,7],9:[2,7],13:[2,7],15:[2,7],23:[2,7]},{5:[2,8],8:[2,8],9:[2,8],13:[2,8],15:[2,8],23:[2,8]},{14:15,30:[1,16]},{22:17,24:18,26:[1,19],27:[1,20]},{16:21,17:[1,22],20:[1,23],21:[1,24]},{5:[2,17],8:[2,17],9:[2,17],13:[2,17],15:[2,17],19:[2,17],23:[2,17],26:[2,17],27:[2,17],30:[2,17]},{5:[2,6],8:[2,6],9:[2,6],13:[2,6],15:[2,6],23:[2,6]},{5:[2,9],8:[2,9],9:[2,9],13:[2,9],15:[2,9],23:[2,9]},{5:[2,24],8:[2,24],9:[2,24],13:[2,24],15:[2,24],23:[2,24]},{10:25,23:[1,13]},{23:[2,19],25:26,28:[1,27],29:[1,28]},{23:[2,20],28:[2,20],29:[2,20]},{23:[2,21],28:[2,21],29:[2,21]},{10:29,23:[1,13]},{10:31,18:30,23:[1,13]},{23:[2,14]},{23:[2,15]},{14:32,30:[1,16]},{23:[2,18]},{23:[2,22]},{23:[2,23]},{14:33,30:[1,16]},{14:34,30:[1,16]},{19:[1,35],30:[2,12]},{5:[2,16],8:[2,16],9:[2,16],13:[2,16],15:[2,16],23:[2,16]},{5:[2,10],8:[2,10],9:[2,10],13:[2,10],15:[2,10],23:[2,10]},{5:[2,11],8:[2,11],9:[2,11],13:[2,11],15:[2,11],23:[2,11]},{10:36,23:[1,13]},{30:[2,13]}],defaultActions:{3:[2,1],23:[2,14],24:[2,15],26:[2,18],27:[2,22],28:[2,23],36:[2,13]},parseError:function(str,hash){if(!hash.recoverable)throw new Error(str);this.trace(str)},parse:function(input){function lex(){var token;return token=self.lexer.lex()||EOF,"number"!=typeof token&&(token=self.symbols_[token]||token),token}var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext="",yylineno=0,yyleng=0,recovering=0,TERROR=2,EOF=1;this.lexer.setInput(input),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var yyloc=this.lexer.yylloc;lstack.push(yyloc);var ranges=this.lexer.options&&this.lexer.options.ranges;this.parseError="function"==typeof this.yy.parseError?this.yy.parseError:Object.getPrototypeOf(this).parseError;for(var symbol,preErrorSymbol,state,action,r,p,len,newState,expected,yyval={};;){if(state=stack[stack.length-1],this.defaultActions[state]?action=this.defaultActions[state]:((null===symbol||"undefined"==typeof symbol)&&(symbol=lex()),action=table[state]&&table[state][symbol]),"undefined"==typeof action||!action.length||!action[0]){var errStr="";expected=[];for(p in table[state])this.terminals_[p]&&p>TERROR&&expected.push("'"+this.terminals_[p]+"'");errStr=this.lexer.showPosition?"Parse error on line "+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(", ")+", got '"+(this.terminals_[symbol]||symbol)+"'":"Parse error on line "+(yylineno+1)+": Unexpected "+(symbol==EOF?"end of input":"'"+(this.terminals_[symbol]||symbol)+"'"),this.parseError(errStr,{text:this.lexer.match,token:this.terminals_[symbol]||symbol,line:this.lexer.yylineno,loc:yyloc,expected:expected})}if(action[0]instanceof Array&&action.length>1)throw new Error("Parse Error: multiple actions possible at state: "+state+", token: "+symbol);switch(action[0]){case 1:stack.push(symbol),vstack.push(this.lexer.yytext),lstack.push(this.lexer.yylloc),stack.push(action[1]),symbol=null,preErrorSymbol?(symbol=preErrorSymbol,preErrorSymbol=null):(yyleng=this.lexer.yyleng,yytext=this.lexer.yytext,yylineno=this.lexer.yylineno,yyloc=this.lexer.yylloc,recovering>0&&recovering--);break;case 2:if(len=this.productions_[action[1]][1],yyval.$=vstack[vstack.length-len],yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column},ranges&&(yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]]),r=this.performAction.call(yyval,yytext,yyleng,yylineno,this.yy,action[1],vstack,lstack),"undefined"!=typeof r)return r;len&&(stack=stack.slice(0,2*-1*len),vstack=vstack.slice(0,-1*len),lstack=lstack.slice(0,-1*len)),stack.push(this.productions_[action[1]][0]),vstack.push(yyval.$),lstack.push(yyval._$),newState=table[stack[stack.length-2]][stack[stack.length-1]],stack.push(newState);break;case 3:return!0}}return!0}},lexer=function(){var lexer={EOF:1,parseError:function(str,hash){if(!this.yy.parser)throw new Error(str);this.yy.parser.parseError(str,hash)},setInput:function(input){return this._input=input,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var ch=this._input[0];this.yytext+=ch,this.yyleng++,this.offset++,this.match+=ch,this.matched+=ch;var lines=ch.match(/(?:\r\n?|\n).*/g);return lines?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ch},unput:function(ch){var len=ch.length,lines=ch.split(/(?:\r\n?|\n)/g);this._input=ch+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-len-1),this.offset-=len;var oldLines=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),lines.length-1&&(this.yylineno-=lines.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:lines?(lines.length===oldLines.length?this.yylloc.first_column:0)+oldLines[oldLines.length-lines.length].length-lines[0].length:this.yylloc.first_column-len},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-len]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(n){this.unput(this.match.slice(n))},pastInput:function(){var past=this.matched.substr(0,this.matched.length-this.match.length);return(past.length>20?"...":"")+past.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var next=this.match;return next.length<20&&(next+=this._input.substr(0,20-next.length)),(next.substr(0,20)+(next.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var pre=this.pastInput(),c=new Array(pre.length+1).join("-");return pre+this.upcomingInput()+"\n"+c+"^"},test_match:function(match,indexed_rule){var token,lines,backup;if(this.options.backtrack_lexer&&(backup={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(backup.yylloc.range=this.yylloc.range.slice(0))),lines=match[0].match(/(?:\r\n?|\n).*/g),lines&&(this.yylineno+=lines.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:lines?lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+match[0].length},this.yytext+=match[0],this.match+=match[0],this.matches=match,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(match[0].length),this.matched+=match[0],token=this.performAction.call(this,this.yy,this,indexed_rule,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),token)return token;if(this._backtrack){for(var k in backup)this[k]=backup[k];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var token,match,tempMatch,index;this._more||(this.yytext="",this.match="");for(var rules=this._currentRules(),i=0;imatch[0].length)){if(match=tempMatch,index=i,this.options.backtrack_lexer){if(token=this.test_match(tempMatch,rules[i]),token!==!1)return token;if(this._backtrack){match=!1;continue}return!1}if(!this.options.flex)break}return match?(token=this.test_match(match,rules[index]),token!==!1?token:!1):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var r=this.next();return r?r:this.lex()},begin:function(condition){this.conditionStack.push(condition)},popState:function(){var n=this.conditionStack.length-1;return n>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(n){return n=this.conditionStack.length-1-Math.abs(n||0),n>=0?this.conditionStack[n]:"INITIAL"},pushState:function(condition){this.begin(condition)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(yy,yy_,$avoiding_name_collisions,YY_START){switch($avoiding_name_collisions){case 0:return 8;case 1:break;case 2:break;case 3:return 9;case 4:return 20;case 5:return 21;case 6:return 17;case 7:return 15;case 8:return 13;case 9:return 19;case 10:return 23;case 11:return 27;case 12:return 26;case 13:return 29;case 14:return 28;case 15:return 30;case 16:return 5;case 17:return"INVALID"}},rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:participant\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:title\b)/i,/^(?:,)/i,/^(?:[^\->:\n,]+)/i,/^(?:--)/i,/^(?:-)/i,/^(?:>>)/i,/^(?:>)/i,/^(?:[^#\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],inclusive:!0}}};return lexer}();return parser.lexer=lexer,Parser.prototype=parser,parser.Parser=Parser,new Parser}();"undefined"!=typeof require&&"undefined"!=typeof exports&&(exports.parser=grammar,exports.Parser=grammar.Parser,exports.parse=function(){return grammar.parse.apply(grammar,arguments)},exports.main=function(args){args[1]||(console.log("Usage: "+args[0]+" FILE"),process.exit(1));var source=require("fs").readFileSync(require("path").normalize(args[1]),"utf8");return exports.parser.parse(source)},"undefined"!=typeof module&&require.main===module&&exports.main(process.argv.slice(1))),ParseError.prototype=new Error,Diagram.ParseError=ParseError,grammar.parseError=function(message,hash){throw new ParseError(message,hash)},Diagram.parse=function(input){return grammar.yy=new Diagram,grammar.parse(input)},this.Diagram=Diagram}.call(this),"undefined"!=typeof jQuery&&function($){$.fn.sequenceDiagram=function(options){return this.each(function(){var $this=$(this),diagram=Diagram.parse($this.text());$this.html(""),diagram.drawSVG(this,options)})}}(jQuery),Raphael.registerFont({w:209,face:{"font-family":"daniel","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 11 8 0 0 0 0 0 0 0",ascent:"288",descent:"-72","x-height":"7",bbox:"-92.0373 -310.134 632 184.967","underline-thickness":"3.51562","underline-position":"-21.6211","unicode-range":"U+0009-U+F002"},glyphs:{" ":{w:179}," ":{w:179},"!":{d:"66,-306v9,3,18,11,19,24v-18,73,-20,111,-37,194v0,10,2,34,-12,34v-12,0,-18,-9,-18,-28v0,-85,23,-136,38,-214v1,-7,4,-10,10,-10xm25,-30v15,-1,28,34,5,35v-11,-1,-38,-36,-5,-35",w:115},'"':{d:"91,-214v-32,3,-25,-40,-20,-68v3,-16,7,-25,12,-27v35,13,14,56,8,95xm8,-231v4,-31,1,-40,18,-75v37,7,11,51,11,79v-3,3,-4,8,-5,13v-17,4,-16,-10,-24,-17",w:117},"#":{d:"271,-64v-30,26,-96,-7,-102,51v-6,2,-13,2,-24,-2v-2,-11,10,-21,2,-28v-14,5,-48,0,-48,22v0,23,-11,14,-29,10v-7,-6,6,-19,-1,-24r-32,4v-19,-8,-15,-24,5,-28r33,-6v4,0,24,-23,11,-27v-26,0,-63,14,-74,-10v3,-1,9,-17,16,-10v15,-8,81,4,89,-30v8,-14,16,-34,24,-38v23,9,24,38,5,49v37,24,55,-38,72,-43v19,10,20,23,-1,45v2,8,23,1,29,4v3,3,6,6,10,11v-14,13,-20,12,-45,12v-17,0,-16,17,-19,29v18,-7,49,3,67,-2v4,0,8,4,12,11xm161,-104v-30,-1,-44,10,-44,37v14,1,24,0,40,-5v0,-1,3,-10,8,-26v0,-4,-1,-6,-4,-6",w:285},$:{d:"164,-257v29,4,1,42,-3,50v5,5,38,13,41,24v8,4,6,15,-2,21v-18,3,-36,-17,-49,-17v-17,1,-31,40,-28,48v5,4,8,8,9,10v13,1,35,37,28,44v-10,21,-36,20,-65,28v-10,10,-12,40,-17,51v-9,-3,-28,1,-18,-17v0,-13,5,-24,-1,-35v-18,1,-59,-10,-42,-29v21,0,56,16,55,-16v5,-4,9,-18,9,-26v-14,-15,-55,-41,-53,-65v2,-33,56,-19,98,-26v10,-14,31,-43,38,-45xm93,-152v11,-10,15,-15,14,-29v-17,-3,-37,1,-43,6v10,12,20,19,29,23xm111,-103v-8,1,-11,12,-10,22v10,0,28,2,27,-8v0,-4,-13,-15,-17,-14",w:225},"%":{d:"181,-96v24,-7,67,-13,104,1v14,18,21,19,22,44v-13,43,-99,61,-146,36v-9,-9,-22,-11,-32,-29v0,-27,24,-53,52,-52xm139,-185v-9,68,-138,73,-131,-5v0,-3,3,-9,9,-17v13,1,27,1,17,-16v5,-39,63,0,93,-6v36,1,80,-9,102,11v15,32,12,32,-8,56v-16,21,-103,78,-152,125r-14,28v-23,11,-25,-7,-29,-20v34,-71,133,-98,171,-162v-13,-12,-52,-5,-61,1v0,1,1,3,3,5xm38,-190v0,34,55,29,70,8v0,-14,-20,-11,-32,-14v-14,-3,-24,-9,-40,-10v1,0,5,11,2,16xm172,-53v12,27,90,18,102,-5v-18,-7,-32,-10,-40,-10v-29,3,-57,-4,-62,15",w:308},"&":{d:"145,-82v17,-8,47,-15,71,-26v13,2,25,12,9,23v-23,7,-40,16,-53,27r0,6v13,8,30,21,36,38v0,8,-4,12,-11,12v-19,0,-43,-39,-59,-44v-30,12,-65,29,-97,32v-32,3,-45,-41,-23,-63v21,-20,52,-26,70,-48v-4,-31,-12,-47,9,-73v13,-16,20,-29,23,-39v15,-15,32,-22,51,-22v30,9,62,64,32,96v-2,3,-47,42,-69,48v-15,8,-11,9,0,22v6,7,10,11,11,11xm114,-138v25,-13,62,-38,74,-62v0,-9,-10,-31,-20,-29v-28,7,-60,42,-60,75v0,10,2,15,6,16xm99,-91v-18,10,-54,18,-59,45v26,5,61,-12,77,-22v-1,-5,-13,-23,-18,-23",w:253},"'":{d:"36,-182v-36,7,-34,-61,-17,-80v15,1,21,19,21,20r-1,-1v0,0,-1,12,-5,35v1,5,3,17,2,26",w:63},"(":{d:"130,-306v13,2,23,43,-1,43v-49,43,-77,77,-90,148v5,49,27,67,64,101v4,14,5,6,2,19r-15,0v-35,-17,-79,-58,-79,-120v0,-58,66,-176,119,-191",w:120},")":{d:"108,-138v-2,73,-48,120,-98,153v-17,-5,-16,-20,-6,-31v52,-64,73,-62,74,-135v1,-42,-40,-98,-58,-128v0,-5,-1,-12,-2,-22v18,-18,25,0,42,27v25,39,50,66,48,136",w:120},"*":{d:"121,-271v15,-5,36,-8,40,9v-5,10,-31,19,-47,31v0,11,34,43,14,53v-18,8,-24,-24,-34,-20v-4,10,-4,19,-12,41v-25,7,-15,-30,-17,-47v-13,-1,-17,9,-46,30r-10,0v-20,-32,37,-43,54,-64v-10,-11,-36,-33,-16,-51v3,0,14,8,33,24v8,-10,26,-39,32,-42v14,7,15,23,9,36",w:177},"+":{d:"163,-64v-7,22,-65,2,-77,21v-2,10,-6,21,-11,35v-20,4,-21,-12,-19,-29v3,-23,-44,6,-39,-27v-8,-22,36,-8,49,-18v8,-13,6,-36,24,-40v19,-4,14,32,11,39v18,3,19,2,54,8v2,1,5,5,8,11",w:170},",":{d:"25,63v-26,21,-48,-2,-22,-24v14,-12,35,-40,35,-69v3,-2,3,-11,12,-9v35,17,5,88,-25,102",w:97},"-":{d:"57,-94v19,4,55,-5,54,17v-15,23,-54,20,-91,15v-4,2,-13,-10,-11,-16v-1,-22,28,-15,48,-16",w:124},".":{d:"40,-48v21,20,21,44,-4,44v-33,0,-26,-24,-10,-44r14,0",w:67},"/":{d:"21,20v-22,-45,21,-95,41,-126v38,-57,115,-158,193,-201v2,0,4,3,7,11v11,29,-15,34,-25,55v-81,56,-189,208,-197,261r-19,0",w:275},0:{d:"78,-237v70,-47,269,-41,270,59v0,34,-11,53,-29,76v-13,35,-30,32,-85,64v-6,2,-10,6,-7,8v-73,14,-98,38,-173,1v-7,-13,-52,-48,-46,-88v9,-57,27,-75,70,-120xm123,-38v100,0,202,-46,195,-153v-32,-55,-144,-73,-211,-35v-16,34,-68,54,-53,108v6,25,1,22,-3,39v6,24,41,41,72,41",w:353},1:{d:"39,-208v0,-14,6,-59,29,-39v3,4,6,13,10,24r-22,128r8,87v-4,6,-9,3,-16,2v-44,-38,-9,-137,-9,-202",w:93},2:{d:"88,-35v47,-10,119,-24,168,-9v0,12,-23,13,-35,16v1,1,3,1,5,1v-74,8,-118,23,-194,23v-14,0,-20,-13,-21,-28v55,-40,83,-61,123,-104v26,-13,65,-67,71,-102v-1,-9,-11,-16,-22,-16v-20,-1,-120,29,-156,49v-10,-2,-30,-20,-10,-28v50,-21,111,-51,178,-48v25,10,44,22,36,39v12,30,-19,64,-34,83v-39,48,-37,39,-115,109v0,5,-3,8,-8,11v4,3,8,4,14,4",w:265},3:{d:"188,-282v34,-10,74,25,47,51v-19,32,-55,50,-92,70v28,14,116,25,108,70v8,14,-49,40,-63,48v-29,9,-130,22,-168,42v-6,-5,-19,-7,-12,-22v56,-36,175,-21,210,-76v-9,-20,-88,-42,-97,-33v-20,-1,-41,2,-56,-7r5,-21v56,-25,103,-36,137,-78v1,-1,2,-5,4,-11v-15,-14,-56,7,-79,0v-10,9,-73,22,-92,31v-11,-4,-28,-23,-13,-30v50,-22,96,-26,154,-37v0,-1,8,3,7,3",w:260},4:{d:"79,-249v-7,17,-29,75,-33,96v0,6,3,8,8,8v43,-2,111,6,141,-6v17,-47,20,-100,63,-148v9,4,16,7,21,10v-17,31,-44,95,-51,141v7,4,24,-4,23,10v-1,16,-29,12,-31,23v-10,22,-9,69,-7,103v-3,2,-7,5,-10,9v-47,-11,-23,-74,-16,-114v0,-4,-2,-6,-7,-6v-65,2,-89,13,-162,4v-22,-22,-2,-53,5,-76v16,-15,17,-57,35,-70v6,-1,21,11,21,16",w:267},5:{d:"185,-272v30,7,45,-8,53,18v1,16,-17,18,-34,14v0,0,-95,-11,-129,1v-6,9,-24,33,-29,54v76,10,171,5,214,47v11,11,22,30,5,52v-14,12,-30,14,-34,27v-26,11,-141,63,-157,60v-16,-2,-25,-19,-4,-27v48,-18,128,-39,170,-86v4,-14,-65,-41,-85,-41r-92,0v-10,-4,-66,-1,-57,-23v0,-23,23,-51,35,-83v11,-28,133,-10,144,-13",w:284},6:{d:"70,-64v9,-51,63,-74,123,-71v43,2,109,3,111,41r-25,47v0,1,1,2,2,3v-5,0,-39,10,-41,20v-15,3,-22,4,-22,11v-39,1,-77,20,-119,13v-42,-7,-35,-9,-77,-46v-56,-118,94,-201,176,-229v7,0,21,8,20,15v-2,17,-23,15,-43,24v-69,31,-119,72,-134,145v-5,25,36,68,78,64v59,-6,128,-18,153,-61v-7,-14,-13,-9,-32,-21v-67,-15,-118,-5,-150,43r0,12v-13,4,-17,-3,-20,-10",w:310},7:{d:"37,-228v33,-14,173,-17,181,-19v28,-1,24,31,9,45v-17,15,-45,49,-59,69v-17,26,-55,67,-61,113v-10,13,-9,14,-14,20v-33,-13,-20,-25,-11,-53v16,-48,73,-115,109,-156v2,-7,5,-14,-10,-12v-26,4,-54,6,-76,13v-23,-5,-83,31,-94,-9v2,-8,18,-19,26,-11",w:245},8:{d:"57,-236v40,-50,166,-51,213,-10v22,28,10,63,-22,78r-35,17v8,5,54,24,53,44v-5,14,-4,33,-18,42v-13,13,-35,18,-44,34v-60,27,-190,49,-194,-42v7,-41,17,-54,59,-70r0,-4v-32,-9,-73,-62,-26,-85v4,0,8,-2,14,-4xm142,-160v24,-2,160,-31,99,-72v-28,-18,-108,-33,-146,-5v-16,12,-28,30,-33,59v24,12,37,20,80,18xm41,-62v30,65,189,6,199,-37v3,-14,-60,-30,-74,-30v-70,0,-118,10,-125,67",w:290},9:{d:"11,-192v15,-49,119,-61,161,-23v16,15,27,55,11,79v-20,62,-51,79,-96,118v-10,4,-45,27,-50,6v9,-15,66,-52,98,-99v-7,-7,-8,-3,-25,0v-49,-11,-96,-25,-99,-81xm145,-131v7,-5,13,-34,13,-41v-2,-51,-104,-38,-114,-6v-2,10,37,35,46,35v23,1,43,-1,55,12",w:198},":":{d:"39,-125v15,-8,40,-1,40,15v0,15,-6,22,-19,22v-13,0,-29,-21,-21,-37xm66,-17v-8,27,-51,19,-46,-8v-1,-6,8,-22,14,-20v29,0,30,6,32,28",w:95},";":{d:"56,-93v2,-30,37,-22,40,2v0,2,-1,7,-3,15v-13,8,-15,6,-27,4xm64,-44v11,-11,30,-4,32,14v-21,39,-63,71,-92,85v-5,0,-11,-2,-18,-8v11,-23,36,-36,50,-61v11,-7,19,-20,28,-30",w:107},"<":{d:"166,-202v12,0,29,15,24,29v0,4,-119,64,-120,73v15,21,89,64,91,86v2,29,-18,12,-30,15v-27,-29,-59,-54,-95,-75v-18,-10,-25,-13,-24,-41",w:176},"=":{d:"125,-121v18,7,55,-9,69,14v0,17,-45,26,-135,26v-18,0,-27,-7,-27,-21v-1,-37,60,-5,93,-19xm138,-71v20,0,48,-1,50,16v-13,24,-86,32,-131,29v-29,-2,-43,-10,-43,-24v-7,-23,36,-14,39,-17v27,6,57,-4,85,-4",w:196},">":{d:"4,-14v20,-48,77,-59,118,-94v-16,-19,-58,-52,-81,-75v-11,-7,-15,-38,-1,-40v33,16,83,71,121,105v26,23,-6,35,-41,53v-29,16,-56,28,-73,54v-21,15,-16,20,-34,15v-3,0,-9,-16,-9,-18",w:174},"?":{d:"105,-291v57,-13,107,-4,107,39v0,67,-136,85,-155,137v-1,6,10,23,-4,23v-23,1,-33,-35,-23,-57v31,-41,124,-60,149,-103v-8,-21,-72,-5,-88,-1v-23,6,-59,39,-71,8v0,0,-1,0,1,-17v10,-4,45,-20,84,-29xm80,-25v-6,4,-8,39,-24,22v-24,3,-22,-21,-13,-35v17,-7,29,5,37,13",w:216},"@":{d:"218,-207v23,8,42,14,47,37v44,68,-27,137,-87,85r1,0v0,2,-59,19,-61,17v-35,0,-42,-47,-17,-68r0,-4v-19,-1,-45,37,-49,40v-37,76,58,72,121,62v11,-2,34,-13,36,3v-14,31,-69,31,-114,33v-51,2,-99,-41,-80,-92v2,-30,22,-40,42,-63v35,-20,91,-53,161,-50xm217,-101v23,0,35,-19,35,-41v0,-43,-75,-41,-102,-19v36,3,55,16,62,41v-6,5,-6,19,5,19xm127,-110v8,5,51,-15,28,-16v-4,0,-25,4,-28,16",w:291},A:{d:"97,-81v-23,-10,-39,38,-52,60v-8,6,-8,6,-22,18v-22,-7,-23,-37,-4,-49v7,-8,11,-15,15,-23r-1,1v-14,-26,23,-29,31,-40v1,-1,15,-29,26,-36v17,-31,39,-58,54,-92v16,-20,20,-51,41,-66v29,5,34,62,45,92v9,64,21,103,49,155v-3,25,-44,11,-54,0v-34,-12,-97,-29,-128,-20xm107,-118v20,6,80,10,111,17v6,-7,-4,-15,-7,-24v-11,-28,-9,-92,-30,-117v-9,9,-19,44,-34,55v-9,23,-27,40,-40,69",w:294},B:{d:"256,-179v41,10,115,34,91,91v-6,3,-14,12,-19,20v-37,19,-50,34,-63,25v-9,10,-12,11,-34,13r3,-3v-4,-4,-12,-4,-18,0v0,0,2,2,5,4v-21,14,-26,6,-44,15v-4,0,-7,-2,-8,-5v-6,11,-20,-5,-18,11v-36,4,-91,35,-114,4v-7,-62,-10,-138,4,-199v-1,-19,-37,2,-37,-27v0,-8,2,-13,6,-15v68,-31,231,-92,311,-39v8,12,12,20,12,25v-8,42,-32,49,-77,80xm79,-160v72,-17,135,-39,184,-70v20,-13,31,-23,31,-27v1,-6,-30,-13,-38,-12v-54,0,-116,13,-186,41v11,21,1,48,9,68xm262,-43v0,-4,3,-6,-4,-5v0,1,1,2,4,5xm211,-140v-34,7,-94,24,-139,15v-6,20,-4,56,-4,82v0,29,43,1,56,2v48,-11,108,-25,154,-48v20,-10,32,-17,32,-25v0,-18,-33,-26,-99,-26xm195,-20v6,1,6,-2,5,-7v-3,2,-7,2,-5,7",w:364},C:{d:"51,-114v-12,75,96,76,166,71r145,-10v9,2,9,5,9,18v-37,18,-85,28,-109,22v-18,10,-47,10,-71,10v-29,0,-68,1,-105,-11v-6,-1,-10,-3,-10,-8v-33,-13,-48,-33,-66,-59v-19,-114,146,-150,224,-177v35,0,88,-31,99,7v-1,29,-49,14,-76,28v-55,8,-115,35,-175,71v-13,8,-23,21,-31,38",w:376},D:{d:"312,-78v-2,1,-3,7,-10,5v6,-3,10,-4,10,-5xm4,-252v2,-27,83,-38,106,-39v130,-7,267,1,291,109v0,0,-2,8,-3,25v-5,9,-4,28,-23,34v-4,4,-2,5,-7,0v-3,3,-15,7,-5,10v0,0,-10,14,-13,2v-11,1,-8,5,-20,14v1,2,7,3,9,1v-4,13,-22,13,-11,4v0,-3,1,-6,-3,-5v-40,29,-103,38,-141,65v10,6,22,-7,34,-3v-41,20,-127,44,-171,46v-21,1,-47,-33,-11,-39v15,-2,43,-6,56,-11v-16,-101,-5,-130,9,-207v2,0,4,-1,6,-3v-16,-17,-91,38,-103,-3xm297,-69v-7,3,-17,8,-25,7v1,1,3,2,5,2v-4,2,-11,5,-23,9v4,-11,30,-21,43,-18xm240,-51v10,0,12,2,0,6r0,-6xm220,-36v-1,-3,4,-6,6,-3v0,1,-2,1,-6,3xm125,-48v16,6,137,-46,155,-53v29,-18,101,-44,82,-93v-21,-53,-84,-61,-168,-67v-20,7,-50,3,-77,8v33,54,-12,132,8,205xm159,-22v-4,-1,-15,-5,-15,2v7,-1,12,-2,15,-2",w:381},E:{d:"45,-219v-19,-36,34,-41,63,-36v44,-10,133,-8,194,-15v3,2,38,11,52,15v-73,19,-171,21,-246,38v-9,11,-16,32,-20,61v35,11,133,-6,183,3v1,6,2,7,3,14v-46,24,-118,16,-193,27v-15,13,-22,52,-22,66v60,1,121,-20,188,-20v22,10,53,-7,74,5v16,29,-23,26,-43,32v-73,4,-139,13,-216,27r-52,-10v-4,-22,23,-69,26,-98v-3,0,-10,-15,-12,-24v20,-12,34,-23,35,-67v2,-1,5,-5,5,-7v0,-4,-14,-11,-19,-11",w:353},F:{d:"270,-258v13,2,59,6,48,34v-78,-3,-143,1,-212,22v-10,16,-21,43,-24,69r145,-9v8,3,29,-3,16,21v-14,-1,-59,13,-60,7v-12,13,-67,18,-108,21v-2,1,-4,3,-7,6v-2,23,-8,43,-7,69v1,28,-30,11,-40,5r10,-80r-26,-14v5,-10,10,-33,28,-25v21,-3,15,-46,26,-59v-1,-3,-32,-13,-28,-24v2,-22,45,-16,59,-30v47,4,99,-14,151,-9v5,-3,25,-3,29,-4",w:236},G:{d:"311,-168v53,0,94,57,74,110v-31,37,-71,34,-136,52v-13,-7,-41,10,-57,7v-73,-1,-122,-17,-162,-59v-49,-51,-24,-80,5,-130v35,-61,138,-93,214,-106v16,4,42,-1,40,21v-5,40,-39,2,-73,21v-76,19,-162,65,-177,142v28,103,237,76,312,29v2,-3,3,-7,3,-13v-10,-35,-37,-43,-87,-45v-16,-13,-53,-9,-78,1v-4,-3,-5,-7,-5,-11v17,-29,73,-17,108,-24v12,4,18,5,19,5",w:391},H:{d:"300,-268v18,12,19,32,4,51v-35,44,-34,140,-46,217v-1,5,-5,13,-11,12v-6,1,-19,-14,-18,-27r7,-106v-28,7,-76,22,-116,14v-18,2,-36,6,-55,3v-43,-8,-14,53,-33,75v-29,1,-26,-67,-21,-97v5,-31,28,-73,43,-98v2,2,7,3,14,3v13,33,-11,48,-13,78v61,4,118,2,176,2v8,0,13,-6,15,-20v4,-47,21,-87,54,-107",w:288},I:{d:"63,-266v34,10,-4,105,-8,128r-24,126v-2,2,-3,1,-9,6v-12,-10,-12,-15,-12,-47v0,-93,9,-156,28,-188v10,-17,19,-25,25,-25",w:79},J:{d:"235,-291v26,11,31,104,31,142v0,37,-2,95,-32,126v-33,34,-121,26,-167,1v-18,-11,-54,-29,-59,-59v0,-3,5,-15,16,-14v31,36,90,57,162,51v63,-30,56,-148,32,-226v-1,-16,11,-13,17,-21",w:282},K:{d:"212,-219v17,-5,80,-60,80,-19v0,9,-2,14,-5,16r-132,78v-34,23,-54,32,-21,50v39,21,74,23,124,41v5,2,7,5,7,9v-4,24,-55,15,-79,8v-67,-19,-98,-36,-116,-83v9,-24,38,-35,66,-61v7,-4,49,-30,76,-39xm47,-194v11,-20,11,-45,31,-55v2,2,4,3,6,0v29,39,-21,96,-18,128v-17,24,-15,62,-29,113v-4,3,-10,7,-19,11v-12,-13,-10,-28,-8,-53v3,-31,17,-79,37,-144",w:270},L:{d:"84,-43v58,0,179,-27,242,-4v3,17,-29,24,-40,26v-85,-4,-202,46,-268,3v-24,-16,-2,-33,-4,-57v26,-76,38,-108,86,-191v14,-7,26,-50,45,-32v6,22,5,31,-12,46v-20,39,-50,82,-67,142v-7,6,-19,46,-19,54v0,9,12,13,37,13",w:331},M:{d:"174,-236v-1,52,-11,92,-7,143v10,5,15,-12,22,-18v42,-55,90,-130,136,-174r15,-18v42,2,32,53,11,80v-12,58,-54,143,-34,210v0,3,-3,12,-9,10v-31,-5,-32,-57,-27,-92v4,-27,12,-58,25,-93v-5,-10,5,-19,6,-30v-46,44,-66,110,-129,172v-11,10,-18,15,-22,15v-34,6,-28,-103,-28,-152v-28,22,-65,119,-96,170v-9,15,-34,3,-31,-19v30,-64,91,-177,139,-229v12,-1,29,13,29,25",w:343},N:{d:"248,-20v-3,17,-37,18,-43,3v-24,-35,-53,-145,-80,-203v-32,40,-55,120,-92,174v-13,3,-26,-13,-27,-22r87,-171v4,-13,20,-57,42,-32v42,48,46,139,82,198v29,-45,46,-88,65,-153v12,-19,23,-42,38,-60v27,-1,14,18,4,44v-6,46,-32,68,-37,121v-15,29,-33,69,-39,101",w:307},O:{d:"240,-268v85,1,163,29,150,125v13,7,-12,18,-5,26v-23,63,-133,112,-228,124v-80,-16,-171,-56,-148,-153v11,-47,20,-43,53,-83v17,-9,39,-22,73,-29v45,-10,81,-10,105,-10xm363,-156v16,-51,-62,-85,-111,-79v-25,-11,-50,8,-81,0v-15,10,-70,16,-85,31v6,20,-27,24,-39,45v-42,75,40,128,115,128v56,0,209,-71,201,-125",w:383},P:{d:"70,-225v-7,-12,-36,16,-49,19v-4,0,-9,-5,-14,-17v21,-47,114,-55,172,-59v41,-3,132,33,99,87v-21,34,-72,59,-144,80v-2,16,-79,3,-74,46v3,25,-5,47,-10,68v-22,-1,-23,-29,-22,-56v2,-25,-20,-32,-8,-50v21,-5,10,-35,25,-57v6,-28,14,-48,25,-61xm71,-229v47,14,-2,50,-1,99v41,-3,113,-37,173,-76v5,-9,8,-14,8,-15v-28,-47,-125,-29,-180,-8",w:252},Q:{d:"374,-217v20,59,-11,127,-48,156r30,38v-1,6,-8,16,-14,9v-3,0,-19,-9,-47,-26v-72,35,-173,75,-236,12v-70,-40,-67,-213,26,-217r8,5v24,-20,72,-48,112,-38v21,-4,22,-1,50,-2v66,-2,94,20,119,63xm296,-88v13,5,61,-49,63,-84v4,-62,-54,-78,-119,-76v-14,-6,-49,5,-71,3v-42,16,-89,41,-93,94v-9,11,1,25,-7,38v-12,-19,-7,-67,-1,-88v-56,30,-37,137,19,155v27,17,92,19,119,0v12,-2,29,-9,52,-20v2,-2,3,-3,3,-6v-11,-12,-46,-27,-54,-56v0,-13,3,-19,9,-19v18,1,60,52,80,59",w:379},R:{d:"100,-275v96,-23,196,-10,208,78v-3,18,-17,52,-49,62v-14,20,-54,23,-79,40v-2,0,-14,2,-36,6v-40,8,-30,14,-3,33v37,27,52,30,118,55v16,6,31,23,12,27v-58,-2,-104,-29,-143,-61v-14,-3,-16,-15,-39,-27v-23,-19,-28,-12,-15,-38v63,-19,111,-15,163,-53v27,-20,43,-36,43,-49v0,-64,-120,-62,-173,-38v-9,4,-38,9,-40,18v-10,32,-16,70,-13,116v-10,21,-8,47,-6,75v2,31,-9,29,-27,22v-9,-55,5,-140,15,-190v-8,-6,-24,10,-24,-11v0,-34,16,-34,42,-55v2,-1,17,-4,46,-10",w:297},S:{d:"13,-3v-7,-3,-22,-18,-5,-22v68,-15,119,-32,154,-45v51,-19,39,-34,3,-53v-46,-25,-82,-30,-121,-64v-33,-29,-50,-35,-25,-58v37,-20,119,-29,181,-29v29,0,44,6,44,18v-9,26,-62,6,-104,14v-17,2,-72,6,-92,16v37,53,132,58,180,111v8,9,11,20,11,30v-4,17,-23,35,-42,34v-21,16,-17,1,-49,17v-14,7,-41,9,-56,20v-25,-3,-49,10,-79,11",w:234},T:{d:"141,-3v-36,-6,1,-49,-3,-79v10,-19,6,-35,15,-64r26,-85v-51,-9,-100,10,-141,14v-16,2,-30,-26,-11,-32v26,-8,143,-8,179,-19r12,6v67,-2,142,-1,200,-1v8,0,14,3,19,10v-18,16,-74,3,-103,14v-48,-4,-60,4,-113,7v-42,22,-36,130,-58,187v1,12,-9,44,-22,42",w:277},U:{d:"365,-262v13,56,-22,104,-36,141v-19,22,-30,38,-57,56v-4,18,-60,35,-78,50v-53,28,-142,0,-161,-34v-31,-56,-37,-108,-11,-164v17,-33,29,-50,48,-29v-2,2,-3,7,-4,13v-44,36,-38,149,7,174v30,26,55,19,102,4v56,-17,66,-34,120,-76v12,-24,56,-68,46,-122r0,-16v0,1,-1,3,-1,6v4,-13,11,-10,25,-3",w:368},V:{d:"246,-258v21,-22,31,-26,44,-8v1,1,-12,22,-28,35v-15,25,-41,38,-56,69v-13,15,-20,31,-28,57v-15,13,-11,29,-27,72v3,21,-5,24,-27,27v-33,-45,-54,-118,-84,-167v-5,-26,-18,-50,-25,-76v-3,-12,24,-8,29,-5v8,13,18,52,26,70r52,115v9,-2,4,-9,10,-21r25,-47v25,-44,46,-76,89,-121",w:234},W:{d:"31,-213v16,46,17,106,41,151v31,-35,49,-89,76,-127v30,-15,39,27,52,56v10,22,21,48,35,67v2,0,4,-1,5,-3v16,-28,50,-76,79,-121v14,-21,40,-63,64,-83r5,8v-30,58,-76,110,-97,173v-18,28,-25,37,-33,63v-11,1,-16,25,-30,15v-21,-31,-44,-89,-62,-131v0,-2,-1,-3,-5,-5v-17,11,-16,36,-31,50v-20,33,-20,84,-68,94v-24,-19,-23,-81,-39,-111v-1,-15,-29,-94,-10,-108v9,2,12,5,18,12",w:331},X:{d:"143,-183v43,-25,69,-36,126,-62v22,-10,86,-10,56,21v-51,3,-158,61,-154,64v10,15,41,30,50,52v27,17,46,60,70,82v9,14,-6,30,-24,20v-35,-43,-75,-100,-116,-132v-48,13,-100,47,-118,94v-1,49,-26,34,-27,4v-1,-26,13,-27,17,-48v22,-27,68,-55,90,-77v-9,-12,-60,-39,-79,-57v-6,-10,-6,-25,12,-25",w:312},Y:{d:"216,-240v19,-14,42,10,22,26v-54,66,-121,109,-156,197v-8,21,-11,15,-30,4v3,-37,27,-61,33,-76v12,-12,15,-19,32,-42v-8,-6,-40,5,-45,5v-48,-6,-69,-65,-56,-113v14,0,13,-1,24,7v2,33,12,75,42,73v36,-2,102,-57,134,-81",w:189},Z:{d:"60,-255v66,12,200,-34,240,21v-13,42,-63,62,-98,89v-19,15,-47,33,-82,55v-25,16,-47,32,-66,47v58,24,129,-6,208,-6v23,0,36,12,13,19v-33,2,-53,5,-86,10v-32,18,-88,15,-135,15v-9,-1,-55,-1,-48,-29v1,-24,30,-24,40,-41v64,-50,151,-86,208,-147v-38,-17,-155,12,-198,-4v0,0,-11,-33,4,-29",w:310},"[":{d:"72,-258r-15,250v30,4,55,-3,80,-6v7,-1,8,17,9,23v-28,15,-73,23,-121,21v-7,0,-10,-6,-10,-17v0,-60,25,-193,22,-288v0,-16,13,-20,33,-19v9,-3,34,-12,51,-12v16,0,15,16,19,29v-16,7,-48,10,-68,19",w:151},"\\":{d:"21,38v-20,-21,9,-72,13,-90v44,-78,113,-189,200,-253v2,0,5,4,7,12v11,31,-13,36,-24,58v-74,61,-174,219,-180,273r-16,0",w:257},"]":{d:"133,-258v-23,-13,-84,6,-85,-32v0,-10,5,-15,14,-15v0,0,30,2,90,7v10,1,15,13,15,36v2,7,-8,59,-13,112r-11,125v-9,48,9,90,-59,71v-20,-4,-39,-1,-59,-4v-5,-10,-25,-12,-14,-30v8,-3,61,-13,78,-8v14,1,8,-7,10,-17v15,-69,21,-166,34,-245",w:171},"^":{d:"68,-306v20,15,47,36,58,60v-1,4,0,7,-9,7v-26,0,-47,-38,-49,-32v-15,9,-41,50,-54,30v-2,-31,17,-23,33,-51v8,-9,15,-14,21,-14",w:135},_:{d:"11,15v-8,33,18,45,50,34r205,2r197,-5v11,-5,14,-9,7,-28v-95,-21,-258,-10,-376,-10v-25,0,-72,-3,-83,7",w:485},"`":{d:"75,-264v16,8,56,14,39,43v-30,-8,-65,-23,-105,-44v-1,-3,-3,-28,5,-25v16,5,44,17,61,26",w:129},a:{d:"124,-56v10,4,59,41,65,50v1,7,-6,17,-12,17r-60,-30v-22,2,-42,21,-65,19v-33,4,-68,-67,-15,-81v41,-27,96,-39,110,9v0,6,-4,12,-11,16v-33,-25,-67,-5,-88,12v10,16,61,-18,76,-12",w:196},b:{d:"80,-140v69,1,123,0,134,52v5,26,-71,71,-97,70v-11,11,-88,22,-94,22v-11,-3,-26,-18,-6,-24v19,-5,-2,-19,-1,-35v1,-18,11,-36,-5,-47v-6,-17,-6,-21,14,-32v6,-45,18,-89,28,-124v2,-7,8,-12,17,-15v5,3,10,11,16,28v-12,27,-13,63,-23,96v0,6,6,9,17,9xm87,-107v-40,-9,-31,31,-39,54v8,15,0,25,12,22v30,-8,60,-18,88,-32v39,-18,49,-33,-1,-42v-20,-4,-45,-7,-60,-2",w:217},c:{d:"128,-123v29,-7,37,29,12,33v-27,-4,-40,6,-79,25v-8,4,-13,11,-16,22v30,32,91,3,134,11v5,13,-8,26,-22,19v-51,25,-139,28,-150,-30v6,-50,69,-82,121,-80",w:194},d:{d:"224,-201v0,-35,-17,-111,24,-94v7,86,-2,119,0,197v-4,2,-8,21,-18,16v-62,-7,-154,-8,-185,29v6,17,28,26,51,26v16,0,100,-15,132,-18v7,5,-6,20,-10,22v-24,8,-122,42,-163,25v-32,-5,-62,-53,-36,-80v35,-37,118,-46,198,-43v1,-22,7,-49,7,-80",w:265},e:{d:"4,-57v0,-58,51,-71,110,-74v33,-1,45,16,59,35v1,14,2,39,-7,42v-24,-2,-73,13,-99,11v-2,2,-2,3,-2,3v0,3,12,8,37,15v21,0,69,9,31,22v-9,14,-34,6,-56,6v-27,-5,-73,-28,-73,-60xm123,-102v-22,2,-68,5,-65,26v24,-2,66,5,79,-6v-5,-13,-1,-13,-14,-20",w:182},f:{d:"6,-59v6,-29,53,-4,53,-43v0,-64,29,-118,84,-150v45,-25,167,-24,155,51v-1,2,-7,6,0,6r-10,2v-45,-58,-165,-39,-186,39v-7,26,-11,42,-9,62v44,8,95,-21,135,-7v-12,25,-39,21,-76,30v-19,5,-18,7,-54,19v-2,8,15,32,17,35v-6,25,-26,26,-40,-5r-15,-24v-41,10,-44,12,-54,-15",w:234},g:{d:"132,-97v30,27,21,75,30,117v-12,31,-11,66,-36,103v-32,46,-105,83,-167,39v-31,-21,-49,-29,-51,-75v-2,-37,77,-50,121,-57v37,-6,68,-10,95,-11v7,-6,3,-32,4,-46v0,0,-1,1,-1,2v0,-18,-5,-31,-14,-45v-44,5,-79,20,-94,-18v3,-54,73,-54,125,-50v12,7,12,13,4,25v-30,-11,-76,8,-90,20v23,3,50,-16,74,-4xm-34,121v60,53,168,1,159,-86v-47,-7,-93,24,-142,30v-12,7,-45,19,-42,29v0,10,8,19,25,27",w:188},h:{d:"100,-310v11,-2,10,19,11,20v-11,52,-40,133,-53,189v-6,30,-9,37,-9,47v27,0,113,-34,143,-34v42,0,31,47,39,79v0,4,-5,17,-16,16v4,2,11,3,4,6v-24,-1,-28,-34,-25,-64v-1,-1,-2,-3,-5,-5v-51,0,-110,38,-162,51v-9,1,-15,-15,-16,-23v17,-89,39,-141,71,-264v0,-9,6,-19,18,-18",w:251},i:{d:"62,-209v7,18,9,23,-5,38v-23,-6,-21,-18,-11,-36v2,0,8,-1,16,-2xm34,-7v-18,-21,-8,-73,-1,-106v7,-10,20,-8,23,6v-1,36,7,72,-2,104v-8,2,-8,0,-20,-4",w:80},j:{d:"88,-191v5,28,-18,40,-28,21v0,-20,12,-29,28,-21xm82,-99v28,-1,16,35,16,61v0,60,-19,150,-35,202v-12,8,-19,31,-35,16v-32,-7,-43,-19,-56,-44r2,-17v11,4,49,45,61,18v10,-55,27,-107,30,-171v0,-16,0,-59,17,-65",w:120},k:{d:"59,-66v33,26,114,37,155,62v8,-4,22,-2,19,-17v0,-4,-12,-11,-30,-24v-36,-25,-54,-22,-99,-33v14,-21,119,-13,103,-63r-16,-7r-123,47r25,-93v-3,-15,16,-49,18,-81v1,-15,-21,-14,-25,-3v-31,82,-49,168,-75,257v2,2,22,30,27,10v2,-5,4,-9,9,-11v4,-16,4,-15,12,-44",w:236},l:{d:"66,-300v21,-6,37,23,30,55v-10,51,-28,135,-28,208v0,11,6,36,-13,37v-29,-5,-30,-48,-25,-83r28,-177v-6,-17,1,-29,8,-40",w:102},m:{d:"348,-59v-2,21,0,57,3,73v-17,3,-30,-1,-32,-16v-8,-7,-5,-44,-13,-70v-35,3,-82,49,-111,70v-12,8,-40,4,-39,-15r2,-56v-1,-13,4,-28,-8,-29v-35,8,-79,72,-115,87v-6,2,-20,-18,-21,-22v1,-20,14,-105,39,-64r8,15v17,-14,72,-56,93,-54v27,3,49,40,43,80v24,-2,66,-55,124,-53v11,14,28,23,27,54",w:368},n:{d:"121,-136v37,6,62,54,62,111v0,32,-16,25,-31,17v-18,-30,-5,-45,-22,-85v-37,-13,-71,55,-92,65v-20,-3,-39,-39,-21,-62v2,-12,3,-15,11,-30v12,-8,20,11,29,12",w:194},o:{d:"108,-139v52,-24,104,18,104,63v0,59,-66,67,-114,83v-52,-2,-115,-50,-80,-105v23,-18,52,-35,90,-41xm45,-60v16,54,125,16,131,-23v-12,-59,-129,-8,-131,23",w:217},p:{d:"82,14v-10,12,-8,117,-24,142v-15,2,-19,0,-29,-13v0,-76,9,-113,22,-192v14,-27,35,-6,37,13v0,8,-3,21,-7,38v2,2,3,2,4,2v26,-9,116,-33,126,-72v-7,-17,-24,-33,-49,-31v-40,3,-116,13,-116,47v-5,7,-2,17,-16,20v-17,-12,-18,-20,-12,-38v8,-25,74,-61,110,-59v55,-15,113,15,118,70v-15,52,-84,79,-146,83v-5,0,-11,-4,-18,-10",w:251},q:{d:"144,-147v27,-8,89,-3,97,31v-9,29,-42,-4,-73,1v-32,6,-118,20,-111,49v0,7,13,13,21,13v21,0,78,-24,104,-34v2,0,9,8,22,21v1,1,1,2,1,5v-27,90,-22,70,-43,203v11,15,-15,54,-33,33v-6,-8,-10,-20,-3,-28v1,-72,5,-114,15,-172v-35,3,-35,10,-59,8v-41,-4,-98,-41,-56,-85v33,-34,59,-27,118,-45",w:248},r:{d:"242,-117v2,22,5,10,-14,23v-73,-7,-166,-23,-174,56v-8,6,-3,20,-8,36v-29,10,-40,-9,-33,-46v6,-31,7,-69,32,-55v58,-37,66,-42,175,-19v3,5,15,4,22,5",w:229},s:{d:"154,-151v19,1,27,24,13,32v-4,1,-22,4,-53,7v-16,8,-22,-2,-39,9v23,21,89,16,96,62v-13,24,-85,35,-124,42v-9,-3,-18,-3,-27,0v-6,-4,-21,-16,-8,-25v30,-6,83,-13,102,-24v-17,-16,-80,-33,-97,-48v-3,-2,-4,-7,-4,-15v-6,-6,3,-13,15,-18v22,-9,94,-23,126,-22",w:188},t:{d:"85,-150v10,-41,35,-126,65,-134v4,1,24,19,11,36v-17,22,-29,57,-36,104v26,8,50,-7,73,5v14,0,22,3,22,9v-1,19,-44,18,-57,23v-10,1,-46,0,-54,10v-10,24,-4,67,-20,98v-21,-3,-26,1,-26,-20v0,-9,2,-36,8,-81v-15,-13,-81,9,-77,-27v4,-38,71,6,91,-23",w:194},u:{d:"207,-136v-1,-2,11,-14,14,-13v6,0,10,7,10,22v-3,40,-23,56,-40,82v-13,19,-62,43,-93,43v-67,-2,-111,-75,-71,-133v26,-3,21,29,19,49v-1,27,26,44,57,42v41,-2,93,-55,104,-92",w:242},v:{d:"24,-127r52,71v42,-16,70,-54,124,-65v5,4,8,7,8,11v-8,19,-4,8,-33,32v0,1,-1,3,-1,5v-61,45,-93,68,-97,68v-40,-15,-50,-72,-68,-100v6,-14,10,-22,15,-22",w:214},w:{d:"15,-139v38,-2,27,57,45,86v30,2,67,-66,101,-78v26,6,36,69,60,78v47,-35,51,-54,119,-104v3,0,7,-2,15,-4v19,23,-9,28,-21,49v-33,28,-68,90,-107,109v-10,6,-52,-47,-72,-71v-20,17,-85,74,-97,73v-38,7,-41,-98,-52,-122v0,-1,3,-7,9,-16",w:325},x:{d:"95,-124v22,-13,78,-32,99,-31v16,0,23,6,23,18v0,22,-17,11,-49,21v-3,0,-45,20,-42,24v0,1,2,4,8,10v20,24,49,41,44,80v-35,3,-27,-9,-60,-44v-40,-43,-37,-26,-79,9v-1,1,-2,3,-3,8v-12,8,-28,10,-27,-11v-6,-8,45,-65,48,-65v-17,-21,-61,-52,-24,-68v9,0,48,37,62,49",w:223},y:{d:"44,-65v22,33,70,4,99,-8v5,-4,28,-15,41,-31r17,0v25,47,-26,70,-40,114v-5,4,-9,8,-10,21v-16,12,-11,33,-27,51v-5,18,-12,43,-23,71v-1,-1,-2,34,-18,29v-12,1,-22,-12,-22,-23v20,-70,24,-65,68,-177v-47,16,-111,8,-116,-39v-11,-13,-7,-62,8,-62v18,0,22,26,23,54",w:216},z:{d:"189,-43v9,-1,46,-6,41,12v0,7,-5,13,-15,14v-45,6,-148,24,-181,13v0,-3,-5,-8,-14,-15v5,-44,66,-46,90,-85v-15,-18,-84,21,-84,-14v0,-10,5,-17,14,-18v33,-3,79,-13,109,-3v4,-2,14,11,12,15v0,23,-26,51,-78,84v28,10,73,-3,106,-3",w:244},"{":{d:"94,-303v27,-9,90,-14,79,26v-20,17,-55,-5,-87,13v-4,1,-6,4,-6,8v33,42,31,44,7,85v-6,10,-13,16,-13,13v5,6,17,17,15,31r-33,78v7,35,28,49,57,63r49,0v7,42,-51,41,-86,20v-43,-13,-51,-51,-56,-89v-2,-25,25,-54,27,-71v-3,-4,-46,-5,-41,-21v2,-10,-3,-29,11,-25v2,0,51,-17,52,-38v4,-3,-25,-23,-25,-49v0,-41,8,-30,50,-44",w:179},"|":{d:"30,-308v26,5,14,50,15,80v5,78,-8,153,-3,225v-2,15,-1,31,-11,36v-8,-3,-25,-22,-25,-32r9,-183v0,-40,0,-78,1,-112v0,-4,9,-15,14,-14",w:63},"}":{d:"47,-298v34,-17,118,-18,112,36v6,25,-76,98,-69,103v4,16,39,7,44,28v7,34,-34,17,-37,39v8,29,49,83,23,123v-15,23,-43,26,-73,46v-34,8,-43,11,-49,-17v1,-15,30,-15,33,-20v24,-12,70,-27,55,-61v-14,-33,-37,-68,-19,-103v-46,-50,46,-100,60,-141v-10,-16,-68,6,-77,-12",w:143},"~":{d:"7,-254v2,-6,59,-50,67,-46v11,-1,35,19,46,26v5,0,27,-10,66,-31v21,8,-1,25,-7,38v-27,21,-48,31,-65,31v-24,-11,-37,-39,-65,-9v-7,7,-26,36,-42,11v3,-5,-3,-17,0,-20",w:199},"Ä":{d:"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm187,-259v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,28,2,28,21xm90,-284v7,3,28,11,28,18v0,9,-9,18,-18,17v-17,0,-25,-24,-10,-35"},"Å":{d:"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm112,-239v-31,-17,-9,-61,29,-56v12,2,22,3,33,12v24,39,-30,62,-62,44xm119,-262v2,14,41,8,41,-4v0,-4,-8,-6,-24,-9v-10,-2,-17,10,-17,13"},"Ç":{d:"48,-108v-12,70,90,71,159,67r138,-9v9,-1,7,9,7,17v-37,16,-80,27,-103,21v-14,9,-40,3,-67,9v-30,0,-64,1,-100,-10v-6,-1,-10,-4,-10,-8v-32,-12,-46,-31,-63,-56v-16,-61,47,-103,83,-121v82,-42,118,-45,200,-60v21,-4,36,34,11,37v-90,11,-148,31,-225,77v-12,8,-23,20,-30,36xm172,18v29,4,47,14,53,35v-2,7,-14,31,-27,31v-28,7,-55,9,-84,14v-18,-5,-13,-32,7,-32v21,0,55,-5,69,-13v-16,-14,-63,10,-50,-35v9,-10,1,-27,23,-29v7,8,11,16,9,29",w:331},"É":{d:"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-16,41,-16,51v55,-1,111,-21,168,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-4,-19,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm133,-248v27,-11,48,-32,59,-14v3,11,-79,52,-88,53v-14,1,-16,-11,-12,-21v10,-4,23,-11,41,-18",w:252},"Ñ":{d:"224,-182v1,-17,15,-24,22,-38v20,0,13,10,3,33v-3,36,-25,52,-28,94v-10,24,-30,55,-29,82r-19,7v-32,-8,-36,-70,-58,-111v-2,-23,-7,-27,-19,-54v-28,36,-41,93,-71,133v-9,5,-20,-9,-20,-17r73,-149v9,-24,31,-5,36,7v19,41,31,98,53,139v22,-35,34,-69,50,-118v2,-3,3,-3,7,-8xm203,-257v22,-8,41,-24,65,-26v3,11,-8,9,-7,21v-26,20,-46,31,-59,31v-2,3,-49,-27,-49,-29v-11,0,-32,31,-46,32v-11,-2,-12,-21,-4,-23v4,-6,28,-30,48,-34v17,-4,43,28,52,28",w:219},"Ö":{d:"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm197,-229v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm101,-254v7,3,28,9,27,18v1,8,-8,17,-17,17v-18,0,-26,-24,-10,-35",w:273},"Ü":{d:"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-29,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm197,-227v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,28,2,28,21xm101,-252v7,3,27,10,27,18v0,8,-9,18,-18,17v-18,-1,-24,-25,-9,-35",w:262},"á":{d:"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm32,-117v24,-3,85,-55,101,-32v3,11,-80,53,-89,53v-13,2,-14,-10,-12,-21",w:173},"à":{d:"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm99,-137v7,6,56,14,37,40v-28,-7,-62,-21,-100,-41v-2,-3,-2,-26,5,-23v16,4,42,17,58,24",w:173},"â":{d:"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm147,-97v-27,-6,-39,-26,-60,-37v-21,7,-38,46,-65,23v-2,-5,-3,-10,-4,-14v18,-4,43,-31,61,-42v28,5,40,21,62,36v12,8,18,17,18,25v0,6,-4,9,-12,9",w:173},"ä":{d:"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-32,5,-66,-64,-15,-77v39,-26,92,-36,104,9v0,6,-3,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm142,-119v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,28,2,28,21xm46,-144v7,3,28,9,27,18v1,8,-9,18,-18,17v-18,-1,-25,-25,-9,-35",w:173},"ã":{d:"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm114,-136v22,-8,41,-24,64,-26v3,11,-7,10,-7,21v-26,20,-45,30,-58,30v-3,3,-49,-26,-49,-28v-10,-1,-32,35,-51,31v-12,-32,8,-29,32,-51v24,-21,54,20,69,23",w:173},"å":{d:"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm54,-101v-37,-20,-9,-71,34,-65v13,1,25,3,38,13v27,45,-34,73,-72,52xm61,-128v4,20,48,7,49,-5v0,-5,-9,-7,-28,-10v-12,-2,-21,11,-21,15",w:173},"ç":{d:"108,-118v30,-6,56,21,25,33v-24,-6,-39,5,-75,23v-7,4,-12,12,-15,22v31,28,86,3,128,9v3,28,-29,16,-44,28v-53,15,-106,10,-120,-37v0,-48,62,-70,101,-78xm92,18v23,4,45,12,48,32v-2,6,-12,28,-25,28v-24,6,-50,10,-77,13v-16,-4,-11,-28,7,-29v17,-1,51,-4,63,-12v-14,-15,-57,10,-46,-32v9,-8,0,-25,21,-26v6,6,12,14,9,26",w:171},"é":{d:"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10v-1,1,-2,3,-2,3v0,3,12,7,35,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-70,-26,-70,-58v0,-54,48,-65,104,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm76,-169v26,-11,48,-32,59,-14v3,10,-80,53,-89,53v-14,1,-14,-10,-12,-21v15,-7,16,-7,42,-18",w:161},"è":{d:"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10v-1,1,-2,3,-2,3v0,3,12,7,35,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-70,-26,-70,-58v0,-54,48,-65,104,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm95,-166v7,6,54,14,37,40v-28,-7,-62,-21,-100,-41v-3,-3,-3,-26,5,-24v16,5,42,18,58,25",w:161},"ê":{d:"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10v-1,1,-2,3,-2,3v0,3,12,7,35,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-70,-26,-70,-58v0,-54,48,-65,104,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm145,-129v-27,-6,-39,-26,-60,-37v-8,0,-10,4,-14,10v-11,15,-51,34,-56,0v17,-4,44,-32,61,-43v28,5,41,21,63,36v12,8,17,17,17,25v0,6,-3,9,-11,9",w:161},"ë":{d:"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10r-3,3v0,3,12,7,36,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-67,-27,-71,-58v7,-52,48,-65,105,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm140,-144v0,8,-4,12,-12,12v-18,0,-19,-19,-16,-33v18,-1,29,1,28,21xm44,-169v7,3,28,9,28,17v0,9,-9,18,-18,18v-18,0,-25,-24,-10,-35",w:161},"í":{d:"59,-98v20,4,15,53,10,95v-6,1,-11,2,-19,-4v1,-7,-12,-18,-10,-24v4,-22,-4,-65,19,-67xm50,-139v27,-11,49,-32,59,-14v3,11,-80,53,-89,53v-14,1,-14,-12,-11,-22v15,-7,14,-6,41,-17",w:105},"ì":{d:"57,-98v22,5,13,50,11,95v-7,1,-11,2,-20,-4v1,-7,-12,-18,-10,-24v4,-22,-2,-64,19,-67xm70,-139v14,10,54,14,37,41v-28,-7,-61,-22,-99,-42v-3,-2,-3,-25,5,-23v15,5,41,17,57,24",w:109},"î":{d:"72,-98v20,5,12,51,10,95v-6,2,-13,1,-20,-4v1,-8,-12,-18,-10,-24v4,-22,-3,-65,20,-67xm134,-94v-26,-7,-39,-25,-60,-37v-7,0,-9,4,-13,10v-14,15,-51,34,-56,-1v18,-4,45,-33,61,-43v27,6,40,22,62,37v12,8,18,17,18,25v0,6,-4,9,-12,9",w:143},"ï":{d:"55,-97v19,5,15,53,10,95v-17,5,-26,-14,-30,-28v6,-20,-3,-65,20,-67xm110,-118v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm14,-143v6,3,28,8,28,17v0,9,-9,18,-18,18v-18,0,-25,-24,-10,-35",w:107},"ñ":{d:"115,-129v34,6,59,50,59,105v0,31,-15,24,-30,17v-15,-29,-5,-42,-20,-81v-35,-13,-68,52,-88,61v-20,-4,-38,-36,-19,-59v0,-12,3,-14,10,-28v11,-8,18,11,27,12xm117,-166v22,-7,41,-23,64,-26v3,11,-7,10,-7,21v-26,20,-45,30,-58,30v-3,3,-49,-26,-49,-28v-10,-1,-32,35,-51,31v-5,-12,-8,-16,0,-23v4,-6,28,-29,48,-33v17,-3,43,28,53,28",w:171},"ó":{d:"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm49,-154v24,-3,85,-55,101,-32v3,11,-80,53,-89,53v-14,0,-13,-8,-12,-21",w:191},"ò":{d:"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm115,-181v14,10,51,13,37,40v-28,-7,-62,-21,-100,-41v-3,-2,-3,-26,5,-23v16,5,42,17,58,24",w:191},"ô":{d:"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm110,-177v-22,6,-38,45,-65,22v-2,-4,-3,-9,-4,-13v18,-4,43,-32,61,-43v27,6,40,21,62,36v12,9,18,17,18,25v1,11,-15,10,-23,7",w:191},"ö":{d:"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm161,-160v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm65,-185v7,3,28,9,28,18v0,7,-9,18,-18,17v-18,1,-25,-24,-10,-35",w:191},"õ":{d:"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm58,-199v26,-21,54,18,69,22v4,0,15,-5,34,-13v22,-9,21,-16,31,-13v3,11,-9,9,-7,22v-26,20,-46,30,-59,30v-2,4,-49,-28,-49,-29v-11,0,-32,31,-46,32v-12,-3,-13,-21,-4,-23v4,-6,14,-15,31,-28",w:191},"ú":{d:"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm106,-174v26,-11,48,-32,59,-14v3,11,-81,53,-89,54v-13,1,-15,-12,-11,-22v15,-7,14,-7,41,-18",w:213},"ù":{d:"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm126,-166v7,6,56,14,37,40v-28,-7,-62,-22,-100,-42v-2,-3,-2,-26,5,-23v16,4,42,18,58,25",w:213},"û":{d:"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm172,-143v-27,-6,-39,-26,-60,-37v-8,0,-10,4,-14,10v-11,15,-49,35,-56,0v17,-4,44,-32,61,-43v27,6,41,21,63,36v12,9,17,17,17,25v0,6,-3,9,-11,9",w:213},"ü":{d:"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm168,-161v0,8,-3,13,-11,13v-17,0,-20,-19,-17,-34v18,-1,29,1,28,21xm72,-186v7,3,29,9,28,18v0,7,-9,18,-18,17v-18,1,-25,-24,-10,-35",w:213},"†":{d:"22,-286v15,6,5,-20,19,-19v9,-3,15,21,17,22v6,1,12,3,20,6v3,10,5,16,-9,16v-34,-10,-6,51,-34,52v-20,-7,11,-47,-15,-49v-14,3,-25,-5,-17,-24v7,-2,14,-4,19,-4",w:77},"°":{d:"106,-268v0,36,-35,38,-51,46v-48,5,-60,-58,-25,-78v33,-11,76,-9,76,32xm38,-257v16,7,39,2,38,-17v-13,-9,-28,-1,-32,11v-5,3,-7,0,-6,6",w:114},"¢":{d:"105,-188v13,-12,14,-18,26,-15v7,23,7,15,-3,49v6,0,18,14,17,20v-3,5,-12,19,-26,13v-14,1,-14,5,-16,21v10,10,46,-13,38,18v-9,17,-23,16,-54,20v-17,16,-4,55,-29,60v-37,-10,19,-64,-24,-71v-20,-10,-37,-47,-6,-62v23,-20,73,-4,77,-53xm65,-101v4,-9,7,-8,3,-13v-14,4,-22,10,-3,13",w:154},"£":{d:"153,-170v3,22,62,0,49,39v-18,6,-31,12,-58,9v-12,-1,-17,30,-23,39v19,26,50,56,91,35v9,-2,27,-13,27,4v0,27,-27,39,-58,42v-32,-5,-59,-19,-78,-39v-6,1,-35,44,-57,39v-25,0,-37,-15,-37,-46v0,-41,43,-53,73,-50v4,1,12,-18,12,-21v-7,-15,-49,0,-44,-30v-2,-31,31,-16,60,-19v16,-30,25,-119,93,-113v16,2,75,16,50,44v-4,5,-7,7,-12,8v-18,-12,-32,-18,-41,-18v-35,-1,-38,52,-47,77xm43,-45v4,5,12,-2,11,-9v-1,2,-12,1,-11,9",w:242},"§":{d:"141,-115v12,10,29,36,28,56v-4,68,-129,69,-152,16v-1,-12,-10,-22,8,-23v17,3,47,21,67,23v16,1,40,-8,38,-21v-8,-49,-119,-30,-117,-85v1,-28,15,-45,-3,-64v-1,-53,55,-61,103,-62v15,-5,6,-5,20,-2v16,17,23,27,23,30v-1,26,-29,7,-45,7v-21,0,-51,2,-62,17v19,14,87,8,97,43v18,14,16,57,-5,65xm64,-147r57,17v10,-28,-22,-43,-47,-44v-25,-1,-35,19,-10,27",w:174},"•":{d:"130,-114v0,47,-124,54,-120,-8r6,-31v44,-28,64,-34,104,0v8,6,10,20,10,39",w:139},"¶":{d:"121,-237v21,-9,44,-13,63,-1v-1,7,5,6,7,11r-4,190v-2,33,4,39,-15,40v-16,1,-10,-20,-10,-33r4,-161v0,-17,-1,-34,-16,-25v2,10,1,23,1,35v-9,46,-6,75,-15,156v-3,4,-7,5,-12,5v-17,-10,-3,-89,-10,-115v-43,14,-98,10,-101,-29v-4,-53,59,-63,104,-75v3,1,4,2,4,2xm95,-204v2,9,-30,50,1,50v35,0,23,-13,29,-43v0,-1,-2,-7,-4,-15v-12,-1,-14,2,-26,8",w:206},"ß":{d:"33,10v-29,4,-28,-32,-16,-70v18,-58,17,-137,56,-176v12,-24,46,-58,82,-43v20,8,47,24,47,54v0,30,-62,59,-67,90v33,23,56,33,63,63v-18,21,-22,36,-48,54v-24,17,-27,41,-53,16v-2,-19,7,-35,24,-42v15,-13,26,-22,34,-40v-13,-17,-78,-29,-56,-70v-3,-27,64,-54,66,-86v-8,-25,-41,-4,-52,8v-29,30,-47,83,-51,141v-17,25,-8,71,-29,101"},"®":{d:"75,-194v78,-29,116,9,130,84v-2,42,-22,47,-57,67v-74,20,-161,-19,-129,-110v6,-18,29,-34,57,-40xm46,-86v51,36,84,21,129,-15v7,-15,0,-39,-10,-49v-13,-37,-49,-26,-86,-18v-28,7,-49,46,-33,82xm72,-123v-5,-43,68,-57,75,-14v-17,26,-18,17,3,32v2,25,-25,18,-45,7r-4,-4v-1,8,-3,20,-12,24v-10,-3,-21,-34,-17,-45xm112,-135v-10,-1,-20,13,-9,14v6,-6,9,-11,9,-14",w:217},"©":{d:"102,-29v-74,5,-124,-84,-70,-140v22,-22,53,-35,97,-38v46,-4,88,49,74,100v0,44,-51,75,-101,78xm96,-66v42,-3,75,-23,75,-69v0,-23,-4,-38,-44,-38v-16,0,-33,6,-49,20v36,-4,55,-12,62,20v-5,16,-49,1,-50,21v10,15,53,-14,54,11v0,18,-14,27,-42,27v-22,1,-46,-11,-46,-31v0,-25,7,-39,20,-44v-1,-1,-2,-2,-3,-2v-51,22,-32,89,23,85",w:217},"™":{d:"213,-307v28,9,11,49,7,75v-1,4,-4,6,-11,6v-7,1,-11,-14,-11,-34v-14,-6,-34,34,-46,28v-2,0,-10,-9,-24,-27v-10,7,-3,36,-27,31v-15,-24,-3,-27,1,-48v-6,-7,-27,-1,-31,3v-3,14,-7,30,-11,51v-5,10,-29,9,-24,-12v-5,-8,1,-18,3,-35v-13,6,-33,2,-29,-18v20,-17,64,-17,100,-19v28,-1,29,30,45,39v11,-6,35,-32,58,-40",w:239},"´":{d:"52,-284v29,-11,50,-34,62,-14v3,12,-86,54,-94,56v-14,0,-16,-12,-12,-23v11,-5,25,-11,44,-19",w:120},"¨":{d:"124,-259v0,9,-4,13,-12,13v-18,0,-22,-21,-17,-35v19,-1,30,1,29,22xm23,-285v7,2,30,9,29,18v1,10,-9,19,-18,19v-19,0,-28,-26,-11,-37",w:136},"≠":{d:"48,-130v29,11,49,-57,60,-50v25,6,7,27,-1,46v22,5,29,7,21,22v-18,2,-48,-1,-50,15v9,8,53,-7,54,10v-4,22,-46,20,-72,24v-7,13,-18,32,-34,57v-8,6,-15,-3,-13,-14v-1,-9,15,-39,14,-45v-30,5,-24,-17,-13,-25v12,-1,36,4,29,-13v-14,0,-47,6,-36,-12v0,-18,27,-13,41,-15",w:140},"Æ":{d:"335,-259v0,30,-102,12,-122,34v10,21,2,79,16,100v24,-6,59,-13,86,-16v23,-2,32,21,13,26r-103,29v-3,22,-4,38,8,43v28,-5,60,-6,86,-14v5,-1,14,7,14,11v6,16,-90,40,-107,40v-29,0,-39,-19,-32,-46v-2,-4,0,-26,-9,-28v-29,2,-58,6,-88,6v-31,0,-40,74,-82,73v-18,-23,4,-37,12,-50v40,-65,112,-126,165,-207v20,-17,69,-11,112,-13v21,0,31,4,31,12xm123,-111v28,1,44,-2,67,-10v-4,-22,5,-49,-7,-65v-3,6,-65,61,-60,75",w:348},"Ø":{d:"76,-211v41,-13,100,-22,140,-3v26,-19,40,-29,44,-29v10,0,15,7,15,20v0,15,-23,23,-30,35v23,39,29,114,-21,139v-36,19,-102,35,-147,18v-14,-5,-29,29,-46,35v-25,-13,-19,-24,3,-56v-9,-17,-28,-27,-28,-60v0,-38,23,-72,70,-99xm107,-66v55,15,125,-12,123,-70v0,-16,-5,-25,-13,-29r-110,95r0,4xm39,-108v-1,3,17,31,22,27v8,-6,109,-90,123,-106v-15,-11,-43,1,-63,2v-33,10,-80,35,-82,77",w:270},"∞":{d:"322,-72v-4,22,-54,41,-76,41v-43,0,-83,-17,-114,-35v-46,19,-125,53,-128,-18v-1,-14,10,-22,13,-35v29,-10,62,-31,97,-4v37,28,47,5,75,-8v40,-19,73,-10,114,1v13,1,18,55,19,58xm228,-69v15,0,62,-12,61,-25v-19,-23,-89,-10,-105,11v0,2,1,4,2,4v28,6,42,10,42,10xm75,-102v-13,2,-41,4,-44,19v0,4,3,7,10,7v21,0,40,-6,54,-17v-9,-6,-16,-9,-20,-9",w:330},"±":{d:"93,-163v-7,46,76,-4,46,47v-14,6,-27,13,-38,8v-24,2,-14,28,-28,44r-14,0v-7,-12,-5,-15,-7,-33v-12,-7,-41,-1,-37,-24v2,-11,23,-17,36,-14r28,-38v4,0,9,4,14,10xm113,-27v-12,18,-58,27,-85,24v-16,2,-22,-23,-13,-36v28,-7,85,-11,98,12",w:151},"≤":{d:"73,-109v10,15,87,16,87,42v0,11,-5,16,-13,16v-36,-11,-69,-24,-109,-31v-18,-8,-18,-13,-9,-36v59,-56,93,-83,101,-83v16,0,18,17,14,28v-27,24,-42,35,-71,64xm10,-29v35,-12,117,-26,148,-3v1,2,-5,19,-8,18r-124,15v-16,2,-26,-18,-16,-30",w:168},"≥":{d:"115,-174v20,7,53,36,20,57v-19,11,-91,68,-82,59v-18,3,-25,-22,-13,-31v15,-10,14,-10,70,-51r-50,-37v-5,-4,-5,-27,4,-28v16,7,40,17,51,31xm14,-32v33,-10,86,-14,127,-10v12,12,5,23,-11,27v-49,9,-82,13,-99,13v-22,0,-24,-16,-17,-30",w:163},"¥":{d:"31,-248v30,-3,64,64,74,59v37,-22,77,-65,107,-82v20,-11,34,18,21,32v-28,19,-52,38,-70,57v-18,8,-40,21,-35,60v2,19,39,7,64,7v25,0,16,21,2,27v-36,16,-46,8,-68,18v6,11,101,-20,66,24v-21,11,-42,12,-75,20v-2,1,-5,6,-10,18v-8,3,-11,10,-24,8v-7,-17,-2,-18,-9,-26v-13,5,-39,3,-53,-2v-10,-17,-7,-27,0,-34v23,-1,45,1,64,-5v-11,-7,-28,-4,-64,-6v-13,-8,-15,-24,-6,-35v33,-2,102,9,76,-37v-14,-14,-33,-38,-60,-66v-10,-10,-8,-28,0,-37",w:219},"µ":{d:"123,-114v41,0,54,-9,127,-17v12,-2,20,-6,25,-12v5,-78,43,-127,119,-138v38,-5,46,23,55,48v-5,5,2,4,2,12v-2,47,-72,81,-129,95v-17,4,-12,32,-2,39v30,-5,24,0,99,4v14,9,14,20,-1,23v-17,3,-71,-1,-85,13v1,19,18,35,-3,47v-1,-6,-10,-7,-16,-5v-3,-3,-20,-37,-29,-41v-15,8,-50,22,-49,-9v1,-19,2,-27,28,-26v24,1,13,-12,8,-30v-22,1,-64,16,-111,23v-50,7,-17,47,-17,57v0,10,-5,15,-13,15v-20,-9,-27,-30,-33,-55v-20,-17,-52,8,-85,-6v-2,-10,-13,-26,4,-29v32,-6,41,-1,65,-7v-17,-74,-4,-173,69,-180v55,-20,130,8,131,65v-11,9,-10,2,-29,-11v-33,-23,-37,-26,-76,-25v-41,13,-69,38,-67,100v0,34,4,50,13,50xm317,-152v29,-6,106,-43,106,-71v0,-23,-24,-25,-42,-17v-31,1,-74,48,-64,88",w:462},"∂":{d:"456,-113v55,-37,119,-8,176,5v-19,37,-104,-5,-144,18v-5,64,-45,87,-130,87v-43,0,-70,-8,-96,-21v-54,15,-146,29,-209,10v-18,-11,-43,-26,-46,-53v-1,-9,28,-48,51,-46v55,-10,55,-8,101,-8v29,0,17,-26,23,-56v4,-19,4,-74,34,-49v4,42,-7,83,-10,124v0,4,-11,10,-34,17v-29,-1,-45,-4,-74,1v-10,2,-57,3,-52,18v30,43,132,30,190,18v2,-10,-7,-19,-5,-28v5,-36,31,-59,74,-56v27,2,71,4,70,35v-1,30,-37,41,-58,57v35,13,131,15,135,-23v2,-19,-5,-36,4,-50xm262,-85v0,3,13,28,19,25v7,0,48,-13,61,-29v-10,-17,-71,-17,-80,4",w:640},"∑":{d:"235,-95v-3,-59,120,-41,160,-28v3,-2,15,-3,14,4v1,3,-16,19,-21,18r-97,4v-25,5,-18,18,-23,56v-16,14,-25,24,-36,18v-83,32,-154,29,-212,-17v-45,-68,41,-114,107,-119v50,-4,59,66,22,85v-16,8,-61,10,-79,15v36,27,185,24,165,-36xm128,-119v-23,-3,-43,4,-53,15v13,5,46,-4,53,-15",w:414},"∏":{d:"243,-190v7,-18,27,-19,38,6v0,2,-5,8,-14,16v-8,-9,-27,-4,-24,-22xm221,-111v55,-7,60,22,45,64v5,23,17,47,-22,47v-35,0,-18,-40,-15,-70v-2,-19,-35,-13,-52,-18v-2,0,-13,1,-34,3v-4,0,-10,11,-13,31v-3,20,1,43,-11,54v-12,-4,-13,-5,-21,-3v-13,-13,-3,-25,-12,-41v7,-6,12,-22,10,-39v-23,-8,-79,15,-87,-21v12,-28,78,-4,101,-20r36,-96v8,-19,17,-28,27,-28v10,0,15,6,15,18v-6,32,-31,62,-38,109v25,10,47,-1,71,10",w:282},"π":{d:"247,-240v-3,5,-14,12,-21,6v-41,5,-71,-4,-85,37v-6,7,-21,42,-25,61v28,12,104,-16,129,24v8,11,12,24,12,38v-7,17,-2,99,-40,68v-9,-23,-5,-47,-1,-73v3,-24,-40,-24,-50,-19v-4,0,-18,2,-44,6v-30,-6,-16,49,-33,58v-19,-11,-14,2,-29,-10v8,-71,20,-114,43,-170v-24,-2,-49,4,-73,7v-30,3,-32,-33,-7,-36r184,-22v17,-1,40,13,40,25",w:265},"∫":{d:"62,-151v-7,-70,20,-130,63,-150v28,1,39,10,70,23v20,8,6,33,-6,35v-29,-13,-45,-20,-49,-20v-20,-4,-45,51,-43,70v8,60,5,129,5,189v0,62,-27,93,-79,93v-37,-1,-71,-14,-63,-57v21,0,79,34,91,-2v16,-3,14,-64,21,-85v-2,-31,-1,-74,-10,-96",w:156},"ª":{d:"6,-265v1,-31,58,-53,80,-22v-11,14,25,28,25,36v-2,8,-15,12,-27,10v-22,-29,-68,19,-78,-24xm52,-281v-8,1,-24,10,-9,13v11,1,24,-10,9,-13",w:117},"º":{d:"13,-273v1,-31,56,-41,83,-18v36,8,14,48,-9,52v-35,6,-64,-5,-74,-34xm81,-269v-7,-7,-20,-11,-29,-6v5,13,13,11,29,6",w:128},"Ω":{d:"121,-111v9,16,43,-5,54,5v28,-4,62,8,81,-5v48,-33,166,-28,160,44v15,34,-51,53,-88,53v-34,0,-53,-21,-71,-37v-15,7,-32,-4,-28,-22v-26,-4,-93,-6,-108,8v8,17,5,37,12,54v-1,15,-18,15,-31,10v-9,-15,-20,-39,-19,-63v-20,-9,-73,15,-79,-18v4,-28,50,-11,77,-24v12,-99,36,-168,137,-178v35,5,64,20,67,57v0,13,-14,18,-20,5v-15,-35,-83,-31,-104,4v-26,20,-39,82,-40,107xm334,-45v15,2,51,-14,53,-22v-7,-20,-36,-31,-69,-29v-8,-1,-39,6,-37,14v-3,10,44,38,53,37",w:424},"æ":{d:"145,-44r33,7v2,42,-59,29,-85,16v-6,7,-35,24,-48,15v-19,2,-35,-21,-33,-37v2,-24,5,-19,28,-36v-6,-8,-45,3,-33,-21v21,-22,58,-12,85,-1v6,-5,35,-28,45,-15v20,-4,36,17,36,35v0,23,-4,21,-28,37xm111,-72v12,3,49,-16,19,-17v-5,0,-20,12,-19,17xm74,-50v-14,-4,-48,16,-19,17v4,1,19,-14,19,-17",w:184},"ø":{d:"76,-136v17,7,33,-8,51,0v9,-6,21,-13,36,-21v23,22,-13,31,3,50v11,13,4,21,14,35v-4,5,-1,14,-4,23v-14,23,-45,41,-84,39v-12,2,-29,28,-41,38v-2,-11,-34,-10,-15,-30v3,-7,5,-11,5,-11v-15,-24,-60,-54,-22,-89v23,-21,25,-32,57,-34xm102,-54v18,1,50,-19,30,-32v-12,7,-22,18,-30,32xm85,-92v-14,3,-26,8,-38,17v2,20,17,13,26,0v6,-8,12,-13,12,-17",w:188},"¿":{d:"181,-247v3,1,31,2,29,15v-4,22,-37,27,-41,4v1,-5,7,-20,12,-19xm161,-34v-45,-1,-105,19,-124,51v0,11,18,17,54,17v39,0,82,-13,112,4v-10,35,-58,31,-100,31v-47,0,-80,-10,-99,-31v-10,-56,22,-73,64,-90v8,-3,32,-9,74,-18v21,-15,7,-62,22,-92v-1,-5,-1,-11,4,-12v16,0,24,7,24,22v-8,30,-8,73,-17,111v-3,5,-7,7,-14,7",w:213},"¡":{d:"86,-197v8,16,-7,41,-24,25v-11,-11,-4,-16,-3,-29v13,0,15,-2,27,4xm46,-107v4,-8,11,-16,23,-7v19,26,-5,57,-6,87v-7,0,-5,18,-9,28v0,14,-17,52,-11,70v-2,7,-15,28,-25,12v-4,-6,-15,-7,-6,-16v2,-39,14,-96,34,-174",w:95},"¬":{d:"141,-99v47,7,103,-3,149,6v14,24,18,15,10,39v-10,34,-7,31,-26,76v-4,6,-15,8,-16,21v-4,2,-4,1,-13,5v-22,-33,-4,-33,16,-104v-5,-9,-28,-4,-38,-6r-183,4v-14,0,-41,-29,-17,-36v31,-9,82,5,118,-5",w:315},"√":{d:"364,-218v43,-21,80,-51,104,-32v-3,19,-24,21,-44,40v-41,15,-78,53,-136,78r-137,98v-20,16,-79,66,-91,68v-3,1,-25,-11,-24,-13v-4,-28,-43,-61,-30,-85v26,-15,42,19,58,32r295,-188v0,1,2,2,5,2",w:474},"ƒ":{d:"115,-262v-23,6,-39,63,-38,96v1,3,57,2,54,16v1,22,-45,15,-51,30v3,34,12,68,10,103v14,17,-18,53,-28,63v-48,8,-89,5,-95,-37v20,-5,77,21,83,-18v17,-29,-4,-61,0,-98v0,-5,-3,-10,-7,-17v-33,4,-43,-17,-25,-37v10,-4,27,5,27,-10v0,-43,15,-77,32,-109v12,-7,16,-22,38,-20v11,1,51,35,25,55v-9,1,-16,-17,-25,-17",w:145},"≈":{d:"133,-112v21,15,48,-30,78,-17v3,3,5,7,5,9v-8,30,-47,45,-76,45v-19,0,-64,-48,-90,-21r-29,20v-6,-1,-17,-16,-15,-32v24,-17,70,-42,107,-21v4,4,10,9,20,17xm138,-57v28,2,48,-25,76,-26v13,30,-21,42,-40,53v-41,24,-77,-15,-114,-23v-15,14,-46,32,-49,-1v-3,-9,27,-28,54,-30",w:223},"∆":{d:"18,-1v-24,-30,8,-48,25,-71v14,-19,34,-28,40,-56v20,-35,29,-14,57,4v9,39,43,62,57,102v0,16,-34,17,-50,14v-28,2,-72,4,-129,7xm139,-47r-22,-52v-12,-5,-12,15,-24,27v-7,6,-14,16,-23,28v23,1,36,-1,69,-3",w:199},"«":{d:"191,-64v16,6,87,37,53,63v-39,-9,-71,-28,-107,-40v-14,-13,-13,-34,10,-47v27,-15,48,-55,84,-62v9,-2,21,10,21,18r-13,21v-16,5,-44,22,-51,41v0,4,1,6,3,6xm71,-65v17,6,87,35,55,62v-39,-8,-66,-27,-108,-40v-14,-13,-13,-36,10,-46v23,-18,50,-56,84,-63v9,-2,21,10,21,18r-13,22v-20,6,-32,17,-51,37v0,3,-1,11,2,10",w:265},"»":{d:"120,-129v9,-33,48,-10,64,5v9,20,86,52,50,86v-36,11,-66,31,-107,40v-6,-7,-9,-13,-9,-17v-2,-13,50,-46,63,-46v11,-18,-33,-42,-48,-47xm1,-128v10,-33,46,-8,64,6v8,19,86,50,51,85v-40,13,-69,30,-108,40v-6,-7,-8,-12,-8,-16v-2,-14,50,-46,63,-47v7,-13,-9,-20,-19,-30v-10,-9,-20,-15,-30,-17",w:252},"…":{d:"244,-24v-1,21,-38,32,-41,3v-2,-19,23,-22,34,-17v0,7,0,15,7,14xm113,-24v0,-22,28,-21,38,-8v5,34,-39,40,-38,8xm35,-2v-10,-2,-36,-17,-18,-29v-1,-15,17,-17,31,-6v7,17,6,33,-13,35",w:258}," ":{w:179},"À":{d:"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm150,-268v14,10,54,14,37,41v-28,-7,-62,-22,-100,-42v-2,-3,-2,-26,5,-23v16,4,42,17,58,24"},"Ã":{d:"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm100,-285v26,-19,54,19,69,22v4,0,15,-5,34,-13v23,-9,22,-17,31,-12v3,11,-9,9,-7,21v-26,20,-46,30,-59,30v-3,3,-50,-26,-49,-29v-12,1,-31,35,-51,32v-3,-8,-5,-14,-5,-18v10,-9,16,-17,37,-33"},"Õ":{d:"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm116,-270v26,-19,54,19,69,22v4,0,15,-5,34,-13v23,-10,22,-16,31,-12v3,11,-8,9,-7,21v-45,28,-47,42,-88,16v-29,-19,-12,-20,-43,2v-8,5,-12,18,-23,15v-13,-3,-12,-20,-4,-23v4,-6,14,-15,31,-28",w:273},"Œ":{d:"247,-243v71,4,161,-7,245,-8v17,0,27,6,27,17v-8,27,-70,14,-104,23v-3,1,-52,0,-65,7r0,4v16,16,17,29,17,65v32,10,74,-14,99,16v-14,25,-76,17,-127,24v-17,18,-55,32,-75,51v85,0,128,-3,204,-11v15,-2,21,11,20,29v-78,24,-177,12,-270,24v-24,3,-24,-29,-48,-15v-46,7,-70,4,-105,-4v-19,-18,-42,-22,-52,-55v-10,-34,0,-47,12,-78v-18,-59,48,-78,105,-84v17,-18,103,-13,117,-5xm125,-45v76,-9,186,-43,209,-105v-26,-67,-137,-83,-217,-54v3,34,-45,25,-60,58v-41,48,5,108,68,101",w:492},"œ":{d:"185,-54v25,28,107,-17,104,33v-12,12,-60,14,-87,14v0,0,1,1,2,1v-11,1,-39,-9,-50,-17v-28,17,-75,32,-114,7v-22,-14,-34,-11,-34,-41v0,-36,33,-49,48,-75v29,-16,72,-3,95,11v12,-9,48,-27,59,-26v30,0,64,15,65,40v0,7,-6,20,-20,37v-29,1,-44,11,-68,16xm226,-106v-21,-7,-41,-2,-48,13v14,1,42,-7,48,-13xm132,-87v-21,-35,-94,11,-92,24v-2,14,43,21,61,21v25,0,36,-20,31,-45",w:295},"–":{d:"6,-66v-8,-72,79,-21,146,-39v37,-10,79,7,111,0v9,8,14,13,14,17v2,26,-72,13,-99,21v-83,4,-124,21,-172,1",w:282},"—":{d:"175,-106v86,-9,201,1,286,-1v11,6,13,11,6,30v-118,15,-246,10,-377,10v-25,0,-73,3,-82,-8r-2,-26v11,-13,32,-9,52,-7v38,3,84,-5,117,2",w:485},"“":{d:"66,-261v-21,5,-37,51,-22,77v0,4,-2,6,-7,6v-31,-9,-38,-62,-12,-94v12,-15,21,-28,31,-34v16,-1,19,24,22,34v10,-11,22,-32,43,-23v-2,8,4,16,5,19v-6,11,-51,53,-29,74v-12,21,-30,5,-33,-17v-6,-13,9,-28,2,-42",w:118},"”":{d:"120,-294v12,3,30,26,19,34v2,15,-40,70,-55,66v-40,-10,10,-51,14,-64v3,-3,8,-31,22,-36xm70,-306v14,3,26,34,16,49v-19,30,-31,45,-58,59v-12,-11,-33,-17,-7,-36v13,-19,36,-27,36,-59v0,-5,9,-13,13,-13",w:148},"‘":{d:"73,-262v-10,7,-41,39,-38,69v-15,13,-27,-16,-28,-28v-2,-20,51,-83,66,-83v20,0,25,41,0,42",w:95},"’":{d:"74,-300v13,31,-1,99,-44,101v-13,0,-19,-5,-19,-15v6,-10,31,-34,35,-59v2,-11,1,-32,11,-32v6,0,11,2,17,5",w:90},"÷":{d:"167,-158v-4,3,-7,9,-10,20v-23,4,-34,-8,-29,-31v14,-6,18,1,39,11xm78,-72v-53,11,-53,12,-69,-15v-1,-12,11,-17,22,-14v71,-13,151,-18,230,-24v11,1,21,16,23,28v-28,20,-90,11,-126,16v-36,5,-62,5,-80,9xm123,-40v19,-17,41,-1,41,17v0,13,-6,19,-17,19v-15,0,-29,-14,-24,-36",w:293},"◊":{d:"76,-158v48,-8,64,11,100,36v28,19,-5,39,-22,54v-15,13,-40,32,-48,49v-17,5,-12,0,-27,-16v-6,-6,-86,-31,-68,-53r2,-9v27,-23,48,-44,63,-61xm93,-65v12,-2,35,-31,41,-38v-5,-10,-16,-14,-34,-24v-12,12,-36,29,-40,44v19,11,30,18,33,18",w:199},"ÿ":{d:"118,85v-11,11,-11,38,-22,61v-2,-1,-2,31,-17,27v-11,0,-21,-10,-21,-22v20,-66,23,-61,64,-168v-22,1,-38,16,-58,4v-22,4,-51,-16,-51,-42v-11,-13,-7,-59,7,-58v16,1,21,24,22,51v21,33,66,5,94,-7v4,-3,26,-14,38,-29r17,0v23,44,-23,59,-34,102v-6,9,-13,9,-13,26v-15,6,-12,33,-27,48v0,2,1,4,1,7xm158,-136v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,29,1,28,21xm62,-161v7,3,28,9,27,18v1,8,-8,17,-17,17v-18,0,-26,-24,-10,-35",w:190},"Ÿ":{d:"176,-189v35,20,-25,54,-39,72v-26,34,-57,57,-74,104v-10,15,-4,14,-23,3r0,-10v19,-44,27,-46,50,-81v-9,-5,-24,4,-34,4v-38,0,-54,-50,-44,-87v21,-5,18,19,22,35v4,18,15,27,29,27v41,0,60,-39,113,-67xm153,-222v0,8,-3,12,-11,12v-18,0,-21,-19,-16,-33v18,-1,28,2,27,21xm57,-247v8,2,29,9,28,17v0,21,-37,24,-36,1v0,-7,2,-13,8,-18",w:135},"⁄":{d:"193,-305v7,6,17,31,3,41v-10,7,-12,13,-21,25v-79,56,-190,209,-197,260r-18,0v-23,-19,9,-70,15,-85v52,-83,121,-179,218,-241",w:120},"¤":{d:"308,-133r-200,16v-2,1,-6,4,-10,10v70,-2,144,-14,211,-8v3,0,8,4,13,8v-1,4,-3,9,-9,17v-57,11,-164,6,-219,25v26,32,112,25,173,25v9,0,35,2,35,19v0,9,-4,13,-12,14v-115,12,-146,23,-211,-19v-12,-4,-22,-9,-25,-27v-6,-29,-61,3,-43,-49v17,-1,36,7,42,-12v-32,7,-36,-39,-11,-40v29,14,63,-25,73,-30v52,-25,72,-44,142,-44v23,0,21,41,-1,39v-35,-3,-61,9,-102,31v2,2,5,4,8,4v18,-6,101,-9,115,-9v7,0,55,13,31,30",w:312},"€":{d:"308,-133r-200,16v-2,1,-6,4,-10,10v70,-2,144,-14,211,-8v3,0,8,4,13,8v-1,4,-3,9,-9,17v-57,11,-164,6,-219,25v26,32,112,25,173,25v9,0,35,2,35,19v0,9,-4,13,-12,14v-115,12,-146,23,-211,-19v-12,-4,-22,-9,-25,-27v-6,-29,-61,3,-43,-49v17,-1,36,7,42,-12v-32,7,-36,-39,-11,-40v29,14,63,-25,73,-30v52,-25,72,-44,142,-44v23,0,21,41,-1,39v-35,-3,-61,9,-102,31v2,2,5,4,8,4v18,-6,101,-9,115,-9v7,0,55,13,31,30",w:312},"‹":{d:"64,-107v9,17,86,17,87,43v0,11,-4,16,-13,16v-36,-11,-70,-22,-109,-31v-19,-4,-18,-14,-9,-36v59,-56,93,-84,101,-84v17,0,19,20,13,29",w:159},"›":{d:"41,-181v26,27,112,44,70,91r-82,60v-20,3,-25,-23,-13,-32r70,-51r-66,-46v-5,-6,-4,-28,5,-29v4,2,9,4,16,7",w:137},"":{d:"74,-74v-6,-24,-70,8,-68,-27v0,-6,6,-20,20,-18v44,6,45,-9,42,-49v7,-40,26,-114,90,-104v48,-2,63,-1,90,30v11,25,4,14,2,44v-7,17,-54,9,-49,-7r8,-21v-5,-13,-22,-9,-43,-11v-56,-6,-63,45,-67,92v-2,21,5,23,22,22v37,-1,80,-9,113,-1v13,31,-9,82,-22,106v-13,10,-26,-6,-22,-25r11,-46v0,-3,-2,-6,-6,-6v-19,0,-47,3,-83,9v-6,1,-9,4,-8,11r12,59v-1,9,-11,30,-23,18v-18,-18,-15,-59,-19,-76",w:272},"":{d:"43,-61v-21,4,-36,2,-39,-15v-4,-35,41,-8,34,-47v4,-59,12,-99,46,-124v11,-42,157,-47,149,13v1,7,-7,15,-13,15v-18,-7,-19,-26,-47,-23v-34,3,-65,6,-79,37v-12,27,-22,52,-21,91v13,9,31,-11,45,-4v32,-15,50,-6,94,-13v12,-30,19,-79,36,-133v1,-5,5,-8,12,-8v44,18,-18,106,-12,144v-9,22,-1,73,-16,104v2,28,-23,28,-37,16v1,-26,9,-48,11,-75v0,-6,-3,-9,-9,-9v-43,0,-83,8,-119,24v8,40,17,33,-7,56v-20,-9,-21,-19,-28,-49",w:283},"‡":{d:"102,-284v16,2,42,-2,33,18v-7,15,-42,1,-38,30v3,3,31,1,30,11v4,15,-29,19,-36,24v-2,18,-4,24,-16,29r-25,-26v-25,7,-53,3,-42,-25v4,-10,70,0,51,-22v-17,4,-41,12,-39,-15v-5,-16,39,-18,44,-20v4,-2,7,-10,10,-24v19,-3,23,6,28,20",w:145},"∙":{d:"57,-77v6,18,-7,21,-19,23v-34,6,-25,-40,-9,-43v18,-3,29,8,28,20",w:67},"‚":{d:"25,63v-26,21,-48,-2,-22,-24v14,-12,35,-40,35,-69v3,-2,3,-11,12,-9v35,17,5,88,-25,102",w:97},"„":{d:"25,63v-26,21,-48,-2,-22,-24v11,-9,36,-41,35,-69v3,-2,4,-12,12,-9v36,14,5,89,-25,102xm84,64v-24,20,-45,-1,-21,-24v21,-20,32,-35,35,-69v3,-2,3,-11,12,-9v36,17,9,86,-26,102",w:135},"‰":{d:"398,-131v58,-1,87,13,72,65v-1,30,-66,63,-99,65v-56,3,-99,-58,-62,-102v2,2,5,2,8,2v20,-16,51,-17,81,-30xm202,-279v33,0,94,-24,95,18v-7,31,-33,27,-54,55v-36,32,-71,74,-112,99v-18,18,-40,34,-51,58v-19,14,-25,37,-56,40v-17,2,-25,-29,-10,-40v15,-11,40,-37,52,-52r87,-72v-51,13,-100,6,-116,-27v1,-5,-6,-30,-9,-36v-3,-5,22,-41,27,-39v29,2,16,34,5,49v0,15,14,23,42,23v42,0,59,-31,28,-38v-17,-4,-53,3,-50,-23v0,-7,1,-12,4,-16v16,-9,36,4,49,5v0,0,23,-4,69,-4xm222,-118v33,-2,55,18,50,57v-29,36,-48,45,-96,50v-27,-5,-56,-17,-58,-51v13,-37,64,-43,104,-56xm335,-61v13,44,101,7,108,-31v-11,-3,-20,-4,-30,-4v-18,-1,-82,18,-78,35xm225,-244v-18,0,-29,-1,-46,3v7,15,6,28,0,43v15,-14,34,-30,46,-46xm164,-53v26,5,59,-10,76,-26v-17,-16,-49,2,-67,14v1,8,-8,6,-9,12",w:485},"Â":{d:"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm202,-219v-27,-6,-40,-26,-61,-37v-21,7,-39,46,-65,23v-2,-4,-3,-10,-4,-14v19,-4,43,-32,61,-43v27,6,40,22,62,37v12,8,18,17,18,25v0,6,-3,9,-11,9"},"Ê":{d:"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-16,41,-16,51v55,-1,111,-21,168,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-4,-19,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm199,-211v-27,-6,-39,-26,-60,-37v-21,7,-40,47,-65,22v-2,-7,-2,-7,-4,-13v18,-5,44,-31,61,-43v27,6,41,22,62,37v12,9,18,17,18,25v0,6,-4,9,-12,9",w:252},"Á":{d:"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm84,-250v31,-5,83,-53,100,-31v0,5,-11,15,-35,28v-16,5,-51,28,-53,25v-14,1,-16,-11,-12,-22"},"Ë":{d:"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-17,41,-17,51v55,0,112,-21,169,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-3,-21,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm191,-236v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm95,-261v7,3,29,9,28,18v0,7,-9,17,-18,17v-18,0,-26,-25,-10,-35",w:252},"È":{d:"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-16,41,-16,51v55,-1,111,-21,168,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-4,-19,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm184,-236v6,9,5,13,0,23v-28,-7,-62,-21,-100,-41v-3,-2,-3,-27,5,-23v34,11,60,25,95,41",w:252},"Í":{d:"26,-5v-9,-6,-9,-12,-9,-36v0,-71,7,-119,21,-144v8,-13,14,-20,19,-20v28,19,-7,89,-10,120v-2,21,-8,47,-14,76v-2,1,-2,0,-7,4xm6,-233v31,-6,83,-53,101,-31v2,11,-80,53,-89,53v-14,1,-14,-11,-12,-22",w:104},"Î":{d:"53,-9v-15,7,-16,-3,-16,-32v0,-71,7,-119,21,-144v8,-13,14,-20,19,-20v28,19,-7,89,-10,120v-2,21,-8,47,-14,76xm137,-209v-27,-6,-40,-26,-61,-37v-8,0,-9,4,-13,10v-11,13,-50,37,-56,0v18,-5,43,-32,61,-43v28,5,40,21,62,36v12,9,18,17,18,25v0,6,-4,9,-11,9",w:144},"Ï":{d:"33,-5v-9,-6,-9,-12,-9,-36v0,-71,8,-119,22,-144v8,-13,14,-20,19,-20v27,20,-11,87,-10,120r-15,76v-1,1,-4,2,-7,4xm111,-222v0,8,-4,12,-12,12v-18,0,-19,-19,-16,-33v18,-1,29,1,28,21xm15,-247v8,2,29,9,28,17v0,21,-37,24,-36,1v0,-7,2,-13,8,-18",w:110},"Ì":{d:"33,-5v-9,-6,-9,-12,-9,-36v0,-71,8,-119,22,-144v8,-13,14,-20,19,-20v27,20,-11,87,-10,120r-15,76v-1,1,-4,2,-7,4xm72,-247v7,6,55,15,36,40v-28,-7,-61,-21,-99,-41v-3,-2,-3,-27,5,-23v18,3,41,17,58,24",w:111},"Ó":{d:"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm142,-250v27,-11,47,-32,59,-14v2,11,-80,53,-89,53v-13,1,-15,-11,-12,-21v10,-5,24,-11,42,-18",w:273},"Ô":{d:"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm157,-282v17,18,52,34,54,63v-24,12,-52,-36,-53,-29r-42,34v-23,-4,-6,-31,5,-34v1,1,27,-37,36,-34",w:273},"":{d:"231,-188v31,-74,91,-99,188,-116v28,1,6,39,1,51v-20,52,-100,91,-148,126v2,4,6,7,12,10v42,-42,181,-41,166,46v-1,8,-19,8,-28,5v-43,1,-168,42,-106,86v15,16,33,28,61,39v0,10,0,17,-6,22v-8,8,-35,26,-78,51v-52,7,-128,22,-154,-17v-23,-35,-99,-35,-117,-77v-29,-68,25,-149,75,-175v44,-23,89,5,135,13v14,-26,2,-39,-1,-64",w:461},"Ò":{d:"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm161,-262v14,10,52,13,37,41v-28,-7,-62,-21,-100,-41v-3,-3,-3,-26,5,-24v16,5,42,17,58,24",w:273},"Ú":{d:"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-30,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm194,-265v3,-1,11,4,11,6v3,12,-81,52,-89,54v-14,0,-13,-9,-12,-22",w:262},"Û":{d:"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-30,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm150,-266v24,11,58,27,73,46v0,5,-3,6,-10,6v-28,2,-61,-30,-63,-25v-10,0,-57,40,-69,23v3,-10,-8,-15,8,-19v17,-1,34,-29,61,-31",w:262},"Ù":{d:"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-30,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm151,-243v14,10,54,14,37,41v-28,-7,-61,-22,-99,-42v-3,-2,-4,-25,4,-23v16,5,42,17,58,24",w:262},"ı":{d:"43,-103v21,4,16,56,11,100v-7,2,-11,1,-20,-5v0,-7,-13,-18,-11,-25v4,-23,-3,-68,20,-70",w:80},"ˆ":{d:"144,-220v-29,0,-41,-27,-63,-39v-8,0,-11,5,-15,11v-17,12,-32,31,-54,13v-2,-5,-3,-9,-4,-14v20,-5,45,-33,64,-45v28,6,43,23,65,38v12,9,19,19,19,27v0,6,-4,9,-12,9",w:165},"˜":{d:"47,-300v26,-21,57,19,72,23v4,0,16,-5,36,-14v24,-10,22,-16,32,-13v3,12,-7,11,-7,23v-27,21,-48,32,-62,32v-3,2,-52,-27,-51,-31v-12,-2,-34,40,-54,33v-4,-13,-8,-18,1,-24v5,-7,16,-15,33,-29",w:186},"¯":{d:"63,-295v28,-7,73,10,105,7v11,1,6,8,5,19v-37,21,-72,11,-136,11v-23,0,-31,-14,-27,-36v12,-15,40,0,53,-1",w:183},"˘":{d:"65,-269v20,-11,45,-31,74,-36v20,30,-42,40,-59,66v-5,6,-11,8,-18,8v-8,-3,-45,-32,-51,-54v5,-24,14,-13,34,1",w:158},"˙":{d:"23,-302v15,-13,32,1,32,18v1,22,-36,29,-39,4v0,0,3,-7,7,-22",w:70},"˚":{d:"23,-225v-43,-24,-11,-85,41,-78v16,2,31,4,46,17v32,54,-41,86,-87,61xm33,-257v2,20,57,11,57,-6v0,-6,-11,-9,-33,-12v-14,-2,-24,13,-24,18",w:123},"¸":{d:"74,16v32,2,49,14,55,36v-3,7,-14,31,-29,33v-28,4,-57,11,-88,14v-19,-6,-13,-31,8,-33v20,-1,59,-5,73,-14v-17,-14,-68,8,-53,-37v9,-10,2,-28,24,-30v8,8,13,17,10,31",w:129},"˝":{d:"91,-249v15,-11,38,-53,57,-29v0,9,0,14,-3,23v-2,3,-20,22,-54,55v-5,5,-10,8,-16,8v-17,2,-6,-22,-7,-31v-1,0,-2,0,-4,1v-17,21,-29,31,-50,27v-5,-18,-3,-15,3,-27v23,-27,40,-46,48,-59v7,-12,31,3,29,9v-1,14,-3,24,-13,31v4,4,9,-1,10,-8",w:151},"˛":{d:"82,-5v-8,12,-16,55,-21,75v0,4,2,7,7,7v6,0,22,-7,50,-20v8,0,12,7,12,20v-2,22,-6,14,-27,30v-15,12,-26,16,-30,16v-47,-8,-59,-14,-56,-75v8,-27,12,-54,25,-77v19,-21,35,15,40,24",w:138},"ˇ":{d:"39,-286v33,46,63,-4,96,-16v6,0,9,6,9,19v0,24,-49,46,-77,46v-32,0,-52,-28,-59,-48v0,-25,23,-17,31,-1",w:153},"\r":{w:179}}}),function(){"use strict"; +function AssertException(message){this.message=message}function assert(exp,message){if(!exp)throw new AssertException(message)}function getCenterX(box){return box.x+box.width/2}function getCenterY(box){return box.y+box.height/2}var DIAGRAM_MARGIN=10,ACTOR_MARGIN=10,ACTOR_PADDING=10,SIGNAL_MARGIN=5,SIGNAL_PADDING=5,NOTE_MARGIN=10,NOTE_PADDING=5,NOTE_OVERLAP=15,TITLE_MARGIN=0,TITLE_PADDING=5,SELF_SIGNAL_WIDTH=20,PLACEMENT=Diagram.PLACEMENT,LINETYPE=Diagram.LINETYPE,ARROWTYPE=Diagram.ARROWTYPE,LINE={stroke:"#000","stroke-width":2},RECT={fill:"#fff"};AssertException.prototype.toString=function(){return"AssertException: "+this.message},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),Raphael.fn.line=function(x1,y1,x2,y2){return assert(_.all([x1,x2,y1,y2],_.isFinite),"x1,x2,y1,y2 must be numeric"),this.path("M{0},{1} L{2},{3}",x1,y1,x2,y2)},Raphael.fn.wobble=function(x1,y1,x2,y2){assert(_.all([x1,x2,y1,y2],_.isFinite),"x1,x2,y1,y2 must be numeric");var wobble=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))/25,r1=Math.random(),r2=Math.random(),xfactor=Math.random()>.5?wobble:-wobble,yfactor=Math.random()>.5?wobble:-wobble,p1={x:(x2-x1)*r1+x1+xfactor,y:(y2-y1)*r1+y1+yfactor},p2={x:(x2-x1)*r2+x1-xfactor,y:(y2-y1)*r2+y1-yfactor};return"C"+p1.x+","+p1.y+" "+p2.x+","+p2.y+" "+x2+","+y2},Raphael.fn.text_bbox=function(text,font){var p;font._obj?p=this.print_center(0,0,text,font._obj,font["font-size"]):(p=this.text(0,0,text),p.attr(font));var bb=p.getBBox();return p.remove(),bb},Raphael.fn.handRect=function(x,y,w,h){return assert(_.all([x,y,w,h],_.isFinite),"x, y, w, h must be numeric"),this.path("M"+x+","+y+this.wobble(x,y,x+w,y)+this.wobble(x+w,y,x+w,y+h)+this.wobble(x+w,y+h,x,y+h)+this.wobble(x,y+h,x,y)).attr(RECT)},Raphael.fn.handLine=function(x1,y1,x2,y2){return assert(_.all([x1,x2,y1,y2],_.isFinite),"x1,x2,y1,y2 must be numeric"),this.path("M"+x1+","+y1+this.wobble(x1,y1,x2,y2))},Raphael.fn.print_center=function(x,y,string,font,size,letter_spacing){var path=this.print(x,y,string,font,size,"baseline",letter_spacing),bb=path.getBBox(),dx=x-bb.x-bb.width/2,dy=y-bb.y-bb.height/2,m=new Raphael.matrix;return m.translate(dx,dy),path.attr("path",Raphael.mapPath(path.attr("path"),m))};var BaseTheme=function(diagram){this.init(diagram)};_.extend(BaseTheme.prototype,{init:function(diagram){this.diagram=diagram,this._paper=void 0,this._font=void 0,this._title=void 0,this._actors_height=0,this._signals_height=0;var a=this.arrow_types={};a[ARROWTYPE.FILLED]="block",a[ARROWTYPE.OPEN]="open";var l=this.line_types={};l[LINETYPE.SOLID]="",l[LINETYPE.DOTTED]="-"},init_paper:function(container){this._paper=new Raphael(container,320,200)},init_font:function(){},draw_line:function(x1,y1,x2,y2){return this._paper.line(x1,y1,x2,y2)},draw_rect:function(x,y,w,h){return this._paper.rect(x,y,w,h)},draw:function(container){var diagram=this.diagram;this.init_paper(container),this.init_font(),this.layout();var title_height=this._title?this._title.height:0;this._paper.setStart(),this._paper.setSize(diagram.width,diagram.height);var y=DIAGRAM_MARGIN+title_height;this.draw_title(),this.draw_actors(y),this.draw_signals(y+this._actors_height),this._paper.setFinish()},layout:function(){function actor_ensure_distance(a,b,d){assert(b>a,"a must be less than or equal to b"),0>a?(b=actors[b],b.x=Math.max(d-b.width/2,b.x)):b>=actors.length?(a=actors[a],a.padding_right=Math.max(d,a.padding_right)):(a=actors[a],a.distances[b]=Math.max(d,a.distances[b]?a.distances[b]:0))}var diagram=this.diagram,paper=this._paper,font=this._font,actors=diagram.actors,signals=diagram.signals;if(diagram.width=0,diagram.height=0,diagram.title){var title=this._title={},bb=paper.text_bbox(diagram.title,font);title.text_bb=bb,title.message=diagram.title,title.width=bb.width+2*(TITLE_PADDING+TITLE_MARGIN),title.height=bb.height+2*(TITLE_PADDING+TITLE_MARGIN),title.x=DIAGRAM_MARGIN,title.y=DIAGRAM_MARGIN,diagram.width+=title.width,diagram.height+=title.height}_.each(actors,function(a){var bb=paper.text_bbox(a.name,font);a.text_bb=bb,a.x=0,a.y=0,a.width=bb.width+2*(ACTOR_PADDING+ACTOR_MARGIN),a.height=bb.height+2*(ACTOR_PADDING+ACTOR_MARGIN),a.distances=[],a.padding_right=0,this._actors_height=Math.max(a.height,this._actors_height)},this),_.each(signals,function(s){var a,b,bb=paper.text_bbox(s.message,font);s.text_bb=bb,s.width=bb.width,s.height=bb.height;var extra_width=0;if("Signal"==s.type)s.width+=2*(SIGNAL_MARGIN+SIGNAL_PADDING),s.height+=2*(SIGNAL_MARGIN+SIGNAL_PADDING),s.isSelf()?(a=s.actorA.index,b=a+1,s.width+=SELF_SIGNAL_WIDTH):(a=Math.min(s.actorA.index,s.actorB.index),b=Math.max(s.actorA.index,s.actorB.index));else{if("Note"!=s.type)throw new Error("Unhandled signal type:"+s.type);if(s.width+=2*(NOTE_MARGIN+NOTE_PADDING),s.height+=2*(NOTE_MARGIN+NOTE_PADDING),extra_width=2*ACTOR_MARGIN,s.placement==PLACEMENT.LEFTOF)b=s.actor.index,a=b-1;else if(s.placement==PLACEMENT.RIGHTOF)a=s.actor.index,b=a+1;else if(s.placement==PLACEMENT.OVER&&s.hasManyActors())a=Math.min(s.actor[0].index,s.actor[1].index),b=Math.max(s.actor[0].index,s.actor[1].index),extra_width=-(2*NOTE_PADDING+2*NOTE_OVERLAP);else if(s.placement==PLACEMENT.OVER)return a=s.actor.index,actor_ensure_distance(a-1,a,s.width/2),actor_ensure_distance(a,a+1,s.width/2),this._signals_height+=s.height,void 0}actor_ensure_distance(a,b,s.width+extra_width),this._signals_height+=s.height},this);var actors_x=0;return _.each(actors,function(a){a.x=Math.max(actors_x,a.x),_.each(a.distances,function(distance,b){"undefined"!=typeof distance&&(b=actors[b],distance=Math.max(distance,a.width/2,b.width/2),b.x=Math.max(b.x,a.x+a.width/2+distance-b.width/2))}),actors_x=a.x+a.width+a.padding_right},this),diagram.width=Math.max(actors_x,diagram.width),diagram.width+=2*DIAGRAM_MARGIN,diagram.height+=2*DIAGRAM_MARGIN+2*this._actors_height+this._signals_height,this},draw_title:function(){var title=this._title;title&&this.draw_text_box(title,title.message,TITLE_MARGIN,TITLE_PADDING,this._font)},draw_actors:function(offsetY){var y=offsetY;_.each(this.diagram.actors,function(a){this.draw_actor(a,y,this._actors_height),this.draw_actor(a,y+this._actors_height+this._signals_height,this._actors_height);var aX=getCenterX(a),line=this.draw_line(aX,y+this._actors_height-ACTOR_MARGIN,aX,y+this._actors_height+ACTOR_MARGIN+this._signals_height);line.attr(LINE)},this)},draw_actor:function(actor,offsetY,height){actor.y=offsetY,actor.height=height,this.draw_text_box(actor,actor.name,ACTOR_MARGIN,ACTOR_PADDING,this._font)},draw_signals:function(offsetY){var y=offsetY;_.each(this.diagram.signals,function(s){"Signal"==s.type?s.isSelf()?this.draw_self_signal(s,y):this.draw_signal(s,y):"Note"==s.type&&this.draw_note(s,y),y+=s.height},this)},draw_self_signal:function(signal,offsetY){assert(signal.isSelf(),"signal must be a self signal");var text_bb=signal.text_bb,aX=getCenterX(signal.actorA),x=aX+SELF_SIGNAL_WIDTH+SIGNAL_PADDING-text_bb.x,y=offsetY+signal.height/2;this.draw_text(x,y,signal.message,this._font);var line,attr=_.extend({},LINE,{"stroke-dasharray":this.line_types[signal.linetype]}),y1=offsetY+SIGNAL_MARGIN,y2=y1+signal.height-SIGNAL_MARGIN;line=this.draw_line(aX,y1,aX+SELF_SIGNAL_WIDTH,y1),line.attr(attr),line=this.draw_line(aX+SELF_SIGNAL_WIDTH,y1,aX+SELF_SIGNAL_WIDTH,y2),line.attr(attr),line=this.draw_line(aX+SELF_SIGNAL_WIDTH,y2,aX,y2),attr["arrow-end"]=this.arrow_types[signal.arrowtype]+"-wide-long",line.attr(attr)},draw_signal:function(signal,offsetY){var aX=getCenterX(signal.actorA),bX=getCenterX(signal.actorB),x=(bX-aX)/2+aX,y=offsetY+SIGNAL_MARGIN+2*SIGNAL_PADDING;this.draw_text(x,y,signal.message,this._font),y=offsetY+signal.height-SIGNAL_MARGIN-SIGNAL_PADDING;var line=this.draw_line(aX,y,bX,y);line.attr(LINE),line.attr({"arrow-end":this.arrow_types[signal.arrowtype]+"-wide-long","stroke-dasharray":this.line_types[signal.linetype]})},draw_note:function(note,offsetY){note.y=offsetY;var actorA=note.hasManyActors()?note.actor[0]:note.actor,aX=getCenterX(actorA);switch(note.placement){case PLACEMENT.RIGHTOF:note.x=aX+ACTOR_MARGIN;break;case PLACEMENT.LEFTOF:note.x=aX-ACTOR_MARGIN-note.width;break;case PLACEMENT.OVER:if(note.hasManyActors()){var bX=getCenterX(note.actor[1]),overlap=NOTE_OVERLAP+NOTE_PADDING;note.x=aX-overlap,note.width=bX+overlap-note.x}else note.x=aX-note.width/2;break;default:throw new Error("Unhandled note placement:"+note.placement)}this.draw_text_box(note,note.message,NOTE_MARGIN,NOTE_PADDING,this._font)},draw_text:function(x,y,text,font){var t,paper=this._paper,f=font||{};f._obj?t=paper.print_center(x,y,text,f._obj,f["font-size"]):(t=paper.text(x,y,text),t.attr(f));var bb=t.getBBox(),r=paper.rect(bb.x,bb.y,bb.width,bb.height);r.attr({fill:"#fff",stroke:"none"}),t.toFront()},draw_text_box:function(box,text,margin,padding,font){var x=box.x+margin,y=box.y+margin,w=box.width-2*margin,h=box.height-2*margin,rect=this.draw_rect(x,y,w,h);rect.attr(LINE),x=getCenterX(box),y=getCenterY(box),this.draw_text(x,y,text,font)}});var RaphaëlTheme=function(diagram){this.init(diagram)};_.extend(RaphaëlTheme.prototype,BaseTheme.prototype,{init_font:function(){this._font={"font-size":16,"font-family":"Andale Mono, monospace"}}});var HandRaphaëlTheme=function(diagram){this.init(diagram)};_.extend(HandRaphaëlTheme.prototype,BaseTheme.prototype,{init_font:function(){this._font={"font-size":16,"font-family":"daniel"},this._font._obj=this._paper.getFont("daniel")},draw_line:function(x1,y1,x2,y2){return this._paper.handLine(x1,y1,x2,y2)},draw_rect:function(x,y,w,h){return this._paper.handRect(x,y,w,h)}});var themes={simple:RaphaëlTheme,hand:HandRaphaëlTheme};Diagram.prototype.drawSVG=function(container,options){var default_options={theme:"hand"};if(options=_.defaults(options||{},default_options),!(options.theme in themes))throw new Error("Unsupported theme: "+options.theme);var drawing=new themes[options.theme](this);drawing.draw(container)}}(); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/lib/underscore.min.js b/src/collectedstatic/mdeditor/js/lib/underscore.min.js new file mode 100644 index 0000000..447e19b --- /dev/null +++ b/src/collectedstatic/mdeditor/js/lib/underscore.min.js @@ -0,0 +1,5 @@ +// Underscore.js 1.8.2 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=d(e,i,4);var o=!w(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=b(r,e);for(var u=null!=t&&t.length,i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t){var r=S.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||o,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=S[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var e=this,u=e._,i=Array.prototype,o=Object.prototype,a=Function.prototype,c=i.push,l=i.slice,f=o.toString,s=o.hasOwnProperty,p=Array.isArray,h=Object.keys,v=a.bind,g=Object.create,y=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):e._=m,m.VERSION="1.8.2";var d=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},b=function(n,t,r){return null==n?m.identity:m.isFunction(n)?d(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return b(n,t,1/0)};var x=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var l=o[c];t&&r[l]!==void 0||(r[l]=i[l])}return r}},_=function(n){if(!m.isObject(n))return{};if(g)return g(n);y.prototype=n;var t=new y;return y.prototype=null,t},j=Math.pow(2,53)-1,w=function(n){var t=n&&n.length;return"number"==typeof t&&t>=0&&j>=t};m.each=m.forEach=function(n,t,r){t=d(t,r);var e,u;if(w(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=b(t,r);for(var e=!w(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=w(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=b(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(b(t)),r)},m.every=m.all=function(n,t,r){t=b(t,r);for(var e=!w(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=b(t,r);for(var e=!w(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r){return w(n)||(n=m.values(n)),m.indexOf(n,t,"number"==typeof r&&r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=w(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=b(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=w(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=b(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=w(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(w(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=b(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var A=function(n){return function(t,r,e){var u={};return r=b(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=A(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=A(function(n,t,r){n[r]=t}),m.countBy=A(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):w(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:w(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=b(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var k=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=n&&n.length;a>o;o++){var c=n[o];if(w(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=k(c,t,r));var l=0,f=c.length;for(u.length+=f;f>l;)u[i++]=c[l++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return k(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){if(null==n)return[];m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=b(r,e));for(var u=[],i=[],o=0,a=n.length;a>o;o++){var c=n[o],l=r?r(c,o,n):c;t?(o&&i===l||u.push(c),i=l):r?m.contains(i,l)||(i.push(l),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(k(arguments,!0,!0))},m.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=k(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,"length").length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=n&&n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.indexOf=function(n,t,r){var e=0,u=n&&n.length;if("number"==typeof r)e=0>r?Math.max(0,u+r):r;else if(r&&u)return e=m.sortedIndex(n,t),n[e]===t?e:-1;if(t!==t)return m.findIndex(l.call(n,e),m.isNaN);for(;u>e;e++)if(n[e]===t)return e;return-1},m.lastIndexOf=function(n,t,r){var e=n?n.length:0;if("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1)),t!==t)return m.findLastIndex(l.call(n,0,e),m.isNaN);for(;--e>=0;)if(n[e]===t)return e;return-1},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=b(r,e,1);for(var u=r(t),i=0,o=n.length;o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var O=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=_(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(v&&n.bind===v)return v.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return O(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var l=m.now();a||r.leading!==!1||(a=l);var f=t-(l-a);return e=this,u=arguments,0>=f||f>t?(o&&(clearTimeout(o),o=null),a=l,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,f)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var l=m.now()-o;t>l&&l>=0?e=setTimeout(c,t-l):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var F=!{toString:null}.propertyIsEnumerable("toString"),S=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(h)return h(n);var t=[];for(var e in n)m.has(n,e)&&t.push(e);return F&&r(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var e in n)t.push(e);return F&&r(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=b(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=x(m.allKeys),m.extendOwn=m.assign=x(m.keys),m.findKey=function(n,t,r){t=b(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=d(t,r)):(u=k(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var l=u[a],f=o[l];e(f,l,o)&&(i[l]=f)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(k(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=x(m.allKeys,!0),m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var E=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=f.call(n);if(u!==f.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!E(n[c],t[c],r,e))return!1}else{var l,s=m.keys(n);if(c=s.length,m.keys(t).length!==c)return!1;for(;c--;)if(l=s[c],!m.has(t,l)||!E(n[l],t[l],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return E(n,t)},m.isEmpty=function(n){return null==n?!0:w(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=p||function(n){return"[object Array]"===f.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return f.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===f.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&s.call(n,t)},m.noConflict=function(){return e._=u,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=function(n){return function(t){return null==t?void 0:t[n]}},m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=d(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var M={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},N=m.invert(M),I=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=I(M),m.unescape=I(N),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var B=0;m.uniqueId=function(n){var t=++B+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var T=/(.)^/,R={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},q=/\\|'|\r|\n|\u2028|\u2029/g,K=function(n){return"\\"+R[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||T).source,(t.interpolate||T).source,(t.evaluate||T).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(q,K),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},l=t.variable||"obj";return c.source="function("+l+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var z=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return c.apply(n,arguments),z(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=i[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],z(this,r)}}),m.each(["concat","join","slice"],function(n){var t=i[n];m.prototype[n]=function(){return z(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/plugins/code-block-dialog/code-block-dialog.js b/src/collectedstatic/mdeditor/js/plugins/code-block-dialog/code-block-dialog.js new file mode 100644 index 0000000..cda5651 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/code-block-dialog/code-block-dialog.js @@ -0,0 +1,237 @@ +/*! + * Code block dialog plugin for Editor.md + * + * @file code-block-dialog.js + * @author pandao + * @version 1.2.0 + * @updateTime 2015-03-07 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + var cmEditor; + var pluginName = "code-block-dialog"; + + // for CodeBlock dialog select + var codeLanguages = exports.codeLanguages = { + asp : ["ASP", "vbscript"], + actionscript : ["ActionScript(3.0)/Flash/Flex", "clike"], + bash : ["Bash/Bat", "shell"], + css : ["CSS", "css"], + c : ["C", "clike"], + cpp : ["C++", "clike"], + csharp : ["C#", "clike"], + coffeescript : ["CoffeeScript", "coffeescript"], + d : ["D", "d"], + dart : ["Dart", "dart"], + delphi : ["Delphi/Pascal", "pascal"], + erlang : ["Erlang", "erlang"], + go : ["Golang", "go"], + groovy : ["Groovy", "groovy"], + html : ["HTML", "text/html"], + java : ["Java", "clike"], + json : ["JSON", "text/json"], + javascript : ["Javascript", "javascript"], + lua : ["Lua", "lua"], + less : ["LESS", "css"], + markdown : ["Markdown", "gfm"], + "objective-c" : ["Objective-C", "clike"], + php : ["PHP", "php"], + perl : ["Perl", "perl"], + python : ["Python", "python"], + r : ["R", "r"], + rst : ["reStructedText", "rst"], + ruby : ["Ruby", "ruby"], + sql : ["SQL", "sql"], + sass : ["SASS/SCSS", "sass"], + shell : ["Shell", "shell"], + scala : ["Scala", "clike"], + swift : ["Swift", "clike"], + vb : ["VB/VBScript", "vb"], + xml : ["XML", "text/xml"], + yaml : ["YAML", "yaml"] + }; + + exports.fn.codeBlockDialog = function() { + + var _this = this; + var cm = this.cm; + var lang = this.lang; + var editor = this.editor; + var settings = this.settings; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var classPrefix = this.classPrefix; + var dialogName = classPrefix + pluginName, dialog; + var dialogLang = lang.dialog.codeBlock; + + cm.focus(); + + if (editor.find("." + dialogName).length > 0) + { + dialog = editor.find("." + dialogName); + dialog.find("option:first").attr("selected", "selected"); + dialog.find("textarea").val(selection); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + } + else + { + var dialogHTML = "
    " + + dialogLang.selectLabel + "" + + "
    " + + ""; + + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 780, + height : 565, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + content : dialogHTML, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + var codeTexts = this.find("textarea").val(); + var langName = this.find("select").val(); + + if (langName === "") + { + alert(lang.dialog.codeBlock.unselectedLanguageAlert); + return false; + } + + if (codeTexts === "") + { + alert(lang.dialog.codeBlock.codeEmptyAlert); + return false; + } + + langName = (langName === "other") ? "" : langName; + + cm.replaceSelection(["```" + langName, codeTexts, "```"].join("\n")); + + if (langName === "") { + cm.setCursor(cursor.line, cursor.ch + 3); + } + + this.hide().lockScreen(false).hideMask(); + + return false; + }], + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + var langSelect = dialog.find("select"); + + if (langSelect.find("option").length === 1) + { + for (var key in codeLanguages) + { + var codeLang = codeLanguages[key]; + langSelect.append(""); + } + + langSelect.append(""); + } + + var mode = langSelect.find("option:selected").attr("mode"); + + var cmConfig = { + mode : (mode) ? mode : "text/html", + theme : settings.theme, + tabSize : 4, + autofocus : true, + autoCloseTags : true, + indentUnit : 4, + lineNumbers : true, + lineWrapping : true, + extraKeys : {"Ctrl-Q": function(cm){ cm.foldCode(cm.getCursor()); }}, + foldGutter : true, + gutters : ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + matchBrackets : true, + indentWithTabs : true, + styleActiveLine : true, + styleSelectedText : true, + autoCloseBrackets : true, + showTrailingSpace : true, + highlightSelectionMatches : true + }; + + var textarea = dialog.find("textarea"); + var cmObj = dialog.find(".CodeMirror"); + + if (dialog.find(".CodeMirror").length < 1) + { + cmEditor = exports.$CodeMirror.fromTextArea(textarea[0], cmConfig); + cmObj = dialog.find(".CodeMirror"); + + cmObj.css({ + "float" : "none", + margin : "8px 0", + border : "1px solid #ddd", + fontSize : settings.fontSize, + width : "100%", + height : "390px" + }); + + cmEditor.on("change", function(cm) { + textarea.val(cm.getValue()); + }); + } + else + { + + cmEditor.setValue(cm.getSelection()); + } + + langSelect.change(function(){ + var _mode = $(this).find("option:selected").attr("mode"); + cmEditor.setOption("mode", _mode); + }); + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji-dialog.js b/src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji-dialog.js new file mode 100644 index 0000000..32d960d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji-dialog.js @@ -0,0 +1,337 @@ +/*! + * Emoji dialog plugin for Editor.md + * + * @file emoji-dialog.js + * @author pandao + * @version 1.2.0 + * @updateTime 2015-03-08 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var $ = jQuery; + var pluginName = "emoji-dialog"; + var emojiTabIndex = 0; + var emojiData = []; + var selecteds = []; + + var logoPrefix = "editormd-logo"; + var logos = [ + logoPrefix, + logoPrefix + "-1x", + logoPrefix + "-2x", + logoPrefix + "-3x", + logoPrefix + "-4x", + logoPrefix + "-5x", + logoPrefix + "-6x", + logoPrefix + "-7x", + logoPrefix + "-8x" + ]; + + var langs = { + "zh-cn" : { + toolbar : { + emoji : "Emoji 表情" + }, + dialog : { + emoji : { + title : "Emoji 表情" + } + } + }, + "zh-tw" : { + toolbar : { + emoji : "Emoji 表情" + }, + dialog : { + emoji : { + title : "Emoji 表情" + } + } + }, + "en" : { + toolbar : { + emoji : "Emoji" + }, + dialog : { + emoji : { + title : "Emoji" + } + } + }, + "de" : { + toolbar : { + emoji : "Emoji" + }, + dialog : { + emoji : { + title : "Emoji" + } + } + } + }; + + exports.fn.emojiDialog = function() { + var _this = this; + var cm = this.cm; + var settings = _this.settings; + + if (!settings.emoji) + { + alert("settings.emoji == false"); + return ; + } + + var path = settings.pluginPath + pluginName + "/"; + var editor = this.editor; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var classPrefix = this.classPrefix; + + $.extend(true, this.lang, langs[this.lang.name]); + this.setToolbar(); + + var lang = this.lang; + var dialogName = classPrefix + pluginName, dialog; + var dialogLang = lang.dialog.emoji; + + var dialogContent = [ + "
    ", + "
    ", + "
    ", + ].join("\n"); + + cm.focus(); + + if (editor.find("." + dialogName).length > 0) + { + dialog = editor.find("." + dialogName); + + selecteds = []; + dialog.find("a").removeClass("selected"); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + } + else + { + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 800, + height : 475, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + content : dialogContent, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + cm.replaceSelection(selecteds.join(" ")); + this.hide().lockScreen(false).hideMask(); + + return false; + }], + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + var category = ["Github emoji", "Twemoji", "Font awesome", "Editor.md logo"]; + var tab = dialog.find("." + classPrefix + "tab"); + + if (tab.html() === "") + { + var head = "
    "; + + tab.append(head); + + var container = "
    "; + + for (var x = 0; x < 4; x++) + { + var display = (x === 0) ? "" : "display:none;"; + container += "
    "; + } + + container += "
    "; + + tab.append(container); + } + + var tabBoxs = tab.find("." + classPrefix + "tab-box"); + var emojiCategories = ["github-emoji", "twemoji", "font-awesome", logoPrefix]; + + var drawTable = function() { + var cname = emojiCategories[emojiTabIndex]; + var $data = emojiData[cname]; + var $tab = tabBoxs.eq(emojiTabIndex); + + if ($tab.html() !== "") { + //console.log("break =>", cname); + return ; + } + + var pagination = function(data, type) { + var rowNumber = (type === "editormd-logo") ? "5" : 20; + var pageTotal = Math.ceil(data.length / rowNumber); + var table = "
    "; + + for (var i = 0; i < pageTotal; i++) + { + var row = "
    "; + + for (var x = 0; x < rowNumber; x++) + { + var emoji = $.trim(data[(i * rowNumber) + x]); + + if (typeof emoji !== "undefined" && emoji !== "") + { + var img = "", icon = ""; + + if (type === "github-emoji") + { + var src = (emoji === "+1") ? "plus1" : emoji; + src = (src === "black_large_square") ? "black_square" : src; + src = (src === "moon") ? "waxing_gibbous_moon" : src; + + src = exports.emoji.path + src + exports.emoji.ext; + img = "\":""; + row += "" + img + ""; + } + else if (type === "twemoji") + { + var twemojiSrc = exports.twemoji.path + emoji + exports.twemoji.ext; + img = "\"twemoji-""; + row += "" + img + ""; + } + else if (type === "font-awesome") + { + icon = ""; + row += "" + icon + ""; + } + else if (type === "editormd-logo") + { + icon = ""; + row += "" + icon + ""; + } + } + else + { + row += ""; + } + } + + row += "
    "; + + table += row; + } + + table += "
    "; + + return table; + }; + + if (emojiTabIndex === 0) + { + for (var i = 0, len = $data.length; i < len; i++) + { + var h4Style = (i === 0) ? " style=\"margin: 0 0 10px;\"" : " style=\"margin: 10px 0;\""; + $tab.append("" + $data[i].category + ""); + $tab.append(pagination($data[i].list, cname)); + } + } + else + { + $tab.append(pagination($data, cname)); + } + + $tab.find("." + classPrefix + "emoji-btn").bind(exports.mouseOrTouch("click", "touchend"), function() { + $(this).toggleClass("selected"); + + if ($(this).hasClass("selected")) + { + selecteds.push($(this).attr("value")); + } + }); + }; + + if (emojiData.length < 1) + { + if (typeof dialog.loading === "function") { + dialog.loading(true); + } + + $.getJSON(path + "emoji.json?temp=" + Math.random(), function(json) { + + if (typeof dialog.loading === "function") { + dialog.loading(false); + } + + emojiData = json; + emojiData[logoPrefix] = logos; + drawTable(); + }); + } + else + { + drawTable(); + } + + tab.find("li").bind(exports.mouseOrTouch("click", "touchend"), function() { + var $this = $(this); + emojiTabIndex = $this.index(); + + $this.addClass("active").siblings().removeClass("active"); + tabBoxs.eq(emojiTabIndex).show().siblings().hide(); + drawTable(); + }); + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji.json b/src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji.json new file mode 100644 index 0000000..46d8473 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/emoji-dialog/emoji.json @@ -0,0 +1,28 @@ +{ + "github-emoji" : [ + { + "category" :"People", + "list" : ["bowtie","smile","laughing","blush","smiley","relaxed","smirk","heart_eyes","kissing_heart","kissing_closed_eyes","flushed","relieved","satisfied","grin","wink","stuck_out_tongue_winking_eye","stuck_out_tongue_closed_eyes","grinning","kissing","kissing_smiling_eyes","stuck_out_tongue","sleeping","worried","frowning","anguished","open_mouth","grimacing","confused","hushed","expressionless","unamused","sweat_smile","sweat","disappointed_relieved","weary","pensive","disappointed","confounded","fearful","cold_sweat","persevere","cry","sob","joy","astonished","scream","neckbeard","tired_face","angry","rage","triumph","sleepy","yum","mask","sunglasses","dizzy_face","imp","smiling_imp","neutral_face","no_mouth","innocent","alien","yellow_heart","blue_heart","purple_heart","heart","green_heart","broken_heart","heartbeat","heartpulse","two_hearts","revolving_hearts","cupid","sparkling_heart","sparkles","star","star2","dizzy","boom","collision","anger","exclamation","question","grey_exclamation","grey_question","zzz","dash","sweat_drops","notes","musical_note","fire","hankey","poop","shit","+1","thumbsup","-1","thumbsdown","ok_hand","punch","facepunch","fist","v","wave","hand","raised_hand","open_hands","point_up","point_down","point_left","point_right","raised_hands","pray","point_up_2","clap","muscle","metal","fu","walking","runner","running","couple","family","two_men_holding_hands","two_women_holding_hands","dancer","dancers","ok_woman","no_good","information_desk_person","raising_hand","bride_with_veil","person_with_pouting_face","person_frowning","bow","couplekiss","couple_with_heart","massage","haircut","nail_care","boy","girl","woman","man","baby","older_woman","older_man","person_with_blond_hair","man_with_gua_pi_mao","man_with_turban","construction_worker","cop","angel","princess","smiley_cat","smile_cat","heart_eyes_cat","kissing_cat","smirk_cat","scream_cat","crying_cat_face","joy_cat","pouting_cat","japanese_ogre","japanese_goblin","see_no_evil","hear_no_evil","speak_no_evil","guardsman","skull","feet","lips","kiss","droplet","ear","eyes","nose","tongue","love_letter","bust_in_silhouette","busts_in_silhouette","speech_balloon","thought_balloon","feelsgood","finnadie","goberserk","godmode","hurtrealbad","rage1","rage2","rage3","rage4","suspect","trollface"] + }, + { + "category" :"Nature", + "list" : ["sunny","umbrella","cloud","snowflake","snowman","zap","cyclone","foggy","ocean","cat","dog","mouse","hamster","rabbit","wolf","frog","tiger","koala","bear","pig","pig_nose","cow","boar","monkey_face","monkey","horse","racehorse","camel","sheep","elephant","panda_face","snake","bird","baby_chick","hatched_chick","hatching_chick","chicken","penguin","turtle","bug","honeybee","ant","beetle","snail","octopus","tropical_fish","fish","whale","whale2","dolphin","cow2","ram","rat","water_buffalo","tiger2","rabbit2","dragon","goat","rooster","dog2","pig2","mouse2","ox","dragon_face","blowfish","crocodile","dromedary_camel","leopard","cat2","poodle","paw_prints","bouquet","cherry_blossom","tulip","four_leaf_clover","rose","sunflower","hibiscus","maple_leaf","leaves","fallen_leaf","herb","mushroom","cactus","palm_tree","evergreen_tree","deciduous_tree","chestnut","seedling","blossom","ear_of_rice","shell","globe_with_meridians","sun_with_face","full_moon_with_face","new_moon_with_face","new_moon","waxing_crescent_moon","first_quarter_moon","waxing_gibbous_moon","full_moon","waning_gibbous_moon","last_quarter_moon","waning_crescent_moon","last_quarter_moon_with_face","first_quarter_moon_with_face","moon","earth_africa","earth_americas","earth_asia","volcano","milky_way","partly_sunny","octocat","squirrel"] + }, + { + "category" :"Objects", + "list" : ["bamboo","gift_heart","dolls","school_satchel","mortar_board","flags","fireworks","sparkler","wind_chime","rice_scene","jack_o_lantern","ghost","santa","christmas_tree","gift","bell","no_bell","tanabata_tree","tada","confetti_ball","balloon","crystal_ball","cd","dvd","floppy_disk","camera","video_camera","movie_camera","computer","tv","iphone","phone","telephone","telephone_receiver","pager","fax","minidisc","vhs","sound","speaker","mute","loudspeaker","mega","hourglass","hourglass_flowing_sand","alarm_clock","watch","radio","satellite","loop","mag","mag_right","unlock","lock","lock_with_ink_pen","closed_lock_with_key","key","bulb","flashlight","high_brightness","low_brightness","electric_plug","battery","calling","email","mailbox","postbox","bath","bathtub","shower","toilet","wrench","nut_and_bolt","hammer","seat","moneybag","yen","dollar","pound","euro","credit_card","money_with_wings","e-mail","inbox_tray","outbox_tray","envelope","incoming_envelope","postal_horn","mailbox_closed","mailbox_with_mail","mailbox_with_no_mail","package","door","smoking","bomb","gun","hocho","pill","syringe","page_facing_up","page_with_curl","bookmark_tabs","bar_chart","chart_with_upwards_trend","chart_with_downwards_trend","scroll","clipboard","calendar","date","card_index","file_folder","open_file_folder","scissors","pushpin","paperclip","black_nib","pencil2","straight_ruler","triangular_ruler","closed_book","green_book","blue_book","orange_book","notebook","notebook_with_decorative_cover","ledger","books","bookmark","name_badge","microscope","telescope","newspaper","football","basketball","soccer","baseball","tennis","8ball","rugby_football","bowling","golf","mountain_bicyclist","bicyclist","horse_racing","snowboarder","swimmer","surfer","ski","spades","hearts","clubs","diamonds","gem","ring","trophy","musical_score","musical_keyboard","violin","space_invader","video_game","black_joker","flower_playing_cards","game_die","dart","mahjong","clapper","memo","pencil","book","art","microphone","headphones","trumpet","saxophone","guitar","shoe","sandal","high_heel","lipstick","boot","shirt","tshirt","necktie","womans_clothes","dress","running_shirt_with_sash","jeans","kimono","bikini","ribbon","tophat","crown","womans_hat","mans_shoe","closed_umbrella","briefcase","handbag","pouch","purse","eyeglasses","fishing_pole_and_fish","coffee","tea","sake","baby_bottle","beer","beers","cocktail","tropical_drink","wine_glass","fork_and_knife","pizza","hamburger","fries","poultry_leg","meat_on_bone","spaghetti","curry","fried_shrimp","bento","sushi","fish_cake","rice_ball","rice_cracker","rice","ramen","stew","oden","dango","egg","bread","doughnut","custard","icecream","ice_cream","shaved_ice","birthday","cake","cookie","chocolate_bar","candy","lollipop","honey_pot","apple","green_apple","tangerine","lemon","cherries","grapes","watermelon","strawberry","peach","melon","banana","pear","pineapple","sweet_potato","eggplant","tomato","corn"] + }, + { + "category" :"Places", + "list" : ["house","house_with_garden","school","office","post_office","hospital","bank","convenience_store","love_hotel","hotel","wedding","church","department_store","european_post_office","city_sunrise","city_sunset","japanese_castle","european_castle","tent","factory","tokyo_tower","japan","mount_fuji","sunrise_over_mountains","sunrise","stars","statue_of_liberty","bridge_at_night","carousel_horse","rainbow","ferris_wheel","fountain","roller_coaster","ship","speedboat","boat","sailboat","rowboat","anchor","rocket","airplane","helicopter","steam_locomotive","tram","mountain_railway","bike","aerial_tramway","suspension_railway","mountain_cableway","tractor","blue_car","oncoming_automobile","car","red_car","taxi","oncoming_taxi","articulated_lorry","bus","oncoming_bus","rotating_light","police_car","oncoming_police_car","fire_engine","ambulance","minibus","truck","train","station","train2","bullettrain_front","bullettrain_side","light_rail","monorail","railway_car","trolleybus","ticket","fuelpump","vertical_traffic_light","traffic_light","warning","construction","beginner","atm","slot_machine","busstop","barber","hotsprings","checkered_flag","crossed_flags","izakaya_lantern","moyai","circus_tent","performing_arts","round_pushpin","triangular_flag_on_post","jp","kr","cn","us","fr","es","it","ru","gb","uk","de"] + }, + { + "category" :"Symbols", + "list" : ["one","two","three","four","five","six","seven","eight","nine","keycap_ten","1234","zero","hash","symbols","arrow_backward","arrow_down","arrow_forward","arrow_left","capital_abcd","abcd","abc","arrow_lower_left","arrow_lower_right","arrow_right","arrow_up","arrow_upper_left","arrow_upper_right","arrow_double_down","arrow_double_up","arrow_down_small","arrow_heading_down","arrow_heading_up","leftwards_arrow_with_hook","arrow_right_hook","left_right_arrow","arrow_up_down","arrow_up_small","arrows_clockwise","arrows_counterclockwise","rewind","fast_forward","information_source","ok","twisted_rightwards_arrows","repeat","repeat_one","new","top","up","cool","free","ng","cinema","koko","signal_strength","u5272","u5408","u55b6","u6307","u6708","u6709","u6e80","u7121","u7533","u7a7a","u7981","sa","restroom","mens","womens","baby_symbol","no_smoking","parking","wheelchair","metro","baggage_claim","accept","wc","potable_water","put_litter_in_its_place","secret","congratulations","m","passport_control","left_luggage","customs","ideograph_advantage","cl","sos","id","no_entry_sign","underage","no_mobile_phones","do_not_litter","non-potable_water","no_bicycles","no_pedestrians","children_crossing","no_entry","eight_spoked_asterisk","sparkle","eight_pointed_black_star","heart_decoration","vs","vibration_mode","mobile_phone_off","chart","currency_exchange","aries","taurus","gemini","cancer","leo","virgo","libra","scorpius","sagittarius","capricorn","aquarius","pisces","ophiuchus","six_pointed_star","negative_squared_cross_mark","a","b","ab","o2","diamond_shape_with_a_dot_inside","recycle","end","back","on","soon","clock1","clock130","clock10","clock1030","clock11","clock1130","clock12","clock1230","clock2","clock230","clock3","clock330","clock4","clock430","clock5","clock530","clock6","clock630","clock7","clock730","clock8","clock830","clock9","clock930","heavy_dollar_sign","copyright","registered","tm","x","heavy_exclamation_mark","bangbang","interrobang","o","heavy_multiplication_x","heavy_plus_sign","heavy_minus_sign","heavy_division_sign","white_flower","100","heavy_check_mark","ballot_box_with_check","radio_button","link","curly_loop","wavy_dash","part_alternation_mark","trident","black_small_square","white_small_square","black_medium_small_square","white_medium_small_square","black_medium_square","white_medium_square","black_large_square","white_large_square","white_check_mark","black_square_button","white_square_button","black_circle","white_circle","red_circle","large_blue_circle","large_blue_diamond","large_orange_diamond","small_blue_diamond","small_orange_diamond","small_red_triangle","small_red_triangle_down","shipit"] + } + ], + + "twemoji" : ["1f004","1f0cf","1f170","1f171","1f17e","1f17f","1f18e","1f191","1f192","1f193","1f194","1f195","1f196","1f197","1f198","1f199","1f19a","1f1e6","1f1e7","1f1e8-1f1f3","1f1e8","1f1e9-1f1ea","1f1e9","1f1ea-1f1f8","1f1ea","1f1eb-1f1f7","1f1eb","1f1ec-1f1e7","1f1ec","1f1ed","1f1ee-1f1f9","1f1ee","1f1ef-1f1f5","1f1ef","1f1f0-1f1f7","1f1f0","1f1f1","1f1f2","1f1f3","1f1f4","1f1f5","1f1f6","1f1f7-1f1fa","1f1f7","1f1f8","1f1f9","1f1fa-1f1f8","1f1fa","1f1fb","1f1fc","1f1fd","1f1fe","1f1ff","1f201","1f202","1f21a","1f22f","1f232","1f233","1f234","1f235","1f236","1f237","1f238","1f239","1f23a","1f250","1f251","1f300","1f301","1f302","1f303","1f304","1f305","1f306","1f307","1f308","1f309","1f30a","1f30b","1f30c","1f30d","1f30e","1f30f","1f310","1f311","1f312","1f313","1f314","1f315","1f316","1f317","1f318","1f319","1f31a","1f31b","1f31c","1f31d","1f31e","1f31f","1f320","1f330","1f331","1f332","1f333","1f334","1f335","1f337","1f338","1f339","1f33a","1f33b","1f33c","1f33d","1f33e","1f33f","1f340","1f341","1f342","1f343","1f344","1f345","1f346","1f347","1f348","1f349","1f34a","1f34b","1f34c","1f34d","1f34e","1f34f","1f350","1f351","1f352","1f353","1f354","1f355","1f356","1f357","1f358","1f359","1f35a","1f35b","1f35c","1f35d","1f35e","1f35f","1f360","1f361","1f362","1f363","1f364","1f365","1f366","1f367","1f368","1f369","1f36a","1f36b","1f36c","1f36d","1f36e","1f36f","1f370","1f371","1f372","1f373","1f374","1f375","1f376","1f377","1f378","1f379","1f37a","1f37b","1f37c","1f380","1f381","1f382","1f383","1f384","1f385","1f386","1f387","1f388","1f389","1f38a","1f38b","1f38c","1f38d","1f38e","1f38f","1f390","1f391","1f392","1f393","1f3a0","1f3a1","1f3a2","1f3a3","1f3a4","1f3a5","1f3a6","1f3a7","1f3a8","1f3a9","1f3aa","1f3ab","1f3ac","1f3ad","1f3ae","1f3af","1f3b0","1f3b1","1f3b2","1f3b3","1f3b4","1f3b5","1f3b6","1f3b7","1f3b8","1f3b9","1f3ba","1f3bb","1f3bc","1f3bd","1f3be","1f3bf","1f3c0","1f3c1","1f3c2","1f3c3","1f3c4","1f3c6","1f3c7","1f3c8","1f3c9","1f3ca","1f3e0","1f3e1","1f3e2","1f3e3","1f3e4","1f3e5","1f3e6","1f3e7","1f3e8","1f3e9","1f3ea","1f3eb","1f3ec","1f3ed","1f3ee","1f3ef","1f3f0","1f400","1f401","1f402","1f403","1f404","1f405","1f406","1f407","1f408","1f409","1f40a","1f40b","1f40c","1f40d","1f40e","1f40f","1f410","1f411","1f412","1f413","1f414","1f415","1f416","1f417","1f418","1f419","1f41a","1f41b","1f41c","1f41d","1f41e","1f41f","1f420","1f421","1f422","1f423","1f424","1f425","1f426","1f427","1f428","1f429","1f42a","1f42b","1f42c","1f42d","1f42e","1f42f","1f430","1f431","1f432","1f433","1f434","1f435","1f436","1f437","1f438","1f439","1f43a","1f43b","1f43c","1f43d","1f43e","1f440","1f442","1f443","1f444","1f445","1f446","1f447","1f448","1f449","1f44a","1f44b","1f44c","1f44d","1f44e","1f44f","1f450","1f451","1f452","1f453","1f454","1f455","1f456","1f457","1f458","1f459","1f45a","1f45b","1f45c","1f45d","1f45e","1f45f","1f460","1f461","1f462","1f463","1f464","1f465","1f466","1f467","1f468","1f469","1f46a","1f46b","1f46c","1f46d","1f46e","1f46f","1f470","1f471","1f472","1f473","1f474","1f475","1f476","1f477","1f478","1f479","1f47a","1f47b","1f47c","1f47d","1f47e","1f47f","1f480","1f481","1f482","1f483","1f484","1f485","1f486","1f487","1f488","1f489","1f48a","1f48b","1f48c","1f48d","1f48e","1f48f","1f490","1f491","1f492","1f493","1f494","1f495","1f496","1f497","1f498","1f499","1f49a","1f49b","1f49c","1f49d","1f49e","1f49f","1f4a0","1f4a1","1f4a2","1f4a3","1f4a4","1f4a5","1f4a6","1f4a7","1f4a8","1f4a9","1f4aa","1f4ab","1f4ac","1f4ad","1f4ae","1f4af","1f4b0","1f4b1","1f4b2","1f4b3","1f4b4","1f4b5","1f4b6","1f4b7","1f4b8","1f4b9","1f4ba","1f4bb","1f4bc","1f4bd","1f4be","1f4bf","1f4c0","1f4c1","1f4c2","1f4c3","1f4c4","1f4c5","1f4c6","1f4c7","1f4c8","1f4c9","1f4ca","1f4cb","1f4cc","1f4cd","1f4ce","1f4cf","1f4d0","1f4d1","1f4d2","1f4d3","1f4d4","1f4d5","1f4d6","1f4d7","1f4d8","1f4d9","1f4da","1f4db","1f4dc","1f4dd","1f4de","1f4df","1f4e0","1f4e1","1f4e2","1f4e3","1f4e4","1f4e5","1f4e6","1f4e7","1f4e8","1f4e9","1f4ea","1f4eb","1f4ec","1f4ed","1f4ee","1f4ef","1f4f0","1f4f1","1f4f2","1f4f3","1f4f4","1f4f5","1f4f6","1f4f7","1f4f9","1f4fa","1f4fb","1f4fc","1f500","1f501","1f502","1f503","1f504","1f505","1f506","1f507","1f508","1f509","1f50a","1f50b","1f50c","1f50d","1f50e","1f50f","1f510","1f511","1f512","1f513","1f514","1f515","1f516","1f517","1f518","1f519","1f51a","1f51b","1f51c","1f51d","1f51e","1f51f","1f520","1f521","1f522","1f523","1f524","1f525","1f526","1f527","1f528","1f529","1f52a","1f52b","1f52c","1f52d","1f52e","1f52f","1f530","1f531","1f532","1f533","1f534","1f535","1f536","1f537","1f538","1f539","1f53a","1f53b","1f53c","1f53d","1f550","1f551","1f552","1f553","1f554","1f555","1f556","1f557","1f558","1f559","1f55a","1f55b","1f55c","1f55d","1f55e","1f55f","1f560","1f561","1f562","1f563","1f564","1f565","1f566","1f567","1f5fb","1f5fc","1f5fd","1f5fe","1f5ff","1f600","1f601","1f602","1f603","1f604","1f605","1f606","1f607","1f608","1f609","1f60a","1f60b","1f60c","1f60d","1f60e","1f60f","1f610","1f611","1f612","1f613","1f614","1f615","1f616","1f617","1f618","1f619","1f61a","1f61b","1f61c","1f61d","1f61e","1f61f","1f620","1f621","1f622","1f623","1f624","1f625","1f626","1f627","1f628","1f629","1f62a","1f62b","1f62c","1f62d","1f62e","1f62f","1f630","1f631","1f632","1f633","1f634","1f635","1f636","1f637","1f638","1f639","1f63a","1f63b","1f63c","1f63d","1f63e","1f63f","1f640","1f645","1f646","1f647","1f648","1f649","1f64a","1f64b","1f64c","1f64d","1f64e","1f64f","1f680","1f681","1f682","1f683","1f684","1f685","1f686","1f687","1f688","1f689","1f68a","1f68b","1f68c","1f68d","1f68e","1f68f","1f690","1f691","1f692","1f693","1f694","1f695","1f696","1f697","1f698","1f699","1f69a","1f69b","1f69c","1f69d","1f69e","1f69f","1f6a0","1f6a1","1f6a2","1f6a3","1f6a4","1f6a5","1f6a6","1f6a7","1f6a8","1f6a9","1f6aa","1f6ab","1f6ac","1f6ad","1f6ae","1f6af","1f6b0","1f6b1","1f6b2","1f6b3","1f6b4","1f6b5","1f6b6","1f6b7","1f6b8","1f6b9","1f6ba","1f6bb","1f6bc","1f6bd","1f6be","1f6bf","1f6c0","1f6c1","1f6c2","1f6c3","1f6c4","1f6c5","203c","2049","2122","2139","2194","2195","2196","2197","2198","2199","21a9","21aa","23-20e3","231a","231b","23e9","23ea","23eb","23ec","23f0","23f3","24c2","25aa","25ab","25b6","25c0","25fb","25fc","25fd","25fe","2600","2601","260e","2611","2614","2615","261d","263a","2648","2649","264a","264b","264c","264d","264e","264f","2650","2651","2652","2653","2660","2663","2665","2666","2668","267b","267f","2693","26a0","26a1","26aa","26ab","26bd","26be","26c4","26c5","26ce","26d4","26ea","26f2","26f3","26f5","26fa","26fd","2702","2705","2708","2709","270a","270b","270c","270f","2712","2714","2716","2728","2733","2734","2744","2747","274c","274e","2753","2754","2755","2757","2764","2795","2796","2797","27a1","27b0","27bf","2934","2935","2b05","2b06","2b07","2b1b","2b1c","2b50","2b55","30-20e3","3030","303d","31-20e3","32-20e3","3297","3299","33-20e3","34-20e3","35-20e3","36-20e3","37-20e3","38-20e3","39-20e3","a9","ae","e50a"], + + "font-awesome" : ["glass","music","search","envelope-o","heart","star","star-o","user","film","th-large","th","th-list","check","times","search-plus","search-minus","power-off","signal","cog","trash-o","home","file-o","clock-o","road","download","arrow-circle-o-down","arrow-circle-o-up","inbox","play-circle-o","repeat","refresh","list-alt","lock","flag","headphones","volume-off","volume-down","volume-up","qrcode","barcode","tag","tags","book","bookmark","print","camera","font","bold","italic","text-height","text-width","align-left","align-center","align-right","align-justify","list","outdent","indent","video-camera","picture-o","pencil","map-marker","adjust","tint","pencil-square-o","share-square-o","check-square-o","arrows","step-backward","fast-backward","backward","play","pause","stop","forward","fast-forward","step-forward","eject","chevron-left","chevron-right","plus-circle","minus-circle","times-circle","check-circle","question-circle","info-circle","crosshairs","times-circle-o","check-circle-o","ban","arrow-left","arrow-right","arrow-up","arrow-down","share","expand","compress","plus","minus","asterisk","exclamation-circle","gift","leaf","fire","eye","eye-slash","exclamation-triangle","plane","calendar","random","comment","magnet","chevron-up","chevron-down","retweet","shopping-cart","folder","folder-open","arrows-v","arrows-h","bar-chart","twitter-square","facebook-square","camera-retro","key","cogs","comments","thumbs-o-up","thumbs-o-down","star-half","heart-o","sign-out","linkedin-square","thumb-tack","external-link","sign-in","trophy","github-square","upload","lemon-o","phone","square-o","bookmark-o","phone-square","twitter","facebook","github","unlock","credit-card","rss","hdd-o","bullhorn","bell","certificate","hand-o-right","hand-o-left","hand-o-up","hand-o-down","arrow-circle-left","arrow-circle-right","arrow-circle-up","arrow-circle-down","globe","wrench","tasks","filter","briefcase","arrows-alt","users","link","cloud","flask","scissors","files-o","paperclip","floppy-o","square","bars","list-ul","list-ol","strikethrough","underline","table","magic","truck","pinterest","pinterest-square","google-plus-square","google-plus","money","caret-down","caret-up","caret-left","caret-right","columns","sort","sort-desc","sort-asc","envelope","linkedin","undo","gavel","tachometer","comment-o","comments-o","bolt","sitemap","umbrella","clipboard","lightbulb-o","exchange","cloud-download","cloud-upload","user-md","stethoscope","suitcase","bell-o","coffee","cutlery","file-text-o","building-o","hospital-o","ambulance","medkit","fighter-jet","beer","h-square","plus-square","angle-double-left","angle-double-right","angle-double-up","angle-double-down","angle-left","angle-right","angle-up","angle-down","desktop","laptop","tablet","mobile","circle-o","quote-left","quote-right","spinner","circle","reply","github-alt","folder-o","folder-open-o","smile-o","frown-o","meh-o","gamepad","keyboard-o","flag-o","flag-checkered","terminal","code","reply-all","star-half-o","location-arrow","crop","code-fork","chain-broken","question","info","exclamation","superscript","subscript","eraser","puzzle-piece","microphone","microphone-slash","shield","calendar-o","fire-extinguisher","rocket","maxcdn","chevron-circle-left","chevron-circle-right","chevron-circle-up","chevron-circle-down","html5","css3","anchor","unlock-alt","bullseye","ellipsis-h","ellipsis-v","rss-square","play-circle","ticket","minus-square","minus-square-o","level-up","level-down","check-square","pencil-square","share-square","compass","caret-square-o-down","caret-square-o-up","caret-square-o-right","eur","gbp","usd","inr","jpy","rub","krw","btc","file","file-text","sort-alpha-asc","sort-alpha-desc","sort-amount-asc","sort-amount-desc","sort-numeric-asc","sort-numeric-desc","thumbs-up","thumbs-down","youtube-square","youtube","xing","xing-square","youtube-play","dropbox","stack-overflow","instagram","flickr","adn","bitbucket","bitbucket-square","tumblr","tumblr-square","long-arrow-down","long-arrow-up","long-arrow-left","long-arrow-right","apple","windows","android","linux","dribbble","skype","foursquare","trello","female","male","gratipay","sun-o","moon-o","archive","bug","vk","weibo","renren","pagelines","stack-exchange","arrow-circle-o-right","arrow-circle-o-left","caret-square-o-left","dot-circle-o","wheelchair","vimeo-square","try","plus-square-o","space-shuttle","slack","envelope-square","wordpress","openid","university","graduation-cap","yahoo","google","reddit","reddit-square","stumbleupon-circle","stumbleupon","delicious","digg","pied-piper","pied-piper-alt","drupal","joomla","language","fax","building","child","paw","spoon","cube","cubes","behance","behance-square","steam","steam-square","recycle","car","taxi","tree","spotify","deviantart","soundcloud","database","file-pdf-o","file-word-o","file-excel-o","file-powerpoint-o","file-image-o","file-archive-o","file-audio-o","file-video-o","file-code-o","vine","codepen","jsfiddle","life-ring","circle-o-notch","rebel","empire","git-square","git","hacker-news","tencent-weibo","qq","weixin","paper-plane","paper-plane-o","history","circle-thin","header","paragraph","sliders","share-alt","share-alt-square","bomb","futbol-o","tty","binoculars","plug","slideshare","twitch","yelp","newspaper-o","wifi","calculator","paypal","google-wallet","cc-visa","cc-mastercard","cc-discover","cc-amex","cc-paypal","cc-stripe","bell-slash","bell-slash-o","trash","copyright","at","eyedropper","paint-brush","birthday-cake","area-chart","pie-chart","line-chart","lastfm","lastfm-square","toggle-off","toggle-on","bicycle","bus","ioxhost","angellist","cc","ils","meanpath","buysellads","connectdevelop","dashcube","forumbee","leanpub","sellsy","shirtsinbulk","simplybuilt","skyatlas","cart-plus","cart-arrow-down","diamond","ship","user-secret","motorcycle","street-view","heartbeat","venus","mars","mercury","transgender","transgender-alt","venus-double","mars-double","venus-mars","mars-stroke","mars-stroke-v","mars-stroke-h","neuter","facebook-official","pinterest-p","whatsapp","server","user-plus","user-times","bed","viacoin","train","subway","medium","GitHub","bed","buysellads","cart-arrow-down","cart-plus","connectdevelop","dashcube","diamond","facebook-official","forumbee","heartbeat","hotel","leanpub","mars","mars-double","mars-stroke","mars-stroke-h","mars-stroke-v","medium","mercury","motorcycle","neuter","pinterest-p","sellsy","server","ship","shirtsinbulk","simplybuilt","skyatlas","street-view","subway","train","transgender","transgender-alt","user-plus","user-secret","user-times","venus","venus-double","venus-mars","viacoin","whatsapp","adjust","anchor","archive","area-chart","arrows","arrows-h","arrows-v","asterisk","at","automobile","ban","bank","bar-chart","bar-chart-o","barcode","bars","bed","beer","bell","bell-o","bell-slash","bell-slash-o","bicycle","binoculars","birthday-cake","bolt","bomb","book","bookmark","bookmark-o","briefcase","bug","building","building-o","bullhorn","bullseye","bus","cab","calculator","calendar","calendar-o","camera","camera-retro","car","caret-square-o-down","caret-square-o-left","caret-square-o-right","caret-square-o-up","cart-arrow-down","cart-plus","cc","certificate","check","check-circle","check-circle-o","check-square","check-square-o","child","circle","circle-o","circle-o-notch","circle-thin","clock-o","close","cloud","cloud-download","cloud-upload","code","code-fork","coffee","cog","cogs","comment","comment-o","comments","comments-o","compass","copyright","credit-card","crop","crosshairs","cube","cubes","cutlery","dashboard","database","desktop","diamond","dot-circle-o","download","edit","ellipsis-h","ellipsis-v","envelope","envelope-o","envelope-square","eraser","exchange","exclamation","exclamation-circle","exclamation-triangle","external-link","external-link-square","eye","eye-slash","eyedropper","fax","female","fighter-jet","file-archive-o","file-audio-o","file-code-o","file-excel-o","file-image-o","file-movie-o","file-pdf-o","file-photo-o","file-picture-o","file-powerpoint-o","file-sound-o","file-video-o","file-word-o","file-zip-o","film","filter","fire","fire-extinguisher","flag","flag-checkered","flag-o","flash","flask","folder","folder-o","folder-open","folder-open-o","frown-o","futbol-o","gamepad","gavel","gear","gears","genderless","gift","glass","globe","graduation-cap","group","hdd-o","headphones","heart","heart-o","heartbeat","history","home","hotel","image","inbox","info","info-circle","institution","key","keyboard-o","language","laptop","leaf","legal","lemon-o","level-down","level-up","life-bouy","life-buoy","life-ring","life-saver","lightbulb-o","line-chart","location-arrow","lock","magic","magnet","mail-forward","mail-reply","mail-reply-all","male","map-marker","meh-o","microphone","microphone-slash","minus","minus-circle","minus-square","minus-square-o","mobile","mobile-phone","money","moon-o","mortar-board","motorcycle","music","navicon","newspaper-o","paint-brush","paper-plane","paper-plane-o","paw","pencil","pencil-square","pencil-square-o","phone","phone-square","photo","picture-o","pie-chart","plane","plug","plus","plus-circle","plus-square","plus-square-o","power-off","print","puzzle-piece","qrcode","question","question-circle","quote-left","quote-right","random","recycle","refresh","remove","reorder","reply","reply-all","retweet","road","rocket","rss","rss-square","search","search-minus","search-plus","send","send-o","server","share","share-alt","share-alt-square","share-square","share-square-o","shield","ship","shopping-cart","sign-in","sign-out","signal","sitemap","sliders","smile-o","soccer-ball-o","sort","sort-alpha-asc","sort-alpha-desc","sort-amount-asc","sort-amount-desc","sort-asc","sort-desc","sort-down","sort-numeric-asc","sort-numeric-desc","sort-up","space-shuttle","spinner","spoon","square","square-o","star","star-half","star-half-empty","star-half-full","star-half-o","star-o","street-view","suitcase","sun-o","support","tablet","tachometer","tag","tags","tasks","taxi","terminal","thumb-tack","thumbs-down","thumbs-o-down","thumbs-o-up","thumbs-up","ticket","times","times-circle","times-circle-o","tint","toggle-down","toggle-left","toggle-off","toggle-on","toggle-right","toggle-up","trash","trash-o","tree","trophy","truck","tty","umbrella","university","unlock","unlock-alt","unsorted","upload","user","user-plus","user-secret","user-times","users","video-camera","volume-down","volume-off","volume-up","warning","wheelchair","wifi","wrench","ambulance","automobile","bicycle","bus","cab","car","fighter-jet","motorcycle","plane","rocket","ship","space-shuttle","subway","taxi","train","truck","wheelchair","circle-thin","genderless","mars","mars-double","mars-stroke","mars-stroke-h","mars-stroke-v","mercury","neuter","transgender","transgender-alt","venus","venus-double","venus-mars","file","file-archive-o","file-audio-o","file-code-o","file-excel-o","file-image-o","file-movie-o","file-o","file-pdf-o","file-photo-o","file-picture-o","file-powerpoint-o","file-sound-o","file-text","file-text-o","file-video-o","file-word-o","file-zip-o","circle-o-notch","cog","gear","refresh","spinner","check-square","check-square-o","circle","circle-o","dot-circle-o","minus-square","minus-square-o","plus-square","plus-square-o","square","square-o","cc-amex","cc-discover","cc-mastercard","cc-paypal","cc-stripe","cc-visa","credit-card","google-wallet","paypal","area-chart","bar-chart","bar-chart-o","line-chart","pie-chart","bitcoin","btc","cny","dollar","eur","euro","gbp","ils","inr","jpy","krw","money","rmb","rouble","rub","ruble","rupee","shekel","sheqel","try","turkish-lira","usd","won","yen","align-center","align-justify","align-left","align-right","bold","chain","chain-broken","clipboard","columns","copy","cut","dedent","eraser","file","file-o","file-text","file-text-o","files-o","floppy-o","font","header","indent","italic","link","list","list-alt","list-ol","list-ul","outdent","paperclip","paragraph","paste","repeat","rotate-left","rotate-right","save","scissors","strikethrough","subscript","superscript","table","text-height","text-width","th","th-large","th-list","underline","undo","unlink","angle-double-down","angle-double-left","angle-double-right","angle-double-up","angle-down","angle-left","angle-right","angle-up","arrow-circle-down","arrow-circle-left","arrow-circle-o-down","arrow-circle-o-left","arrow-circle-o-right","arrow-circle-o-up","arrow-circle-right","arrow-circle-up","arrow-down","arrow-left","arrow-right","arrow-up","arrows","arrows-alt","arrows-h","arrows-v","caret-down","caret-left","caret-right","caret-square-o-down","caret-square-o-left","caret-square-o-right","caret-square-o-up","caret-up","chevron-circle-down","chevron-circle-left","chevron-circle-right","chevron-circle-up","chevron-down","chevron-left","chevron-right","chevron-up","hand-o-down","hand-o-left","hand-o-right","hand-o-up","long-arrow-down","long-arrow-left","long-arrow-right","long-arrow-up","toggle-down","toggle-left","toggle-right","toggle-up","arrows-alt","backward","compress","eject","expand","fast-backward","fast-forward","forward","pause","play","play-circle","play-circle-o","step-backward","step-forward","stop","youtube-play","report an issue with Adblock Plus","adn","android","angellist","apple","behance","behance-square","bitbucket","bitbucket-square","bitcoin","btc","buysellads","cc-amex","cc-discover","cc-mastercard","cc-paypal","cc-stripe","cc-visa","codepen","connectdevelop","css3","dashcube","delicious","deviantart","digg","dribbble","dropbox","drupal","empire","facebook","facebook-f","facebook-official","facebook-square","flickr","forumbee","foursquare","ge","git","git-square","github","github-alt","github-square","gittip","google","google-plus","google-plus-square","google-wallet","gratipay","hacker-news","html5","instagram","ioxhost","joomla","jsfiddle","lastfm","lastfm-square","leanpub","linkedin","linkedin-square","linux","maxcdn","meanpath","medium","openid","pagelines","paypal","pied-piper","pied-piper-alt","pinterest","pinterest-p","pinterest-square","qq","ra","rebel","reddit","reddit-square","renren","sellsy","share-alt","share-alt-square","shirtsinbulk","simplybuilt","skyatlas","skype","slack","slideshare","soundcloud","spotify","stack-exchange","stack-overflow","steam","steam-square","stumbleupon","stumbleupon-circle","tencent-weibo","trello","tumblr","tumblr-square","twitch","twitter","twitter-square","viacoin","vimeo-square","vine","vk","wechat","weibo","weixin","whatsapp","windows","wordpress","xing","xing-square","yahoo","yelp","youtube","youtube-play","youtube-square","ambulance","h-square","heart","heart-o","heartbeat","hospital-o","medkit","plus-square","stethoscope","user-md","wheelchair"] +} \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/plugins/goto-line-dialog/goto-line-dialog.js b/src/collectedstatic/mdeditor/js/plugins/goto-line-dialog/goto-line-dialog.js new file mode 100644 index 0000000..c64f25e --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/goto-line-dialog/goto-line-dialog.js @@ -0,0 +1,169 @@ +/*! + * Goto line dialog plugin for Editor.md + * + * @file goto-line-dialog.js + * @author pandao + * @version 1.2.1 + * @updateTime 2015-06-09 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var $ = jQuery; + var pluginName = "goto-line-dialog"; + + var langs = { + "zh-cn" : { + toolbar : { + "goto-line" : "跳转到行" + }, + dialog : { + "goto-line" : { + title : "跳转到行", + label : "请输入行号", + error : "错误:" + } + } + }, + "zh-tw" : { + toolbar : { + "goto-line" : "跳轉到行" + }, + dialog : { + "goto-line" : { + title : "跳轉到行", + label : "請輸入行號", + error : "錯誤:" + } + } + }, + "en" : { + toolbar : { + "goto-line" : "Goto line" + }, + dialog : { + "goto-line" : { + title : "Goto line", + label : "Enter a line number, range ", + error : "Error: " + } + } + }, + "de" : { + toolbar : { + "goto-line" : "Gehe zu Zeile" + }, + dialog : { + "goto-line" : { + title : "Gehe zu Zeile", + label : "Eine Zeile oder Zeilenbereich eingeben", + error : "Fehler: " + } + } + } + }; + + exports.fn.gotoLineDialog = function() { + var _this = this; + var cm = this.cm; + var editor = this.editor; + var settings = this.settings; + var path = settings.pluginPath + pluginName +"/"; + var classPrefix = this.classPrefix; + var dialogName = classPrefix + pluginName, dialog; + + $.extend(true, this.lang, langs[this.lang.name]); + this.setToolbar(); + + var lang = this.lang; + var dialogLang = lang.dialog["goto-line"]; + var lineCount = cm.lineCount(); + + dialogLang.error += dialogLang.label + " 1-" + lineCount; + + if (editor.find("." + dialogName).length < 1) + { + var dialogContent = [ + "
    ", + "

    " + dialogLang.label + " 1-" + lineCount +"   

    ", + "
    " + ].join("\n"); + + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 400, + height : 180, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + content : dialogContent, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + var line = parseInt(this.find("[data-line-number]").val()); + + if (line < 1 || line > lineCount) { + alert(dialogLang.error); + + return false; + } + + _this.gotoLine(line); + + this.hide().lockScreen(false).hideMask(); + + return false; + }], + + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + dialog = editor.find("." + dialogName); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/help-dialog/help-dialog.js b/src/collectedstatic/mdeditor/js/plugins/help-dialog/help-dialog.js new file mode 100644 index 0000000..a21a31d --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/help-dialog/help-dialog.js @@ -0,0 +1,102 @@ +/*! + * Help dialog plugin for Editor.md + * + * @file help-dialog.js + * @author pandao + * @version 1.2.0 + * @updateTime 2015-03-08 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var $ = jQuery; + var pluginName = "help-dialog"; + + exports.fn.helpDialog = function() { + var _this = this; + var lang = this.lang; + var editor = this.editor; + var settings = this.settings; + var path = settings.pluginPath + pluginName + "/"; + var classPrefix = this.classPrefix; + var dialogName = classPrefix + pluginName, dialog; + var dialogLang = lang.dialog.help; + + if (editor.find("." + dialogName).length < 1) + { + var dialogContent = "
    "; + + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 840, + height : 540, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + content : dialogContent, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + close : [lang.buttons.close, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + dialog = editor.find("." + dialogName); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + + var helpContent = dialog.find(".markdown-body"); + + if (helpContent.html() === "") + { + $.get(path + "help.md", function(text) { + var md = exports.$marked(text); + helpContent.html(md); + + helpContent.find("a").attr("target", "_blank"); + }); + } + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/help-dialog/help.md b/src/collectedstatic/mdeditor/js/plugins/help-dialog/help.md new file mode 100644 index 0000000..9a030f2 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/help-dialog/help.md @@ -0,0 +1,77 @@ +##### Markdown语法教程 (Markdown syntax tutorial) + +- [Markdown Syntax](http://daringfireball.net/projects/markdown/syntax/ "Markdown Syntax") +- [Mastering Markdown](https://guides.github.com/features/mastering-markdown/ "Mastering Markdown") +- [Markdown Basics](https://help.github.com/articles/markdown-basics/ "Markdown Basics") +- [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown/ "GitHub Flavored Markdown") +- [Markdown 语法说明(简体中文)](http://www.markdown.cn/ "Markdown 语法说明(简体中文)") +- [Markdown 語法說明(繁體中文)](http://markdown.tw/ "Markdown 語法說明(繁體中文)") + +##### 键盘快捷键 (Keyboard shortcuts) + +> If Editor.md code editor is on focus, you can use keyboard shortcuts. + +| Keyboard shortcuts (键盘快捷键) | 说明 | Description | +| :---------------------------------------------- |:--------------------------------- | :------------------------------------------------- | +| F9 | 切换实时预览 | Switch watch/unwatch | +| F10 | 全屏HTML预览(按 Shift + ESC 退出) | Full preview HTML (Press Shift + ESC exit) | +| F11 | 切换全屏状态 | Switch fullscreen (Press ESC exit) | +| Ctrl + 1~6 / Command + 1~6 | 插入标题1~6 | Insert heading 1~6 | +| Ctrl + A / Command + A | 全选 | Select all | +| Ctrl + B / Command + B | 插入粗体 | Insert bold | +| Ctrl + D / Command + D | 插入日期时间 | Insert datetime | +| Ctrl + E / Command + E | 插入Emoji符号 | Insert :emoji: | +| Ctrl + F / Command + F | 查找/搜索 | Start searching | +| Ctrl + G / Command + G | 切换到下一个搜索结果项 | Find next search results | +| Ctrl + H / Command + H | 插入水平线 | Insert horizontal rule | +| Ctrl + I / Command + I | 插入斜体 | Insert italic | +| Ctrl + K / Command + K | 插入行内代码 | Insert inline code | +| Ctrl + L / Command + L | 插入链接 | Insert link | +| Ctrl + U / Command + U | 插入无序列表 | Insert unordered list | +| Ctrl + Q | 代码折叠切换 | Switch code fold | +| Ctrl + Z / Command + Z | 撤销 | Undo | +| Ctrl + Y / Command + Y | 重做 | Redo | +| Ctrl + Shift + A | 插入@链接 | Insert @link | +| Ctrl + Shift + C | 插入行内代码 | Insert inline code | +| Ctrl + Shift + E | 打开插入Emoji表情对话框 | Open emoji dialog | +| Ctrl + Shift + F / Command + Option + F | 替换 | Replace | +| Ctrl + Shift + G / Shift + Command + G | 切换到上一个搜索结果项 | Find previous search results | +| Ctrl + Shift + H | 打开HTML实体字符对话框 | Open HTML Entities dialog | +| Ctrl + Shift + I | 插入图片 | Insert image ![]() | +| Ctrl + Shift + K | 插入TeX(KaTeX)公式符号 | Insert TeX(KaTeX) symbol $$TeX$$ | +| Ctrl + Shift + L | 打开插入链接对话框 | Open link dialog | +| Ctrl + Shift + O | 插入有序列表 | Insert ordered list | +| Ctrl + Shift + P | 打开插入PRE对话框 | Open Preformatted text dialog | +| Ctrl + Shift + Q | 插入引用 | Insert blockquotes | +| Ctrl + Shift + R / Shift + Command + Option + F | 全部替换 | Replace all | +| Ctrl + Shift + S | 插入删除线 | Insert strikethrough | +| Ctrl + Shift + T | 打开插入表格对话框 | Open table dialog | +| Ctrl + Shift + U | 将所选文字转成大写 | Selection text convert to uppercase | +| Shift + Alt + C | 插入```代码 | Insert code blocks (```) | +| Shift + Alt + H | 打开使用帮助对话框 | Open help dialog | +| Shift + Alt + L | 将所选文本转成小写 | Selection text convert to lowercase | +| Shift + Alt + P | 插入分页符 | Insert page break | +| Alt + L | 将所选文本转成小写 | Selection text convert to lowercase | +| Shift + Alt + U | 将所选的每个单词的首字母转成大写 | Selection words first letter convert to Uppercase | +| Ctrl + Shift + Alt + C | 打开插入代码块对话框层 | Open code blocks dialog | +| Ctrl + Shift + Alt + I | 打开插入图片对话框层 | Open image dialog | +| Ctrl + Shift + Alt + U | 将所选文本的第一个首字母转成大写 | Selection text first letter convert to uppercase | +| Ctrl + Alt + G | 跳转到指定的行 | Goto line | + +##### Emoji表情参考 (Emoji reference) + +- [Github emoji](http://www.emoji-cheat-sheet.com/ "Github emoji") +- [Twitter Emoji \(Twemoji\)](http://twitter.github.io/twemoji/preview.html "Twitter Emoji \(Twemoji\)") +- [FontAwesome icons emoji](http://fortawesome.github.io/Font-Awesome/icons/ "FontAwesome icons emoji") + +##### 流程图参考 (Flowchart reference) + +[http://adrai.github.io/flowchart.js/](http://adrai.github.io/flowchart.js/) + +##### 时序图参考 (SequenceDiagram reference) + +[http://bramp.github.io/js-sequence-diagrams/](http://bramp.github.io/js-sequence-diagrams/) + +##### TeX/LaTeX reference + +[http://meta.wikimedia.org/wiki/Help:Formula](http://meta.wikimedia.org/wiki/Help:Formula) diff --git a/src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities-dialog.js b/src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities-dialog.js new file mode 100644 index 0000000..78a2317 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities-dialog.js @@ -0,0 +1,173 @@ +/*! + * HTML entities dialog plugin for Editor.md + * + * @file html-entities-dialog.js + * @author pandao + * @version 1.2.0 + * @updateTime 2015-03-08 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var $ = jQuery; + var pluginName = "html-entities-dialog"; + var selecteds = []; + var entitiesData = []; + + exports.fn.htmlEntitiesDialog = function() { + var _this = this; + var cm = this.cm; + var lang = _this.lang; + var settings = _this.settings; + var path = settings.pluginPath + pluginName + "/"; + var editor = this.editor; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var classPrefix = _this.classPrefix; + + var dialogName = classPrefix + "dialog-" + pluginName, dialog; + var dialogLang = lang.dialog.htmlEntities; + + var dialogContent = [ + '
    ', + '
    ', + '
    ', + '
    ', + ].join("\r\n"); + + cm.focus(); + + if (editor.find("." + dialogName).length > 0) + { + dialog = editor.find("." + dialogName); + + selecteds = []; + dialog.find("a").removeClass("selected"); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + } + else + { + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 800, + height : 475, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + content : dialogContent, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + cm.replaceSelection(selecteds.join(" ")); + this.hide().lockScreen(false).hideMask(); + + return false; + }], + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + var table = dialog.find("." + classPrefix + "grid-table"); + + var drawTable = function() { + + if (entitiesData.length < 1) return ; + + var rowNumber = 20; + var pageTotal = Math.ceil(entitiesData.length / rowNumber); + + table.html(""); + + for (var i = 0; i < pageTotal; i++) + { + var row = "
    "; + + for (var x = 0; x < rowNumber; x++) + { + var entity = entitiesData[(i * rowNumber) + x]; + + if (typeof entity !== "undefined") + { + var name = entity.name.replace("&", "&"); + + row += "" + name + ""; + } + } + + row += "
    "; + + table.append(row); + } + + dialog.find("." + classPrefix + "html-entity-btn").bind(exports.mouseOrTouch("click", "touchend"), function() { + $(this).toggleClass("selected"); + + if ($(this).hasClass("selected")) + { + selecteds.push($(this).attr("value")); + } + }); + }; + + if (entitiesData.length < 1) + { + if (typeof (dialog.loading) == "function") dialog.loading(true); + + $.getJSON(path + pluginName.replace("-dialog", "") + ".json", function(json) { + + if (typeof (dialog.loading) == "function") dialog.loading(false); + + entitiesData = json; + drawTable(); + }); + } + else + { + drawTable(); + } + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities.json b/src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities.json new file mode 100644 index 0000000..e9e8229 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/html-entities-dialog/html-entities.json @@ -0,0 +1,936 @@ +[ + { + "name" : "&#64;", + "description":"at symbol" + }, + { + "name":"&copy;", + "description":"copyright symbol" + }, + { + "name":"&reg;", + "description":"registered symbol" + }, + { + "name":"&trade;", + "description":"trademark symbol" + }, + { + "name":"&hearts;", + "description":"heart" + }, + { + "name":"&nbsp;", + "description":"Inserts a non-breaking blank space" + }, + { + "name":"&amp;", + "description":"Ampersand" + }, + { + "name":"&#36;", + "description":"dollar symbol" + }, + { + "name":"&cent;", + "description":"Cent symbol" + }, + { + "name":"&pound;", + "description":"Pound" + }, + { + "name":"&yen;", + "description":"Yen" + }, + { + "name":"&euro;", + "description":"Euro symbol" + }, + { + "name":"&quot;", + "description":"quotation mark" + }, + { + "name":"&ldquo;", + "description":"Opening Double Quotes " + }, + { + "name":"&rdquo;", + "description":"Closing Double Quotes " + }, + { + "name":"&lsquo;", + "description":"Opening Single Quote Mark " + }, + { + "name":"&rsquo;", + "description":"Closing Single Quote Mark " + }, + { + "name":"&laquo;", + "description":"angle quotation mark (left)" + }, + { + "name":"&raquo;", + "description":"angle quotation mark (right)" + }, + { + "name":"&lsaquo;", + "description":"single left angle quotation" + }, + { + "name":"&rsaquo;", + "description":"single right angle quotation" + }, + { + "name":"&sect;", + "description":"Section Symbol" + }, + { + "name":"&micro;", + "description":"micro sign" + }, + { + "name":"&para;", + "description":"Paragraph symbol" + }, + { + "name":"&bull;", + "description":"Big List Dot" + }, + { + "name":"&middot;", + "description":"Medium List Dot" + }, + { + "name":"&hellip;", + "description":"horizontal ellipsis" + }, + { + "name":"&#124;", + "description":"vertical bar" + }, + { + "name":"&brvbar;", + "description":"broken vertical bar" + }, + { + "name":"&ndash;", + "description":"en-dash" + }, + { + "name":"&mdash;", + "description":"em-dash" + }, + { + "name":"&curren;", + "description":"Generic currency symbol" + }, + { + "name":"&#33;", + "description":"exclamation point" + }, + { + "name":"&#35;", + "description":"number sign" + }, + { + "name":"&#39;", + "description":"single quote" + }, + { + "name":"&#40;", + "description":"" + }, + { + "name":"&#41;", + "description":"" + }, + { + "name":"&#42;", + "description":"asterisk" + }, + { + "name":"&#43;", + "description":"plus sign" + }, + { + "name":"&#44;", + "description":"comma" + }, + { + "name":"&#45;", + "description":"minus sign - hyphen" + }, + { + "name":"&#46;", + "description":"period" + }, + { + "name":"&#47;", + "description":"slash" + }, + { + "name":"&#48;", + "description":"0" + }, + { + "name":"&#49;", + "description":"1" + }, + { + "name":"&#50;", + "description":"2" + }, + { + "name":"&#51;", + "description":"3" + }, + { + "name":"&#52;", + "description":"4" + }, + { + "name":"&#53;", + "description":"5" + }, + { + "name":"&#54;", + "description":"6" + }, + { + "name":"&#55;", + "description":"7" + }, + { + "name":"&#56;", + "description":"8" + }, + { + "name":"&#57;", + "description":"9" + }, + { + "name":"&#58;", + "description":"colon" + }, + { + "name":"&#59;", + "description":"semicolon" + }, + { + "name":"&#61;", + "description":"equal sign" + }, + { + "name":"&#63;", + "description":"question mark" + }, + { + "name":"&lt;", + "description":"Less than" + }, + { + "name":"&gt;", + "description":"Greater than" + }, + { + "name":"&le;", + "description":"Less than or Equal to" + }, + { + "name":"&ge;", + "description":"Greater than or Equal to" + }, + { + "name":"&times;", + "description":"Multiplication symbol" + }, + { + "name":"&divide;", + "description":"Division symbol" + }, + { + "name":"&minus;", + "description":"Minus symbol" + }, + { + "name":"&plusmn;", + "description":"Plus/minus symbol" + }, + { + "name":"&ne;", + "description":"Not Equal" + }, + { + "name":"&sup1;", + "description":"Superscript 1" + }, + { + "name":"&sup2;", + "description":"Superscript 2" + }, + { + "name":"&sup3;", + "description":"Superscript 3" + }, + { + "name":"&frac12;", + "description":"Fraction ½" + }, + { + "name":"&frac14;", + "description":"Fraction ¼" + }, + { + "name":"&frac34;", + "description":"Fraction ¾" + }, + { + "name":"&permil;", + "description":"per mille" + }, + { + "name":"&deg;", + "description":"Degree symbol" + }, + { + "name":"&radic;", + "description":"square root" + }, + { + "name":"&infin;", + "description":"Infinity" + }, + { + "name":"&larr;", + "description":"left arrow" + }, + { + "name":"&uarr;", + "description":"up arrow" + }, + { + "name":"&rarr;", + "description":"right arrow" + }, + { + "name":"&darr;", + "description":"down arrow" + }, + { + "name":"&harr;", + "description":"left right arrow" + }, + { + "name":"&crarr;", + "description":"carriage return arrow" + }, + { + "name":"&lceil;", + "description":"left ceiling" + }, + { + "name":"&rceil;", + "description":"right ceiling" + }, + { + "name":"&lfloor;", + "description":"left floor" + }, + { + "name":"&rfloor;", + "description":"right floor" + }, + { + "name":"&spades;", + "description":"spade" + }, + { + "name":"&clubs;", + "description":"club" + }, + { + "name":"&hearts;", + "description":"heart" + }, + { + "name":"&diams;", + "description":"diamond" + }, + { + "name":"&loz;", + "description":"lozenge" + }, + { + "name":"&dagger;", + "description":"dagger" + }, + { + "name":"&Dagger;", + "description":"double dagger" + }, + { + "name":"&iexcl;", + "description":"inverted exclamation mark" + }, + { + "name":"&iquest;", + "description":"inverted question mark" + }, + { + "name":"&#338;", + "description":"latin capital letter OE" + }, + { + "name":"&#339;", + "description":"latin small letter oe" + }, + { + "name":"&#352;", + "description":"latin capital letter S with caron" + }, + { + "name":"&#353;", + "description":"latin small letter s with caron" + }, + { + "name":"&#376;", + "description":"latin capital letter Y with diaeresis" + }, + { + "name":"&#402;", + "description":"latin small f with hook - function" + }, + { + "name":"&not;", + "description":"not sign" + }, + { + "name":"&ordf;", + "description":"feminine ordinal indicator" + }, + { + "name":"&uml;", + "description":"spacing diaeresis - umlaut" + }, + { + "name":"&macr;", + "description":"spacing macron - overline" + }, + { + "name":"&acute;", + "description":"acute accent - spacing acute" + }, + { + "name":"&Agrave;", + "description":"latin capital letter A with grave" + }, + { + "name":"&Aacute;", + "description":"latin capital letter A with acute" + }, + { + "name":"&Acirc;", + "description":"latin capital letter A with circumflex" + }, + { + "name":"&Atilde;", + "description":"latin capital letter A with tilde" + }, + { + "name":"&Auml;", + "description":"latin capital letter A with diaeresis" + }, + { + "name":"&Aring;", + "description":"latin capital letter A with ring above" + }, + { + "name":"&AElig;", + "description":"latin capital letter AE" + }, + { + "name":"&Ccedil;", + "description":"latin capital letter C with cedilla" + }, + { + "name":"&Egrave;", + "description":"latin capital letter E with grave" + }, + { + "name":"&Eacute;", + "description":"latin capital letter E with acute" + }, + { + "name":"&Ecirc;", + "description":"latin capital letter E with circumflex" + }, + { + "name":"&Euml;", + "description":"latin capital letter E with diaeresis" + }, + { + "name":"&Igrave;", + "description":"latin capital letter I with grave" + }, + { + "name":"&Iacute;", + "description":"latin capital letter I with acute" + }, + { + "name":"&Icirc;", + "description":"latin capital letter I with circumflex" + }, + { + "name":"&Iuml;", + "description":"latin capital letter I with diaeresis" + }, + + { + "name":"&ETH;", + "description":"latin capital letter ETH" + }, + { + "name":"&Ntilde;", + "description":"latin capital letter N with tilde" + }, + { + "name":"&Ograve;", + "description":"latin capital letter O with grave" + }, + { + "name":"&Oacute;", + "description":"latin capital letter O with acute" + }, + { + "name":"&Ocirc;", + "description":"latin capital letter O with circumflex" + }, + { + "name":"&Otilde;", + "description":"latin capital letter O with tilde" + }, + { + "name":"&Ouml;", + "description":"latin capital letter O with diaeresis" + }, + { + "name":"&times;", + "description":"multiplication sign" + }, + { + "name":"&Oslash;", + "description":"latin capital letter O with slash" + }, + { + "name":"&Ugrave;", + "description":"latin capital letter U with grave" + }, + { + "name":"&Uacute;", + "description":"latin capital letter U with acute" + }, + { + "name":"&Ucirc;", + "description":"latin capital letter U with circumflex" + }, + { + "name":"&Uuml;", + "description":"latin capital letter U with diaeresis" + }, + { + "name":"&Yacute;", + "description":"latin capital letter Y with acute" + }, + { + "name":"&THORN;", + "description":"latin capital letter THORN" + }, + { + "name":"&szlig;", + "description":"latin small letter sharp s - ess-zed" + }, + + + { + "name":"&eth;", + "description":"latin capital letter eth" + }, + { + "name":"&ntilde;", + "description":"latin capital letter n with tilde" + }, + { + "name":"&ograve;", + "description":"latin capital letter o with grave" + }, + { + "name":"&oacute;", + "description":"latin capital letter o with acute" + }, + { + "name":"&ocirc;", + "description":"latin capital letter o with circumflex" + }, + { + "name":"&otilde;", + "description":"latin capital letter o with tilde" + }, + { + "name":"&ouml;", + "description":"latin capital letter o with diaeresis" + }, + { + "name":"&times;", + "description":"multiplication sign" + }, + { + "name":"&oslash;", + "description":"latin capital letter o with slash" + }, + { + "name":"&ugrave;", + "description":"latin capital letter u with grave" + }, + { + "name":"&uacute;", + "description":"latin capital letter u with acute" + }, + { + "name":"&ucirc;", + "description":"latin capital letter u with circumflex" + }, + { + "name":"&uuml;", + "description":"latin capital letter u with diaeresis" + }, + { + "name":"&yacute;", + "description":"latin capital letter y with acute" + }, + { + "name":"&thorn;", + "description":"latin capital letter thorn" + }, + { + "name":"&yuml;", + "description":"latin small letter y with diaeresis" + }, + + { + "name":"&agrave;", + "description":"latin capital letter a with grave" + }, + { + "name":"&aacute;", + "description":"latin capital letter a with acute" + }, + { + "name":"&acirc;", + "description":"latin capital letter a with circumflex" + }, + { + "name":"&atilde;", + "description":"latin capital letter a with tilde" + }, + { + "name":"&auml;", + "description":"latin capital letter a with diaeresis" + }, + { + "name":"&aring;", + "description":"latin capital letter a with ring above" + }, + { + "name":"&aelig;", + "description":"latin capital letter ae" + }, + { + "name":"&ccedil;", + "description":"latin capital letter c with cedilla" + }, + { + "name":"&egrave;", + "description":"latin capital letter e with grave" + }, + { + "name":"&eacute;", + "description":"latin capital letter e with acute" + }, + { + "name":"&ecirc;", + "description":"latin capital letter e with circumflex" + }, + { + "name":"&euml;", + "description":"latin capital letter e with diaeresis" + }, + { + "name":"&igrave;", + "description":"latin capital letter i with grave" + }, + { + "name":"&Iacute;", + "description":"latin capital letter i with acute" + }, + { + "name":"&icirc;", + "description":"latin capital letter i with circumflex" + }, + { + "name":"&iuml;", + "description":"latin capital letter i with diaeresis" + }, + + { + "name":"&#65;", + "description":"A" + }, + { + "name":"&#66;", + "description":"B" + }, + { + "name":"&#67;", + "description":"C" + }, + { + "name":"&#68;", + "description":"D" + }, + { + "name":"&#69;", + "description":"E" + }, + { + "name":"&#70;", + "description":"F" + }, + { + "name":"&#71;", + "description":"G" + }, + { + "name":"&#72;", + "description":"H" + }, + { + "name":"&#73;", + "description":"I" + }, + { + "name":"&#74;", + "description":"J" + }, + { + "name":"&#75;", + "description":"K" + }, + { + "name":"&#76;", + "description":"L" + }, + { + "name":"&#77;", + "description":"M" + }, + { + "name":"&#78;", + "description":"N" + }, + { + "name":"&#79;", + "description":"O" + }, + { + "name":"&#80;", + "description":"P" + }, + { + "name":"&#81;", + "description":"Q" + }, + { + "name":"&#82;", + "description":"R" + }, + { + "name":"&#83;", + "description":"S" + }, + { + "name":"&#84;", + "description":"T" + }, + { + "name":"&#85;", + "description":"U" + }, + { + "name":"&#86;", + "description":"V" + }, + { + "name":"&#87;", + "description":"W" + }, + { + "name":"&#88;", + "description":"X" + }, + { + "name":"&#89;", + "description":"Y" + }, + { + "name":"&#90;", + "description":"Z" + }, + { + "name":"&#91;", + "description":"opening bracket" + }, + { + "name":"&#92;", + "description":"backslash" + }, + { + "name":"&#93;", + "description":"closing bracket" + }, + { + "name":"&#94;", + "description":"caret - circumflex" + }, + { + "name":"&#95;", + "description":"underscore" + }, + + { + "name":"&#96;", + "description":"grave accent" + }, + { + "name":"&#97;", + "description":"a" + }, + { + "name":"&#98;", + "description":"b" + }, + { + "name":"&#99;", + "description":"c" + }, + { + "name":"&#100;", + "description":"d" + }, + { + "name":"&#101;", + "description":"e" + }, + { + "name":"&#102;", + "description":"f" + }, + { + "name":"&#103;", + "description":"g" + }, + { + "name":"&#104;", + "description":"h" + }, + { + "name":"&#105;", + "description":"i" + }, + { + "name":"&#106;", + "description":"j" + }, + { + "name":"&#107;", + "description":"k" + }, + { + "name":"&#108;", + "description":"l" + }, + { + "name":"&#109;", + "description":"m" + }, + { + "name":"&#110;", + "description":"n" + }, + { + "name":"&#111;", + "description":"o" + }, + { + "name":"&#112;", + "description":"p" + }, + { + "name":"&#113;", + "description":"q" + }, + { + "name":"&#114;", + "description":"r" + }, + { + "name":"&#115;", + "description":"s" + }, + { + "name":"&#116;", + "description":"t" + }, + { + "name":"&#117;", + "description":"u" + }, + { + "name":"&#118;", + "description":"v" + }, + { + "name":"&#119;", + "description":"w" + }, + { + "name":"&#120;", + "description":"x" + }, + { + "name":"&#121;", + "description":"y" + }, + { + "name":"&#122;", + "description":"z" + }, + { + "name":"&#123;", + "description":"opening brace" + }, + { + "name":"&#124;", + "description":"vertical bar" + }, + { + "name":"&#125;", + "description":"closing brace" + }, + { + "name":"&#126;", + "description":"equivalency sign - tilde" + } +] \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/js/plugins/image-dialog/image-dialog.js b/src/collectedstatic/mdeditor/js/plugins/image-dialog/image-dialog.js new file mode 100644 index 0000000..0f8d817 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/image-dialog/image-dialog.js @@ -0,0 +1,221 @@ +/*! + * Image (upload) dialog plugin for Editor.md + * + * @file image-dialog.js + * @author pandao + * @version 1.3.4 + * @updateTime 2015-06-09 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var pluginName = "image-dialog"; + + exports.fn.imageDialog = function() { + + var _this = this; + var cm = this.cm; + var lang = this.lang; + var editor = this.editor; + var settings = this.settings; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var imageLang = lang.dialog.image; + var classPrefix = this.classPrefix; + var iframeName = classPrefix + "image-iframe"; + var dialogName = classPrefix + pluginName, dialog; + + cm.focus(); + + var loading = function(show) { + var _loading = dialog.find("." + classPrefix + "dialog-mask"); + _loading[(show) ? "show" : "hide"](); + }; + + if (editor.find("." + dialogName).length < 1) + { + var guid = (new Date).getTime(); + var action = settings.imageUploadURL + (settings.imageUploadURL.indexOf("?") >= 0 ? "&" : "?") + "guid=" + guid; + + if (settings.crossDomainUpload) + { + action += "&callback=" + settings.uploadCallbackURL + "&dialog_id=editormd-image-dialog-" + guid; + } + + var dialogContent = ( (settings.imageUpload) ? "
    " : "
    " ) + + ( (settings.imageUpload) ? "" : "" ) + + "" + + "" + (function(){ + return (settings.imageUpload) ? "
    " + + "" + + "" + + "
    " : ""; + })() + + "
    " + + "" + + "" + + "
    " + + "" + + "" + + "
    " + + ( (settings.imageUpload) ? "" : "
    "); + + //var imageFooterHTML = ""; + + dialog = this.createDialog({ + title : imageLang.title, + width : (settings.imageUpload) ? 465 : 380, + height : 254, + name : dialogName, + content : dialogContent, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + var url = this.find("[data-url]").val(); + var alt = this.find("[data-alt]").val(); + var link = this.find("[data-link]").val(); + + if (url === "") + { + alert(imageLang.imageURLEmpty); + return false; + } + + var altAttr = (alt !== "") ? " \"" + alt + "\"" : ""; + + if (link === "" || link === "http://") + { + cm.replaceSelection("![" + alt + "](" + url + altAttr + ")"); + } + else + { + cm.replaceSelection("[![" + alt + "](" + url + altAttr + ")](" + link + altAttr + ")"); + } + + if (alt === "") { + cm.setCursor(cursor.line, cursor.ch + 2); + } + + this.hide().lockScreen(false).hideMask(); + + return false; + }], + + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + + dialog.attr("id", classPrefix + "image-dialog-" + guid); + + if (!settings.imageUpload) { + return ; + } + + var fileInput = dialog.find("[name=\"" + classPrefix + "image-file\"]"); + + fileInput.bind("change", function() { + var fileName = fileInput.val(); + var isImage = new RegExp("(\\.(" + settings.imageFormats.join("|") + "))$"); // /(\.(webp|jpg|jpeg|gif|bmp|png))$/ + + if (fileName === "") + { + alert(imageLang.uploadFileEmpty); + + return false; + } + + if (!isImage.test(fileName)) + { + alert(imageLang.formatNotAllowed + settings.imageFormats.join(", ")); + + return false; + } + + loading(true); + + var submitHandler = function() { + + var uploadIframe = document.getElementById(iframeName); + + uploadIframe.onload = function() { + + loading(false); + + var body = (uploadIframe.contentWindow ? uploadIframe.contentWindow : uploadIframe.contentDocument).document.body; + var json = (body.innerText) ? body.innerText : ( (body.textContent) ? body.textContent : null); + + json = (typeof JSON.parse !== "undefined") ? JSON.parse(json) : eval("(" + json + ")"); + + if(!settings.crossDomainUpload) + { + if (json.success === 1) + { + dialog.find("[data-url]").val(json.url); + } + else + { + alert(json.message); + } + } + + return false; + }; + }; + + dialog.find("[type=\"submit\"]").bind("click", submitHandler).trigger("click"); + }); + } + + dialog = editor.find("." + dialogName); + dialog.find("[type=\"text\"]").val(""); + dialog.find("[type=\"file\"]").val(""); + dialog.find("[data-link]").val("http://"); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/link-dialog/link-dialog.js b/src/collectedstatic/mdeditor/js/plugins/link-dialog/link-dialog.js new file mode 100644 index 0000000..6957563 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/link-dialog/link-dialog.js @@ -0,0 +1,133 @@ +/*! + * Link dialog plugin for Editor.md + * + * @file link-dialog.js + * @author pandao + * @version 1.2.1 + * @updateTime 2015-06-09 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var pluginName = "link-dialog"; + + exports.fn.linkDialog = function() { + + var _this = this; + var cm = this.cm; + var editor = this.editor; + var settings = this.settings; + var selection = cm.getSelection(); + var lang = this.lang; + var linkLang = lang.dialog.link; + var classPrefix = this.classPrefix; + var dialogName = classPrefix + pluginName, dialog; + + cm.focus(); + + if (editor.find("." + dialogName).length > 0) + { + dialog = editor.find("." + dialogName); + dialog.find("[data-url]").val("http://"); + dialog.find("[data-title]").val(selection); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + } + else + { + var dialogHTML = "
    " + + "" + + "" + + "
    " + + "" + + "" + + "
    " + + "
    "; + + dialog = this.createDialog({ + title : linkLang.title, + width : 380, + height : 211, + content : dialogHTML, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + var url = this.find("[data-url]").val(); + var title = this.find("[data-title]").val(); + + if (url === "http://" || url === "") + { + alert(linkLang.urlEmpty); + return false; + } + + /*if (title === "") + { + alert(linkLang.titleEmpty); + return false; + }*/ + + var str = "[" + title + "](" + url + " \"" + title + "\")"; + + if (title == "") + { + str = "[" + url + "](" + url + ")"; + } + + cm.replaceSelection(str); + + this.hide().lockScreen(false).hideMask(); + + return false; + }], + + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/plugin-template.js b/src/collectedstatic/mdeditor/js/plugins/plugin-template.js new file mode 100644 index 0000000..8e30169 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/plugin-template.js @@ -0,0 +1,111 @@ +/*! + * Link dialog plugin for Editor.md + * + * @file link-dialog.js + * @author pandao + * @version 1.2.0 + * @updateTime 2015-03-07 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var $ = jQuery; // if using module loader(Require.js/Sea.js). + + var langs = { + "zh-cn" : { + toolbar : { + table : "表格" + }, + dialog : { + table : { + title : "添加表格", + cellsLabel : "单元格数", + alignLabel : "对齐方式", + rows : "行数", + cols : "列数", + aligns : ["默认", "左对齐", "居中对齐", "右对齐"] + } + } + }, + "zh-tw" : { + toolbar : { + table : "添加表格" + }, + dialog : { + table : { + title : "添加表格", + cellsLabel : "單元格數", + alignLabel : "對齊方式", + rows : "行數", + cols : "列數", + aligns : ["默認", "左對齊", "居中對齊", "右對齊"] + } + } + }, + "en" : { + toolbar : { + table : "Tables" + }, + dialog : { + table : { + title : "Tables", + cellsLabel : "Cells", + alignLabel : "Align", + rows : "Rows", + cols : "Cols", + aligns : ["Default", "Left align", "Center align", "Right align"] + } + } + } + }; + + exports.fn.htmlEntities = function() { + /* + var _this = this; // this == the current instance object of Editor.md + var lang = _this.lang; + var settings = _this.settings; + var editor = this.editor; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var classPrefix = this.classPrefix; + + $.extend(true, this.lang, langs[this.lang.name]); // l18n + this.setToolbar(); + + cm.focus(); + */ + //.... + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("./../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/preformatted-text-dialog/preformatted-text-dialog.js b/src/collectedstatic/mdeditor/js/plugins/preformatted-text-dialog/preformatted-text-dialog.js new file mode 100644 index 0000000..812c2e7 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/preformatted-text-dialog/preformatted-text-dialog.js @@ -0,0 +1,172 @@ +/*! + * Preformatted text dialog plugin for Editor.md + * + * @file preformatted-text-dialog.js + * @author pandao + * @version 1.2.0 + * @updateTime 2015-03-07 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + var cmEditor; + var pluginName = "preformatted-text-dialog"; + + exports.fn.preformattedTextDialog = function() { + + var _this = this; + var cm = this.cm; + var lang = this.lang; + var editor = this.editor; + var settings = this.settings; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var classPrefix = this.classPrefix; + var dialogLang = lang.dialog.preformattedText; + var dialogName = classPrefix + pluginName, dialog; + + cm.focus(); + + if (editor.find("." + dialogName).length > 0) + { + dialog = editor.find("." + dialogName); + dialog.find("textarea").val(selection); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + } + else + { + var dialogContent = ""; + + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 780, + height : 540, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + content : dialogContent, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + var codeTexts = this.find("textarea").val(); + + if (codeTexts === "") + { + alert(dialogLang.emptyAlert); + return false; + } + + codeTexts = codeTexts.split("\n"); + + for (var i in codeTexts) + { + codeTexts[i] = " " + codeTexts[i]; + } + + codeTexts = codeTexts.join("\n"); + + if (cursor.ch !== 0) { + codeTexts = "\r\n\r\n" + codeTexts; + } + + cm.replaceSelection(codeTexts); + + this.hide().lockScreen(false).hideMask(); + + return false; + }], + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + var cmConfig = { + mode : "text/html", + theme : settings.theme, + tabSize : 4, + autofocus : true, + autoCloseTags : true, + indentUnit : 4, + lineNumbers : true, + lineWrapping : true, + extraKeys : {"Ctrl-Q": function(cm){ cm.foldCode(cm.getCursor()); }}, + foldGutter : true, + gutters : ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + matchBrackets : true, + indentWithTabs : true, + styleActiveLine : true, + styleSelectedText : true, + autoCloseBrackets : true, + showTrailingSpace : true, + highlightSelectionMatches : true + }; + + var textarea = dialog.find("textarea"); + var cmObj = dialog.find(".CodeMirror"); + + if (dialog.find(".CodeMirror").length < 1) + { + cmEditor = exports.$CodeMirror.fromTextArea(textarea[0], cmConfig); + cmObj = dialog.find(".CodeMirror"); + + cmObj.css({ + "float" : "none", + margin : "0 0 5px", + border : "1px solid #ddd", + fontSize : settings.fontSize, + width : "100%", + height : "410px" + }); + + cmEditor.on("change", function(cm) { + textarea.val(cm.getValue()); + }); + } + else + { + cmEditor.setValue(cm.getSelection()); + } + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/reference-link-dialog/reference-link-dialog.js b/src/collectedstatic/mdeditor/js/plugins/reference-link-dialog/reference-link-dialog.js new file mode 100644 index 0000000..6eb9d72 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/reference-link-dialog/reference-link-dialog.js @@ -0,0 +1,153 @@ +/*! + * Reference link dialog plugin for Editor.md + * + * @file reference-link-dialog.js + * @author pandao + * @version 1.2.1 + * @updateTime 2015-06-09 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var pluginName = "reference-link-dialog"; + var ReLinkId = 1; + + exports.fn.referenceLinkDialog = function() { + + var _this = this; + var cm = this.cm; + var lang = this.lang; + var editor = this.editor; + var settings = this.settings; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var dialogLang = lang.dialog.referenceLink; + var classPrefix = this.classPrefix; + var dialogName = classPrefix + pluginName, dialog; + + cm.focus(); + + if (editor.find("." + dialogName).length < 1) + { + var dialogHTML = "
    " + + "" + + "" + + "
    " + + "" + + "" + + "
    " + + "" + + "" + + "
    " + + "" + + "" + + "
    " + + "
    "; + + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 380, + height : 296, + content : dialogHTML, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + var name = this.find("[data-name]").val(); + var url = this.find("[data-url]").val(); + var rid = this.find("[data-url-id]").val(); + var title = this.find("[data-title]").val(); + + if (name === "") + { + alert(dialogLang.nameEmpty); + return false; + } + + if (rid === "") + { + alert(dialogLang.idEmpty); + return false; + } + + if (url === "http://" || url === "") + { + alert(dialogLang.urlEmpty); + return false; + } + + //cm.replaceSelection("[" + title + "][" + name + "]\n[" + name + "]: " + url + ""); + cm.replaceSelection("[" + name + "][" + rid + "]"); + + if (selection === "") { + cm.setCursor(cursor.line, cursor.ch + 1); + } + + title = (title === "") ? "" : " \"" + title + "\""; + + cm.setValue(cm.getValue() + "\n[" + rid + "]: " + url + title + ""); + + this.hide().lockScreen(false).hideMask(); + + return false; + }], + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + dialog = editor.find("." + dialogName); + dialog.find("[data-name]").val("[" + ReLinkId + "]"); + dialog.find("[data-url-id]").val(""); + dialog.find("[data-url]").val("http://"); + dialog.find("[data-title]").val(selection); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + + ReLinkId++; + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/table-dialog/table-dialog.js b/src/collectedstatic/mdeditor/js/plugins/table-dialog/table-dialog.js new file mode 100644 index 0000000..026a324 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/table-dialog/table-dialog.js @@ -0,0 +1,218 @@ +/*! + * Table dialog plugin for Editor.md + * + * @file table-dialog.js + * @author pandao + * @version 1.2.1 + * @updateTime 2015-06-09 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var $ = jQuery; + var pluginName = "table-dialog"; + + var langs = { + "zh-cn" : { + toolbar : { + table : "表格" + }, + dialog : { + table : { + title : "添加表格", + cellsLabel : "单元格数", + alignLabel : "对齐方式", + rows : "行数", + cols : "列数", + aligns : ["默认", "左对齐", "居中对齐", "右对齐"] + } + } + }, + "zh-tw" : { + toolbar : { + table : "添加表格" + }, + dialog : { + table : { + title : "添加表格", + cellsLabel : "單元格數", + alignLabel : "對齊方式", + rows : "行數", + cols : "列數", + aligns : ["默認", "左對齊", "居中對齊", "右對齊"] + } + } + }, + "en" : { + toolbar : { + table : "Tables" + }, + dialog : { + table : { + title : "Tables", + cellsLabel : "Cells", + alignLabel : "Align", + rows : "Rows", + cols : "Cols", + aligns : ["Default", "Left align", "Center align", "Right align"] + } + } + } + }; + + exports.fn.tableDialog = function() { + var _this = this; + var cm = this.cm; + var editor = this.editor; + var settings = this.settings; + var path = settings.path + "../plugins/" + pluginName +"/"; + var classPrefix = this.classPrefix; + var dialogName = classPrefix + pluginName, dialog; + + $.extend(true, this.lang, langs[this.lang.name]); + this.setToolbar(); + + var lang = this.lang; + var dialogLang = lang.dialog.table; + + var dialogContent = [ + "
    ", + "", + dialogLang.rows + "   ", + dialogLang.cols + "
    ", + "", + "
    ", + "
    " + ].join("\n"); + + if (editor.find("." + dialogName).length > 0) + { + dialog = editor.find("." + dialogName); + + this.dialogShowMask(dialog); + this.dialogLockScreen(); + dialog.show(); + } + else + { + dialog = this.createDialog({ + name : dialogName, + title : dialogLang.title, + width : 360, + height : 226, + mask : settings.dialogShowMask, + drag : settings.dialogDraggable, + content : dialogContent, + lockScreen : settings.dialogLockScreen, + maskStyle : { + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }, + buttons : { + enter : [lang.buttons.enter, function() { + var rows = parseInt(this.find("[data-rows]").val()); + var cols = parseInt(this.find("[data-cols]").val()); + var align = this.find("[name=\"table-align\"]:checked").val(); + var table = ""; + var hrLine = "------------"; + + var alignSign = { + _default : hrLine, + left : ":" + hrLine, + center : ":" + hrLine + ":", + right : hrLine + ":" + }; + + if ( rows > 1 && cols > 0) + { + for (var r = 0, len = rows; r < len; r++) + { + var row = []; + var head = []; + + for (var c = 0, len2 = cols; c < len2; c++) + { + if (r === 1) { + head.push(alignSign[align]); + } + + row.push(" "); + } + + if (r === 1) { + table += "| " + head.join(" | ") + " |" + "\n"; + } + + table += "| " + row.join( (cols === 1) ? "" : " | " ) + " |" + "\n"; + } + } + + cm.replaceSelection(table); + + this.hide().lockScreen(false).hideMask(); + + return false; + }], + + cancel : [lang.buttons.cancel, function() { + this.hide().lockScreen(false).hideMask(); + + return false; + }] + } + }); + } + + var faBtns = dialog.find(".fa-btns"); + + if (faBtns.html() === "") + { + var icons = ["align-justify", "align-left", "align-center", "align-right"]; + var _lang = dialogLang.aligns; + var values = ["_default", "left", "center", "right"]; + + for (var i = 0, len = icons.length; i < len; i++) + { + var checked = (i === 0) ? " checked=\"checked\"" : ""; + var btn = ""; + + faBtns.append(btn); + } + } + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/js/plugins/test-plugin/test-plugin.js b/src/collectedstatic/mdeditor/js/plugins/test-plugin/test-plugin.js new file mode 100644 index 0000000..32d7394 --- /dev/null +++ b/src/collectedstatic/mdeditor/js/plugins/test-plugin/test-plugin.js @@ -0,0 +1,66 @@ +/*! + * Test plugin for Editor.md + * + * @file test-plugin.js + * @author pandao + * @version 1.2.0 + * @updateTime 2015-03-07 + * {@link https://github.com/pandao/editor.md} + * @license MIT + */ + +(function() { + + var factory = function (exports) { + + var $ = jQuery; // if using module loader(Require.js/Sea.js). + + exports.testPlugin = function(){ + alert("testPlugin"); + }; + + exports.fn.testPluginMethodA = function() { + /* + var _this = this; // this == the current instance object of Editor.md + var lang = _this.lang; + var settings = _this.settings; + var editor = this.editor; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var classPrefix = this.classPrefix; + + cm.focus(); + */ + //.... + + alert("testPluginMethodA"); + }; + + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/languages/de.js b/src/collectedstatic/mdeditor/languages/de.js new file mode 100644 index 0000000..a58850f --- /dev/null +++ b/src/collectedstatic/mdeditor/languages/de.js @@ -0,0 +1,129 @@ +(function(){ + var factory = function (exports) { + var lang = { + name : "de", + description : "Open source online Markdown editor.", + tocTitle : "Inhalt", + toolbar : { + undo : "Rückgängig(Ctrl+Z)", + redo : "Wiederholen(Ctrl+Y)", + bold : "Fett", + del : "Durchgestrichen", + italic : "Kursiv", + quote : "Block Zitat", + ucwords : "Erster Buchstabe des Worts groß", + uppercase : "Auswahltext in Großbuchstaben konvertieren", + lowercase : "Auswahltext in Kleinbuchstaben konvertieren", + h1 : "Überschrift 1", + h2 : "Überschrift 2", + h3 : "Überschrift 3", + h4 : "Überschrift 4", + h5 : "Überschrift 5", + h6 : "Überschrift 6", + "list-ul" : "Ungeordnete Liste", + "list-ol" : "Geordnete Liste", + hr : "Horizontale Linie", + link : "Link", + "reference-link" : "Referenzlink", + image : "Bild", + code : "Code inline", + "preformatted-text" : "Vorformatierter Text / Codeblock (Tab Einrückung)", + "code-block" : "Codeblock (Multi-languages)", + table : "Tabellen", + datetime : "Datum & Zeit", + emoji : "Emoji", + "html-entities" : "HTML Entities", + pagebreak : "Seitenumbruch", + watch : "Unwatch", + unwatch : "Watch", + preview : "HTML Vorschau (Shift + ESC zum verlassen)", + fullscreen : "Vollbild (ESC zum verlassen)", + clear : "Löschen", + search : "Suchen", + help : "Hilfe", + info : "Über " + exports.title + }, + buttons : { + enter : "Eingeben", + cancel : "Abbrechen", + close : "Schließen" + }, + dialog : { + link : { + title : "Link", + url : "Adresse", + urlTitle : "Titel", + urlEmpty : "Fehler: Bitte Link Adresse angeben." + }, + referenceLink : { + title : "Referenzlink", + name : "Name", + url : "Adresse", + urlId : "ID", + urlTitle : "Titel", + nameEmpty: "Fehler: Referenzlink Name kann nicht leer sein.", + idEmpty : "Fehler: Bitte Referenzlink ID angeben.", + urlEmpty : "Fehler: Bitte Referenzlink URL Adresse angeben." + }, + image : { + title : "Bild", + url : "Adresse", + link : "Link", + alt : "Titel", + uploadButton : "Hochladen", + imageURLEmpty : "Fehler: Bild URL Adresse darf nciht leer sein.", + uploadFileEmpty : "Fehler: Bild darf nicht leer sein!", + formatNotAllowed : "Fehler: nur Bilddatei upload möglich. Bitte im Format:" + }, + preformattedText : { + title : "Vorformatierter Text / Codeblock ", + emptyAlert : "Fehler: Bitte den vorformatierten text oder Code Inhalt eingeben.", + placeholder : "Codiere jetzt ..." + }, + codeBlock : { + title : "Codeblock", + selectLabel : "Sprachen: ", + selectDefaultText : "Programmiersprache wählen...", + otherLanguage : "Andere sprachen", + unselectedLanguageAlert : "Fehler: Bitte Programmiersprache wählen.", + codeEmptyAlert : "Fehler: Bitte den Code Inhalt eingeben.", + placeholder : "Codiere jetzt ..." + }, + htmlEntities : { + title : "HTML Entities" + }, + help : { + title : "Hilfe" + } + } + }; + + exports.defaults.lang = lang; + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/languages/en.js b/src/collectedstatic/mdeditor/languages/en.js new file mode 100644 index 0000000..6af70c9 --- /dev/null +++ b/src/collectedstatic/mdeditor/languages/en.js @@ -0,0 +1,129 @@ +(function(){ + var factory = function (exports) { + var lang = { + name : "en", + description : "Open source online Markdown editor.", + tocTitle : "Table of Contents", + toolbar : { + undo : "Undo(Ctrl+Z)", + redo : "Redo(Ctrl+Y)", + bold : "Bold", + del : "Strikethrough", + italic : "Italic", + quote : "Block quote", + ucwords : "Words first letter convert to uppercase", + uppercase : "Selection text convert to uppercase", + lowercase : "Selection text convert to lowercase", + h1 : "Heading 1", + h2 : "Heading 2", + h3 : "Heading 3", + h4 : "Heading 4", + h5 : "Heading 5", + h6 : "Heading 6", + "list-ul" : "Unordered list", + "list-ol" : "Ordered list", + hr : "Horizontal rule", + link : "Link", + "reference-link" : "Reference link", + image : "Image", + code : "Code inline", + "preformatted-text" : "Preformatted text / Code block (Tab indent)", + "code-block" : "Code block (Multi-languages)", + table : "Tables", + datetime : "Datetime", + emoji : "Emoji", + "html-entities" : "HTML Entities", + pagebreak : "Page break", + watch : "Unwatch", + unwatch : "Watch", + preview : "HTML Preview (Press Shift + ESC exit)", + fullscreen : "Fullscreen (Press ESC exit)", + clear : "Clear", + search : "Search", + help : "Help", + info : "About " + exports.title + }, + buttons : { + enter : "Enter", + cancel : "Cancel", + close : "Close" + }, + dialog : { + link : { + title : "Link", + url : "Address", + urlTitle : "Title", + urlEmpty : "Error: Please fill in the link address." + }, + referenceLink : { + title : "Reference link", + name : "Name", + url : "Address", + urlId : "ID", + urlTitle : "Title", + nameEmpty: "Error: Reference name can't be empty.", + idEmpty : "Error: Please fill in reference link id.", + urlEmpty : "Error: Please fill in reference link url address." + }, + image : { + title : "Image", + url : "Address", + link : "Link", + alt : "Title", + uploadButton : "Upload", + imageURLEmpty : "Error: picture url address can't be empty.", + uploadFileEmpty : "Error: upload pictures cannot be empty!", + formatNotAllowed : "Error: only allows to upload pictures file, upload allowed image file format:" + }, + preformattedText : { + title : "Preformatted text / Codes", + emptyAlert : "Error: Please fill in the Preformatted text or content of the codes.", + placeholder : "coding now...." + }, + codeBlock : { + title : "Code block", + selectLabel : "Languages: ", + selectDefaultText : "select a code language...", + otherLanguage : "Other languages", + unselectedLanguageAlert : "Error: Please select the code language.", + codeEmptyAlert : "Error: Please fill in the code content.", + placeholder : "coding now...." + }, + htmlEntities : { + title : "HTML Entities" + }, + help : { + title : "Help" + } + } + }; + + exports.defaults.lang = lang; + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); \ No newline at end of file diff --git a/src/collectedstatic/mdeditor/languages/es.js b/src/collectedstatic/mdeditor/languages/es.js new file mode 100644 index 0000000..b6b6586 --- /dev/null +++ b/src/collectedstatic/mdeditor/languages/es.js @@ -0,0 +1,129 @@ +(function(){ + var factory = function (exports) { + var lang = { + name : "ex", + description : "Open source online Markdown editor.", + tocTitle : "Índice", + toolbar : { + undo : "Deshacer (Ctrl+Z)", + redo : "Rehacer (Ctrl+Y)", + bold : "Bold", + del : "Tachado", + italic : "Cursiva", + quote : "Citar", + ucwords : "Primera letra de las en mayúsculas", + uppercase : "Convertir la selección a mayúsculas", + lowercase : "Convertir la selección a minúsculas", + h1 : "Título 1", + h2 : "Título 2", + h3 : "Título 3", + h4 : "Título 4", + h5 : "Título 5", + h6 : "Título 6", + "list-ul" : "Lista no ordenada", + "list-ol" : "Lista ordenada", + hr : "Línea horizontal", + link : "Enlace", + "reference-link" : "Referencia a enlace", + image : "Imagen", + code : "Código", + "preformatted-text" : "Texto preformateado / Bloque de código (Indentado por Tab)", + "code-block" : "Bloque de código (Multi-lenguaje)", + table : "Tables", + datetime : "Datetime", + emoji : "Emoji", + "html-entities" : "Entidades HTML", + pagebreak : "Salto de página", + watch : "Unwatch", + unwatch : "Watch", + preview : "Vista previa HTML (Shift + ESC para salir)", + fullscreen : "Pantalla completa (ESC para salir)", + clear : "Borrar", + search : "Buscar", + help : "Ayuda", + info : "Sobre " + exports.title + }, + buttons : { + enter : "Intro", + cancel : "Cancelar", + close : "Cerrar" + }, + dialog : { + link : { + title : "Enlace", + url : "Dirección", + urlTitle : "Título", + urlEmpty : "Error: Introduzca la dirección del enlace." + }, + referenceLink : { + title : "Referencia a enlace", + name : "Nombre", + url : "Dirección", + urlId : "ID", + urlTitle : "Título", + nameEmpty: "Error: El nombre no puede estar vacío.", + idEmpty : "Error: Introduzca un ID.", + urlEmpty : "Error: Introduzca una dirección URL." + }, + image : { + title : "Imagen", + url : "Dirección", + link : "Enlace", + alt : "Título", + uploadButton : "Cargar", + imageURLEmpty : "Error: La dirección URL de la imagen no pueder estar vacia.", + uploadFileEmpty : "Error: upload pictures cannot be empty!", + formatNotAllowed : "Error: Sólo se pueden cargar ficheros de imagen, los formatos permitidos son:" + }, + preformattedText : { + title : "Texto preformateado / Código", + emptyAlert : "Error: Introduzca el texto preformateado o el código.", + placeholder : "Código...." + }, + codeBlock : { + title : "Bloque de código", + selectLabel : "Lenguajes: ", + selectDefaultText : "Selecciona un lenguaje...", + otherLanguage : "Otros", + unselectedLanguageAlert : "Error: Selecciona un lenguaje.", + codeEmptyAlert : "Error: Introduce el código.", + placeholder : "Código...." + }, + htmlEntities : { + title : "Entidades HTML" + }, + help : { + title : "Ayuda" + } + } + }; + + exports.defaults.lang = lang; + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/mdeditor/languages/pt_BR.js b/src/collectedstatic/mdeditor/languages/pt_BR.js new file mode 100644 index 0000000..727914f --- /dev/null +++ b/src/collectedstatic/mdeditor/languages/pt_BR.js @@ -0,0 +1,129 @@ +(function(){ + var factory = function (exports) { + var lang = { + name : "pt_BR", + description : "Open source online Markdown editor.", + tocTitle : "Índice", + toolbar : { + undo : "Desfazer(Ctrl+Z)", + redo : "Refazer(Ctrl+Y)", + bold : "Negrito", + del : "Tachado", + italic : "Itálico", + quote : "Bloco de Citação", + ucwords : "Palavras com a primeira letra em maiúscula", + uppercase : "Texto em maiúsculas", + lowercase : "Texto em minúsculas", + h1 : "Título 1", + h2 : "Título 2", + h3 : "Título 3", + h4 : "Título 4", + h5 : "Título 5", + h6 : "Título 6", + "list-ul" : "Lista não ordenada", + "list-ol" : "Lista ordenada", + hr : "Linha Horizontal", + link : "Link", + "reference-link" : "Link de referência", + image : "Imagem", + code : "Código embutído", + "preformatted-text" : "Texto pré-formatado / Bloco de Código (Identado por Tab)", + "code-block" : "Bloco de Código (Multi-linguagens)", + table : "Tabelas", + datetime : "Data/hora", + emoji : "Emoji", + "html-entities" : "Elemento de HTML", + pagebreak : "Quebra de página", + watch : "Não Ver", + unwatch : "Ver", + preview : "HTML Preview (Pressione Shift + ESC para sair)", + fullscreen : "Tela Cheia (Pressione ESC para sair)", + clear : "Limpar", + search : "Procurar", + help : "Ajuda", + info : "Sobre " + exports.title + }, + buttons : { + enter : "OK", + cancel : "Cancelar", + close : "Fechar" + }, + dialog : { + link : { + title : "Link", + url : "Endereço", + urlTitle : "Titulo", + urlEmpty : "Erro: Pro favor, preença o endereço do link." + }, + referenceLink : { + title : "Link de referência", + name : "Nome", + url : "Endereço", + urlId : "ID", + urlTitle : "Titulo", + nameEmpty: "Erro: Nome de referência não pode estar vazio.", + idEmpty : "Erro: Por favor preencha o link de refeência com id válido.", + urlEmpty : "Erro: Por favor preencha o link com uma url de referência correta." + }, + image : { + title : "Imagem", + url : "Endereço", + link : "Link", + alt : "Titulo", + uploadButton : "Envio", + imageURLEmpty : "Erro: Endereço da imagem não pode estar em branco.", + uploadFileEmpty : "Erro: É necessário enviar a imagem. Não pode estar vazio!", + formatNotAllowed : "Erro: Somente é possível enviar arquivos de figuras, Formatos permitidos:" + }, + preformattedText : { + title : "Texto pré-formatado / Código", + emptyAlert : "Erro: Por favor preencher aqui com seu texto pré formatado / código.", + placeholder : "codificando agora...." + }, + codeBlock : { + title : "Bloco de Código", + selectLabel : "Linguagens: ", + selectDefaultText : "selecione o tipo de linguagem ...", + otherLanguage : "Outras linguagenss", + unselectedLanguageAlert : "Erro: Por favor selecione a linguagem do código.", + codeEmptyAlert : "Erro: Por favor selecione o conteúdo de código.", + placeholder : "codificando agora...." + }, + htmlEntities : { + title : "Elementos HTML" + }, + help : { + title : "Ajuda" + } + } + }; + + exports.defaults.lang = lang; + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); diff --git a/src/collectedstatic/pygments/default.css b/src/collectedstatic/pygments/default.css new file mode 100644 index 0000000..73e6e49 --- /dev/null +++ b/src/collectedstatic/pygments/default.css @@ -0,0 +1,293 @@ +.codehilite .hll { + background-color: #ffffcc +} + +.codehilite { + background: #ffffff; +} + +.codehilite .c { + color: #177500 +} + +/* Comment */ +.codehilite .err { + color: #000000 +} + +/* Error */ +.codehilite .k { + color: #A90D91 +} + +/* Keyword */ +.codehilite .l { + color: #1C01CE +} + +/* Literal */ +.codehilite .n { + color: #000000 +} + +/* Name */ +.codehilite .o { + color: #000000 +} + +/* Operator */ +.codehilite .ch { + color: #177500 +} + +/* Comment.Hashbang */ +.codehilite .cm { + color: #177500 +} + +/* Comment.Multiline */ +.codehilite .cp { + color: #633820 +} + +/* Comment.Preproc */ +.codehilite .cpf { + color: #177500 +} + +/* Comment.PreprocFile */ +.codehilite .c1 { + color: #177500 +} + +/* Comment.Single */ +.codehilite .cs { + color: #177500 +} + +/* Comment.Special */ +.codehilite .kc { + color: #A90D91 +} + +/* Keyword.Constant */ +.codehilite .kd { + color: #A90D91 +} + +/* Keyword.Declaration */ +.codehilite .kn { + color: #A90D91 +} + +/* Keyword.Namespace */ +.codehilite .kp { + color: #A90D91 +} + +/* Keyword.Pseudo */ +.codehilite .kr { + color: #A90D91 +} + +/* Keyword.Reserved */ +.codehilite .kt { + color: #A90D91 +} + +/* Keyword.Type */ +.codehilite .ld { + color: #1C01CE +} + +/* Literal.Date */ +.codehilite .m { + color: #1C01CE +} + +/* Literal.Number */ +.codehilite .s { + color: #C41A16 +} + +/* Literal.String */ +.codehilite .na { + color: #836C28 +} + +/* Name.Attribute */ +.codehilite .nb { + color: #A90D91 +} + +/* Name.Builtin */ +.codehilite .nc { + color: #3F6E75 +} + +/* Name.Class */ +.codehilite .no { + color: #000000 +} + +/* Name.Constant */ +.codehilite .nd { + color: #000000 +} + +/* Name.Decorator */ +.codehilite .ni { + color: #000000 +} + +/* Name.Entity */ +.codehilite .ne { + color: #000000 +} + +/* Name.Exception */ +.codehilite .nf { + color: #000000 +} + +/* Name.Function */ +.codehilite .nl { + color: #000000 +} + +/* Name.Label */ +.codehilite .nn { + color: #000000 +} + +/* Name.Namespace */ +.codehilite .nx { + color: #000000 +} + +/* Name.Other */ +.codehilite .py { + color: #000000 +} + +/* Name.Property */ +.codehilite .nt { + color: #000000 +} + +/* Name.Tag */ +.codehilite .nv { + color: #000000 +} + +/* Name.Variable */ +.codehilite .ow { + color: #000000 +} + +/* Operator.Word */ +.codehilite .mb { + color: #1C01CE +} + +/* Literal.Number.Bin */ +.codehilite .mf { + color: #1C01CE +} + +/* Literal.Number.Float */ +.codehilite .mh { + color: #1C01CE +} + +/* Literal.Number.Hex */ +.codehilite .mi { + color: #1C01CE +} + +/* Literal.Number.Integer */ +.codehilite .mo { + color: #1C01CE +} + +/* Literal.Number.Oct */ +.codehilite .sb { + color: #C41A16 +} + +/* Literal.String.Backtick */ +.codehilite .sc { + color: #2300CE +} + +/* Literal.String.Char */ +.codehilite .sd { + color: #C41A16 +} + +/* Literal.String.Doc */ +.codehilite .s2 { + color: #C41A16 +} + +/* Literal.String.Double */ +.codehilite .se { + color: #C41A16 +} + +/* Literal.String.Escape */ +.codehilite .sh { + color: #C41A16 +} + +/* Literal.String.Heredoc */ +.codehilite .si { + color: #C41A16 +} + +/* Literal.String.Interpol */ +.codehilite .sx { + color: #C41A16 +} + +/* Literal.String.Other */ +.codehilite .sr { + color: #C41A16 +} + +/* Literal.String.Regex */ +.codehilite .s1 { + color: #C41A16 +} + +/* Literal.String.Single */ +.codehilite .ss { + color: #C41A16 +} + +/* Literal.String.Symbol */ +.codehilite .bp { + color: #5B269A +} + +/* Name.Builtin.Pseudo */ +.codehilite .vc { + color: #000000 +} + +/* Name.Variable.Class */ +.codehilite .vg { + color: #000000 +} + +/* Name.Variable.Global */ +.codehilite .vi { + color: #000000 +} + +/* Name.Variable.Instance */ +.codehilite .il { + color: #1C01CE +} + +/* Literal.Number.Integer.Long */ \ No newline at end of file -- 2.34.1 From e33ae10e3f72430d683e510e6bae9fa61ce6eda9 Mon Sep 17 00:00:00 2001 From: yyd Date: Sun, 26 Oct 2025 20:27:42 +0800 Subject: [PATCH 12/13] =?UTF-8?q?Django=E7=B3=BB=E7=BB=9F=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Django系统架构模型.docx | Bin 0 -> 1391591 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/Django系统架构模型.docx diff --git a/doc/Django系统架构模型.docx b/doc/Django系统架构模型.docx new file mode 100644 index 0000000000000000000000000000000000000000..a2c821d710a6647d839c0d4eaabf415440fd2e8e GIT binary patch literal 1391591 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%0DLV-~wf~0&peE&PR0fF2?vi@Mbpw`oqO!7v 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

    }u=i;N;>83<}aIG{iuZ)ZP}41N8iB=g`is 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ˈ{vv}sGf@oXkl?YAgO3qNdaZYu0S8s?Q!&LE5>^$84B-0 zO<9yYgfc8OAQyX5b1$oCtjh zIJg)c3aqP0SD4dGx~}5FWurCZMq*3~biH}ri1yGF2y_U*+Rz4atI^=ZIR`~m#FWM0 z`k>ZLJUMvlVz6;9@ov%Se++&^dV`~Mp*kG@N@~by^z{4aQ2v1zHICOu_fbeBZcpUF z@2B0cX8BwG6Hn?zELtk8l&x1Ah!nDKLo|m-RPL{j?m=A)em$97`Wtk5e060y6;7)W zFQ9dSL4B>(OjwU#tr`Z0ltj~b2a#65;$Q6*=Qu8YgG6JOnGV~F?|ICwzHngDYa?oKkFc1oBGt>TZ{`!$%bgh^KLrkfPa=WBoI^2%Bp-uB z$-Mw0JD?QFkRY0c+!-djkO%YB&!3Zwo0IO&wK4jpg?Aho>T>H3|Ks(aDEi>$>6Y?S z&B(FmvAavGat5Df3qq=ks5Lc+|94W6(eDE9wOQA{VmcK3c{ z8~X3ySU_?fB#^>x-y_~HB|Z9?=s!P&ynXg$(% zUXFv>HU**M*Gjyu9+t@?P^wCHwX;O2x!O26S_vi-i;Iq^bM_P7PhWD-?NYk0ocCu+ zpPrs@S)j_u)M0>Ds_owKMBtTBf~XoY8ajGA@D!f%mg+fkxuV}vlF;DB>1i2S9;7E0 zLrA$IHnOlLT4j0*BYxd(z1TvnGVft?UnRZjv0gr!k@Y=KU%&d*N?+0WR}VEUBAts! zQ`F0o^<`6-$u^PoZttDO(Jvy_D~~RF6{C*()srVsu~#;0D=nNyFH59d8G|4`PO?R4w}d`kA39g3YFT!9JB$}- zgc_8+I=C{)Qu?hC95hyQk<|1|>IYx?OjlIf*jf*2Dj zsh>(Qd9%DMDo?#ERSMtrifNzHN-1yIxaexf98dJvGoY)2(5`XkR!v|3b zWE=4O&6GA729A0TxrT8WW%vd8JIJ~opZ{nsS ziC0Q$pJxA+k2g)QoTuOC|JmnYq#oMoR})1JuSC;|Ut+>{acUIg%-0`0)uv|V<{|_r z8AcWAi1%m8P#(%0Dsz8MVNKx-n$}Gb?K*114IB z#jwSL?tcC6hkO`TC#K>SuGRtgPhM43^Evz0O-i&^b1(<5`O{fjeoyA0 zrSlMsz8Kp|-2CC>5tppP&g#d+HPIkKIua*(;K4( z$MFkaMMN}Cr@NLIQyUssMS6F1k98T?PkCICm-0TT3D8LYQlElc9WMMt)urL!gZe=@7 zqMX!_Cuf<~Bi&~ybxV;}7d%&E#ZNITJ9g0})|RzS%r>wbIGq?$5$zb9m=KNR;B_v2 zS1{c;{EP7efhv!Fv~;Zj3+uM$$;o=!AgZZ!?7&f2Pv3(l#>CLl5gS)eR+w>C65Lm6 z-EOE+Q2VO%0ejj4CK$Aqwir|?&@-eaZo&cM@qlWg9s$~HuP z=_#l(r)KKCMsYO7Y@=VF+rQXklMyFqeOuw5E zg%Yicv`t#{bS%;JQCw40p2Zpq@jNa`-C}SpDyJV|r&tvN;=lAqea0BexVgSssbN(@ zP|3y1wX@y$#mX;1Kc_d^)$sO5+aUExS#5&mNDD)=dVx-_GzEacTTs7t0{{W2Cw7OKiGP(aQ%o zm%NFUZC>5hk9MtQeq*WsyI^zwGp1}z9~G5k?T|jpg1)?-{Fh

    7g>~i~&qcD5baXjm(Yv z{wJTu3{~9=>>ylmt+Wkfl@ezYi zg0yh8b7gd`hn0yW$>|w7SLj(w?ha5tia^k8RIk&Y+jHe2_GMe)zp03wNPQ&F-7mR# z)x3pmd6FG<=_zy?yk=c;z>}*w3~_%(Qo^R=-N}c;sv|`RmGTEqa0Un9qJ1}-S%U6R z6?HwGt3vQ0?=vBXC8VAiY~`Lj&=IKaZPmjKQBr;F%+jGr>UL`7fWA~M@4Vaet~2a? zr#C^vzUU4Dh|+Jej}q`G+bx`-eM^I?x33fu_RYxB%^xc8cX!-Q3r>+OZP+b~u75f$ zD0?}6MDzG6l@6V7#ZYNtCF}6T^dS*|H}Sz5nb0;$Q!D88aIL-yGp3sGy`B2a^Jg8p z1Wc^UoT$)_OV&7X1vF|v7dLw`1VlNEXO%`sgqR{m$dKH1Ur= z(+qyVUC$s&K|hfl3cB7fb;{^)ek@GQbh~nrPO5`aedLh{K`7=)1968)T4zYPz5>2l z*0KEstuK;~ibf(*)$^{@DF;QOWy7K`)W(R-YIaK=?paPFJuob0juz>YxrmoJ(_tU& ztD^XB&Q*KWIh%A}$IUqxPbc+y-v@2AWY)7W#V>d%UXO6!UBU25-tf{ris>+UOwdz1 zeNS(P%S@MvVr;U`-sKQ(K?DqWj$%f8v+xFM`7~AV45qy+qN;QD%p1e6brEqkR-ID) zl>Y^_GaEHlnX+1Gi3u{w<9huxd(WT&?z#sbW9mC!lNnl$rnVI|AxAW4&#YdOxfEag z9-|A5#kO9n*KvVl6cASdXYWSh%#fv`SI=lC9zG zmJWZe`ib_UdI{gSlV(ikLX=0P2b!M?(?4K9KAl&M-{ybfdh(q1l+g+Wq15=J;cxyl z8g#;r&&r0fw{U~SIpv2^W$k&=_QI3~$e@BjVyvuwpB8M%p_=juP1=umpmz32C)Kk} zZ_V4}SW&r`3zU+T=gIObRfb8jRVf^djgCrT*8+x9sNe4P90<-2bIbxyXy+QS%U?B> zO*v;+*4BcAvDb6GajViOIQz`)qAQH@Tz5I0F-^QZHFhStu-SAtuVK=8O_hS4kmJ*} zCvdO;uXkJ3sZR(B3&Abyl4~1!k4t@sR`VXjeVRC~>2BJYSz4(XEBQjRV0On1eZ*CSO{h<9JUJV6qYCpt_yboDR}Wu zv(#}duX2)fge))~`iB#oT5hbX@dmq}rupCF#{NvlDkk5;CO zEoXC&`)$5vt9*3U0TNS1m-MFG) zij>1)&bW7ySDr$%yYsc*$z3h|L@^kh)5x#0-u!V}#K?`XQfPJKMBSrHwTmmEa3@c| z#U=p{{f8E7=57y@$Kr)u*P45X6tuZW71YGi?Kb_^u1EEP+|aU=1oh1(+05;o*1W8W z7|dbV#lxG!iIA4nn`3oTp~#yBMZu8`DAT#ii7)Ry>ApESR@qO!6Sfv`16L}ZHF-|- z?8l3T4P(1GLK>$#oN_o04X%y4$`e{&ra!ieYfb39XI8E55F^63lW{F$fsbmF%SOKO zP99B@RjTg#4p)`OV6ST|K1NS+CFy6RRBN1!wqE+_IAPt za)xQ^wKYMRs55{BEcVWlqt)T&uHK4%3ub$0qG*Tr!X}?b-d(dT$aEI9q&v>w^gv@7 zUiq8BvcA(bNI-E=q2Imz^2v!w+B}3g+J8pTd3{;dt|n7iEO2#q=iBze7ZgE^v5c=_ zS@xp!!+NsyiQVTr?_bx@6k`wNcLen86#Z+<6gdVJ$IXSW?a10d>n?pYu!VFN$}hO` zMmj`Lq)UTDN|@@~c%`wMgEK9&j47sV5+sW=y)A7j&0xV=%Jd79?1kDQl~)B<$!u+9 z5)&FO6Se9!U)|i>vW{Hv7huJi})g|SVKh$j>nonNAO0suF-Zh@pI^57I z+P#+x(W;RlIZa0Xax!U5@JU*uZOgGt_(+KTsN;fR^B%fl)-2XqkcQx3Cu!B8rpIWi zq;W1(S1bOod)dK3tdZORvo+U=f=#b`SbLmQC+rgx-wv;|dCj|WWq&TT-Pm!OF7GXB z=invtqNXDrOXaki`ckd`C6+C=mo~*U9+PGjzWJk8UnY^tH!GfoquJuaC=a!!^Jo(7 zUU%5mD;==4azG-rbWk@x5gsxt^j zHfou$%ZFll{`BS}`T}){kcp(=`wrv>ES;d^4 z9#eazUF)U&ta)CZ>u=1E&In|d*g^N4^OgCH!~J`_)b9^5C7N`j^>!V*T(2?6_Xqpj z&a?N*jkDjwhahP*Y0{OCoNgSra&>^Z2M#;vI$XzdK%?OCLe8I-HRE(A&`+^#3`W?4 ztZ`YjhEn7B-+C9Nt^(m;3$3nq!uip+z{&18O^X&^z`xg?=AAK~pmjre`F&(#XNu$; zRvy?!!>aA>;9NQ5TVmO<$cqxM5o!Dc7SJ4y$s#*{vw7jNP`?To-}1(*ksa`{XF#CzGbiF8WzrZ&O%$GGhema(T#^|ht6}J$T`pOt1VluY+nh<6W7+g1P+f^ zU8s~25<0&En{yWuvU;C0589bm)+tsh`XT*nhIIKZy4Sky0)TG zxwfTJo^`5e;!lW`7O4SS` z4hiB~NEL&IAU(`BdS}Z3$UP<*JNSDQ>lvE6n(=U0k)!=QLi(U*Tyvx3hO;?N?xu`g zV16*p3e)SD(5Su`?LC*mQTs86$;p1D28Gk0L;#ed0Jo5&>ko_^{W{tWP@P zsU{{}{W^$7V&9i46pa~@u1%?6UM7oByIFMSN%l}93-SSF`n#BfSZ{mA>NdG%mjou< zYEtt?K{oCz)?p{61QMHWn2uw)6RB29ptcQV;$4-vK8YzGyb6#g9~8=kDOuo z9avT=b!+Tg6Lzx&9Brk_?T`sD?XZw}(MSbxuS@8-Mzw)F)d8L>uUh4;aKn59g2)Jjw+mp>cV}oB z-^C#%2j+1Bc4Q16b?3nT-qCZt-s8cRo~zqPVx!3{WGjof(|W8;Oiiuw4DXcZ*VahZ z`PRa(u?()6HyiHzf2NsDYe!Ydl%|G@B6h?A^&v}X{zRmxMCP%+4V|sod>3lzV3m=~ zCB5Nl21yU^&jyx*or-&%*ZpWPxI9_{gQOoGGC~k?Sr&(yYHl-neoG7Sts5g8%ff6$ z*>h=cB=IPQOiy6OU22>j&Y$BICKpXNrqg1HbbWkM%O)ag)mBZrb+fC?s-N^K&w#hB2!!WT32Y@kcWOIVy&UtbLf3us`>O#qv}_xRq8!^2 zz4htIIRTC~Q!rjY03M2OvIGDAdRIzP*k1p`wifO|q?RmZhxth~&1zjPd9nwU3isUy z15XyGvz}O49E)M;+}eCwe(vs=&+`|}z5C_j?DXz^Y3!O!-y$sgjLlRGmrk2h<|xMx ze?3dlKOhogT&ef0lTLq4ef~>D)s@QBC@=SG?b`$u8AFv0w%3KpD_2;YvFKL!`I2&+q^V0kcL&%NaZ+-b; z+SXNhb#UtfE$O~S8aY|AXcWbx7<2;c_Q6#ni|$T9&c6Ka&e+i($B(Rh4|YWuF#@`+ zIN+4(@Ho0{C&g}l{IAZ!(}VOhf#rQSZ$j8dk<b-xVj}AJ?M>#d7V1tdMBwMDH%XzjB1+4-0lrMI zrqhs33ky6_mD+ki)|_#GMfW#0knummBi$`6b@%=dmMJDdKW}8Sy{cDq<)DvqRLS99 zu|;vF{$=&OmjhlyV8rp=MgE1Z2ZWF>YyG*}B6Hqi-JOgFv;)0MTQ2=+Z-9W@1Q3uD zQC-fJKA)X3|I+t057woDXCN0ju>uAIGmS;XQ7er!B_wbqZxZT!l7KAL@LH1PlYLm3 zp6KRhz@z;2B(Oji3HDJv+Gs+q6=IKWw+~H)cqW0zMkX&%hESOB8QQ7yB&?O;dbHN@ zv?^2mv(BjwrwdOpOCup|&mRs^pZ@?odf3=!H!5YdLi$B6Xg0yn7L3*WbP55gb2)Lq zDC7h#eSr2{hCo=0Ho!2vdxB}uOhT=LV%gh_5`(Tma+zN4`)zvk^!R832Kv%&k0d+HNVsGd+$~tpiH2`qmNxdBmMdKmC#mKa8R( zM$|3rEFd#E`epE>j=}+BI2Z@0$3C-hTF_fD#|g*>SU>KOag5XALGFypmJywpz4e=y zOIirrI@ZQV^qYBo|Gx&w1jnr}{bq@>o8nGxz0T`-Q!;?m`-fTidV(7u!TtNArF47MY54Z?81=8;Ap~oxfZ+4LxvZDR7LQ?X;m1cSu;SwI0)gYByTCf?n~upaeBUxa zv~IJd!vwpY73SX9-F;!icF4pUIKHgLV#AA)+EtmF*y&7$sJ6_=h=@F?uBQ8r95tLT z`r`-tI9VS-Dzm?$bh3x2KR~}Qg3lNa{Ghr3ao`iUb4Q1|rayCFG0PYL-X9ow7g8S^^w2;*cn-USTos69HCkdD%CGkZa6R z4(@AF689Dt75d#tj8EJrn3Z;#JYRc;>(P1#M+LAj>LXY4JwyjI>y1x==RfS}$HB%PpNoT20L#od-R`vOW6hg=u(+_GZVi#0SHUlM&ks)I zza25)27ob^-#f_BsOZ)Op66+BlxFoufiwj;otTM<2|2Ym9;+LdB(VH;JImfe>Sv?Naw=CP26MG>2SvaU zU=BN`fwFBp@yjT5rkg{J_?*F9!9Ty^pPuPFaR*g&iRnn@{X2F&y;H4|GHo~ni?q54 z|KhF=zym|h1Udj(VR5-M>9}H&0H)D5Q~7?rSO?w!4J;xKz{V30BsMLI-MyVFv&Xe* zzyaeIT#G=YkADy$GMc*(7o=@$=Opx3!~y?=9J>6DjDKNjGIIdJef%$PVd&Ku;Ie*g zr;fZ@7^_FsE&E*UOxN8zckTxW9hCCQDN9oGS~v0X=NM^x4we?oXy#kkbC2`OsX) z*(=!r;#L^b>eo$x9y{;hw02Ug-mM=Q^$+hKgdGO^W%kSCR|L4Z#myYLqPhcusS;h6 zJ!nqo>H*vTb(`3zWbo>@7(w^wJ3G;K++o@L;KUJzp}$0HAmvvU*UD!N^QHC z3kbN&1!(**KtPI`*`;2Z&8A*@hRCLV%>@7+b3pBqQAYBfW0SH!q^ql|&=F(W{JbFX z_Z-Z8r3~RLWs(Kh1TPU;1V12sQZV!*f4Z6hahi5;CVu&MJ704?opR*wj8+`F%SUd5 zFZhu*uxf5(LNgZELEmxZ>FcQL4hE4Uzb=~_%#W2f-ys*W4OAe-M=4@ArD^r5f%#4V zzlDvQ+n`E`jr#4;V8iF16++U&-y9=03Hw`wdc<0N=2YKQfRHIQf}A0bSnCB|z%w%b zAjM^IK$WBNx4-N#ZZtE&-(@}5*YEkX2REtA-qK7`2bq+QnwMa>5B!2YN#BpC!;%aN zS?%8{T9BIk6+Sw_F^V*(1%~tnU6&2CD1H^WzqzizqV~gU{C^9`|CcxVD<}G1C;>jN zaEAr()`)tu=A-%T_7aWYoC0Ln+VrF9*}3@kZentqZz z6he_{I?LUTeIa}tQaoRb?}C;c#{YKYsn|h-UJSO;ZE@>51dL^igEC$HqwaSH_`9iy zMXbbJZdPZ5AJFghk+HRRw7!KBINmIBakJd(&$^!{zMYiBQJNKA-diMNq(@j}Mwy__ zP}SbiuMcJkqp~(Tl#2@I8zusuFw6@o`!`rzAhngB4?BAea09$BjvU-nLJg`X-yi2- z4^E>sQ=!Hn-I0TL-*d#Ppvdf6X5{Z{0!59dZ(~3TGrs#hQ9Lq*x9NYFyPl7y zlQwDPhRHgmB!2c3l>>y`EG*rL^+lL|(th3U;JJj_Yr!Ek281Q{6v|NvvCc^x4o&b{ zmQhp*QCMsMgkpW>t0=C%NBB*j5XZzlikt)!laK-aGZdVHWEwL>#5vOPV}b5xUsv(o zzVAr#_|?dLv1Wk)1tuHSdS^D990^&(#M4f<=h;w%&>_EuO^@PwWM8G1;NdnRYr8*P z|1wcE&2OjjwF5Q}@w6zNEO$?s(EI7gqCcad}InkeK!csTeHicUn5;z?c%3!75oyMCorqADQ zDr@TY#$KDDH6!Vu?lya6Rj^~GUV5y}X+4QX(PTXnTIF-Za!+2f)!<{31N`)s%TKQa z67y^G*zkZznLJ~HOU!nZrh}(%_}-iRj(n8Z+oZfuv3UBW*Iw#uougy-MhFNWgjdd~ z?HH)X$TOen*r0k@>^Xl+SM3^(gKbd0X1dfIMxObS|3oIgG~WQuPTav<+$`WRm2nN< z)*|UNb6Ja;V>_5+GqCLyDy#UHYxz&5U}e@UH*2+?mkCUrB?P#dKWo0oEU{B09bB7~ zIC*irS0@5ROnIU$OV%`(B29I;N#RmRq6_?>*LmuGkZy!!;pkQo*hG!7m>%^@8o# zI|cPA6Q%}y9r)35T$(k|3&UpQgp;l&Qzj|o&%S5o4K(jfO0$8xHvH}t1Nliw zZa;T>tP`5fBTN}h9bcTSTYLU9|M523!p7a2M|x*s<5-9BD9Uu*EagXcyU@tJpuk3@J&!6eFhX1m;LYKP~q$}{n2Pt8l( zb-uIs2)!6j&k$vpw6L=3=+oQuoL!i}{3D!CxP|TN=QyPLP`zTMR0OIA4ak8zn?spI zCbmJ`P&lkc3ZN6xVjWJ8S^bujaMb+@quWlgwhR3UQm*5TtU*A*t}3$~3lP~{{TZ(d z#v#K+_EuaQvu-eXrj*XbZj%$DIhI`dhZm){3+y9#VpBLt#=7jA z&vHL9tGP}(hm9;P4UlQa*&o;eT`dkl!5shNfY3v2WK|-6d zjN`q<2tf(6%fvVGPt4BY7$LKC2&6B6Jv)0|rTKv-ecj29%IM{?-g_h66e=!(qC!1l zy5x-+hdVA5$a}zMGzX+`<&BP;1>K%+vwk(I%U(kR=1~Jw5$k6SoIk0^W7BN_JYnGk zP>*{a(5_<@l|5)p|As1HYrFZ`GruyEi)L<{@7un9+~LqOHAo7($hLmbeL{)byhIM6 z&1Q9Oj$c&iFk2CK$r%OCKs;*=-)a#@wq^Y1By zsY3Otav?5dfDS4DA8<7yV#8g^oh2=}1=Y4Z3Z1*8C%N|qRv7HY;`81qr z&M`_^VA$xsb}qihB&D-7jigKo;TM5}g zk(jY3*8-~t8GKcjh#%+F?7Ku1U`s9NXzFaldT~QfUwL4>as35lj4; z@*Sn<20k2l>>?SVEZqQm6`_BwKyFIX#7_U&z#PhElRae>q$VN8uGW_Hk$zLgo4mAw z6f{{JUX^o^%5LvGoj9h!-zmvL*|s8>a;$Bn&SN?`2c48R?ldzzYTG=_J5y7lnvq0k zH}UOyTRIKVX^!eHwPFj?Vl9(yM{e$=7kjxKA2y6E)ag@dq%}fW|TUg$ZD5^{`Ap1o{V@gzYZ;1bVQb&7VL47Ule{ z4WSos0rB)UR4}fDAF4pg`T@FWXid#+9^c)IEkLDo zvy$y+>l{D|+Pc^d2!r%uZsc@8HVqTOI(8|*D$NxoeO;rP)Xb`Sct@20N&>zd>>d38 z!m0Rd-zt4jPWS~V?h)pbu>6^Xj;l${+uUB-47T`HaFIWE3k&+atoi-%{(^jEe`12a zKi=Qp0~QcIK>P!-`%(D(!2Z6T4ERJ~;LJ+)hiUwTmH%qT994fFqV}b3zaN|53LUZh zzk_xE+uGn-9HI;4+Xj6(8uLFPPAf3{XA?e00EwNW(jU}u)s|J&Uc$qQ3r~JTw&i8>jBG?S&v_!7U=C8^-mC_cEY=S% z{!DsHVIwHbwBoKBjAIS?KVu3&-;&6fl+q`E#!8ao9Q?@uj>Z0QlwIC-1rEk)O`EcdzjEB(~e*w+cYlpRVLjdkJ`k6-dM$ zgWuW-e@E)D{f=LT?R(wv*s(Cd{-tK%tNsqk|4W%zXW~3j=Ls4$$@T`hnkT&+ zsUM!m?8334ftdtjCg}_eMxIaB z&{s*lHQ5*q-+?sAbcII`8jQcVb@fWdP!?3v-m^DHLlV1)Ik&YkRogEC^g4K_i$Uo9 zw|fcDZS?=@L&l`A@-xpN0PC}IGgz49Ts#Zkq7jff5PYtgVEDLuU7%Z+nf~n|gb~+b zc=_S$(}+Ns^C#vz_0J87+D;ChE?xG>EMxtgQ$Z-sf>S=ZpGBivhf)hFfr91=qlq_= zEOCtiE1n)1&7hCf_9KD(?Y-h*-s`$;)@z!-lILb4Mh~yux{GFn8$WgqYw@G9 ze_Nh8E(_6$C9TQv#)oP0v%Zfz&6+Yd6>zMv%-ahg=2mHDWlsX6WFp$|bMC491DRZ3P$d;L57Wq>k+D?D;iVPnKrN!Q#?VD%u58 zQQNJzj1dv-{7q?vT6fXrFL>4Gm zwfGy8@4XSw*Kj|IteMvxfbwt6Iz~-3ZtD~Mhx%Zp)1$IncEgg&?vEOz?9bS)FZbKq zKluEx-g`e?b-KM;I#-?jR!B3%Hj(xfLydQ?@ugkIo34-^z#;v_jQ4>Sd|F#(6~4( zf`>EYZv#uKx*(T%mU6vLo1Zm0eIlWcP1vnBn+(Hv)PA!^PXpyZ?Qa*9> zb!W$--{(@C02CSKUV!f^^z6YulUijMsVh>TTqMV~)bFVV34`M6Qw|eP)#+d->w=_* zmyI3>>|?a?FR>55y6x9M>%T=%8!+kd+7C>6=e)~3Bgl;oG1-eYZuR{Ireqk&p}BchJS3y$Zf z*sgWszje@>u;Fr1DLP>g(8Swe#jWfe(l?B2tw$O1Xm!)5EA>fc*5+c#7=$vK03W}* z*Z~IPzBHLS04eJDt=rYuB`u_}lT`N;uBAS}O&{86jbQ)T$XBg|6q(vR4wC?BN8MW! zzugu6m7wm$p5Nv{@`ArS>$WXVOQQ#$9|0+1_V}Z#&vvDj{O$PPQ@%zgJOjaV&mf^j z@5N@tHMU-ZqT^Nu@^#;8@@iA*K(A~jHJO64{|x8xBK0W&CF7yIY(FiRq;%&hs-!%| z#feu#Ni*nsqiWAz5UO>c-U*~P@?=dsj}q0Qp_<51r)iw!%0{_O->l@-aiN*6H2H#A zBBt4Z1CB9`)ZWD&Y^F2)_87}GY#H|xW;#j-la7y`x@*f%IU`H=q6d|5&n@iC2^#h@ zS*$fHw1b!9kvKy9QK&bEx{~U@=eHZr-H!=zeU(?0)5&8{GwYxL zXmTsbW0w}Qs!Y6D%*FbGIm^*+N5hlbN* z?Sb1qTGAI1p3;qAmA$s=5n?RU^Iao#3p=W@C&3!<(KS1Wt( z#Z}ZRRcKY8S1}#G-_sHC&$e8kWA?qOb<(EFDb0EMtE|Q5qDgs>=OxOqm}>%+y1Vad zJX*wpUxzoNH2GJ)di8bINE!w1dyUj)$9gE*1Ea~ z#1PDUb9sE*vg^A%t%qUZX9vrmT_KGbcV^%ob8g#$JzL`j8ZuvRk!{`)^7z;S%XTi8 z$ShMEOB+}!mdSB{V(-8ntynBsmWkhJgriy(HML$&cEFtF`Cy0?FG1Vg=H037IYism z3#R=I{yOyCgS$OLof63crF)30`RzBMUmU(k*RRR^ALiaX8tVT4|0hWi>MF@L>T*>i zB>OUmP?UX1wo3NwyBS6am5{P!m+X7?Jqd*vd$zH~Fqpv@yYYLD_O9OV&*z-)`F+p# zk4_z@Gc#WEdOe?y=i_m|-|je`rSgnh8{31uA%`YCxXuo|kd73tz~gpGqwN|hv^HX$ zV-!mt5x25(^&xAUp?67#x$RS9zx0erH-KQTZ@n){Z_*=+jBPG)V@)D^iZ18F&L$$H z(=MQK*5?r2LE_eub3*C!%Bfs~56O;aVvSkE20lY~tVVCC7&H0bSGyU{qF3YzG<*E|I$gX;#z*!^kLEqvL!Og-$&L_D zCZf4%iOISb=ilTr?8G}R?%s9gruwQ%kc%-*w_7>ddxpQ+60)kPi|C# zr*ZAI5Cx-pQycohP4#-X2n-fgQ@6<zfE~!o z1nY8lrVS^W;^Z-A&$;3c30t?{)p5^C-gnHctTWGH%bBlhNYI{f+TWWt>b2IgA3^MR zT%$<3(3CiiEl&j7=gEbT)8Y8lrojP4*n>zGj}WK3PQ0_LlAUH#p6I*u+LL{pA+_62 z7psG-q-`TF4=P3;CLY}Km~HoIT67ExSg(A zNSI1@52*^Xy0|;6T)q#gG41vXWos0Lw4hx-dXndtGR!ul3l*GQ>Kl!ZOxokzKH`_! zA<;Z_-jKK)@*n_xKhDT5e&c znP!=R1${2YF#e+f{^Ch7fG=^vn1KGNiP+c z9;nBU8_uStCwOzT2q@+0W*VNIvMVxtb#2ENVylvu`lu*F7waOjw)Ld_!vG|64LV~Q zHe&3-gkZce@>07W(lvIgM0iyxM*_7vz7t<@#=FX?y1RuIab{{@%3u;#E{$7~T!s;( zO^oP==999vn1>NMVUbJPN(CbH0`)82lR1_&pF*)p~I%6Ax zAs^V9J1fmCq8>86lss*kPR173woLDJ%%cK7AD-Yf^g0$2(cV7*A+KUZ^iR5^RXrJ? zD5`DSTmSbw`bf6*s&~7-|76wb%_^JfZb*{pahyJXldyTW*i1*e)H3v3E#LYDur3VB zdHJK@gGy~uQ?4&>GbOFQJtF>MQ?2!}zs3@?O$ivA6cJMh^K6 zHzu9{E@{>%fP8(ju;E(idK|>`%>D%bvaK)Myv71Um~08@!Bg z`#i7ioiMhtA7%GJ?@0E}NqRe`(DtgU9#SbQ$U*LwP2Kdd8uRYt0aqnWm+IFicCz89 zrHE3_gc0KW2%Udfh6__G9A*){?RMykY8U7i{!<6AX^YAN6-to1H4nH45Q1B*Z>A?p zmcVL;lOv%h{A4Q(QsMWswlEv|7MH?$UE4uMU1HY8xt%K+dfRQZ4Ix}x*?sr#n>vPmL_lk+8e{!Z|-3K?~Bsa8a<)-Q>1 zhp>)7c$NU1es~?9$sq#^+r!s4ht^N#QuJg<=RLbKkzP4@C zW)BPV=G16tSsGEa1Q!I8q?lQ(cwh&*ILlqbj&WL=GVSMmAQf}dBV2QRtt+A_vQ)PY ztzLlLsIRwagG{<4F@sy`ZHv7x8C2w7MIi67q58jG2|6vM?@tdu*R*nc&}xXtl?3tN zdq2<{z)3jgo3W7ony#%uPN`lpGyfA*YkK8A%z|l)EpPu|cp?-?mwu~j>l^OFS~Y#9 zIGl2mJzDahpq)m;nv`22gk+_!K{yiFr380hRmP{}**SWt0Rt@MQdfd^p0m~fQJ#i*#KU3pVS)>+wIbq{kIv`}JEWQ{D=Rc@W8dHR{GEq;cOjUpkjDA7&a5wO5`Rbz{?LK_ zRnqmtXYf_6`(fpc*cZ+6pIWp3R`UMdg%2HPIycpf#`lf|=8$Bp)DTTgO%f-l101Sy zA%m%U=Yaau(`$2ZB=xRvmX(=Vqxdxrn)%RdrDs%j*2@*wX93VNpaPATz^XHj^9P`@ zH{>$9nO*oyoz`}?2kAZPrC(uBW~CNX35yT!Y}blapxNpgg0oM>U`KZRW)}B*y}xiR zV;rTsP(i<)V-stP5t#9KC(c_EmUm};&HJC-Pc;XDtzxwYXGl>3C6))9^{< z_8nGj=-;Jt>X0<-;#<6zU`Zs!YY*--JFemz-p%Vbw=83*MsA-@!HuwZ8*Z61#Pc@m zRzi0=bF9{+@)uXV;*?buCTZO%n?V7X$0>Xgaha{nmhzwv#O!-Ad`hC)* ze#Nv*+pw@y>evGrw)@b(lk&?!-jZ8Q^+! z%&E2|K~cz{=($CFm{Z(Z14z4~r zFkF&k?qPCq`~9dh5`t5I-|nef{oy|QzFB_JmR$TVV$g3>IDRPfTBREfEJWM`*r@lC zTQ~b%ajR#c_wCtevx@gwFkH<^sZ`fJfP`SAkf>$i=E8{GWR)`k$vIu2TI`D2=<@VAz2A=Zh}!AU%ELz#n=?$nQeW zz}{Y+;y5f83#xJa6aywQyYtg1X`o9l_jnZ#!-_rYp6N;hlfcJr<7L2Yli6!( z58a$A>>UH9n(un1KS-SZ%a4R~=~@5#y#8Otp+D^`|3`D;W6cvE&Lq47L`Z)3V`lsw zT0nB}%^9NL{#)DE!~-UYZxvXsqxXKATRz3?IsWKOcRpueo!lPD&yZ7(DWhM+C&?~2 z-{M5R+vX4yW05RYJ9jkwI2(dX@wsNh=%cz1Co#j)Op-4oK3ar)6EA-FeOexo)-*lM z>Ei0z3Hs;C2^-yM)8h?+bx}&s=I#-c6#Nt&VmEZ%knx)0H@_+>^?~@KMQv*1U~%?U zb)dI2?RDvT({VzU9m_?~an@y_jh$qiv|KPl#J|S8th2#2N zKo9z60EJ{PHtf9@{V3AIP~# zD%)7U7Cg+>)-sj+q06^>lCl>lj^0s?6{q;^%%?fvyzZ17?ELgdl7V-&c{(a|jBUjulE}MbWqxo5 z9Cdb>o;V1MKuD7Ne4`H!@tmxXS4oAe;bJlYzDeQY6oN;n3k+Tqm10xt>#Hy#?f-~M zUuF|Wwt3?3&Llg~^`SN`23dBJ)xGUlQmR+=mWeT2}^6RgM7GX3w>1OflZB#1iPCl1$c zx;Ybibh}6j;tk?zZJvKJ^v*eUkS;*1(9#SbUoyd8&ZUm5s4RraIF(vg4|RA!!#*q{ z6TPw8J3$IQQ|r19Jb3MDU^Ww5lR*f{dAAN7#WMY>b&nYjAhVrLelJq2VWn+uf2llj zh4saOW7Bmlf+I(2o3yA1kth>smlHCPB+<)vedD+B^z|E%=g*%nvw&2-BF9N367`rH z%zJ=ACBw6owSU5|$<|7B_D%D>(g20v6$ z$mf=lfqh;n(VR*>8C@kRw|>L~!&ym?HQTsv3Te1+3YTZZIxu?(nYN=76xA9n(SubHXVl+?#66cSRi;*_vy@V=ff0HD6<;|^1f6GmCmS$K4NKx4U4 z3!_}u#7msm#y};uB5OIm>?N*$<;F0iWR-Pw;D$6eq{MsMlVGH!H*Y{qRm^JA zA>l1)MRYBN0KxmHQaUYtn5HUeP)44j$U|s$R==tb^x~y3!-eG%M<0L8?XK`w*~d2u zQ%h*q^!D^WjkQR|QdOUa3*-DE?lV5EJ`XvPh^KcBTQS$qwM%Z}kyITKisNtZYf~F= z51EjtpV;CZo#Y+onG(%gyKTOucf0y*o^Hn~tCtNlfuT=h$f#V2uYTD++$isBbCq<_ zN$diJ`*t0-DGcd<_Va`!bb^Rx!wqDB)T>}wyu39LlSh2)z4Sa`ucklAeKP>L=p!Yn zP|cGQ2GxG`BAKE){EGVQ3jbMy*u=Stqo%fODYEuq!bf$)M%ylhv|1Nmvi zL4ss!=n%~ei)ObMa$3sfp0C$eY5>aG7Ndrb{S?14b>!+%=pHXA#phiegZ2g1pSQ0E zP#%?BC0JUG0QN)%FQ&YQ<|DkOl*oFJxev0~U3hS}uDx9HyY?_5zNx>^e5RhAm|wyD zhLr!w%*3Q#J01h%bmuHX0*&lf-a7VCJQwt|f7?=z!Uw^NdPS#NliaMOgJv&w<%v*Sqyed$1g5BThKEp_awi$=xi!MfQriY$6N?2FEBQ2wVvDS7TT-$953kc zPuZsk#(eDnOS-HG+rDsZkJ`_-PbyB(FKY%c4hUrFbH&*vtz6TyD>o4ovw>98l?h&% zXxh$?t_1jx?8^-kdRB(v+GuO;zsWtfG>3#Fw&nb#ac9kZI{@F`AAzRq*Q)_T8aOg-geND)4ok zA4q}x?4?dCxBp^r#GI~p0%}2ZL%aKSLRvxVw)EE)UzSdQ;_$+m)0P&4Pgi#~-m|kM zSD^x>5>{Q|^=$m|3q00R5()x^V$ln(j+0KD8rVk;&4$$RH!gRsns|EN$dQ9PL|YBA zNvYyY*f*mp7?&kR)>W9<*tF64S3pBE6^Lm+f$iS&DBY^2^azS8(cbaNJ~xMj`IoLP z!FdR*J=dWT=`lozXtw9AN>VvY+)xyIUed~g`M%u&M5!p;26W*3FWL0Ct((m|{;LH&-TUvStdJ zAT*6y=2!?^y8D>bqHL~sYI5+2`2!VK2ZFoLV^3s^IUN}$ABff6s`4!7x#67kXnno=iqQ2pqV}o8j5u*N(wm;85My6lD`u8cB1Td4{<+vgP)B%0M~-c zY;a#S)+KXu4&(y<^(3_8P)Pq3W{;b1rK#Cwuoh`GWO0bZz%Bj$wNm)lVAUG_FV=g! zPt+p$;Y-0fO2v25O;Z>TbxrnV4v1k@@4P5Ao?N|2w>qLqhM*G{HE!-G!?-r1FDbM? zkNpRKd`)A+dn;iFk4UerHKv?dtwKXF%X?X_tb(&vIn~o2U&81wOH#8etZKPa*|{CM zikvmx@w`##%HuV`GNM)w+O@8Gh0}WtH(pDc`LuPNaPtj*(2+}Z-=t*f@U${qpGC@X z=o*KBfL2+$Z-()6w7Es6yOgJ_Vi(8)9?Sh)7di`06m~O79eX-H^=hqq=P|sa^xENE zOUDXZ%}QDAvyd{ca8`Nc5dV3~RVlAuv*vnelg5@eDd%qa3}WdF1~V*tEbwO;DWFpP zO9S83Nf>0Ruk=njI$wmhD>-)sP|t!pXB}aKT*bM=wb$uK zDpFG#K(_V6r_{iF5Ek)K8(a4g$K&|!y5AD(yk7DMB2>Zlih7zy$H~TnAmyjpt>YoK z7ZR&%qw=fS08lUhe?yA8?kE0+a=WiD-fMMO5ttg;w#WI1e{U0vcU-1Xl{6D|y6>o6WRieZ=aF#(M^g1@Q4A&WCaY@N zo+7$eDY>61nTJu=)cP*@#$Rq6I6}R&FImp_-XBoynuc_@@YP;@Hcr{^-=tk|UCWe(5sWXV z$v&2vKMI~0*Ejp*-_#@P0Yvhzfu7mG01!fyKl<7!HYmmdSF=c`{>X;TMoaBh%k^3_ zSlIcu?R&kMM zTmz#IR?G9Kahx$Q^Y<t?d5lt^n!vF(>i^7qT9oHpO! ztaeC;w+Toaqg9ioHUG0ooGUIpt7oz$vgiJq@u0i@3}t^~e`dU?{UVhai!Jvz`UsEv zKkXBBRP0)H>%d3HxlQIV{_atyAUxa_8aoT>5qk?J{Zd=nAoR?HQA-!b!6B~)0$c?; z^-9zEq7qn26~1#+2MX+~5(d@?Ji~$-LNbcH-Qm0eHw0wR^aRb7HxNwc#p`iLaw?5f z)m*QYaj&(?7qWPSld;XbHLRf)sZE_T*=I4*PqQ&}suFHdeK4eb85v()-CbUx$`dK) zwk~N;Z{oe-tZTK zdhWw}rwcX*xm;TIGw@DYIL9!;^~Eh0v_j43z=^Y&j(GvH`5;7m(3T;^4q=LWJ5M$C zf&->BoLfooO3^J*cRQcGT4>V9kUK%)Jf~e|?w{T@?PvpGO2hkh$17>J*L!>N#(z{t zb#Y6MQEs`wPc0lx(RI_nq12;edDTMOt5ssq_h5M)=s?(Xdw&&Dr^qYWCah(08jxZ5 zf=Y|+mWwwwPwI&{%lB~~Sc`A@;feSzoeI?oflH}MxX!7iNq_ed2iOtn`yP#!)Yy;R zXKplnQnNM5*OjTAWdX1V%b_9g2PBnkqvf%-yQ-`B7$}YIVeS+uTvN;#DvCSmw z@Ley>zMF*Nh}Ys*g!MXHS53cR5VO=MSK{t&J-Z!-K zUQ^qN7RGp$4e`ULZql3Tc;dLaRF5zyR#%@#xKX9_nOn-%e$<3*;op|`vLqPFJgZ?R z@ua?jqyUEOy8!<-m*;|ZtTX^)AhV3OtpLzN?!5f`Q5u1;gad4{F)ZdymPJRst^9lk zL?>UC(*0FmYRtSul$JZ9_%S)m_Oa%KpcDfpVfIzLaAdYF>#KDsq;+3z3P7CPU#3T_ z)!)p1vQG3Cd_LYFd(CF%)nR<50|Zz%emq5>f%3H!I(LemPJ=bpcypky6NbV=#2w%D z)^^jdDQ;%CK-oKJ_O(9gfVdRp2M+Yehu_#rR^wr^8j+NlVBG%DU7k_b!R4k6S)afb zux&Oz%6oGcam{qK_ph|q-O*T%mXE#<_9}AlO;yV z-LtO}B~L=)ZI7`NPa0Mo7Yy?S9~*eyTy=j^Ml1JlERsj_J*j8tV>r0$v`%kKQI4Dj z?E==~q9QdIOoB~{HBz>P)c<(Q7x7N9rHxKaKQ%x>g%X|TpXaY7%leOpcL$l5_fzps z)|(T2ryC5dmB}|A5tkUAm6x&Lnj;p@7e3kCSqjB>mY1cFYEed7mCbf1`c?JST!(0N z#Ue2S#d`QU^fZv0nA*c?SF3R;3F|Ksl1L<))Lmuo+cr2tTE^yPCHF6WyKUSkGY4B@6nE#~f>+{ygF>b@RdLwtB0Lyx3n?thhM zbnYNhe!{!foGL@0q4ZMctxp;X)9Ceu4!p&Col>R?IOv>qA4MuXmE|^ypdi3faLUaj&ZF~9E*0)A1^L&PJDy%Fi$LkaHbBl^p1yTJqs%F?O!8( zk-kpQ7Pa&@Ss_&ln269$8~0XF68q$NveG5Lh@sj(1UY~d*p%q0+OlUw@MjQN=D{wH zvq%9Qt1&gUBk?cP4)KjqtwJ|SDthr+AIYF{CJ8*o4B}pLZuaWgpnu1Le{}0)A9tTv z$1m$V=^_Fn)7KGML6oGZC~mkilH{xL1ha1yDtgE{HirnlWcVGI|+QniZkHTME{cdT>w@HUQwTIcC|9jlFKRIx`_GkDt$t8 zqkIyCZyMK?1uCo!m~_|<8!f6&c8gEIZ9&U+N>VZ5Jy%`_&*aUx!5$?`y2+ERWQP9e zKJ5+G@sPxr?yjjd?_Yr-UL|igd3EuYH?6x~j>x)VNVxez&1u~GHJk@P3S`~jf;A`9JmHaH z)Lz9eZF?V1H2g+V_$q5q><3Ph>#gDK=$v{+z}nR-J}Q}-nmR4Lowjp{WX{XX&HTu? ze=}%gjh4jyQR-R<9l0y4pP7f)o=x&taB`AVHGaFlyu7mde73ArsN<$M*K^A>VLK16 z_H-`g?jwmp-r!U+`Z0pzeG)!=UDg;y!yBw&*N9Vq+)#P*DTfQQ;IH_)u<0PJji7A# zV$EZ!O3q@_FzPK_2SyFSs*MpqHFP;&cfpw!UrFt0q77AdD8}Vu3AQ;6A59_PKY;q~P^Zx)Q6Q4W*El1Lbl^-Jp~ zF-ou&!+w?ii7}Y4B8Br=o4q4fqcz&d=KVeeZVXMvGNyXfYGuZ)#3JjrH#eqMT{X}( ztU;c66Q*sf{YPSb=XB9$CpZhw)-(y!D?X%6u*h$Brz6d1)J!<+eLy2D}i!;ru$G?=85y=7N z!yaHW&F*@~Fz^#^CKntna|S@pZQf3WOH~fAv}XZhChyQ!1|Oj99M8F4Aln0~s2Q|3 z7TrBDvROT%S=%k2;lXtAJ)0OXRUhGmpu(_Tp`k)?;U!r_k*9qKw(DQg{}H~jJXn}w8&{N$dYU-$g#8!&QPyhVlZw9(m&pL;Pr^VE)Qun2s zqeW--8+O=81ZR?qPoJ)-2x+95bV^*W>7F4NJuHcBzpHO1_%t$#>1CT1U(jMs-rD;z z#>a!WRU>Kr#Eu-Eu%$iD8xwWVV#a&@2zes)gZ~SVOjhHv#c;SXXp?5VKJ$aoZY)B`7apbf;CxU5|as370X|E2~nBB1W zTzAgJ>_T_JbDV>u!t<`ij?Xh!09F_qEIH8xQc@=e#k9HbdrZmCEwcjE-f9doW82UZI?YIv5_cTp9~)9;EAe^OZ1z*3PT*0Fny%D^xJ%x2Xd3oa^Gnz)0(ned|L2-~bNX@Oe zO59<7Eh+PIxomtQT-lK_&LjkInEf;rcPOjB$nYBW%SiuP5-5E0T`S zGogx*1C3>Rob+_>$MokO1lrY^&}O?N@;ZlMUY^8n^<2I-q|WrTr`o=cK9id7fb5Yy<_Gs#jSrH@e}*8 zh|PVI??XA3^L7Zesn)sW{u`T{zFaZ_8EGG%*BD*dg-`vA0&RLmhvchX{%hE&9lE^H zS8HUL8&{dJl-~ei6Du|^DyJWO98%@K$GY|Kz$far8HlW;V;EFIV4VMpPw{koI7#D- zPc(TKMT4QG;l7!Zm-DDcSOP3gAI+R^(Rs(puTy6@qVX_eT9^fl&)SMM4v(kmDCJ-d zZlCDD=S$Q2(mtk7K)o4B68+Nl`-PO|6A)$wJNJR?bk@J|t`8l&y*?NuP1ExO^1 z&jFTc0cus>u$oUxIdEp9Uh$T%lGA&e3|1_A%48OooBBw{0lqt_8D387`%5dRUpr*6 z^`sb3wZ0W4x7zi zbrNcT!Z_|5^v+rg0sX2{AWbg}V+D5Q8K=Pz2&}Ip^h-lz&GM<@90)7x!EdUff>(P4 zsnDRj4Q~ zMX*T+!gD?@O#5|FRWEqFas6N|En^mgU4n8Q**m>OVVK169#i%C z{dzOz@t8cHWZtS_@5b95tV>3D7=5?H}4+1IS4~e?V+zgwP*tj!&OI`NDWb- zqz?=cb<&;Z&MkYnthhCBA*pY;Y0(vv5&E)uJ0UxZ(*B@@=8!jOc`DB|b`4Pk6NZVkde)3V|3N|oVWpL2|Z?`vd@#~`s(fiuP3M19*=BQJeQl~ zoiK74d78RRJKUHL6+E_oNqv6Vby#e0KN926xM|SYZRPxdccRh-ZuRta%s_@yg83_1 zH<6$)EQ?`$f^7motCpm?aLmkx7d_j6qE~=n>JN0zKmKT~opJlHMZ_p^lLVcdCK0J> zUo8Zra~%uB=-L~SLQG{_02GEA^iGAg)_`(Mt6{?ZOKUMwtc@^GXkMQY!S}jn+^_W| zIDRyypXrk4pcJxvkpb;)T-D}f^CQ$Jdn{|afA(ipF?4ij4yeh$cXO(GW zs=BEd#+epu06R%Mia0OE+&^%|h6h#l1rp?|=p?AQU{@YqVfwDjc=;bwfm;aTsg`2f zsEK1Op4zn42fOO!3v1A84L5%3JnTN{=b)rbxQ3J=O3t!D0RzbGnHFQ>g`6A3k9Bel zu8_vWBt4B)tl3GZftD~l*xxm%;|T~XmlPQFtGnzur8e)^(6((Rn0pY3nRZp)-HsU? z$i?4=dSiynSto_S5ig7}ULXerrrp<@=+rVF`h3EvB`t!B{42y}_xC*pZB z2FG6ACi+)9Bb)MSM;SHJq&w@aOXz8KNXiHNm}%B(*yFOcVE;X0V3q!f-ur_BvkTUn z%}oa)_e;{}rB>JfL(j0Y-ftyJ>~+)h+c^efT8Uwm;f|)1rAjfz_zxQGZ4T5;R>}Zo zB{o`(eafV@?K4o`?#P{`;c?Gf^Rtc)$TU{7HD)xeN{oeK`Gya^Z_uRZ4sBD56tQD7 zwWdR&sWR%P9Sy5Kf3z%-F_EZVFLLfgYV9(jOlLV6QmZX}?b%Y?T_08eSze8ZV^Tq~ zR}y!yz^BBY=zBl)SkjxG(IA;?HdX*o?2>hFc2ZVeO*CcaKL7=`tkH6M+ryLltR`yS)Hf8b*DG)t6GpfFMsOFG8w*I<5S{iyvIO+3Dx{Su`+ZQ zt;(|YmH+uCTlx>M%TGw2wPxL#mnA*MAo%<{9qn8Tc=yGRcHYkcxnoPX(XZyr_p4^Ysp=De-P;J^yhF;?H&0|dd0P8ZZ11IYNt4;lr+-P2BWOAwoCx=Q=<_pX3$segwC$F zDSisc{X&8TMDhCo)&<1If*s%=1^{$*nP!)G1(-hn)X)I+I6Uwe%e3c-9}mcHD?!l0 z|CvGMCr(r1+y6ZW>Q98&0>qAYaSjm>o)7(Y_6C+MRq1W#8Rk8|pwWNf@_+TT{lw+M zd9=d-Y<;3J=-)~Whq+JuHwte1o&By|I3ZIn2jl{zzo>UvM|kwTKboTcI~nPRg`RhG zm#sfVGhyH0LMgY~@7+y4_zG+LnbZ3PpZ-6ZjWPgE{lz~GG_Qf(`F24%iE(|m1xX(L zzq3LAG~NB0|6rBj`RWg>O>QS9KiP}Jk#kcqcBvw@>mQu~Ex%J+*HC`9^U)H)Vu!k_YwT4lzF`m)$jH}u zMtc29PjO{!t@LqBsvaaTY0U7A$s+8_3Kk%~eee6YjFcDgbvP({zWZ7yiP(NDkBXi0 z(|0h{PwUrlW@e2+49ST=^R2!QjUwCDuO;X&)6_1|EXU#CfIKl}N1U?LdRPN!;`dMX zSo$lHWXq&wfBnK*Ghu^ykArT3$dxaF6}zh$se}0A-4#J-!I2+ewA+B3X(ds8tKJ`Q zqrR}NAMHo7`WSCxbh`@MrC1Jz)*DuNP>%AVc!5%fqzfnQ5hsls|ByOCOV5P|hCJ}s zZXwf}K(%LiNb;DZjP%YH9usSZRZ`;v0-9tn%+6MQC z`k&rWP^R!4l?C=bRCkRPQ(8T5QzsySpS-03e#z`Nf81CpARkCJgcFPBNmo|q=6}Se zCDN2qJPNo%`mXonFX%D-v~Ee5BE2`bQehFdri;zf4BCWa}IGY>@>0PRt!0%S7Pq zh(QA?_}Y?h2^UTGM;bBf=!7(&h1Q6xH~7O{=9~ngiqfXR|9bp;4G$37VnV+D@@%}_n)4VU(J@^9h;Xg`Ivdn zmU;(zk1=}RtHHb4swDBqIASHz-&aKH^bT9s-75gq~$TKKRMw zR%l>WS^l8vt>K3z5{UqWXXbIv-`|atgYu)0`*FWKNmqQiN04uVxQR)l8>=-YA`IS1wsZ*5IP~A20k7940K~U*}|Q~2L5^b`H2RpI1UnFH%ZgH(a{qw zE-oD;^b9GCWLF7MQd%A4jdt?}j5zV5Rn)Y6yR7{03++$z`=Eu(cYK1E?$N`2TyZEi zNgCfDT+?4lTJTW<6+l*!gvBdGq2D*WZ!h>o))us!z7H^9v z#xtrr%c|Pnw5UI|VYaK=eh(Yqmz2yd>4DF4aeYrg5$sH6Caods7vjA)EL~DOf9Mq# z*ky_l9Cu2DMV7)aP| zWPsW4q9uVc9IWcrpeF%xpd>&4=VYecoDAhUU)7L8(}Ue_dtf7*M%MZbJqCSQ9?(78 zBnB~t(c%gl)H95vG0i|EPoN07ZXG1Dw9Y~F2Iv#ove|OSizIN1MjEpkbOWpOn!L*I zhut@F%^C}%*1`6;>-xPiLbYX3pjus}%$Z0%Jj(!bYrb8GAAvq!MxUl!?$czn&&c;U zw_f-)SLORn1t|T85}#B4-~Jzek-}Vh-u~>v3c&HcLCAaqW&h-5%pn??@A4_Xl>s5^ zAeu?#*nT8Gu+{9wBaJF=&TdY8=Qe)P`@$1sxpw2HzEZ2cIS-?Zf#~!Oh|Veen%4B- zKZ75?x(%=V{)S&*p&+nql$RiW_2n_Uu>dj=@UVrYjNT)QJ9jA2B;uEB9+GE;e8ZQ0 zE0OwUdV}76Bx$4LQmzB`UcGadeWsZHsYdM(SF>oIeQI2kSGr3Y{F)FS_r=|qJ(95Y z0E94Qfs8of+C*>3kA+H%6?JX=cN#K<3j; z8*crct|^0$H}c+$pL#TyHMzCQ3PNW(?l*0D+UH#-O6-4jj}BQ<@>-jtm)m*F6?r+t z>W!QN06aL?QQ#G!^ZX;T;aDr0XBTsZC%_zS-z@@n$GR!Bw2wp z6w>|t2K*M6slVSGCMWkS?+VfrPKZm$*jQ6>;^e23f|xMgWurkno$phR5?EK#ibF>R z6>MPmxH}N5hW5rm8fE(zL^RwMIyE0_N zgRVt`g&90m*B_EyE1c+d^WqDNTcU8rTCf+}v2g^qUwR()v8d}!k>~A{3o@(jJEdyW z)8tzQRMxk&X_oNcmzQK=dg28RnKJ>N112?n+JO$P^HU24~x9w@{%j{lyrXG3y?3u zsvMR3EVkea&i5|*1ncc1g{O5-bvz|AJcn#;eNx5Sm=JKmtubR{&|*dUuw>6wdW}AU zp=jAGD?oJZfAk*zCTO&D5TM-6$f06{DK2hlaC6Suuzq9`K>mh}!wR%r8IOl#(L)tGb199lIaY zyO>=XYMngiu!-MecUf)$P6FC4gmtjYfFZDipe%(1EW_M{r8s-J`i8X7MW+p&TRlU#e7mpv5~t}r(%vJs;Q-G)YFcg2Mk~& zhf@w?Ub7nJqWlIOE=4zG_+B8Y;{RlWyUoxJ~*X9$`h0Pm?L@pp*> zh#LYvYtRen0q5GxrsR0GL~1RcU|WN?7j=?(vkx6Wu2WUau`uU#`*U`)ow>1n6vgTn zDN!R3rQ$MsMP1wkfg<><2S-`>te{)+uH@WR&$Ar)Ou1(0E9fa`eqfYPhes@ZIFn<; zpo_0I8umcP;n|(nbVtuPrm&wd&}}`)AEP;(a+-Hvdt57saPh_JpL$zAp7&nw)zFbT zzP^+0qC1Xkl5vV_At&utZNRI5J6_1N`oh>e$4-mk%F3p6<>Fxq1dmhc$Y*ct0Hb8a z;lYig%w`5+CHJi+uJX32C6QO(v^x1?LHm-TWo5X}{F&Ll>G5tdm(=R*vh8wv##xY4 z3muZ1(MHt_G#)fnb+3<~NnWm4km5W-jqIZ6j>jZ=yS$6eN)VTA52|H2E3+E0idgp; z7-XOFdO(W45iB2N{AuJ2AB;~mTq2Zj(#bqA;$S$lFWVs$v1Wn_?X2} zw#3H0)3(fG$%Q~OXKRNVrjM>SvltIyHTf-W9;CZ^&4v1ILG0ir7>J3}8ws#?E z{3o|Bw)VgE6;k_bdD8~Dl0qUm*uMYz%_DE|D;7E>N=U44v`!y&dr8ynLs&w*I$ zE7`jHjtmNPmycL08}*fVR!S5e>5jBagQkhf;!7HPb4}gj&K2hkc<+@??|+Q8Q$va2 zeLWk*OY#CPynrxk&ECEf5Ey9+7tzXN?x8UYQ&?Hi#HG467cDq;bvvxyS@4x{y4m;2 zCNBa%;sjXW@-z_qY{wkX*at|sG4x+HLsl@t*PGQl~te)4Zdath7 zjR<&$Aa5!2gEAJCL7(C-+t44<$>Z*GkY-5||41Cu;701PR zPQ5J+y`ZX8P8&-RnNM2OM3sbmjXKe)SmZnJ zw0N_$0Cy|TY>wm77zxhPcmdSJL=~Y%(y>GM%+B?d!pFbjMxMY}&pkqw%@NS{8A~4stN!!$dP<&_oyY z*-C=I7#Z8DZ{XQM&mOWviPmSFqxZAt(5lp{HO!I$uoqcY3;pX2X42@!_6e72Xci%L3OSEqIuo#4HiRNG)dOyZ}0n>0F4 zlRK9h+Bu^mKrBagzyuN!w9*16m82a#7lh#xhl1w&5Hx=)CVtekx^LNoR}Q7YWLnQZ zfSL2Y5qfth@uR7|+SHqDKFA6f2qGJUSaze-F|gdaee#Wtz&=Kmz6a&gT0m1uebw#i z-mYuF6tP?k62Aj|wD(#NjH-e@XPsWwS9GQEiudfg9kK8;(b*K?N25h;R=aeGSa zMU_#9gh^Z;r<Op_o@EyV_3x5&fDyt2$p|6dU`^vjmRg%IGcy{JjH%Pw z(=rV4rYtPEBaY4Jre!jbgUEKGWg1(!aW)n;amG>b!^!J@F_#_eA61R*314-YHM z0JFFLtQ|gRyvycE?KVbnS-*PTOHk5DZ;zmEp`73z=lp|o?^(md&O6!nZh>6LS0X^2 zn5kd7kL4&+OaJc1*a}*{Q<@E9Eo#O*GV za*_TjacgUo#ZCSa!HE05N`4YyYNR+L{6^3E1>(|b>^P#{&}SM*YcqH!BHK2ufbRxQ z8Rx)PRD`7tJ_N`v@^%KE+7YcLACfpaQS2>?h6=ja9xuUTvGk^=rm?tE>ot1w{njFe zw-{~rTAaB?i+q9!f0`7ZV`wz^M8noNt<-DD)wV5Ilb!u!uj1jgO@j_BQC!bzWV+&( zp{^jYLVbgu*Y(C`#iU)=jdYRe$M10*;ZwK94z*REt)LTjYd`mGySy;UUkjo6EAhqc z_(trs*5KQ2S_QRu9^`cIF{^&@%P`^8bi;%S6Ezh5LWmZ=M5^dx-=&g~WPJ@xtodw% zz3=wO!c0)aV0N3peq`MR(GyPKZfEtYbRxmaGhrfNr1oTTPQ9H@O^D=?2`nw_bGpvH zJz=~@e@jhs^6dXd+FM4|wQO6XK!6}Yg9L}5!QCB#dvJGm3vR&)7J|D4cXtc!?(Xgy zx#}L*P5&%JC$w`rvM_l zb1=~PspF<&91FWvrtXjJUMWrf?w5&J*XilN+?q!FZlYsU2(M&@Yt_Mj^_M;D7-fFW zFVmElzHVsKmq@kGAKsyT@Mg9@&jGOP+KP1O$Q=rA{qNAVP6`?Y$<{bd*891wEt@Mz zdrVbrlfP0XrzR#!X9%w0E7xGEkszwWg-cX0;DX$rv|&YCYT8YcJLkEjZGWv!Nb;Dy zh|<@1ouLH4WTqAnw`^y3KIHq~FE#sQHpU5sPSDV-L?qX-7FfjtNAh#maXGZ_S!~c) zmNba>yFOZjaVk5?te8L&UvW&+*>>Y-Be8R@NqI@@0yKqoW(@=&9PI+hkgf_X5*?4Q za{eolF|afth?@nTM@d3 zPp#8BtyMlXxVl!m-luqP#Ok_iuGT^LfGwA@Q{ZT(r5Y0hE22=SOY02eX^ur-j8C=*e>y96`($GsHjEWxxVu=VXyeBj59o zFg&?sG<4;8Rl-I`e^=F|?Q-MYb;-zGi<=_M%`H?D{!o!ddM#AT8*_`+OJ{u=xgUF4qVZ=JX%T&OPKo`Hk#%bEtm*xXuU>o>N2q7n%CZ5$s&(@ z!ay)ag0CeYpDOVXTqm}VXqL}(cf2ec#QBvk8?eS5&XYo=MItdBj>UI(u!{~}kDC$3 z6w^Ud-pn~Cd;EweR`aQ?b%HD2&gM|W7fkE5M>MU|_t`d}{#sIt96{zjCZAx9)mg!0 zuaimmZIk-bak7dP!LG)FE6uin`N@_a_IJ#t9Z=I&(i z+DLF#k^WS6gm1_7@Tx<1B_3`?MmORHl1QUvRpX9F@g~#^pnYKB$E9AXJOaL2L|2IUX_gy}+HwB`) zj;Z&yS#otu=!>Yyl!zZ)tK9tY^h8=s9@uKP2K&o)NJzDFsp zSQhxh32YKKqu!HKyf-Or8IHEytmoyxfWSG&$u@ilnyI5?7-k>2BoRB@=iV~6)$@&< z#&)fw`1t+25Z!W4g|u_O224ZjX&fR%$UV2j%*=2PH}NsvM}tIHYtOM{lBe@?T_0Jy z0SzRRQ1jF&zM*p@zWrn3Tnz;!Twg?MPi4UQQN1~85VMfVX7$Y-b6^5-Z#QvEVbIU7 zSR*D4CQ?Y@g)4NALfTZh*tv)Ipxy*|tS*EFl3aGuLM%z)Di9Nk%FGbj~I+yhoocN9GwZw=E z+p=G{mvT=exqMq_h_t!7Coh$FMp}<`L9QU?mm!zO|5uI39{4KptF_ z|D6qwx=HD0z}j#czNKnAyKfzS4eFM5m(ja4IhZ1at@4c7I{cZngeV;y$mPK`*vqJ~5K*P7`E z6zK+@c=dbG8c;io1269jNu%FNKR+9@K7ske|5SJ_l7E?NXX|Eqdo`Y53|7ek* z)Y2d;zXR9~;UmEDsQO_<&-M9)Iu+?yzm+Ee$V=*WQDoysx;gvkCt}Mjt5QX_Ph)0u zO$NQPGQzZ$9;);!qA!fvX{k-6bG#|HVpB7qrgKzW%%&Gmqf6K)9xGWK#LQ2k5?>;c zcJ$e~JhVAqxF%ctxYU!cl3rIT-!TI-2JKNzzdRu-x4MX5;}~nR|6}|x9VNqIDOK|&3bWb7 zxnc#r1(uK>gbU_SLxEDj71V&{OxvzoYcK$8yco9dRsRby#Sy`}c44OE$CO1-AlIRB zUiR6>cdrDq(uP&T+b`PdOwDp6b1Ah(A_QhyNgNEqEfy|bK;d=DX@2Rzp>*#pDyqvk}c@;lc*8VvBV{tt2b*K zVb)k$x(!914}m9V%mQ_)0gW5Rd`^Z6fT^njiZi+g^PB}+_9{O=$=#V5lsi{JKv%6g zpC484WlJsPUAwY zsp23-l2TSLm`{9=wQ{$<&Eta^xEa$8y@iKtWunuO{1$-B<02Uzp4_6OCs(W=W}}93 zt^6s`>67p*K;%)1w`#RjjSeM$T_9QZ3-b%X)r<*FB|;$-q$voT{W}YeLBfCe2BQ#E zE#S1mROSzOMMsuQ)`tQvn?y-X-nZA+YI$mJy76lPQPppI47XszDizyQmhM~*Y)A?t z*zXL%IjfB5n~Bv+?vx=S0E55!&Fo0*a&oLs;ytwTa~U+y*|H5MsLcidY5Z)^l4P9}0{tAoO~ z&kV*dtcoiSl@;lMG9nRZ_NF&I=XZ*fLM?H`A=`jlO$b-LMq8biCEi#6NC;_{!*@DY zw4PO%3VxZSp>Lgz_>PPF1!ZQEo1&>x*WIqS=5_uxn1dIxC{Qw$sO3zb34+Fjs7a&zyT1 z9edG7t|Y(&{7)$0j8{lhG^nOzr%1u0gZBSL0!l%G-|)UqfIL*b1(qft4*TgPA~Leb zdd&l;c#pYpXRxcd!A%SfzsB_paV#a0KRrF8!ZZq&K`2HWEUCECpx4*DIquB$gXrc? zi?U?GAf?>1V(SHEC`#zA!}l_mU)<@s&p=ZAB-(=t_Ywn^Y^A>clS8D$5$JJ*Udu{rE`oiQ|6IR=Z$gDy8UGx9Jv>swJ4NNT_+o)0<5hJ@iKUWkvI9;0 zb>R*xqc`{DVYK-8qKq&brw5c(P07U!tVLuzBf3gBOXQN3#0@RPa$XfLRsQ*6d@1!e`9BF^-Jg%S~@ns!#p8?1aJ&*4%=pd#?f~>29 z!bJdEM^P()58V#|j$P0111$~?4&t_gmZF6G~ zazt^@@&S)APBlXQSC}wkgdhHlf?KZ~ubNF_fSdm5iDI=Y#5RzP9ez^|y668DSdrx9 zUmS5~1^5_JOPJ%%ypF_xP~1WnH241kW&Fmu=E3kjuT+8P8HJuG*}Foc(?XpdF2cV5 z*8?HN$=LksL|+fXOw*8fRFGf+wg|-kd2x*VDqN@YIlvSAMwi74%yLJ`FT(nMk8^)P ze+Zg{{9kf>z-R!dKdKT9bf4V-T@^5yEO7hl3Q2T?F9CBP9S=Jhf`qW&L>geB`4_h5 z3lC`;h4$}x2LXLACW(bLAbJw54|x zobgtgn!|OkRZ0d`NAR0p`AaB=fBmZZSCm_5^#pVwvM@?PhFn%f^%5I5p|ey+hBVeL zT2c#tBL#oECKjp315~Am&^ERFfD!;(ZUNzp4W%m54Z#WiK+9OeDtHM2rM>I^T+sEvyU=E6UxGhX?ZW00#xoUsc0b0Ps6w00YAH)qXsSz$%NW@oC%r zP3{rDUbBLDP8%#t#8&{4r$m3L<%4E)Yk+_tfL9MM56XpA{rz-7l!f2qAFzK@o_Z9{ z*T9Cg>N$iZ!(^E%5z3T3PT~O{ZQvO>0}tWv92*GGG6YzJT>lfT<1aeY0Px-4C6vI3 z1)@WN?BxF@pMZLNip!2qulujt z;i&&-G6>*Zv-5f{Mrf+3WLCZH^WkYg&~f@3Z8Xv7nC>$ciJpp^bKfE3`hMR zX3IYrVZbraMl%Yo>j<)@M!n?%jI;=#pMrE`J{9gppILZcy^IfCF-zlI zueP0?noYkx$;=b#GTD1!(y4=?Odr(VCFQ>y>5 z5J!OK`%s`!;}3h`zs@CA3&IQu)MQr2@ETVgb_>5__tce5bT!(DsX*>+bkIsz;btYS zas1z8BW51{NI=kO*NX{au*p`|Qufmh;^iF^w)X#ZTT5U(Tp~OLtk~>0+(^h!d-HY& zl6eKErf1w>zqKU*(^MC+zepGVVl4rzvG6lfb06hhzA}P0P94T1;EnCebt*<5Fu7;{ zZ?k}5__1z=1L-=sRi+MyFA6@-d|gvkfEM8;KXOgj=2W~mAe964(g2RF{pU;i<5m2( z8ISp9R)Bp02^*hZ{6DU+W&=f{+G*g z)bIX4bufNaWZNqbkSiT|0P@xU^xFSL5&N$I_>Twv|0_}oxg$Tlh^(@}PzX(rfdN0_ zA7z9~1$F)8Bwsw@%ml}|Us*CnfDw4;i>G?aG8uNp&BL+h$;ke}(y-(Xs`vnxfxyp>RJzvwk zuLsn$F)%PDUII@a+g@&807X}iX@KPoSdcP&^8~Q>vqPXxJhh%8s$HOjJs;Ii-z)_N zPQVvI7pHsT4KkWv*2$*JtbrLU3?)KFI~3khJ7>@%!9D@2nf;@Ng0MWTy@D{QJQZT0 ze}*cmZsJ#I^z4rn{vjF2Xw!jJ4aIXg0%7{FZv}|*D_r-x_b|HCqrg!4A;iF73BgHx zAfv!O!~AsHAH}1QfBXC6fBr9xYT=J>@*5-bkFqcwz}5)=V|P^kQFN<+9}KiNArnl- zZW7kDzxw;X&hXbEGj>B+LFfDT38Jtd#~g;gx(U)m|7W8QukDv z$^N2EnUMIZklhpPC}@5VIAAbyA{A!7 zC}@L+Py$3010Mu$eR4@jAmDy!GHt@X`tuh0e0!~vI=jO#$)%IfnwZcZOv@T}lIETY z6!~aLvW1^+>e`+*310RbIbQ$?8Q6eMEGFY6_tO@j=D~m%PDVCb86^yM6wb1GBSQiv z)M%NA0uqW9c|wGA0z2blCh#kN$}qRYb3P#?r|6y>Oc1-kI}6Y+JI=l+6)Ah(tp@=H zj=xSmx53k%0vxS2KtJFasQU&N#UQ}@$MXU`JV}TTSDGO4$LZ#}SyV$Yo zpQ-5pJX%2K7d{Z78K|aJ(|)b$@kfhbg;dyRc)o~lYj)h9Snmq5sb3F#CthqzKsn6R!otGJ3XheP?9aDs57B?C z`2uh%Kkp1B=H}*F_Gtq*63Knh_x$v0o}}l`W6w*0j@_*vJ-B_8xB^VA0bP>Q`Mlom ze_X-5IPk5*Re*YD<8_&QWG0i!dA%9Q=k@Y*JD=|N;g5D#8O49WGdl{<^g)(JbJ;nl zzdU$v@^mHs`4D`mNo=90clmAPyms19ZiA$mydLjRoH81ht)u#PFSCt!EF-4;#=FcB zivl`WEg4y}zQvM-P*(W2i(HbJcaw3kntcOxad97`N@f*;_i?@bYZZtnui{ z%%<|xdhhe!W!PtgeRrN~YHWmqgG0SqB^p4l&s?mtG5N3yQ2l(bt5*PNant>nEObdD zRkF3R`1Ozas`oMeK zUu+kZHo{@pg~t`==0e4}djgCU(Ek*u?&Iu$=-kIu z3`tfeqF{}G!*&>vtPX11dImC1R*3F&B62XHH_q&H_GDS8^%-Aq(CqtOqMxx?5vaqU zUO^M4QQ?eUhqJA?oC8&WZhM*U?h%uTw?&YOTqC@3Sg~;A`z2z8V^sxpvt3bZ^keXn znZ*@h1u96|8P$@CBBh-zCo(=(6zf0+WaKB4B@c#5V^>qe(W59*%UM1SM*jc_s{jij z@1wbjIr2_hRhXTJs`Mwzi5zj_VTeiMe+D8$9N(>83^2dX%TAbA4RNut0^a7#8LY|2 zCrtox_j6m(w0RW*XB_6g0_5+Qh6wTDTvGt)-9e+tD1ME4i|Ke)Q~)%nHxz3%-9&Jm z_&C+RffmA**!=KE3se&$R7#`DXa*{B=rrrWI^et>Hwkpyk86OMcZ{%Zwq?gjpwAMa z&HxN-Hmim20Y5AH{y4xnidg0@9NaSSwgE=@THf<2Aj5MsUscxj{6H)k!H-)ChzEW9 z_U(?jr|Qpc9>Z_WqmuN2`W#NO6E2_=@X8UCD>*U@&lUM+_!jf$PvV{xR{ZJkM{kG% z1A;yJ@P7yPpQjC-ZY5=+^UrImf?mxo=lZg;NS??ugg(q?c+xOV+)NZ%aerKY0XcHp z?!%lxXa@@Eh9bJXhWBvJZ?0>Zljl(C={kb&Q^IT9KS#8A{f;oEg)-;l-doC1p$NV+&>QpoQ3&S^A#}EPLOSgcJrwdGCh2k zm;57QR0x9c%vLDGs3QJj^H(Q`y@rTu?4Apv|1?eAV&IuO6;F}Gz4}MnGe`wY~d ztnm29<9SB~jFWg&EFs(f2%_z(lYfuXfy_54E^3#1Mk|uThOZz-|33iS5wUjU&xUHL3at$N}!8zdV|_IFVO8Y?L-3 zmwd}oaCN;0#9QN^B_pMYzgnTO?&u~0gEI4%t1o_YH$Vb1%+5hd0_Wo(!F8O&!Bj!H z2YOX=NVWW417ZbkoN^k>Ia&knew(M?E?iMYiFS)yG2b%O!0n8N4IZxt`^RZER%$qI zl{JT_>sga8;0%uT9 z(q8VxKE59q?uYr_U|~4Csya=L4#F)AUx8_yXNyAoV|t~R+#~Z02a~84iXYn zShrHek5wLP1SPDLwJe=YNpo}_BHam_lLx@?2Wn(ErVq=n1{@Fy%H$bpnGG9tJN!u8 zOBExTYyO%6_E11q%f-{_v;ta@`jHrS7lU*HeZbUj80{LUqJa~EAG`jkpjcP~S7*-( zCG{cyPEmp{pYP>b3}%=lQi`tq*O#!__(5YXs=?ZY3fsjbDBfs%U34YEQT zl#DdbmPuic4s^fFHvvaLtCe4`X`h(XHIo-_z5)tKmS<+-c+w6*`5#dN&+lpiAxqcx zx-2T{$|@=<0s;b|rR@(7ZZ4fJz@$`^k}p?1ToH?s=e3eVoATI8x)Nx(b=}X6-(X76 z8^y-KsPTGwSXx>-I@cudezbdckn}8Rqw28nLt=jxZjplZM0oPUr5#&lTk0kPhDgP%?$oDTSsSK zEQRH}P!;l&>bDGydPQV}<<1M3DKj>hHs0`rg^Pt9~>@YGYi((8gA16Dk= z>pu7SI$A{BBM^-pUf(<*@pr!|DL|H62}5LyWxUvNz^!86gIso=#9~W~S_!cRZ^bVw zBPfCbMT;mk$fcVv&fZL-R+(&E2WwG*(MI=ct*-sYMu{%W-!gYOv8SqNWlfe9%^^Mf zrKeHb!AJ7<*XRirG-{5E#};8BXzA+~JxA*8YsN>GGCeaS5hgegWT0&a%`nM;XFxO{EdW?>$nbnk!k9KOHcZX_*BoFWI1+ylo6Ei6i2=x`Z>VUg$(V zu}mPgs{g4bn6LT(b2p+vy^A$kbEb;^{2k|+8ttQiN283+u#tw$GJ?Y?V?AuLSM-Vq z`=PNIP6k1*RdMi`KQxYrUwJV)9K0Z(k>Vvz<+fXRSik{h{bKKzG>h8AN7Go9;x@3u z&i0vtbiq@kYFezRUL&^TNCdC18j9#RZ-$7=Z4R*ty(4oom5Y|GowXSc6SiSoUPat(0a)PHDIh_y0 z_!k*%4`9TXeN?JmfM7emLCAuUZE*JNmcdb5lSDAm^YSUrNb;iW%sZ4~gFiXo6DYx- z)vXt!+_RcrYVONO-XHz7}dJ_s4|qu0zoA zCk7i3aaXRT>7F-O4%4q_(eRzbh{5yhx+;wZ*FRY`i=EOHS>PxND9q2*2R%=zpxtdH zCt->9rB6*}IFw@J<0{c1OG^fHmNa9t8|BF~3Cy-H%~N3d#|$La$snlw^Z}N}x&0C*1*SIITS-3k#n?w94rQ%BZji=($Sc`#ibrUVt>49e za)FjI4Leo1ZInaCO8*Z0X3}ZGS|wj^bJ8ge>(fElp=DH9p-j`kZhlfQ*>I@xu1unB zN%zW(M03Uuccr38l#}e_*EaR;>v%>-R^_5*Ym>^$Ny@XjVUj0U{U258D|7oD0>+*| z)q0V5Tp*^TZSG#as5)%$mW5NJ^jSfiY|gFI0oEJRz$?ArDVj59A?B^)9(C`}J(e`w zEC;(N7bVW_B~uM0`L+f9^F|YX8k+E2P7}DX^QWWCeF2^G>b)E#)%>cSQa?`Z8yYox zy8Z3>8Vr_&8+ht-(|v@vYQ#R%s<$E@AAd}K!p}L?Of}DI2je}2ZO{|Z>t@2(<@j`M znR$m5Jw9ISZw>uIrmkO|&T38;$}H`?i5l%{rhOjgyy5ujKBu}UmHo#^vihz!>5jLX z+JbO%1}esP7UU%536kQ*5Bgdf?W_}{5DvJW5NGtRKQ*v>RqJxQ$9g!den1X521HjTWjaYS&JT-3tlz z%A_CMUHY)7MpU|FsKb3q3U$QN>_QVAuDjXw5*r66o>t2ZQ2HN1BS06&0gt?_o?d_^ zNS>5D)v%%sgm5J25pePnPmO72J-(rtcqApefa=9C(}hNgq(f#u?uEI;Hy}uVy$k=N ze>?X|6!pmJT4%+I^BgU;W-ymdT0@*6TMst4MuQ~TBKbXQKr4pU7hw&S5VX!@1p}+e z*sqtI?g63Q5Q7H|0pCI!@%IP1QClM!O3ZO}_}P!+QvzSH;?E=h(lB2jF%G*24}X-U z`xX0BKf9<%iOEithe5y@nPR#tyLdB09R_1wR*X$8RjcHnYIvug#n{wUT^TOZ#;HwR z7$&SE{|9U^EUK$n2+Ts-r4!r)Qk0mmVCFmL!s567hB5xKv-5iF*?@qg^RcD)rC{ne zIcyz@iTLjt2>t3N;-JX+mtj?ibI%&j<%hh_QxZ5tn^d|^>~3EW^*{?!fu3@+d|qSD zdB9jZrYK)Pun-$&o7-*w}ok*mq@ zPHGaI(U-br>Qhsv00j$n^PAA=N{GOOB@b}R%}dz$;nN-U5)&=|mv^p26N}>69ird2 zl2lsTAIuM~WtZ$?e4+9=xUG>Ix_C#xir>G}XCiWr!06VL;H%+g6#1z-TWgnkLq0*%V7*Ro=k;D*hMuYnDfN>FI6#@o)|fSIU@G$R!$S3_)sV zQzw%-b))t-?Z^+Xva;>0+{7VFW2>vON}R88AQ20J@qJG1%VLq zjT+-kc(RS=NfvFwJtq#y9Ma7W5~yzhaNU+DL=Zt>jg>I(U48{&vJ0g1(-9Lii0tlT zFXkI^(3qJH&DX{0u^zEl6^^d1n`#r%YQKLgEyv1r;M#;EakCfDTYTbGl&eLF_n>-m z=(IQ*eG1b@-jomV7TyKq4g>p#KtvdI%j7!7%3RudaIm3G?-nIpy&6FF~F92bsNUSGQwoiApig zpZf2K zK|eI#FlJiWy43jqN2NwX1|@=3(oXz*Y~!wZ_b5jR%I0N4U382b8Jf%@vS-o>nn6_Q zEn$0nnOs;SbuwlwR_`vydg?QS&AgYWP_D$d2|a#!HD3nBx#Vrb@eixya7?@fR5Pcr z;caxq7Afgbb2+I}IK=T8i6=A9C&6d-cNsNmtxIaG(@+M`LsqOB$%$}xOe8xZ5QXH& ziaYO?;4vX4+ky~>@E(zxjT4NZR>x80dOe>JoKs|Woo2OOe}PQce*p@7FI<|tf{?0E zpvcLzirx)WQ4<0aX1@GSc{1nsk8^SS&kMWz^oOxAu70jbNlKh?h(a*vn39}vT>pST9jMvzY+QKA- zhfEq}5hwOt+7R(oyhiL86I*Uh8pE>5-TOChfZWF>pmPl`F22a2j`nel;iV^#Jn@G# z`Ktc$93_77>IbF9*AnJ3Oi;LGNrcFdd}D{*Usi5Ah!2##OAu2^QRwmuGWC_m$m|-_ z#Ph!x|BQkSWR_H8$rBbe5>^jZ<(7Bw7>iSl)m^AI8w-{f=a?h3mCL>QqQ5ADP;W`c z#&$Xz+)H&;erbPc7c_Xi-tO~}*eyq%k7-U*^W?C+{Vn^wb1a|M{E{MZg39Xtd$z+( zeW>Q3YnwD#@fh~!U}5HHxugh-o#{Gj^e~C(1BnOXwO|A~3Z3}8} zhSDeO`yT9EpCq@BBG=>dJYK{slw`B2SUa5bV4p?Wq@8PKAQ6-p!h4f{WE?4*ASRY| zD@^h;Qhb;*>Ei&_q#uqPT0HI<^WnQRrp;L<$7v}k-2e*--S$HuC!Nat8W+kgj=yyB z(NFTmZ_uc8fKM;Sp!+tJNzG<YO$$-MAjbsZK`=#kkf-IBcWi9isnbIph zGSr{2j3YiT#M5aeQh9{C_V+2Ghl=nuh@D-@2BxZFJ8LT{v(@~I&787L0a)WPRYyJ5 z`c>xY1aw&Hr-Iv;%FB+%1+Oj-bh+bNYWwQi#cG?L*VRfV8?(H8z2%7XyyvMkiUw}e zcbDMpp#5xq!en#4s|!AYJ-l7GRT|YA7rsL7bn2n>7CGi}YL&>&T*_Y#_nqpgZbA6O z9_bn;P^}DQU2vJ9?*0||YtVWj+&%nYA*>P<3nu-n^@84LI*E^{>8M$@e##_|wwM~8 z!DcjZNsF`-`PRU^ZD{dxut;lZ_9Y8UxB{tpRR~-A$oU9(c8aS)WUjSYMck?scI{-w z8K2hS!mA$<23J+{w8U|#Yz=dt7pOH#m8cbi>C}R0lqxkDGj#(M`Nc>(=qde3uS=4r zx^?@@uNSR$bD9kl#<|05XTI?*TKVkxN`6_dUZ$<%7amzpBAkUHe%ydggo+&fXY5L;Zu=)#*a z=8r|*O{R6BPtr7RMiz9(hv6RIyX8#Vphh%e@!nH9wPq|pI6UQtz%;|z{qd)H)Q_Y~G>>e)A-7N>I z81=kbr*areFBWrVi`8{MxVPtOSw+~|a2YWSfAGa8SimCHnoyc5hwygb%obb9(ucOC z(LA*+rpt-6r3^MKsfRHz^d{eo*Jk9)gH%&h0k$)9Q?c*V=3NesgiQ9FY<0rqUh@hpSk_{w%km{c^36vXF`uG&H^7racAL#$ z6i+UUrln;Hz4~>96pw%LB}YQzE9&OQ>AA{#6(~8})N{UrhKEBKR1V(hhoFUeqoHSe z)|!fbo;A9!Z69n>It@g=9yOdg;Z+bRF`MQB3pTW4DI3M0?8^GgtF{aOoUT?7HiOPn@st8zc*%v*iwz zo)g{yvvkJ01h=1%9xK)w?#WEvzRC^;U)<`tK99>0DZh264j*MZTsqLV)eb5(wK8KA z!}uPJ@FOUx2sfqtXmr8a8e^DtJr*aC?uu(aQ}a37fG>^e%`2C)j@O5WhkCmF)!5*X zH{0<#KbjX&X0g+Nyuk#@Qm}T#?W-=0n5=}(KBgU;Nqt=ly z^w5Mo;ZR2%AP_y~@|0;^S~zdEPLrzX~iFLPza=ID$<0 z?%>%v_vwgno`=btgrQU|0;&k+hP>X*zoB8RiECsYFHEZuUwcE-XwTRZe!!(goJd&Y zwz2~|<)w3o+FD;ZkIoD&>n`0-ttGnZN3hp4Rvg$smm5CBL5E+ZP8fB#$RibV%B4Yv2{TnDe~BD4 zUmmVMDf014g4Zo!G?qGwL`UO#s1#wxWDwKHn}p1d2sTjh-^1e(W9oF_Fu%jSZm#Tz z?J!F?y%o)Uhl2jjsYC<{$`}qZONl2*_$KkSP2dJAQ3W@!ea4}j-huCbUUYq6w2{yP!h9t`_+ARITnR8&*eMKBIk z?8h$LU}Gnx8hx`8HGW6v+1jRG8$5%KUAslx0wD&@Kl1lSFeJkc;TSEk;n<4)DrasT zw?;AelR(DqKM6uZB3~-qTm!c+7fdhV^#n8sQX@X`&-995BUvJc5n^aR-}}In(XU;H z(Y3;GFrbtqWNnO5s-pndUVf5SN#%hbESp(%K6243!g({){kAKSsYbGi2-5Msig1bR zXt=*4hL$`K)wlY(oGblY!~}1$ikc<;foXLQz{HKqE{CJ+t&7Ww`WOD9=fV~Ujj)rh4B}#X>c3e z2wV=-&n@K~46Tg@#2gXK01}FfNct3yzYNnm#xYz1juSh96l$JbX@aqjW7F(wrP%io zWkTd*li|c_0^hHrDtd9M2xIcrPa-Ybnt&^^aE3l*x)=_6-Yy()@s!hSt>@vvRV6X{ zkmao4Qg=T6nNLqoM^9!~nwwtg8M20Ip0+A`$H(Ev2_PRKKu${1au#C;x!tgJ&OX1} zS1*UvqidQrrk@bnHdwWuaX#3uYGVfO!pL|46)id0?ftB6sA6c>sLvTZ%3+e4=lEA& zqw8+1&qViRlB5G9?5du)iXWabC`PY;hP*vrK4LngP7n-Dvv7&En{fzehd4TQgJn&= z(kcUfe*7@L+!DR3g7sT80 zd`?{hSrCXsMMc%3O$T6De4mfvm{GXIqHntdVkf+R4dIWnBzgXr>JFMu0i{rJu(9XZ zsG}G|C^J7+m<<&yh&z1YcP*_*9#*{i*s+9UT0tbJxzuXop$<~(nA^qfOv$w)s}K;Y zimqyC8;i$x`E-AOe}>^Vx@*Fmf7jdKx67HeUIN01K7YOqE;WRSX9tlcQvE^z#JP_W zVyv8*g~doIx}uyKwjCxN=uI#ulMJ;?CL=#(z)*pH*rK=HPC+(DA;0>#!-j;*j!YYu zOTo^-TT)5#6LoN**U%t=|1s@QEVJFG5B4qD*DGqNNJv4Lb}@-PVYh zW#X|p36)ePg1s4P0uXtF-i1*Z-u+8WA_*!UMMC1SjBiUMXMoc9oF%LEL7;kWdV9Uy zrtxr6?6U`hC<$^n7_}PX=M&AXFOc;jU@I{~M?X+nXm-_6C_E>28|_@{T~l!gc_A#o~JP?yWRuch@k5J~7;utsFq% z`p%P~n|n81q!J$&7l=coj;8IVi*7jt1~8Zk!8>|Va!CmRY7yi&fMj7PPahP$LaSNd z{>bJ*U=0gcd~&aqgMgH{lL(Rmv%s5O)jo5zPk z(x+MYt7Cq+4tK|1zdZUuApN)ydG+jh2P`3t%>f+DvA}urEl&Ev)l^(n7F?RELy59R zky0!SOK;_PLirHz0Dek?anFM2Sa#_VED-7EHk_=hAdd4n(!H_~xo4N`pn8 zVI+-}W0gohe9|NY3s@I`c+fj?DtR33x;CfI`Qy zOd%XLYbgN~IYVcZxu(x_rHS9Ql<=#n*@fW4eJvmSaBH z+Cws!NVf!=-4GIJ`a@p`30zhsRq&+VZpd!mHXvobyMnNKCCccV3MLis2WA=zX|G!W z*SPjKJBhu$Q|E7>yi>*5=^#()0hWW3aD(i5`{Ut7S?2*f+w#>(k4D^9o83u8r<^>p zLwoPrGuKQA)bY>{@GF#^ZS-}ttq_c(0H+}X|8+D*(!S?dl9LF{t`u>>gt&F(k96jitgWE+w-#e>xCHeX@7k5^YSofvT(J2YJVT9 zy&Ne8*zYR`0%37M!3R1z0<}~Ig*?Hc`q)gFtqh5!DN0HC7M2XEZ?s4-L2~O;r4ri^nm)PS? ziIXBT^*Px|9 zwAJ)rv*-C{PnD2^wB%RhTU$}bFKhE>HY4bOL|wYJSA*B>sH~}SQR($d4;fcn|6K6E zxy?B`{T4Ore1$kb5UYGW1t`vwV1yCR5aaC3zoHB*Af{-(Qq_imp+uB(zd5@9wfYia zr6>$xDsQK%Sc&a$7U+FbmEQ4rsVDL0fq?@~Xi}i3jltcVR4Z(3Stdd?#Ht(fUGq#Ghxsm1ncp5-YYFF-3JA08`KWa z4nIFXx}NNPNg@Of1sh^<1Ej3hxh8!{NNauScZy2__a!}!E7)Eh6M~UV7hd-rS4#4Q zK{{=>Npc@631LhPIC|yt0l_p|0*nmTlsQRW37kpvH#^Js3Pmh*R|2`A%fbU7xU4!( zN?R%*(!qZ+WB^a78%$A7=q4%O13H~;bUVmK3t!bIEHq0-O#}=YRw{*^fxDc)M^EhA z?m*TO67L;hvyfgiatxubD&)YxfVTTFi=jWL1Fn(z&dkgJq|dPA#!TgTDKJjtR2gy) z6Hb2seNL2ty9O@C=L;lYOTKgN!k+)G@b_N)5Cw!jX%>|ESyKO4#1Q&!y%kH}b=w=u z498(3YlF-tI*-$^4oRgER;=GivH2ojJ+HkZETwJn zs>3x$gc>f&an9`dLprbS*Vr3Q8TMv9pLbb-zM|&a4vWOFnIkzLU00czQ-`MN-vP5v z0zR+DIeHT6j~kHmwfq}z(qC20pi;8UPCsTS;_REPeqKTCgZHmXP?VfP=xCODeH@L3TWWa6g}Md? z{&jc2SArk?_xyaHIO?(+Q)jH9<>_XzZrNGm>yRD;EzGEd({i^AbX#D~Js{2e0<7V} zBbouiTAw&TSj!DAQL?r^i4v^Ix5rR}{CdJSeM#&2A=uwb*`fT`)O54DsHJH>Oz~tp z=4ebvFN(1DuK|eEoR$FwQ7Ue8g>drXqFj*>ZRgrX+By+Fx^zAz+T^urTqkx!i?467 z3njZ-U!j*SL==jTG#03zt7SjxYmJlH^?Egw^&T5>3p5~_RyUh>b#?%dUaQY2ak~Rc z`gLQ(K8;^&VF9;y2VUTG$wtYv0)YI<*>AS>Aw)pJtJ=Xt@; z4`C7?@=aAt$v`pW36L%KbzM3IM)%l2qy2BDTL4ow(F7@9I+-;#K3=DmZu-@}iCj|e-Z)IgwzZhy7 z)t>(rEC`(}^sBFK7sptT#3Vqx+{h7+(Qk(;!+kK-JCQ%)RVgIE{63+lQLFj+}Q#b)1o`QC!K6jAb1Y=oCQ6 zwzZ|?5UyEp88=&M=dR>nKT?{v9hxg|A-Zyy%TGqN6)l4I2N1(ah0G}2i6k9v*-TXm zI($06R@Lt24WGdyS*pd1TkDDWFI~{MqkBh()!=pLUTK8#)LSfcg>q%nrh>eZR7tLe z>DIyooH6FmPQa`S?5{jd52r5>4?*;LKPdPfNZEJn*o__h3T|&Dwk{L^km~Y&V}6L3 z^nE3P;>?I~m{QS%UT!$u2E1+a5PQBs zvvoK^wP_h_3%yWGf0Ve6?G)WuFxjTN8XbF|@A}FA$wygZ@D3MjHl`P6bay)tBE~8Y zdI~$%e?knQbeYzG47JQ+1~*3Kh_#q{Htcq9dy3tcD7idgpY+#l7&&8;b*~(ao_ysO zeo@iaLvw=>mHK~^>wN%5YmSJV=2N9M(_Ak0p47CZRjIL~U8je)N)DE6Yw1`QX%RNg zEj@3U6Cz|#DWdtzVQrh4S=1+@3PoxEwo!E6i$Ed+6^Cx6*UFqK)D{#B?*{Jmpf+L2 z*{^b50o`$s#9_^LeDfR;Zn64 zb0u@h80h_$+Q9#hs<({mq7ApUmF`aIM!LIOy1To(OS(ZCq(Qp7yE~-28>EpCcm}=q zyZ8Ik5BNoK{>;pEuJc%HRUpg=wM?IH#VNf$F1QjzaV0sQveI+x40pX?A0VkaeyyYw zpWjKDyRhA?&}kW(sTZo`jVodcy=zHh4Xmkx%D&mEB@P#SahUa8hFHCRZ4QL8$MUJYgCM%9{0;7?c3@FUs;PZEog($2P!_ z&=&y%2E$ID=RpDM_a8S=QBkJl*rrty;>o!Fd)j%n0!5)qo}vbF_nIksl!j9{Oz0UZ z;pNwei9^VFxYqn}Y|Ux{O@tAYH)HxiabA+tL94oEkycb6P<*W$P~uD8m-I#Phk)lj zez4o&UuDTKH~G)~A(fL)!HzoVV=O~?NC)Wj70lTr2@kC{3v8!bhvkv>@Vtg@rV*!} zd&9_QM!UoN-QcYH!;f;l*Qj*n0bIbLr~A+2ja|o`YQ8@(5^tRV;u|nmZ>L*DL@N_S zMX&~`pP3_cva?GOY-6vM_O}E%xoPy}t3qv^@KsBXEwcBnJ|@hYP$*B}kX`=5)0X;a z0JolT=X6qlU_=;;9;C3Y%JMr^nax3h>yR-}|L{XlkD)D6RnE3^&?v1&?$j#r!cD15 z!>7mmT)P(^*&F8c(|hM(t#Xxw&@5OhN?c`8tmG}ZV1*iWh`TM0Vso31V?TS2ap5ii zJrfB{Q`s?Hrk?Ws7a`IZ9AHuC&}p{!f3$nxE3W~wV(4}|Gv<54h%YQFI|YdQTfyW! zLLbQn7=`!_)f#By+bZNTdOmrQ3hoYFL@DFoS)*dVF8gmes6Mfn*xns5Lb zUuuH*cQEJ0c*m;|`TroT7Kcp$d@c=6va(+*;KT?=rP$)O-IdN$1(wanIJEZvPEj%S za#*uw=>A^6S|C+rGMG#vmaSt{?bShy7s@p>g27>N0zXVn3*Bse@(0d!z$w*HhI$SX z`u6^Q^54N}0DYQ3%1-&W^;xvcr_oHrI8@)*XiCfDjqOCkB=S7f?RX<&asI-0!%v^9 zY+u=)0e8`MAuQl4^N;Os$TKHJpt6l@1&$s>s?`0Qij-*YPNnq=-xTL04ig23zzA1S z(wbjP;B&zAL`bzDv06g|#+ug{BO8?i9Lc5S?NOn-KoupH*Cy4;jYz1%=ZF4}1?D@A z7+yik(~>bJtqel@OHqfNd#;|md@Qk9duJ!U?sezwPbre5Y{d$(Qn;k7Kq?2NG7bSw z+!(-p)tvadX4M!Wx-Fyn;o=e)tL``WwPC`}v9>p)h?t2e@~NsMzM?!gR{V#A0A5 zLbT22Da?o)UaFwB9dIT$Wl#YSsZ_fUX zJQ~y!v{Gw;gWu{B(r4uWA%VdM4lqA|{zOX9x5%(pl|1L+1Ar~XLO;)&33dRVf1VL1 zV8ls&SSfxup;HnVP-_i~_VCWDg+yCheDL;lKO?gK(G4-3r=BKAB_Ozf^c@mJFNj;} zc#$fuZG#eUz-)HqUS3|H zMf;=6x}pk%%kS)Wdj7fVjoY9XOkD$6s5ONC11y_>341x2y}d6NqzcG2?i`gi8CD(m zBsK5t_X2EEMmmu~KNvUmWo>#Wz=lzai_i$MHU}eE({79cGJtFReOQ^kFoSfGZ!GJ$ zct)(PHY1e7RG=sGnp*D>=Dbd5>fP8zivf#Q0W#Qy577U=O5%(l&?Z--CH#O492>wS zc?NmmNkjV)P|BKh-}Ny=h2uzCd*E^cArFkMUnyQAz<_2lk0a4QU)4(ug9CUlY(FGs z#gatw8=xCUCJPrO8>8m08KYTfYuPND_iI)S4ZPZ|5N~bfhlkASZX94N3aj_5bda7J zb?z*F3xn#OK3rMR#G<&Yu=9ak7_D7BX9!{x>Fq=0kIFg?D~>tue-}NKlxCLzsDZ8y ziU-gjj#^ArlT5-Jx9Z;ITHsHLE`3nL218@LNF(j-?FNvNvS}>g3Xa*oGuF590*Grf z@V#bxTup@vB|C3iho%Xwe%&CbheZ}h#=gi`5G%t=DOd{>6z>4u7(HR<$b|(}tQIKL zL8V042s|k;{a$~uAJ|f4y|sWK1MHgw;6RQ~ojP8hPLI1me#n#AeM+X)!+5M)9W$5G*FL;tlBV?&{AW)+`orcf9hwv*?QIYGBHbP`3Ulqzbny> zoE?0&K^X=cbj*obE6#nu9R*B()=+DJ2(#@EzLXJW5i1}GEpRapsNtdK=~5*KUy!r- zrtW$m34+`xflz6DA{~rCwZheW*vH}_EqI$KiP(NEX!1f_h1`VWXKKu$DadK+mxy37P}qJZ6niBJj9B4iHKy2^TC;--YNHr~;7oEG1J)Q*4#mtHizQS1VRAkQ4 z1Wi^LdVbvsb7TTWPdFaUY~9J-5<{F=m+ zq4?KgKNLX;K<3RJ2ieJ5pnqdpM$!7P)}Wy>LC+rQeS!%aMpjXyRs-|gkhJ|IYDBl7 zr=Q{0D#lV%NMfH;rj^96;rLw zrS<9hb5<(MAC@TFYdRS2>0RB^i*~W#8)uPo6z-Mh zKfC3uXu;%^Z=zy2+8vj#lM2@ie`lG@Yr#!lE!X3Ru$!+^NM^Pr(;6XI=$l(>(#DO) znj>(ZV90X|OOm9i$=orjO`*;_x00cV5t{{i+qe542{JpBOR^Y)2{oAP`CY>OACV$I zKmd>ufRbXHwPr?i6N$8O43#( z+nO=>jey;v^U`C!3NMV%`v5{3E?{D^54ZypNZ|$u{qvFi!V;-KiPC^7bzj7NH)mh!Cdu*Ls;ab4SFgjnQ``Lg7JwiXY7<>GiI%RpSOp=o1 z(_r{s0TW|3eHJY}^3}G)GxJ`3T`Swql)DQ!%M^A|6}CxRzS2dSQu8BPY87O#T8Sh{ey&1fNv>QQJ;%4FbKHX9deSRpEGxc(zo`X z*^X%uqp&|1$5w|zf+qS{iF|Z%0XTsd|D7tcaRH@^uc)dD(NJgr<0A=HB`^amS?HhB zOCT|QwE>W>cO?;UJIQ2^iJ_6o%2TVye&*-jTs*&*LAr#lqZ%sy#4rl!1_i}8kWG59 z4{>*5Te{IZd!`sR%rZZKxz*9t^m5o51McbK{>RHsX*t?+Swm|+|2~O*l=nGv(D7%k zu{B}-IFBIGFA&eR8<%{0u8KNaOKgW!4=~?6^qAOjpFv}?byKyQlcY(qiFsyy;F3|G zeuE{w*I}v1C~~N5!mT3Z4(KSVujM3P9>dV#tU%2Cd{(U8F#j6%russjdu5%J{UN-p zf7ieGJ5kbP;S)+ZH`h=Y2D)vKwX)<|o?;LbfzA&E%TEFS?`oD5ITaIB%T`n#ABv)C)Lm6uYJ=jX66d+>(sCyU)MlReMi5lZCqkuQ7s&I zh3Or!!5k9)s>ePzN{f<^`8bi)7Sp*!FWzy9^@l*Fids|XZQO6}lVq$t+B>FJ@!LP9^HT%x>5@W;+w|rP((C0bf{2cI ze=_;K3N-Z@Gf~P?q=Z|wUc!TFN4=%=!vZ3r92(L-)#%$#sm^5n5Omln?K8G7%gsI^ zW=cMdop8v@efnOwwMSKQk2_P(!Z1^6%}zPugwNc1fTg2Tq4J2a+tS%R(t)7VrfzrP z)IsQkSLbnLd(b^4Q`)^ogPxK?>bVn6k&0(s!h(~S`4J2V2oK%OV$R8`{UWNakLuZ2 zThgz-Fi!ZvAY}XeHx?9I2H%uRBDHIPW>ePT6~auf*NAMn?Sc#<{%x8H8CUp7anzRo zb<*lx|I-Qi!SI1^_U=|~9!|kR@B%{JI16`|dCSO%J<|&;B*%@^{&lxFv0u|;-SO9f zPPT+&INk;HIs3Gx(3t+ zc4)h{@9HKN>PS6yWEBSSVoed3+P7YX9SApUDpxKZq76ZlGk`IUI7@BwF;`{1;&Zz! zhg(I@2Hs|rcbvD)ktVcofcoP@d~`*n+%p%g=iMBSrw^SRKV!2xW(S>GSCdbmv`em7 z8^b*hwWTX&5KYeT!?reyYTx7ugjKROr27Br#m3=*J1gxE@Rvw+exh+~J#ha1K*s)!~bp-inleOKJat!)w}i53stBeD+vGa%{w zGFxEXGgkpW;}Y$mWwWLwf5|?x(6mjJmv(LfXh&hU{&^xB7Ht-NJxy@@Sr56vpHop( ztfrJ>uUrZvFvnN_>u^A^?afquVWos43|ecnvvJbB-{S?UJOWn%gsoIQJ9aKqa3*936exAP#h4M zjOx2De1Eqs*O>+G!aD7Qobn8827(EN)(~TpGC)9k13p-!pDu71aFPG*J>sD9r<{V9 zK+04rK3UNIdHvm`*X~}USQ514UY*|=|mGh`=;6v5h6~Wt8AHge&6Bca1V$ z(}g@68oH18Wl&KTMFj->XNd|idfZlvcnoe2Un3ZHOu;M>$Tc9zB-AJq(?}Jfrt*J% zt!UavJ1!7-8N&AmB$-b;Exm4qn6y4Vm1pm5W%c>_U<(5+fX};IT%*QNG=PsfiM2Vu zkIoYU|8Re7?_qjrrS=MWdH747Bn|JPu?28{0~CP7=Z}}#?{C*a7Fe{He+%3-B75+0 znIG)(k&kx$K0tg9AmS4MiVaNu0`?N;Za}qPfmF&n$01vU+NxMQZ?5$J^X7_F zj3mS7{A%7sP@iG9-5tl5XN>ZXE+M2$1_MNcKAv!RkoTMn;CopHg<0Ty+X_Uij*gJ{ zKpU|i91A1QK)nUb3I87C)NJQ+^(>t4EX29En~MuN8e0BvMP*f$ot2drU|l92Wlx_- zXSWN9EC0rOzXVKb(wyaU$%+*_)HJ}VRQ{|i{;w4nSPAE#zo&#KE!x-AQ2$+|j-o{x zD(%+Hj{lVq3V|Jzt-}AvI_OPA!4C@WaVqkZK}kpN$te9MYQqK%;0+xEB*r02UmPq zpD0k8p967cCE}mXW&_j~eiN8{XWRin1Seh;?E$bz0=?H?b6DXpABIW3$>((A7469T z)!X|gB_+w@en3|=E)<|#2d=AuBhEkum7|Eie&RR&SB|=2qEDZq#fG8w1k#W~r2V%b z0mW+{`0L=zBw+JPF96!0n#ZkQG8gRq4K44+NELjN9vWt$e4ID$2t-Bvfl-lWjB2i7 zk>y}7aK#52Q~p=d*uD-OOD3K|aep_{w~nF7UnL<30&v@LWXh|=b~tr4m$(=1SUux)Ja zk1RDrDkcoYj|Gyf`ZHUUY!Xg)NVG#iLpMzmOLbq+%pbYkgCS zVx(OW`Oi#_rO?q!z10R;#1$ykoXh5uUWh1?o#wQRe5I9V>NUR67lZK3R9$44&Ry5)*BIn$Fv)E;eR8 zh-Doo47g~HW)7cE0kViXmp~SQ$RHW^brH9!khAVsLM*syAXvlwBm9+!?^UGURvze# zy2;}eplp5PhB@ zuNQCk7n^TD6XrqVs%_v*@==#*y+`h~1mXPqafKb|j#oYmxc(PD;zt4ofK*vrE)iL7 z=xvt(=w@YS7kVs$L<;+)=XSnwcU+Y17=&5Mcmf8rjphPV(YMx5#qaWg1R=3M5TSVw z$k9-c(Duh1xMI%COJ6YF5jEqks)YBlpan@&myw!Xf6B3S-S{tO&}5kgy53a|t$j4#Pj z^ndgh65cRRz)&${{0HNuEX-B+_q^{KwQO6?F%10WQ&W`cC$I(Yw1)tGOMU*yB$bj$ z%T9py8u6;<%blT)yh2y4u#b|ZVToSM`-c4c^`IACav(YC?oGrwsAYe+lN)x4`j(On zr>e}G*G&a`;0k-nc|`tItPn%s76L8ak$i3wWMP{al@1~2lmR96;u|d%KT)Fxx_B+xgo^N_Lr%)x1&qVp}ui>fbq@PjZM| zZ#|G7>y9iGQ_Qv6AWs851q>OcmR!Nn2{=Eh?*t)Sv0c|){ihEMGk|t?uDn@xmv4LRxxjhxD-AM;b_*Nz2{~hm<~*U z3hSbZ)doc!rh)O0ZGyjL@1tg)qoN$|MqL8~53OT`>(?X5d-KT=6(6ahb?8#wjMhnG zw53|eR%8^NBFPlxT7O{Imsb2t97V^eU%|-Bn_E=|;Igp&vM&=jDGVoAy6jXBB~Ni*cTJ-y(F^DEMq8-9PFv`%j9;)1 zn-hHU{!`-8=Q)mid*U`{!}xgt(j_Z@LGsfaH!jg<59Ygx0{Ggy^S~jmiTN?S6{9DV z+5li-RIYIvd$@ouiI#6LXF0$BX$UvhB1@h{P8iRE+y*YSY`jDui0SXWOG4zwTrVaB zJ6rgzJN0{RQhc#GC_+b2m30Uih`xA^HQ6GJxeCgt>Vuca7aF2BMXf{C8h5LrQ)j1} zvDc|q6hl??mO7=+ewnkC066IttpWYASIme&;{X&-i>&{aXbpl#%%f7|A_p9=D(^(7`><~j ztQa-maFdArq=N8rQ^CB6a=H2V{J%jm)wXx5A4Muu3e7@ePmMR^K#8a!(S78M0b zRN&`ik}E;Qe3X#~p;QONfwb34x@{^0(G zNQ=|$z%ve-cR;GP$+B><)G4lkUBt_}g$#Am7@Sqeg|st18!h%g{=45IqlmY6=diaIFawrj94WrCTSX^EzIs=NIt@Bi zKT=*!-MH5H4(wOW5ekgMWt*V+=C8wzQPk3bPQ*1}@U;w-Jz!OD4RNUvMt$fovpk)X zLq3J*5PM)xRaabZZ%sY2Els7e`!#Wh%s}2Nev29-v(pPH^XuyR>D+M}%IQ9?0r3_%>z0*cS%dCSNCd!ZnU1tX(;~I;M<8U=ehebUacdlP*?4^^Z(?CtLk9 zfWue--63H3gs&+!M8iq`1j-+#OG3r7KmW#~teQi{Hdjn>2>ErtWra3R^E>0_yU?_K zcPlvG?aR6CWSymxfA@Kg?2(L`rN0v5I`fJwayvjmhl;qJjYMt{a%31j1SSzVl$+%~ zqFvOKZ|d-FBsxoVA6jMRI4OBv7?*T|v5raSb-cXHWeO zFgu1?ntR3PNOpOhPEoLsQ6w5*ICJ_LhPuhK@;eqPHzl|rJY~a44nC8C)Q42G*NfJ7 zP7g6Q1EN}yTJ$WVj~n+k=n?06A$8FaS0v3y?SKpxKhdj$7Xn`Y5iV<^Mv2X>Y014& z1N(#2fo|g*F*A;6*?d1N#)v{g>4HY%Sg{^)?nCzhU#o@}hXg)Nesq<(B5op`qIGE; zEXe1~)d-lW6MFuym{^u@1*lCs|1bxE zvOHrw7`fL5rX<~5&E&%h=Q0!2k10d0-ML(=3aro}L3$%g1QOxt6}T7kpSt%pnFLxGRdSgUZ$}*%k3J7F74hHrNT)&JZHM?*u{L5;|RIcKa;p0W6H}HkCru< z`ky~$KMQCGupc0%oR}m%Rv0hRd~UO~%(a0%H+f1!^C;~zoS@28QMdET_@p=HjQaw) z!9ue-fOQHj4ueL9S=upjt=;3*S>~UrYQ$Mcy^W~SeQ3U&SrgS z-nfUea=O0@eX-3ID6hksz!SQEz^h$B65&%;mbM+F+th|R2m%&T{=g8BnV+xy27SVd$LNs7*1eiq2icEHD0v@b9{?@sCKCI$rMYN z$QD@kUS2pNnD}zvD4VE2!abi9eaYOyI7HuQ0md-dFtz)bh)XiIdxiF_voM6tdM-Aw z_sPmD`X~P+D{!d(L?ea35d3?WSVN#(lQ9~TNdQCkie<#W+!Qh@-Fo)&ac*fX7pFLG z3=ys;KXg2Pm&v1lOI@AP)E??HCxkeCR>_RCKS|~jr2d*&k%Lv49yZ60#k#WHj}VJ{ zk3YK(I)lMrXrXI-XI8p9{8ljC*!q`nvs9!0JxX+LM@2VD;yid>#sOc_c8yyo!LiKl zUD)^ucP7efo}|ue%td%=p7yt@)fzoQ3IkzKc<_sbe}aJYeJwG@KOLK3Q`6U{<;-%) z5^?jC7usCj^)=D1NT)P{dJ!PIF8nM6`4QBf{Eae=Vr7Bpypa3uto=*KUj>pf5y_6WV{1j*w{`6~4x83n2(ACmrMoX+GF`>VW9-G%jx zW}9LK`We)-2^TI)>q6IeJ`aN=+FJE8MKt6!(rMI{grV*y&QhfPa1CFZDZHtQ=_GG@ z$oGZbs{JEFTK3_8H3AlG>D2>QH%`$6k?BqH;lurJhd_z|_%7&6RlqUKfKafZu0y9p zp*rC~LZ&NMICHP#A}UjA;gi_)BH1f1A6PeFdQG9q0rE&2mzX51>zq-*t*QD*2AQZJ8mBg0Q8&huNs*vCjCib7QM0HRX{uN8$0FJ#g zYR!|QtRT!YguaM-dh5NicvyRUh=g}2f&x8LuS{8C^K(*_HFH+d%<9EI#d{L9u+V0H zOqHDjA#s15vcd}$VFmsbO7e1sAeuuviC(7?1E0A;PO&Ou;+tPRFe__OLa!7k=1NrN z-eVTQjLNI?f2bKY@t51yWmLW(Y@r->k{f(;p?kVz#?9;TP*YfeTYymBapoR-h8 zm^QdP?>%$x4c&G^2E!YcxCDoO+B;by3JzBi-pCp%ewLC!2NyaA`*HK=M?j}*cB*b$ zp>72;Y36{l_gI_xCxXnd2d*S`oA?HdN4KlCM)cQ)yiE|NitbJAYJtn4*iOGI&WRS9 ziIe$D#$+7`GViLDxgW!BG8gQ&t!5c(NHClezP!R9VZaIk7DUUBrEU8&`G;>u<<8{7 z02R0qkFqMs1#y{xAmK6%7DEj}wPTVTk`7(5MUThjwpdp=@zpTs4ue$Q@ z?Z(yKve~Geps%=2@LZOv{M|Tv+|}p0vRkdE)JDiJMRCd!y=8V)8OL)j)=KB}%vE}+ zpJ6@U%>89|Nk&U61{Vsc90)Y(kDiT8wqqx*-KTHnix z4i|I+FseiFN$|z?tB*BXAKy~JzcrW^3N#K8M2tCUGly@{Gqk48Bf8~W#7QaM-W7|TFPrH`@=|d+Br9_H9A9puYg||CG0)Hx}`w=j;Snr{k z0wq$W$r~53a0u8}K}2WulSF?m+vzA@Hl%9Ro@J0+$fTOc>@37g)RY(W)8(~^jL_Iw|hRcrR_NTPxu-geX~TaX_(Z6){6Nu`9UMc zr-|3tuXLThH=`gLK2<73zGeX|VxtdQ^$zv|H|S>D)M+^OgrUOADMenJncr~37&`J`O(PtNk#&NjqBv#12R z!-IcljR;mp0QRmimbLzR!lpbiEFCQ}tJkLJY;DQFQ%MB|)dsc+bV@l}w(?o_2h26^ z4JY4+rc)7_$tMl(#~W9li_t$IpY`3CFcCuVpGQ;{DntG>#G8m4-92+nt%j3PQ4xaM zY6$5A`M9*SSg^EGmN=2&?}{#=Vl9f`;SCI<5ki77DyPg)YmBGdB=z!fwg@v(j<^p}<|kab(1xBcM{ zP8n2ra}W_-7df3#vLqS{XYLIi>Xh_~G^#Qti;{5TL7whID&-kSXNlH*g}FG0tm6H1 zBCv(JrplA$nZMKhc2PgE>g9-??M=pl^y22Nc*<<-OkJ;xqi}JVhwLT0oUe#_XxP(k z+OjU%(xwa}#K^t**(kor#Zf`k3tCk4rDyj`YF%4^74fBHBcz(W-_4)2ONy~MEiGa4 zfICi2B2o-#uU%Tw#agV|9!_Q6qzmQ(7gJ=TBNjDlQvMejKP$DgaA!HcBV{=07k2H8}Fst@`Sc=6cmAOfC zIOua|kQXWd^#wprKg5C3jLxrscXiy_bJ zK`OFXAdZuOf-bRCouJSJl~N-mg_4`30l~w=+kCxmVwN(S!}!Oy?vTgUI#fDXv0woF z2BiK~aE*NY_-9ZC_8q9j@sg^1izguRq4Q>v`wMDlz+d1-!f*9G(7Trkc6-du_kP)I ze19PKce*BpkvgA`57HC!!l0tENQKZ|EgE2w$|1y^v&^UZ`1aoN^`1QpNYO;H6gu4F zt!+RYcu}_RCtD<%Q(JYfKCpLe+Ft~U=Wb33ST=`CbUVcfP(f(}p~rxb9eAM(C08^~ z4Wxh{6QONsTtEK7B2lJ<4A3m*6=OOA_us~hjrx87sN?|;Pq)aipd*fsj)su|x6`>y z<*L>qqH|RFXnzfjMxba|fy>sq01Us;;pKL=G_$tm4aCFy07czK3z^d7)RdGDgY2Ei zdh0zJBehNpj`AG+lYI?_P9s2U5gZ6OHFmFLI+{najWWt9U7!GCG^(Hii=xA^55Q6Z z|HIQhyEvNfMG|G^P1ebp1t7`+e?x%90|VO7qbefYrwl(+h0~f5V2erz;`c{{tmD{zuIqPM>S0+Gc=Txlyqe) zWRa&ZLRGJfnd6;+M7GqL;uLYPX6{4CQd-^L&(<8^_4txJJw5pzwm?TC^aCw}J>w(`-Zu_G(5T5kWG(O! zYt)$rE3-)LN;hN<6{$$lcRVNy$(t+agCgTN)fZp3!J*Cp5!2*A0IlyIcQAAu<*0O4 z968X{;inPGpcq9HuT=T*YY(Rz9 zCV-!&cln#c`+?!SMTkj#{sh=(MF3xZ%8k`!V-eD%1TopK;Z>6Wr4X)Nl4bZuQvw(L zKbn%|K2Oe( z1M&T>ILtZ3y2u((qqaa1Xir_cZY`3sH#}?rVDbkns8P?Xf1!u zdT|07U~IN)P$}5XOJ9K?;{X+2qTz19vb2*JT=c&o(ngU2l6i)rBDcVnj1PFH8b#tK zlaGJ_4~woI_xN{O_AfpGpmxBrk(wv4wzhUr*Nb)p`v=G0Q%*coePg4Tbz3|sK0q6B zKno1R7R^F$I%G|Kp9Q3Okn(if)^KKUanWXp4?>25{HMV3^a3!&n?LoG^O*|3(P4nP zNRoWSN<(Bz7=&Y_CS`#0Pq*vzfD0P$x5W1X(?WS36Zmwz*r+)UEMQpjZy#h5St|R2*V#Ljv50L@Bu9$kZECZXj%U` zNY^N00W@%~MCpB1_B%W$1efCSFVM;JeOEHT6R;k8v2#wr4W1#Kwrn_#(QYIhxZ2Gb zg70~|Za9wO{WwG7+AS@6-M6-2(2GhQbpxsbJOzMqB;nz^=XPB^3B~C($1ENwO^0k| z%dmIG{VyB(%ClH6$#(T2Y}t#KEQ-l_}uSxK3Sp3FBhhpst0f- z;wr(+k63~*`~c-$EN}b(9MioQD6+j#c-1Nw5Kn@^nneWK2aWk{iuejycl<1EZw~gy zlEL}shj@A$xmb6H4}MH{oZJZ2D|+6HD3?9qp34prRaIrvl}^=E^_-DiOSw#ZLqqK_ zJzp{X2?}q`GvFEgBlE2GE{pNeGFp;vo5L(c7WM>HY$q|hhf5q3fNJo;C4 zn?%*^?$NnAPXDKKDVuq##%1sqH$)CfX#-QpsIN*2^ETmL9fyw~<*go}#CCZudX{pe5H2w|?U zY^7kKB~0Cku5CZ?BaSYf@c0w_phFX_z+{R15dE8?JHLOsK$3@+_y@J z6`-Jag$IK!h9k~3?Im_OG9;QN1UgdeM$q*1TRTfo#o@8_ zLmkILgw!31Iq){cak3uofv|_CO*Zw*G4zw%H1}6H!XBcD>o!OB<9x=?^BG&~-5*nh zIAH6+dCUN6<2Cxojy}75a??Z~%7|t^5g9G)ewaa>Cl)O;kDO>6Hsu(=QsR3^nv*J#dyS$`M#;!{5^lQV5=XO8uxFa?*tB~#L<%TY-r9fQurDHw(+apSHs2x_^g zAl0_4t*D72ak#kFQj{mZu|?`WiBZw0TE?sIhCiRc-LPVs!OW{E7X0`xP2htdK%nqC zA0g44g^$Mx1c2TDS|7W6$mCNRaOsWkk-bth8mb(8at&-U)>{Z}!cJUXsT zw=^+T7Hty33t9rG&WqMJ1(!AkyV6FF$T|LMmA=&+3^~|~ zxkueNODUt>tieGQGU9@)wdL93tYm%gonwH8K`kyX=kd7S!=fj}pa*?7s`Of(TxR;W zA}VnDWLW_LA%KzOzlUg{Ts9vN6r!L;k_^Hl>Xd!>po#o7z%NDWVdaywZYRG_!szCq zCdQ|*h^jR^!sM~hz1o9NVc;k$$S|u)RbyjnB=|NDQ!A2{ECSL{AH8)ef9%%xyH!(C z=uv7LT%Cb^RZC6z!Q=$TJBYER9-PC~4;*=ba}yF63Shx`eSHNs>3E$jg-a55U$PIm z6ek#XQLs?Kypi{piwJf`7HqB~XUd|<{4_<^mtYlqk`;s!}#fan>iO@a})hCMI zenjS_Jalyp{B|FJsZprw+vZhaZ>raD>9yo7XPPWw(8fh6o%fmE(#-c;0v`{n&5HV} zI)&9ID9W7jpT}%re4c=npbV_C^XcUIqKlxDxx)`|I$pG%(m|Of9=FTCDNwxIP8oy= zqg(lq(f!;NMOT9rYuXHK$}CefwKvR{2~%iYg)`JF87q>+p*IJ(EIK6`rYKhTZ#h1p zC%7|QtJDAl{xz${{&H|^{GH4}LTN182L(8bAwCS?R z$KMN8oN}z8=6p1Bs_{O3_n@y|H21{qI{P^{fIg|+r)INBM&V#ZsSg-SG<0;bHu#iy z&`}xP4U4*M0G088|5&odMFN?pJpD=VU(JU+5^;?W(5h37z};UL9S8TbyDFB(L4nZ! zy%DS6>?8Qh?;ej1;E*O%9$DZ}h>g}n_uJU2FWv(MC&*aG6Uh!-zaK#c-i8Fd5G_Ec zpB$0|qw_kcs$Zf{Q5mH{5~G-OK_`u#H+k^AQ%v0y0O0M~cc)9Vrl;f_=0&!fm|TLQGbQf(P|MKz4ukLkA!D!@G+66D4SyN=`K{X` zUfAzjx8&5p;|qMZVeKVJJTuW=iMT;G^IUnrUc}t{+@}yEj4j>&~8t7{2!NQ1TWrFs%;NS9>c&j0s08Y6C ztv>qrvx`g=4GLS8I+Mx9HM*;&B?>D=K6Aw#NFL3^NZK1LYPBR36MB9sa2;Tr+jCZ)Qd(fFHzQZraJ_ z_JJI|P7N(wP|z)LatmJgJe%z|;@vn%W{7ovb{da8Jd6mTq1L@9BW#4PS2yxgGv4Kx zjIk}Q6zsU~!td;qEIjSo?a#;==W73M^8YRaL&8AukH3{!c?Bbne{QCZT^s*p*ojWM z`}pv-gLwnzZ?XSVTe4HA3Kdb{PgIN~4@3bd7#M8tkEH;fK`L`sgW7u_)1vdfp(;4= zJwN4F=d-PPG8^#;K=tjcnI7MeEu1sm{3I5)5uYcm@+eW~o;TE@V4+7ZfeO6w0MGsf zcJ7v{2{ix`R)VyY@pt72dEeJ+q|oT=mY}%Nx@4GPNr{opI=OoS-IIuU8i9dSVK!ny z;(bVaP^Y_7uj^CNTOFJ6G?-15B13+-=6`6Z&7n{8jkrrRsV=v9mL4o|M)sF}J`4RA zBNarHV{dud$@Jr_Jnz1_!VmZ3e=f$tb{@@WgsM-FW#0gA(N%3&RvDsh)74|8ji`x;)ezTL zXWgSA+Rse%Zg^Ee=+na!wW?5McdhF|`XF8IfeoEa(w2)XG*Fcmu9{UHGZLAwpC@j# zTS2<4xQ%a+!5s&RxV91E=F4+=7JF&&dpMYohpjUWD7EQpHT7p21gDZt^m^DV(Qs~( zlQG;8k?^qqv)x)bA5b?oKV%}mmELjL3mb_^kAN68Q0t5g(1#hxK>`Xozvo=Hd%+L7 zwx72Sga~N=WpRB$9(dn4OG!z9zejDo7Z;^DyaM~pux;@jIcyofw2WJzQqX5fkq4kO z12GI0Bbr;1I!(x~v=7%*1^721OOY!;Ajtomh(`MX@URDs)f zmlMgmEi(-FZjgqNzVS~%U~_>#2-v6}y&GDlvUBP>=k)Sehe~csns4)1k7=|(Z7qXy z)Kv)rgyij^DQ4QF`tum57Gl#0d0eZZpMwqP#gLWHiq$VmotOC3*uHsQ8biw!dqNRt-F91=M^-`qN^z zMk=I;?^@_sdWRX7cwS#8I>|XNkZY}GHxE~4YQzT*skH)qel!k={!v-*Yu6vLA-vjE zl|*PcR|~pr`T3O4QFrr+H%Ds;fugjj)KGMKo(#R`|HD+*JfVC{>MT|V;!y+qt@=6-0DYH` z%^yha*-86iv?0-GvkK9tLe%IC^9LH|U6v7fk<4 z>3c6H50AUl?AqF&XghC`IBy?bgfahCliFUBRcqHcc?pSp6sJ>cAsTWnI*urDsd_}P z1Lc_(_f2Ow=&u9go&0jOjVj!sgze`t;+a9sD+ktatre~}f}wIbiuA6o8G$3Zd{wji zoN79$^fT6WOsl*B%O@xE^Zs%zOGfPJF>%{Q`_G}bej->JQlb=o$GZ5v%L_R=o#oac z^35yK($g%7I8=?C?X+oBDUC4oz3_j}N(<0Ahg=I*SYx4JOwrwXKr;c*Kp;rt#^|2n zU}Mh}tB=6Ef4PqUJIG;1DS#jjXp>x#3CmsrUGwGN3xeRru3`n*z|g35$1-VzAUS$g@?|@ ze}J#De0(uy-GYsPIsNys^I^p3;POO~ST#zrPn&eZ)baTQy>3p4odbtkJa2it%mn%r z=05#3D=tZg7GQ*ZKS*Z1+cO~nvpHZ+z_}5q@hc&hS5>`Vv8pQI!c63k05hG+g115< z%@c5QV~0DeRi_COST<)o!H)}n^nHOCB zDY5P%D3?#LkGLwo3VYsn#y)Xussj*SI*#@~;<_kx>Hh{6vC1#=o2?f`~1VpoI*96CR- z8_4pzaOT?PE@;UYbbsPe^K+S%VK2y)NF7)rzXWuA#*`_n)!>1j1LA<7|Il;#8qKw? zs|9wd7T$z$jIVz$b#2_>>FHexWMPFjIy?VLJalPDpE^iNI$ZwtJ-14k_C6l3;L@K? zF-!XJ$f@BN7Hj~%&N8a1u5b5rH_|O2-5t^(-3`)Rl1g{C zG}66EK|nx4QjqR$6eL9iX+3k}eLwH>o^i%FUm3tyu=bj3&i@s^`lTLv6QG@-4;Z1W z8R#AE(EIC$nc2*_RmiSCPCcgNX71@K!YS<$)LY8k9zvvIz(e}rZC-0={yTnbTu4q& zulfg{-rkcyX+SfYsGM_jBU6DB*zo@e4lW{ZNX^#esqtW=GvFIWqcA_F!k$hO8o^YQ zL{97~ZS!^>Wm}Vo3${5tz=Cpq@C>Q;CFl6@}m9tJ@Jy{qLFuL@TEb6Uryy$Wa(+q zpQAiMSAA4il%n#VZU6U9>7i8m<%gGO)U*yFacW(O_m|757-hd(b+ay z7ZwJ;Y0~JgCXok#EpQ7^UY7xH$(oW81pl z5FzMFlhgfobo1#YNrPv$JWRP)?{Mg8Ud%9$mukV@oBdMtpuZRLkTRqWnW6_eLo)<| z@}crsOHtk- zH$aAC@jxJF9p#VP#Hjp$paY4s5vI@w3f@-F|tz(JENOd#)}g%$_M ziG0#Yohn>x+U$ETuHb|zH&7f|+hdMjuPrhoN&j`d2kA+uR9ta?F4m`Y0*^h(Yebfx278%CNEMBI{je2DCZ`S2rc*`G#$qi}I-FfvGSJs2mX>u5 z0qW#mp1N#}Ig)AMH9ZO{3E~|fY90UykuzI4%^%eEScBRgCRS+J2*8&OUZF70NU|BX z;(QVw{AFAe52)19Q)#k*{OE`|{Xzr8)I{|dr7$K4Rv0s0=A)^oxT?V!6Bj(X6M}#p3ED?CL$O@cQ)vD?yNObHL;i=* z{U!8_&qyTXWf-BPs{7LEiwpudX`#f@!)AP*HvU`YO~x8KHWTE1%j4wnsNuDFpT9P% zgZ@CIO1I{*Q$3_~!xY?8bSo_m*6PRv2%YW&KN{rXpufcC9kEy1?tx|M^I2Xe7kC8) z_y$DXTEp~58jN%~s32GGR2RSs>IKDM{CZ*9{6<29v17 z-w%hENrHN^BOF1GU1c@3iA5&t467QP;6fJQ8W8rk^$h_-9ZF$OJ233Z9!I~R@`Cfb zJjnwG0!VcT8uaOhfeHQ-gzy;e@2HrrR}#*c_TOgO-8UAra|~c%kmu_=hpr$0tQO!Q z4OW18s@H@J9+P*`-Czp=6VloU>DGTRZ*?y|hN^_1K*ax~ZSND|Q`Rv?97YxvU`bez zqp=+2?nCtl7(d#*o!z8EKC|uZThOh~!5<2(f8in=DIbrJjoK3Fe;Wi+Su~vUPcK)cM{H@) z@G7*cPkY}@0gkaXHUt2pp|Mxf+vSDr>h>d8f*mOv%P+Zz7bR5p@)a{6G8Qm})(UE` z)x@q5bdMaJoOp>bl8=CgAoxXeFNnURD_S@4Gi$M;kxqjn+)prKGKw!JUSWi&@IxOL zps3sVKmLH6?Y^IoAxmG)6_tU5?;Hh5AO-v9hV3C=D`lWKvCpv{U0!!>f_|7hb0z*+1MQUtTBK#T(8`5*w8ep9ZbrT&jMS^^Pe^{ z&-A`8#8-)V7%pV>5v3suFGn&tD*mr}Z;*}c2%iwUWqnA{PO)od$c-DQgSxITJprya zg@crSN1!h%0%5ZG^lB&R=N;MC3U>YaU|}wR(lT}IHc+p09L3cZG%A<<{Pj%FG=Kn{ z3JIe#DMtte2@1`K2}D2iK`V4YaQa8dw16~viN(Ol`yNvRyl#j-tE4%%H|=}t5kg`D zG)t4p6CGC{b8p5JNjN5Y@YdIiC5jkSfdM~}fTaey3qezK5)1~};s-Al1TCXBclwT- zKT8vV8C@M*41eEp^86uSXZOU&BP|NL7cf&YySw^*ZT8#Hr=Fyim3u7ckoJyy3>aljp1ZD{je8^qxcGjnG4;4TFD$aEbPa zTEQM#Ck0q9mArh^e`hg(?TF_$ak8HS{cw*%aNte?V&CPJBenfg6q_>ru1x<`DB{OJ zzcr`yA`#KDmB2}>Vlg(tnelhlWTAg3c@4&S{3l$({EN6Y>vn|?=&H(HH|F-dv{tsp zto@G8gVq}kd-ER(ZKGrn&G6`wb>V;u=V1-5;9GcPl>yurh{GlF(0{nZOPp^n7MwpX z)N=gr`l?sp+V&x|;5qlJqzzA;eW^z*;=fbn2kh2KAJ zzU91`Fkf{3g>!wTGDeEJB~(7w)GDRl@?s8^D($7Z*ok?j9i@5M^L3sRiET?#^B6^= z>N!e!ZHs3VN3#w(^ipFDN5Famt(pJ)J6%ppw1Qj@ta|fJ(SD$Q_>b2#m z(O~^*t9)W~KPO??y`K*xB{ZuiBich!M$AxiCoEeSMTa`oedK9P6%#^E*wo>>T zZ(X|PGZ~ynPbANt8}h-LFQ+ik^e^WvP(3Mbj*b(zS0Y>&{pOu2KG?ToF56mFMOgK7 zIpB|Jjab-a@uiCd{k}7L(aGl+8;3YX496*Z@%#3B)c5!)!PsIU9K-nEm5q&!_4S-` zuc<@X`-dZGR2ml2Lr&MI>G&x!iY2g+p3+1Y`XCSfm&GZ^nWn<#<#S{3c$WaU%-u?f9qMkD0- zGXczzms}pS(QpwiC8Eiuam;%X*^U+QOjGX+7e82a>rzKt4BH#EKX_j#J`246t=SK}ytcK<%FaJQ`Z9lX?i1Sn31y*t65i~Wind_s*Qx)4^?V`3g8{BxRo zN9xEU!I#P7=X9UmJEwIakNOkAm8?N$jnm~I*RXBOYw>Aur|IrPwneG&^)?S%S=j;k z#*#?-QdJ;0eI8Cs$c--C)?)IL=(&2T-^Wv|0HW(p3oVTKNHCcrcU1p8TK^qBIaH{` z!N8!#8KOoo1_f>R3_^@HzPuEuU9~#@)5GvU!MFqwpKQ+)VjHhf+ucFH3l2f55S<}VQ zrq=qYJd(j-^xpHt_?p|@_L>`CjqT^hb@aDP{10vJsT4W9%ITZ?q>(!S)AL#a?+}a3 zBLm@^)t|dPaZrw{c$K&!2(}we?9~wa#Z@HEe@bKGg<%z}fki?er6&Sj)NoHjH6+xs_f$IQ6P=O1g~_bcThFt97`! z$2f2430zhyUw(gqCPzi=Rrioz&z7MMXh7tSK|6?rzVSBcV83r!Z?g@IA!}c^ao>kn zfE#M~NXdmi|-Wz_0O+xqd^RiG)=hbkG=O+qJc?uQDzh7&oo<>r)3G zy&E$!tEVinXq{*B79GHH*l_acddyLJInSZpR)7ns9)Xm42pd!^ube!!<;_2&{lpSK z$oyu3bXCmu)+eO(S;=x-7YjoIM!FQ-Ds*9nPOJ<8KBvXL@Fj`FW(-4q{gM+&A!AiE zLW**?v&nP1WoAx_+Ox}AypGR08GVnROKM!8a*WjYn?(8KR55ax21q)4Q7(*X35bYz zhQB`*-db%&@)HP;ybxZgneRy&+rJQ0<4MxbGuQYP^(m%okiHeOneYOsESZB&^tXIN zYIThb-^Ueg9s3lgsSD?-md06;l9Z=^jm9Kp+{`%y2z8ymmIH2o^}H(2LBwCQoTpTbL(~^(8MLQV zhMD?DUL$NRbh6O)nE*kE&O2?zl(KjgE^uaPZ*QN-6A|ENvZ$PvHv`?aJA+Xh-ZKzb z8{p2Ac#mhsqrDF*{GUEGr)5r2jF0`yS+l38LPIsbV@1mh4lYdYDG%uz8gFuD_vyDTg2 zz>e0E!Hfx+(7>v$kyztNbf{ovUlqb0R`p!{0M!M;W?LXY*SI)4Clo3CZPU}LtOAjJ z)hT}Fz%TodO%#kCf2D)mt!tXa^k-<*Iq0ukEe7>=wNBYl1_Y82bzrhGM#5G2t6((=U2O%;Y^*=@8 z6tA^6#AX+qrgZTYzowNt47){{^S~wuUuXdUaiMR>MRJrPZ4kL}1#Q;{TGYunwm}BC z3B@cJ-#S!U8Q8xk@ni}Fv#ebptW)RS0tG@ZD~A5HJUD1>B)ps&7^dGYzt&FLO&;@E z+|25ArDxD-b|Db?l@mJk(tyRJZbr?G7z^8j(&`zj4kwYNWqMC3^F3Z~pjgVOyXBs4 zu`etIWfmuu6CTIhe#R%ASjJ_HeR-_&3aRgvRahVD%yaZ}c|OJn>OKGVoyX=^8@DP( zl-dR6ZA;JTr+Al52t`XxmbFhYiw$NCRMFW+MY`*E!Q1 za|f$a)5E6CVZFo0rcvl`CsCaiKlDW9w655PezG{G4Q;8J4{j`sbcQTt!G;#kv)l9< zzq9%bCi!Y>h@d>=<0_~;;=H1a#Gby40AsJO<09XcpOYb0r$q^}4>Z@_FsWFZk0;x` zLojA%dn(l}p63#LqObDqc8B+vVHREPsP)slRFedom@Rr;u{l2_jx^!#FeELrXep@y znD33Flt+G%iC=ow56cf4eW!nOEFr;BjDGQ#@eQLPIgiORI<^iwVWNX=X$F9;$&xkZ zN_M(xB&>|37ENT4i(lNt-(fj;i=S5jnb%u%edEvXR}U{sh|c3c?Qt+smt5!vQTG54 zs2He+Yc-?had7fJvN}Diw_l8g6C$7eJ4^WPzb9f?OXw>i#hP5^W`hmIHI#=Lwz_Wp zI}K#ne8cAm`WPwv@)5rN{*=Ed)jrfW9tK<5kRy^&oC3AR!fieT5d6ica^;1Z(`Y2u z099|}7AlN`IY!0J^vKxp@{ePMO=8Jb)IWCP2ixcrItUmTkPLDX&WzORHv}hoTDX)$ z_ZO0b*q>k~U0CAR!t45ra=fcepWHPSd2`a2(%`RLB%?pYqZY-ijM3nOIic8ZS$d!R z2E(Nkp*a1H55lRXE#bYW_T@SZIs5D5r>e;USKDHuT7nI%P2tLLxCb$!5!58pBEMzg zdy#(9hcabrhT8TdNyBK$+R+mxpVWMuha>Z@+nS)6eKG5H4p@P?UoPaN|B@OSA|Wt} zr=B##&z#<*31ECKe%`HJ3!K4BLjO2}PkpfnX;EGoPZoD0z1y0GpWrKoovg+5t^-n7 z&j+tVize~33D_x2%N7mJA1Lcs*dikBf88%`8Vb-`0ZaAJ)GQ8ao&Nkt3R3r2=oT&f z5fa0}iAd5lMg>*i>M_or^|zz0`Hr=H;=zJ4-kYpz zKA&c!f~%+sX|I|%@x9bl6fuiZugOjw67qK)u(>C31EMY0tncc@=dxuuyD2iR9 zwQUSS#h*{c*+=wIqKD#8yLp$tE{(_*{2aS_r!2n)(VP^Kw3DP(S585y)VVr;+ilQr zmHLWWaN%QwmNg_ZRtd2Buub#MzDTty zGOM;C@@(GWxGHwr=)PrXG1MdnbMnS)hmXImEVdT&|uD0VW+{nlE zJA4|2l42=c6G<1DtCovBYdEZsM!8>9y=0wg^a&BmBBS?!b(g6&55yyIFY5!Zl(JA@t5YC($N{TNIq&?^@zl{gkj^l6=s)Z z91LGh;@bHjIFi^9E_3!%79KQ?uhG?!X;CWo7Np`(uPZ0X&+;4>sUvx6NjMy3+{hZb ze>J3j$xQ$S3oU9u3X`OZ6^@~NV*eZrh22ophM9`JaBQg=D_7+QT+3PxD)Yh`-wesC z(HMP^xW{=7BP>{%T!-5->8)?o<widTaw3@Dp2>C+ec&zH@V@q;rl>g!gr*tgBL{tog{de^K` zby;l=P>w)r9pDmFrY5C4gw$ZK7_*2Uq`D!P6%9b8y4+<5C)gGlNNqmsA)hj_v0~tq686RAp_j(I zm%$HstfYa1!28mK^(&nQ{bW>_A-z(W;1RMgvdWVgfsfZJ`jre8#{By4&@-4oemdOa z;F0?eY+v{>sQ1z~HImee%-#3Fd0EZ=|50UB;7QkiW2}%5tgQknCS5nT!2@E|X_}Mc zsXWyf+)}g!Jemn+AF0wQ#qF*MKHb;4*L1V=rrbdfZTbzxV<49xphTJB&$b6y4(qkez1F3iO9z0{F4Hg6P5vAJI zubHLG_8tIm1clTmmr%C!Vx04*x_JP#E1;RObyKGwH=He&jib(bd3E-YS6Tm_K$zgY z%i0^WvU>5nhl)c%M~xWXC%6eRVBilpW;h68ov0C|U(7C`AD#xrUy%rP2cWupjDsgy_9xse-|D#CQ3}e7VH!L|C!FA5gNvS zYb})3IKImIc)sXeH(3LP8*{yR=L8dxAe3XI>`wNx3Av4#CaZ2c*$ht_PH?on z8`~Tg*sEr6{B^%M--7~2c>_V@V^Q4nX(A(-4-#fau19)wS1fqM8Ner<^rPH+afa(b zR;MmQ*zBBSdE1dP&8jYlhr$43>1W1B;n^e|&PuF~Je3Q@^zOD3yV~(TOtP|*D8gf zr!R+obISnuk`BJ5^gI8k;8i-+)0&K8J`v#!8nl%$=BoZ7KpWu5RR93{s#qqQu zK>T)bgEeY>JG&qd#>fL43`bDxZHy9=PQ3ws3yk)YRC)+|ej)<(w^5)#g^@qJiB{=2 z{|;-@|Do9x8$dgr8!Qd25emSMk%YjfKgbW%|EPwWtkAc^+S(eYLslcTdV?~}zb=8; z_YelK^eo9immW@yCo75xU%!gM5~JS&5wK6-QYWF-{C|q%XMBo&m#F@GJoVyJfB5|p zGH{?x6a4iug7U$R4{E?uxU0VkCNwTKv440tGBOg!2KRVF3R1sl|F}*Nc_;MGd4>4# zdS{MUW&)#pu4Zj7daoQn!-f|I!{j_@P6yA#Z*XhSL1FL$5a>$F%b&>c4A|(5DkGdUw6;8PzD0{qsmhLty4kanBkQ&y< z3$8kW=5O|Fo?r8U-E%ToP;4W6duSnJV~DjL2um4Dvp^HO=+`oiqo7ci)pReZF)qPJ zl+smyOT@VEe8U2-?R;9m5N3Wl0O+f7%M9`RuO(1I{)S628y^1OtqQ>NL{Kc@t|c(b zoP#Q%S3R>Izqs|rKp%YA9&)8jjo%92lhZ-%PLc)q$OO{q54Tlfb2sM&B|HsJ12d?z zWdYRh?fw|>A(b7ug0u2PEQF#*|GlFUaIC0MvB&FR7RZ%DnrzCE2*tSG--@C>-A%vL zzXjiF#SSfsB%I&+SBFK4?t^;)ejlQ8_1+C|H~_@pY|!ij_wid>qAyz^T!}0-1H<0K zPy_{yvzQl}BW>U#e_XL}7>Bp@gZa;=M*t4t7lky3s#Cc^^my#mx`mM1I_tCYIXfCv zLDQ_Mo=+b4+i@JwFhjV9Qfjci*PcMWe#Ym?*Y6pZnS0T3B-17i%U0Ry*&{ayigmKo zb_0J-=H%NgDACnU%Xp-{gB1h!n$EYbB%G@80Ze8^25Z```~K(~gAk`O8^d0}tz_!H znbz8}^+-nbZfrzvM{X|J$eRxejN@z85vClE2vJG`=MB4sPDfy|7uVF8Yg~Brp2?fu z3)7KuGmqQ)szY2zrfvIhWOq;2*+#V9WHA}DvFN>T-DI#SWWSsm8_5VelNL+I)?o*= zl4U0lKV?1kR;&rppBV9icTgrwJR{_%#6VI(r%WXpWd*9!i zAW6g7!$X%&p^PnpwBtYqGmR!4b;1$R!+cu~!~~w;LBJ2$I24F|f8gI1!k)irvZ9qY4=pp@O1iRX0n7O0@Jk~l&1(=Sg-+9y zX}eh}P39`{8>Y7r$DD6ueOY?&(}%vsHGjg#+N*$v2d!!dK}EiK*GkI2W_}G7uxY-+ z?rRXOocVQ7wTn~dV!xKGbx^v-9wgjyZQB%NQ0}}Xg#8x7Lm2ZVn(fEV!1i{V&d_H# zzdA!2t8#M3%N-8V#w076zUNK}o7Aq9h9&uS%x$J?+>Ek!Qm!U1@8Yttlf)P~ zUTM)1W5Hn72N*KBN7_y5daHCf?F+EWp@Wq|M~^=djVKYk$+NjNAPUz%Sk#2$!*X%X zBH&7xET!CwUv0-GY+pV&aPJxXAiP0>$MmsXvfZfb3>H?>JLe_u5Q|PdQI`+)JRdOV zq$-51k)Ns@F30@(&>c7_gPLjm_L&^X%9Cu{w>qcP&2I^tNLZhfXwbMZ$AI2O46G81 z1Y(kWoEU)c1qXCPxI09-5#Rj#$6sH?TA>r5U5(=I`iqT0@R%HcKnhl%h8@x!Igi~OqU{FCrmQ8J8PQjsyZK7|jyVKk@0BQf2^L%O>HTbZeB+1-(EW7*REsvxY?hoA;R+Cv zuEC-(mSu6)&o_uckHs*zl+E!vHL^vWJzM_G`lM#K{uEB?Ft$F^(jkd={t}t@m!bma z%`5c~lbIWb@4B7to|N=PizUf({PpcX7wZoy94^28syb z65O*g_r1^gKW-VUII;Kch*B)R^5rR)+SYmm^y@*)i3cbLb;uQJG|Pp~43lY*0>N2e zkQ~Jl!>2{5jUnVt1mPIVC`CV2ZPs!GVYV+Q2sf6fzBr<8l^e3`7Y0e6&qb>5Owf0< zumUk!Q6_0^stnb5Pc+XaX7$n>DN^C=zogt1zAZ^s!E*E5e)gKl7Fx{#<+20H+WhXW z4Kds;u!02D59yXOibEJo>sHt+gheQtr)i|&!h5Zyk&`8&ZYKrKa>k@T1);<#eGS@vjXDi$(Y&C;Vv9#<9f%FZF@?MiE zR6N(KUl+^y*|`qN{c`3N`J!UFrPrjgqXWB3lpnQlNp7O)kHoDP%8Ullo-`^*vrQyF z(wNn>RKNw@>VQ)9D;Vx-swPgQ(+V3xtfwLuW-)V$wep*;floe3Hl#P?M+7okVt2cC z*%V2K&#ShhLs_4nU$%=pHxoK+`7fT#{vqsgmVZ^=B1^v}h46h(%E0>dW!93vdWE6( z8jQ$bhip1`6~o*|pRsDbL@(b9gpp+22F@=2w{|~slDlmU-nyI_X2iI=+wi6xy-2=X zW)fd?y7WG>ao9MaicxaD#*Zs&EIS3P8Z{L7+v&;>QA=$Lyy~Q}W{@|MNjHO=-yO?= znn9ssy9LlJ4+`l90cZ8LZ+(2)Qsd~w{bcG1m9{f?9%^gBwu&y1v!AMEgc@@W{+Yz~ zyC&4x5P`E(!gXR^!>V1xl!(~wpQGnpkwTht^B*GF9QFyLEaS90%Zgm86@>>kQhmEr z`8SkL6%HLX)XOu8FMdKaP)%OB((a+Z6o3c_c1*|@ap-=XCR>OmAA}%tdf%XlB~f^A zMh>CG-A6LyVSYzDljVWCJ--dM^XmVEmy-S@MsA!huK4r`NdJ(`c0LS>%<7*j9IS8k zMNQ;C1z|lA%}S;@htgs7{RgF15s^{fgX9DO%1hmO@B|4^-Slf~n}!;OC_*C}`wjJJ zp1c~Mt$F|Z_l*x;j-fsc;!iOP&E#HAG?+SIuQ(x-S2a@TgqFV}tF6jQtO`RL!A)4S z)r=vvvQ4VK-!TTwjKk6MiC&KvL9~felfs{^DmSbupIuzi{H|SxDz*hAbzkYMzpRo4d&6f77AqRT(r2=Y)v1CU<@H`#12;G`@|v(kw4N z(XG)hQfC~`6@s6s?*hA7r^WiMkG~H;%9WZhH<7-E8}0Y;*~1(mTjnsp2=%R}xI0Da3ZdhJ2xg4Eq_vEEEqaFLkpJLxbNMcl0dZ zL{Bb^?078@WG*(TmV{!{Ha3?h<5mZjoV{w73UZa6WY5d!)cq}`)36a}UUGyV`LaJD zPRr|AX6Q7iO1y-+#DRPEQv!TqNe7f;M_64p_x*1Zy#}dkY7tWiKkqM6j0eYL8_*N7 zi=mzBoj*R2JxPrb1}x!HWxx`Su&x9HT989L#FDfYhD4wfiGg|)(7nRAlSm#M2YvlI-!tpd z;SKCg1F_%Xg{JkB-JXq8Ig0sbUxy}BEr~#j^B;7YR33IgHTOQn* zP`w~82=+FTuJ5ImcQ>XZF^t2F8fnvd(h2c8PUD(BbGf=Ct0N(f){jxB=_(c2ot!`m zGw6}c;U^`z7o2-#^8{{ffTF2 zhkm}8rNAFAQw_1AhCLauQuF7O)0PRDeNNo9Wn7iXVoXgQCFsbhKxGyB#M73LjnlOq zTl9M9&F-Gj!sVQr{X)htE28Eg>g$H;*Pe`@6Y};5(`9mUjB&A(qlgCgsGai=&j@zdr0eIk3~HEedtCgK*+F^r z9cN}I0smA|;ad%bMG9epI)h6~O|Bp#y5=rk=T`dmh3^)%Ha=@IVS^^b@b?O+h=O{` z(^{j`;VQHO9}z1wDHb_kBJ@HF`bUvek;#T8CMpgX<=9L=c%ow9xreJ3B#GTb>&CP5 zkKDrPu|KVP_GX#gxV8IEz@KW>coT7>A+@I&!APF86;Q_`#fCJstDrc{e^P`0dg1w; zmwCNI@c(;O3sG)82U-#cslii_$rdM2l=cQt++@36;@Y!P8vX(Jv>)@TS41ymKpS(} zANZ$llng)fK1&OsIHOWDD;WH`@xgE|jZFA$SD5hjKH1eQB&(3Ks~kUU@4#VBW12Ap z-#X-8(W@k&(Boq+_FnIC4o7mD9-oL&dcBAwHH!b{voh1L@f)9W$*gVs4!_;AFs7}A zs-3B7&TY0QT?a}omRP@GJ8(nKRzbG5NzHY;A62mhn4t5;7zkuwb5y;drYL_z zISmP`UlrA&_9DP$Nk&4P!hp=sqTK-|=Cif=%i|TII&%q@VW)0lcLF&SE7&5|L`V^O zsz60om}gNXrbBMkwl2L|F-lgfR4;7;znv32e5R3?()ou0xR2>b&J$nXiLn!kyObRz zHgyy(KGas1_)6k?7ZwX}PKmKxPY0iq`GkJv{;KLYsLOSP^#(twur4}ep^BKF&|j2R zjZB$!V~(Uj(=PIKoWY_@9obyjnOwmLkK(An=I1}BQo~)MgSxNka9`EZPF=i!C7edtFDVdHj zlEt5$8dv@ltyMxup;zRh(G#amcDnHU6xM?LbiXZd+3oJ@uFXMXU3iub!D3L`(mdbf z9;lRJ-9JPUSWYU!3couPpSRXVL7<;O>=!N5q@K=tI(3xclS|t&5zQ?5k?5+BGv>B^ zY|m=F#ZHa=E;0Vj1Zg=xKX5WxJ;t1zPH>NmxzhRzWZ@|z6;M^)tYp^2_)>H zpu?ep{l*hqRQDq<&Xy)*^vUFo>$!I>rMYaXERqEUz2eAx;VV?BH z82(Oie;ZoG7o-a^^ZuW&WkF&4IlA3QIvml{~k(R(dGQ zZ1A3kh-wz8LlpYK`a_#VN2iJZqPcOJTD%?!h1~BaMd~IC>tOZp1UU%FJzWsrLcq~~ z@04xKE*^L%s6*-f)2|OxpgYcRx82bDl`@4n*3QF!MRQAgjNnY_!vp4Iu| zWJedqiP{xcZf#MtZPDDQ!a@_hZJ2Wp8^`+5ZmFjm@lgVePCx?-VkB&7k*1vCh#AbR zAo91Ki0>F(-H;KQ8T8HT8Em2y@!2qQ6VvCt{L znx>~Rq(ENk2eh!1;?tn=OzU!v>V914dSURx>pB*nJ9UIKYYoxI5QblB-ot(<;WG_X;m(QL#C%8!s}#wm($%zBBar zW~q%7h2k>95jW8yHhQwH2DLVcOniU!nV) zT?-h|9S`3O3F_Jyy`Y=}kIHXbRze(OJ~Kl*zM9c$R3wtN(*XO+r8>>)yv#zbxW1w@^FQ5l-FGM&WEfX?H}41 z;}EWSg%(e(?>S5j(HGam3FW%UeI`Fip5Dq4lxFd_QoxIf4?a!PHH|)F9qe~ir$-og zcOr<+9J6C=-a*==#7X&@GG?gB!zC2$h1|PSc|41)i6HW&k20qP{bPAq-FxDTq?IM~ch~LXgxU%JdR! zR6*d)0?}CFh8z1aKtgTlLkI3nBJ3ADF&kkg%pYU@SW zVEy5u1^f8d6iOP@GzNxlt8@jv2Tb2I6N>1RRihw%n;)k&goI3r>E$rr-jKbiS&=#KZ(>>h(o- zgLib&&rsBVP()oAKeTuF>ko(EcK5OO0KD6`RMy%>y?aP$E)aN|;dGBM@ATMNdxdh} zglwehyjpEyvwEMt68x5QHm3^|)*$dk)^#N2(mnncm*s9-7f8ga&^**{tnN)`A-@I7Cli5xrYUWSv1Q*m?cnzAGF)hBSa7) z^5guNj++<~a@3gIL$l1Yylm^;&JMaBG2J|#1Uvr-DH^_*TcH2?g3&Z1DH*?0FtWYf z;O=O)^xI=(Nr6gJa~UxVXSg^xA@SR#2}nb|E4zGf9&o_?D9bdlKnq9Of=&QHFV&`* zObCl!U7BLqBwg=tGMRu&sXHnWN|M#2v~qK9GHbDfgZe&@lZ641OCHJoFz~2>mNOOGNN@EffGpsSF}QAkt}N^j~b5ZQAqp< z6HQ(tmJuiPu1_ubdAuU5Q1a-OtHi|s#2O-k!i!s?2{KA@-x@0viE1?^NQST|6QC6) zi<$Ct;Ne|i3{J&#);_pnJSZ+~d2N`sa5y$G5w)m4scTHwcq71C zb_F2YiYTPJA1Cdkjs*0jS${Pl$-~=DvCL}VspbhIc7DUb3BSoKW0cRv?0|)!Dn&SA2sMclw8gf^6jq(H1jW$dU^AYChp_-}9v>WAnQ%xE1hEnr0Py0} zXyb;yde7xf>mLOh6*Fw*d#ln@( zhV{hcjw5GJ)S8Bq~gM{eVm7A+jhYY4ZBL#|8$ zR{ZW%I=Xow1W1HUAd`mr3dzQJFcar zm}XokI*CnXFFajmFq=w#86tiW3yZTEl{9iY&wF2(kJ7R# zMG^AF76Nt9?w&#;N&IRv?7aE|Zb3Xq?@_~^N}2c_^L+_Hh@^*kE(4&6Ucz~kA;|c* z)GjO?HB`S?m4iWyc5-A4gX%Mq}tehJ~j!bKYPfwnk?}c z0SsK9dN*fABZvxAqewKuhaHKCh?pZ6JM|8!5}T&$Ak^2}KY5^ksRg~^88}Mru17Gd z;g5HUd8%fwPh%_(7Up#HGFfQAbx0MCQ_T^C*}w>Gqo)j<$BTNf z_vnvjls;CA*2OracxGxaHlBrh!<0nj%4D#o1~j>keCzDt6GU~W0n|30r_PDTf4FvyhbHXphVQ&sJhwHXfv=jr*A8(`@h8PCNW&n z*~r#fZs3tdCsZvI*qpc%*cQv-)sAmTo&kyPz$_ZB=_80vWmGhj3L~;#Q|K)R8A#8iv%H*ZC%#i}xHFg&I@>8*3&Y4B zy%_rQ`nP#1()_DPwl7YppAjx|UfVot8>*aPHg%?X$1W~?HdHL z-Tx$_&;7$&#A$d>r!9SGs3C$9l3&EC=VG0;W#H^I-1N2Ik$QL!ih;%a-xPt1w8l(* z8zvpS%HN{Gl*echRy-k~3L7L}#X!n-3G7!lxnWWCr)FmQtT8oOj_6?eASOZgURUGi z+Z7z|CCXE!?jOuC|B9A!nb69M;^JZA{UPR8>%Uedrs zo`c#AmjgPumy}^f##P{;O~0&EC>yKVNu9djd0RRRXZl|klPn1%Z;IggoSDb|BV)w&PeG40@Mcxv>f9R^KaPVSl(MTuP}LU4|+Y?nmk`x~vw`Q6dn3C)Im5 zZU}fS?Z?M|C}SDh-23(3Xnd%2Mrx^j86$s5c&+?fL4?I0A+fhP4L(xXoVNjOS|2x) z0{28V?46yzCMrTu@rI<}zO~tyms!4s9)i^2M1SmL%==L4anNMx&9qjyoi@tSld|Hg zX?G_X_8NcUSi@WnU>=jABtLr(DJ44!r5{UV&#Z=4ThjKEUOeJ%C`}ocfBWXkD^a62 zW8n&HXg95h)|i=a7C!#4ofj0zpRvv{e`EXkb902&+l5R0z=-MpqjBVl6U8?x<}XpT zOH9N9sj52Q06QxXE9S8texz@NJnyuS^7?;za$IC zzq5O|-VW<^odMJ-w0svUY9|VKVWAth``b$%J@pFDPm6G%Q$QOPB|du*PKb!Zq|~wL zZ+!YCVxJD$g7Xn?eFi&SVTNE_Ljx{ig@-!W=YTbMcw~g8!_eN|zSX`+*1E6k@^4BS zK$bfGMx-Ac7(1zMh26GiU00U-gk)2PFEd-PjxwV%PAr~J!4+RP5uA72_^z%GReupY z+=KYH*UVXbBmR18s9k)mvJUL}jTXn+QHjEr{;9r+RiDT7j#@~G;(UH%83N&bxlc7H zk#Yt0*}zY*N&8CcO(wWESP(T79pwAZeyc80)P)NjWFM!U z-oC!VuX2yCf~D2L*n3~x+jwJEl|iS2oQbu{YDu-TU^YirNDdEut)iYbK_Mok%)cDA072HO!Yue zJ;~X~_v-@HUIK(at z`xm25iEHui@p+T_##?{Q!gV&L?Kxzr zM4(Z#R!59|twTEC`l;Dj!(DJzd!O%^?GqYIDl8$~de1pTeOl16QY*-PTAOJ4dz1bbiFy{v$dXg-(3ki!=LD*Sn;}T%T&*yNr(NYi#mY?aYFI|nLEfowxbfvNMsEn z{u>e)*ysKkHr)t11_sv~f9^Lx%muAYy8aQOExmgWCy$B+u;tN@hg$5k1)laGgJO-i zEoms8`qc5L*{Zv^&=J!@3iB}im?d2TAG;tLxk_S3D)e6C%W{fbMzMMbr8a3;kQ&pZXL{2V@u={e^Z_V4}l zr6`|crZ9c6ge8sV-(^Dif}E)+-tJhR=sX}mj4H|Y`RfhPF>H_TFra!^)m_6e?7^3z z#Yvts0M+x}eE$81xU=^+ssVdu=Fnd1i|bqwYc$i&fB@VvoSX1UA!FRiCk;1phOg9< z0Pgh`Jim+sg>kqh7uwp|v-9(TJ7gP$H;zz^F7fE%z`t6m{u+b!0VJ(?ghIGnhy*sU}Bd z#e_BuDiLt#4WQc~fXaO^Ryiy;*#o>-;?)14>K%aV3j3(v*j8iPPGdDjW81dVrg0kE zwr$(CZQDtEci;DW@4eq-awd~G$(cE4@BKXczt;LK2%sCHWT>R-fzcoK`l0qCr> zq)_e5`65bX-Qc9>#-SeO8P7h<51y$#dioJpsdlag(5;!>Snz&IOP0rdxb@zE+-8&= z!T$s&(y~6HNf$&YfPmerG}O$jM3sw`biy3^4h_l4M42Gr|F;d-lrJ*z&uj&yfp725 zr#KS;c;`R(TPXvxN~nH8Yy1cI77JbfF|vUrtF-+neS+xcnf9A=M>8pM&Q3S4*_O_p6$xj|wUb5I#QNdR&8T8Z`n!3)N8j*JEt~$8)NkZ3m5S@*~(y zHRV!GSJ2mmKTt=-U)`>%nOni0f|Y6;*1SmkUdMQzgf;93h0VAj-S3}Hh(2GlPgnM{ z0uCwYFvB=5id|m!w0Mv_EZ%Saex4mpB^w81gcxTHb9$;-|4Qm(6JCo~??ar+Dlm~Q zmhJQMz<@1~qft!)xxGPv^`Ku=a=aAUm=&lul4El|gq~haYfeZia~Tr0oTQ}T_+E5< zxzuJoPE_kvhO|D;1fNiry8Xu+8f(U)g})6l}eqG*HmkPQdKnr#m|kcwi>fnIoxMs%1L@= zozj0(n6X5<9ZAF~`~PHHUbFvl_Y)5E|GQ`O7rLTX_YnD zrngHWZ9za!UdIW2Cy2X@^PF~UG%Tn7s#J05&^lE^RPN?Sg`GyWn=+2MX8v;lZ_-i9 z?rBD`t9V7{_+#v+=oVwEsf07Nb`*5Q!EZ+d-gpvBh=Rudvi?M66@8p@SP6QIW|r_ zQ5NLpvWLwwD#J1idLcfLKuiTnzI}6eVru=-?Qh_+of0hn5j6RDH1*q54}RqWHACqs z>`d`Vv-WsGn5W8(f2&9yy4Iza#;pwWJsgAtzgoF=6DcbZyib++W#xKeT6|yG@IxL@ zhu2)a$ljp!y}h@YW0o#|BJ|dST(F zv)hyB%7fPH(Ur zT|p6b$nL0phk0MI^*UwY)qOM_nE?!EVx+3^{l7S* zX0K?$5{Xs7eRT8T)~6S@Hy2n3Uc&SUtk$U`mEug#INeXEJhCT0kl~wzo*@!`{4Gd6 zOIcoh9aCtz=ANqigRUw9G-ecWWIA|JZ7PaBc3dC-VA*g=7HX@U$D1Yk>nqhLxys4P zvOunU^(_C=UXC?-{@(v(cpyiSaPHUXP!q{fOfAX2Zh}Fn()t2FeyRJ!rn%*udZKW6 zU~cSp(@+(Z>Y@)TmAG*bpRvxkeko6!{2W4v#P_T5{;qUyTro$cHGfj1r1H0ug2rL3 zpEU?>PC>$VB$4;!e^oFMnsdQ>7d9cy1cip2<3vN`*~_{PM2`?^Uo{W>??vR zXR(MWOPqnx!|srKETOaUEP~5Nve!GMGF0A2yXW|$XTkvy4iMrBFk!7RFRkZ?ll2N$9gtfd z`;q^AVr<-<8Gl+y`ee#%J=sj0zAjg&v{USQ=-(G2CrlGT==(3NL9-7btvF6@=fui0 z8o^LN>#tgM@V@E(a#WoCFp`rvDa5Ofd|w^ds<{!VQ#o=A`LV*tp3KPEg2pb9S3fId zVG|vi@UFXI!|rb??OIsoV(574)%Yeq`+-b|Cq6;>c8PeiFN@dK#D z(r$_ftwZ1H*|E2>ijyP<5*xO*wkUB&0J3oZ+(mhb?R$xUQFRC=?L@j4EQ(scL@U@{ z)%Pk9LnJ0W?8Luu?-C}1a05FPRX#qxXZBTp^aczeo|@I?iCzS}oCTGQt87?&$8=ej z1@;Meb>P{wiE2h95l|NMiOYb~%c1s-BY3JR^G zx4XWRg}YHl9|+Wa>{96EGhCU=ak&j&Xy>bnld_dXi3>gtPX@@#BKVQ1_Z%`du0`ff zFk?_CU79)lI6qAIR-e3DtuD4iG&9=k9=aaYhi|(wQy@3tXEq2H+qOBcNt5x-W!5Y& zQYKS6k6l#7ZxAguoKtsGLK|G0W4E3H?5yTM$#s;&Rjp#>Vb zfv_mju#a-uK+p%^a+x!z-yr&G9M;H#IsNVi;L$sTAbK^e@wQni?cbSH zkbOxOK*uB}RMVPoqA?B)7C35djf10bFI6f3wm_PC#uy612d<8rK_%Bl@c7vN&{iaG zp2=<^7u@7Lna0y>Qm7&XSpgMdIn;bUCyYlGWnjdZsY+4dPDo%vPU6YE^wR}`WMUa+8BB+vLfJZag2Dug0!d(t zQK6XY+I%aGm*=HYWN4F@94=+`YTaR>`R0|7_oZ^&+vSBw$P4`BAs+*s?&yze93HAf zMn6eT#&b4r`Y#($tz}Ka`fc)sd4hGdRado%6J632=@WnAI!0xW?-rTJ9|!1=3!Vcp zat!LTcwFI>LPVd^n11ZSldIm6a(kS$dXuySF0SEe(Lm#w=spL=*LX|l1XJ9ro*Tbe zO#JMtwqeH=B{C(pA|YOho^!Q&#D(Q|ZR8+&`;)57kd#`AL@*D`RtmIi{Vsi@?c0t(^|$91y8T^!ewUNMKkZ`VXC z*=D1auGA8R%#CGt^BcxpKQJeC63Hjfkzj7Wa7d}bLdZWXs?60<9V(KGz>ou|Xv}9E z+^LkiM84&Fi?TlQN9F;gtf&G6mAEPu<;V{{HzKL-n1tQ1gu}-;yvVdD?O$yF!T<~6W$5pi_Tlh3#Vj5^Zi>D;0u-X2xyMdo&RiU7pJQ zp*{vZs+erdU03^}B$-=x*`hZ#QJQV7#-?0wW9d?p*dB#rksZSTcPn4xO%b=gDW3vQ zXv;;Ut{ORW! z=~j3#_=3u(%m}`4Aw1mJHh?3AmHXOPc6TsG2lm(Wi4(*zQAS!iZUa-uy?(-QL`_}; zGvQdBc4TUpob;JMj}DLBYq>En-j|IV^L(Qa@AF7FpZ+d*^K;?u5FE-36f4ucwu(Ig zCnHKtL(fJftGE*~B{KbK=2Ny5jns+A8MYbjVqg4O5%Z@cA6Sl>a*f$s=Pc-3zN>npQ@CnZ^~l?l zO;=4~?dnCFC5t5)epjQ&8I}#~w43%79opyg&ImGa5B?-kN^z8wsl%^Z+z){{o~EI@ zbuf3LN(n<~o`V^6qrCR{U#ep)z`B1zzpiKf`ty1Xpar;qr5c!Fg6mZx%UT-qNQRkVTUX!U~7% z3h~N`kS{jwI#7EVWb%n!%9G?A7s_l=+dEsAZWJV*hn5-a)QeolQAEJvy}&LAz*22! z`nCWC)}gI+_H@C`U-V<5f?)ZKSL85hfxW!#5gJ=A6o|GTdUEpMnXBl@smSdfl7WE1zi+8g z^vm8GFsb*rgk6@O)EPng{KphjwuE7UIc8^7A-IXGA#Bm$V0vDGURj9Llun)=0kITk z*WZ4{Bp9j%-6&xi|9fax3u?^{ZNjyN{3En5$*|+7*hob+skTPdsJJBcUNB_aSC&Ls z=BDnQQSNMzBdq8pVl0^FmoI&OVJ5BJ)=&78^zDPytO#A;TqgWWQW@zl|5Z3a-uKI} zMACIP2Tp}6SXxY(5+U`*w^tC%sknX4Dz>(gSEJOSg>!=TGxsdkQ##W;naQEMCp5$sDlG2b<-jPNaymj;nH3x6b zKQdLctQ5vmBZP#`36^RdPI^h^~D-nmXw|++>-@KiF zMTmR0BexFj9Jh^bEEgy(i}{1vyIbjS#IE!-7DhBt=n(ZkV&xEkr`WRQqTV;#G|sse zh`dKMG{zb?v3Bdats>!$EqWWsFKrnsSEfghAPd%E8#}NF4zfk)ufcf4Cm%eGt6++x z0!)s~@vG10?U2BX3oZjtQM;>z{qF+NiX8~<S=Bqve?L$P>DVSR7Jg#`!8L=>uC}!nnlG#2u z6gtC!41tTxxds~Qok@`*XN>u58JoO}TM9q^IPx5!I$xx0!-HymMr}I1E!M0f-g?o?r2r+lH8j}=0KV{?(D z!Kho^rOJN|_P>_5lWic?vR&c3-j&qYx*Ce{v4eC@+4|-lve-C@X=i6c=*hE@Xu#TV z{FbEfARi*1W71$!p^Lc$@e6MvziiEt;xZr$62p(cK(9`{QwPs^`q5X^?=UmYN zdH(el++lvdw|EXZYxdF%A7io%HAYc66kpgtzW6OQroQx4z9dZ8jhC@al)wl6>Kr29 zE9)<#h4JSpSS8vOJUConb0VgfqlVXXYc=O2^BtafwB^IM5j-6*ne#_Gr)zVAMz?2L z%_^*#3?1eCn_D!?^YHb=C6SWY7jtFaiBb1I*G&7$@{t~W>olyC_|#Avv(A;;o94>C z9@hHa@3nYGCnTwNgtK14b!K)glu^@`B2pK^Uj&PfIW#_2X4kk^C()D-xrAz^F1M**X9N0M z5E+u`>qUZ#XO3pA2EFG3F~`Otj}NnC^gc8hFiagwX}i1T+iMp6_tqoF||&=?RIkPp3o3M_;_#9buFH-08M zx`1Ezay1QyyYek^=f*rOnV$e$$-7ON>|)-W80BTky$k$Lkd9yK&%R@}II5JFG4qS` z)TqbIj@`hCV%2;hkrpt(C{_w+89r}-T?#;#LPgaOYm71Oi_-ogsyGRuw}5V_xsq#a z50dv8k}pOQ*$Pom^S@_Sg>|mVT`-Nu8P9t%WYE3HI8V&I+GPGox48b{5*0AHiGJ;V z4p_YMIFH|zr(4C3D|3of42KA!f?(BCn!CY*Ez`BW&6c81EyzHWHQgI;rti-g_PqN^ zqq-K;WSqkw6&3$ArTlJG5@;plbc(7rD6u_jyQ@f^K|*%X-Uphn}cVZFxbdf*HAo7maed;D9rwzh_ee(~*lnXUR^pQq>a|G6dl zd;6bE0bt?)8h$FZn}HqHW(-Tl&R4=Ph#(%S4)b3vwj*;t6Wvr2eSa;X< z&5t5ba8wiK!BgZ3RiS}|@Y5&X|Ima7hQhe1e%W5GqK_9LhJi11ehHC14>A<~Ql_<` zcR!XRh*){!(&X*3ev0GnwdIr5?pg1*#>>~BPt!4f@|Bcb@;Eu0>*Q)L52g)Q^-Zx~ zL6D%DctufodR@P{$+=#!JrLSR1M(kN>t8;Y5az&U3R4Gdm%?7lx$4FQ;9JRw>r3C0cw1&8>M(m3^!bP($M!*dzGSFW6HC z^5WjqOy!1%vte&-5BNY^IMuFHcG6aaZ=|CPc7+olEM> zPa{S4Wt$uixK@iY7LE}>wuuB+`63>*tOibjnG33yEI?jPEDhef7>$+LGca*3oS*S@L%RJ^}bb8HDlw;m1ef zfSK!n;J%ZkW?ZT8>LkotcX4s?WvW=e{4@Rc<2xk`17H~q1{t^xB*uL84U#aA z)&VLS+v-4e6O;}`nR;&@yfBPNpmm|Ohc>rLrMnB;G*#5g-3X_jO!J;=fh%@_>&`{jdVFdKm^s9_? z@CMh^O;p3u1sdmyykJ@dAiANc!L%~2daYnN(m^2qgu>`(HKVPlsEDXW3G)jic9V^7 zMHAsyfXd*-$&!snSA${61-#uYa%MQJyfcv1U2n7(6&kgq!6eOn|CCe*EVCxwU=nST z`Jd28_`U*iD>Sk}*{>7kIoC>VW1;9&DNAyTD9 ziaFpBWIkh{*#}(;UvVLY-*&p(028YzCoTq3Ngx?_zH5o%yyL0gq!+;I>i@*3Yc?s$ z;FC_A)Vg5nd@C9_4dLj=}2(O_4m7c9TaDqG?mI0ic`pPe-fFHWucZ?_EdjwF1@ zQ1Z`hAMAo%6>sC9?vJN%$9iKu=GDT{lmBAdya^>B16xi}N^4wdP$KIwPT8tY)m^!d zEmm^;iU3Cno+3->Fb;7Tp$OZzG^p*)=Cn+=S7p@dunUGQC8dHtVVjcQ3DhFQ3Hr0$ zw8@Hu5P+{Q#Ip-=qLqzz}Jqmhlq4+d+V;}wz zF2=9WvtI`O1y(b8q1AaOn5-JLzLIa=f{lLx^8?C_a_ulgB+#2s^J056WHqqEF^NH2 zPRUnyK9%mka6aJNc~U&acZ8l|5DNSy-oP$&Y@D9uI&<@}sN_=J@8eb94g)K#(^9>=rbgZtX{jtN^+SNHfuZS|S{3_|CY!ynjVXDh>ggdNp%Az%1C`U`6qGOU z+&W#@adRvLIuak4L^mHjU#zHn3Y(kh2P`Jk_!ICD7#_JjN**3bGT7R_-w^L0F(&wH zv^gzJR;7Iao3{T?*r=Y3wD^m171|UxIVF&Sw@G`Sdb>@Y-wYr$hWj#Tl%tdJKiYL( zJuzU*4h!FN2nh?vL}O7fb|2$FsYm{R;Ozzpu7?X7prmXYX~l+kWrdI)5@J*!1oJ-F zEVGNe{wpx_07p^AhIa1Ttr8MqxhC4#UbU0B6+DJhE-*;^3#@148ESqb;Qw$ICZ3sP ze7yG1^&8A+i%Uy;=e~gzcMkq+$YNs#v@GMHL~+oot)OA4&OyA?yN!b7;leZg8P0>; z%OA6b4_J~bUjmsRoCFhLIF;^lux`wVv@rf^Wv|OJ3*}-bNZ}BHgSh~aN|Zf&pfTWb zv;B(^|KJX31ub5wfnI?3oXwTjhjx`yEB@Y!C>njA4DOEwVkcVqA(Oq1A^TPKXl?B) zRkq3-L*-r4jvKgPVmcy4cM*0|@FqP`NDk;vYZ*B}8&_ zrxJ3oYhBHULGx_CNBjr8^x}Lds33OTVJzC5V%!YRjL5+DlruIV4kL_CNsn; z^8bBRt0Jg-`s!p&{*>$WW~QxnGKPLjEX?4fzV;Suzj_wrm*_Ca+`bkZQ)R6y=2wL8 z;G@L@%4+_Q|2v;dM2S77>;%7LR2Z_O?0jJU`2&ckMbQWJU0jt_GO_;ocHY(LRS}zp z<=Dtjj1rlY*f$hknMP@95zwd+z?OX%N9<-yuCigDm6QB1z`Nf!uSZV*H7~^czDUxx zOFdhlnI0jZlcV7_zAmO0SHjdc^}q;40Si3QgQ0?sF?kl}X z_$BctUi-8TskBeLr}j)uNlaMb#)6GcBdAlKn3P|{{0xEeh$$^AHw~Q)f+elal`?AU zM~5lnZ4!A0J^!SE?VS2Q_6J`}8R(O987zJ&j*<$=;!pe6qb?#AQ$G;<+y z3rU>1!$+QQ|h#v|XP!c!bDEVw7%dZAjVF ztl+#-3(dh_sE<7(T&RBxL@wZO5YHcpFZk)|IH0ESC0D!r~y4&Y)`z22~_kVPzcfWxTJlX zdWbIV0K|s`Uk~EbIc?L**gRt4XhVc_fnj!sIXPmW^qoS%M*^HMW`g+TMk_l0-}!o- z-5`3CC2b)^W;PC56b1}g4kQT1mH^UH7-`Ba|0_Lc3U%pJup8-RDz$Bzv<<^(e{@Jl z(%pkl|71&4h}zgzHSB7WCO~R zG$KDPK#?+zrLLf+LqtmN>*{pf$=m#)2OwBg>`@o&()*kcRk0sl!Qj8;RbpKWP#o4@ za?4uws+hWKe5N(%TsDSt5KFuW%^Zvi9EQTer^3P~(H($>rh@mi6XrS{5iS5sE+EhY zKkU>AK!Ob{IowqyhxkCyU7P}>^Z&>{NQ|-WFo4|kUciqU_cnKbUZ&f3Y39$8bK8%x zv6{I^kM3r{X^$BJQiy7>L@W$RjO0|l3VAUZO+O~AUQ2IXK;WmOk}7bKxl0=ZQGq&F z<%h-$3&`av?BsEL;02)12RijiTJr>wtR)_{yw)~5zp%Zy&UtMsEb1gKYqA0y@(3>Q zbW3LDwTdh{C0TU_lMIK^(FVzA;*XQ{t~jj9*x~|6&z4;&uYWIZ=3)kf_k1n1aPbgt zYYfP2GJR}fV^mj<^zd8qQlZNoC_GmwQzf;Em2H$~1dV^vsrPD>g(3>opbsMGG>%Pa za#_aKG1n=2Oeh;Yv{LZM($uRPJj1EQZBke7|2UVd&yzIHr?_t@8`$H3de#gus%>df zx5T~mCr^@7Syc2Io~5RU6I7!910{h(Ywj*i2weLk#`N-Ez!G~cQj=H@w0AuY$#Kw% zfidx9z=bAIvb;^`b&`9K*uR0mM|ri~{foz>hv%3U^mo|f7+v+m;*w!I8cK`J;)u2G z{?pmugf3IvXxip&;j}9*E<&&|<5>i^RWX^cWvN%C=|=+5|v2ADw%minkZ9JA}UV_SZHzu{1nLV zTD)l1NyarS-1Hly3&F~{K4NF(!5%1QS39#5HHaTAjLs=<3Qri zFcYi5FQ|q5*59L3Z$tpOv>wO+iJhnjE#T4vWhy-t#LT!6`VIUvUkUuuSN*f1&JM%r z)*!9MM@(cfyXB}*OBr;%%%sPhYjip^48NXpR-h&$Q?Da6HgYUlpUW!puA9^v^wHV$ zLH8-8@0}-c>8D`6C`byxLQHewL9ti){HSX5!KOU&-rZKLT`s!nx?dTbgYDcyNCrR^(3+2A2|GJ+5V7`#mSO@F^O z$N**ip;6`wbCVqkvQs-7-HWsH4(w~!W}yC5>=3^LKNBh$y1Kah0Jb7f&r1M4i^4J0 z^bM2^H6}20il6%T-RH32AC^}-WRGvC;e%3DRLtVo)29cILO3N5VZGfuvadh^%^_R% ztE_BeplYuojtr#mX$#dL^)`#+ekdDi3u2s8ne|GGzyFugLzU;5eKa_%u7yOT`E!+> z<*?UI(MOrmomKv^km0oNxQEG;*5gkw=WDX2eoG;)Nx#Y(o6ZmWB<*_`el1wWsVht1 z2QQKiliec<%h9~kRfIZP2cM*g`UK_+Y*WjI(ja_pwoxbq6nmO-yE;jBVA*aN$gpEum-nH`JXXR|x%$M`$_$4a!C59a`uk&aq&ymcxPWU5**r5_o z^laKU@hx@~1Kareu@2=tUP?FoQeTsAS)bDJ3tPBp?3nZ@e%no-v2$mH$v^b{w#; za#xAaEbnkkDsPb?^U2+? zuH2)~h4Yx=vAGoQuLlR!kZ4q~t(Y%ePL#%SN>Y8DupV5Ts@&WnqkYG!HFdQXJBXw| zJYOK7b*-^(UTxe(WdmbaCReA92Ko?keq;X164!e0B^>Zzfg~z}N(>+9nWw1IOrpBtD zk_Mh)6-;#&lo3~pxV=&#c3Ga6Z9;fdl439;2l1^xi#6s^;Y%B)WMZ=IezObXdd4k0zoQBZs=lQf+@ZXV`fQDM^@nf3#xjTQ+< zW^p%okV*g-r@1p9Dvl3Tjs_fhqS}#cvu2EFI5IfFIWWyMkVn^0C|ozQ_9Wr_qIlCV z%e-yUl5W}l&3kO0ARYT2>9G;d^}G;#J-pl-q7PGA*I4@*$9^QLvBc85XW4Uu3{?@+ zyYWi&2?W#OdEKTn_PgL^EOs|Hu4s9mdihg^^L4C@fxh4lm%7!2%~n45CiqGVHCQ>q zrbN)>+@4Ww)S9_ckWqPSwjwTs)*y@SeXEC-fJC)KEiQiLq1R10(l6PxnDS7E{8ndc zlPN)r77&4^$-%e~*D%LIPv(Xsco9>@g!2aF+G(~U*A$>IkeS1~O7rpec0;pt+hW0a z>5L1-g3d)77!?Q!4fz|}RuZcm?_!mA0bbF^An#?>AG@=bB)Le%b(vSMCl&kZMx7gt zv$AqzQMHHz?UkOw%6YoYq2ad9SvOikmnIeS-DCHx?Snfqj3s|y{nDYzsbIy3_R3qf z^sF4tXrp9!&(g2yQRD?S`gxam^vI6&SgPwO``b2_m};uR*i(aTQ{ZD|`NmV|wzkkJ z#vwEuDHv24#w_+Td`Vh`Mme-5LK&QrVoIlIm4p2ih~^pkj&#gm!qMhEhxkm397*kj zrH#>0P`DU{RP0aawn<2))~jnv^|NJOrSp6_s@sqWDaZH&3T}9=+C;Q8 zmy52~_O%QUEc;e!d~jecJU(Lsr-Y@8@wIcKfN4Mc0TB7o>ckzOuQ zVfE?_b%nlfVZ;nSHFtev=_aQY;cS`Is3cf=(rpYTw05@;{4jL-ay%KFWWD7A3Fi+1 z7uK`+xcPk~zq4dORRVvAw-uugm9e+Tg@Yd1u3^UhMU+iri*4v|KTqLCcFeV}Xrq({ ziQt$U!4V4k9E*~ie(m?JO!W&Pa*JMx?z<$fYbu(c-E4?Fd(AfXh8c@}4K~t{JjfRn zdkiPz0DD~NLJqgkS^hcmA04(91r#s8znzyqBAgW7Q}=FC9!s?z?wYl@B440=*<5DS zXLxkcEba87u+3_lKnY^_U|D4x@|tCLf# zrDdu9=s}Mcv`d?GO2F9Z9+FqYRc#Y2vXsza`F;r6kE>~382g0vwQGZ%$^NpYLBC)l z`GXYou$x@DBG2GhXEcl3jKnhRz(b~O^mnIEAytTY`8!WTcs)& zYGqli=02DzhN}`^hb3 zVZizxYta5?5NfjH%6{Ni)^vF6S5fD27bAOxV`ysnRtt%i0q2iEZQ_<${C&Ji)3eje zCt$)DS#G9pg!Cbuj08+%7<%oRu8Dru6N)^OB%Gw7Rl7N5&{h1guBI3NWKOb40Smd{ z+=i)pv;f~_ZeG^}ZwSkP8{Ui1{#4PDuQ1(WHbh`SjO#{TQeYn5jRpe@+Rc=dbuX^g|szM}a z(hLm^9ZiRz5RGzbxViw7Mv>5|si}WvaM*BvcZeTE=*J_6PQtHDKTl;gZW#~z?g@C^ z3Mf?3X3^K?Zx2_YC`*BxUocB&`b8j`4#1g(YjEb4_B1^}HZZ-sypZs}_9PN;z*#s{ zC-ZwhZ2%_D()#W$+bRL(o|uR1+7;?VGglT!DUSCbE6EGOH@&)9jqWT?=>UP`LSf~3 z3QO+I%EOezsx~w^MOh4&m%hSD7G1lUsaM&ump{BnGZ*8^g*)NzdOH+VxFi zrLNp(>NCMMBVms?Z9I?e@KWp;dHH-FH~r^Jv#~KwKTdbC#XSB!z`$|PKIcRc^25Eo z-iZ26gii!f-qHKNn+3q`imuqRUz3i+4AQT3J7^C_U~BoE?LvvPX60I7yX=JH&YlWP9`c7J9?gkTCdS-lE#T0I zo{O(d3biN|M)2L36Ej!L_-l>>QlC@wq}9s7+m8IXlS%{wN;iG<@MDB$rybWkWaz6i ze$~3%$`=+?5lLhCh_6&%{?wy_ivjmPj#b6kQ&eaOKFXJt+Bg42l-G1GB@y zgl0dZIpAzqIQG>A;WOixX6z#N4U;Cp$uGh2UPb)|zW|K`@gIOo8U9b5WOz5ha zF)CeQO4C4BkC;_n3m9Ay06gL)*%USiT)^{ax&)p|!sbadQ3=mjUM>JN5K#p0X#)(N?=7lITzokb7rl zfCxMjohlP9Y-!OjT+|>$?EDS4!j5-&sNES%&?NLBwOykoggGN0^8OdLw+GhpPB~@dz?>VuFBV$A>f} zU|q@cte!$FK!9C@5_MEjXcjU!xCxvu;gw-^OEaRT9`)BK=U($@gz*2b3`hhPlex$} zb4{~lF|)Z)#(#pO$E+^dxIp5)9xI>!T^nwQ4m~Hb^R_YF6mR@AR9TQJOq-ama=*@1 zdT9g_k6sZ;!zL|drWt#h<5wFI#V8Ia=h&@@G;#|zaXECmr*6i{Z71iro}5^wCu`OZ zYLSq8r-q*7%gUQE1V-(dVZKf{$F3+BJ@X(ut_nJTREC+G#;Kf7dJ`L-*y zTV)!?su?Z;$%2_ZgGa1y2t1O;sLaV<5*PH;B)_awg5!!(^9C0WW5Dj2G28XXQZc$4R030*I5|019-qR3X4+e7W*{E4i zSU_q{ozY-&jQ1<+g0zUxf$!rZk3xf?Ez0NDq6##YQCxH>;*Ei!Z80__Nl?kwT_@DE zUYulRy0snPf)~KDR2HkqF{%fEf%zxd)Ov|m1Oo-hh&A&S)N?B*PBEn4>Gg~qvN@=+ z!mYjgSuPpU`({%JB4b)nxyXJ0VIqXU>NA9rklr*2vz$Fnj?&|&p9)ui0gTZEk;JQWjN51vKc5o%T6+~H#U zZXx9}5i+GYfSXPHCy-ztt*bU4-vvbIv;QiA9^s?6pFs!W8Sm|cp(=qnbt8Xxv>zOm z7xE20&X-!w2wH{}Ik0*9k!Ib;s z7O9q{453LU{!@4sfL>NecgXJT>^)XEsEy*up-iauZ{@nQY72|yBGval`Jwuyn(tE> zG%VS#W=gIwU|W)`^IfP-3jBN9J~CLwoDdt5$3slYpFL=)=+9Rl_F_8Z$xa;4sN`0D zAGQru=^Q^+yK8X5mN=##wP`KGQHtlFf6LiL|_zmfU^adLOZJ8i(>7{2e>76 z{~HORp%Kg?7@DebFY-TV)Sjo*y6UVq$>DMw({j9}YR)R^J8m*BJ0aqim%ucgy$@p5 z=s-5^h0x~;z`ij;uB57z&FyU#-#j$no*`Tcr25#G8`dM_!Mz|=V?JAiETv;sdHtfU zXWNBJ0$RC$0Zm6R@QlTGKXQM?rxhK*pR+qO;|kNiVM|AkB%(dN|)ml2n?>aZO%o@6y!9 za+LVGtkX7^hvRaV+=kFh$N$csd*c2LZ>p7Y0K>VH*|`ex&Z()Q0^wK(r;-?-GuMQ( zo?Zu$96#T|30D}E*8EC%H^W*jA9Tq15RDi?Rua30p}wd2HdfhCkIz)~m0;S{Xz!=Q zXJ&#+bG+@QgNqN+oA>Wd+L%(3BkMxhnr}F8f65lC;$hTE4JA6Ig>0|PkV7z_c7C3r$8um5kCB`Fq!}kAMMD9in03%DU1n5oweUu6js7h-)+pd-0Cz>SK^jo z&7fQ1#=qmhKBm;5O|2^Oqg*3mO@60V>iE`Eu&z+Xza;)y+?8JT0n zK1AEBd97!8soUep4SX%XEGx@G-NpS{n+TOU*=vW>PF@U-&fN!h$VHO*1&tJ2$nN8p z$WhLe8>*-AfADg>>Mwuf^bpM6JWE5q#9nniZ&{LtE|UJIC!;3;!eI*YSjRYP2*zA< zZZwyJg=G@-5)tjLjYK0%4Udwb0wsp82JOUmw)VUE9Tg)&dGLJ|BNADP zy+R3KyPQEsQWA(8q*$A06y>NijMCe$A5ePw!qm~sNzl>qjW zpAhkv$v$U*XYzj*PvFldxWTyVbmS<}Ar#R7SPa zKqAXIX~9&02+Y=mU8Y&brFJMF&>D_+0Kv}e&kJ*X&qK^ol{TwIT1h)3nF*NkG=Wky z&Ul3~OR&U9$yVsce}=(u{SVT>py{BjsRwT2rXB#7!^^|d;y-ZW$+;PV82!ZEm;S`9?tlz5Nd4Fgr6NvS28Qr}JQ0nD099jZzJ}3z|G&-P ze++&ToM7_=nD9l127QU?khxu5e*pIgM1d!H=%v3Q(;er9m=|}$9nX=f)h;tFmiS;F za8RI*th0n2Urt~azdW^d2^Pq3?EH;sF%--&l9~F zVvJ$P!w34RsRHq#58$ zX=#vu^e?Thz6O@k0In&T?FBQo!iZN())AB;|6c4twlw_zjcQ>+DCqYywJMw z54r;sY#PYH|NF_1^1kNdn0lY~8!fd!e^g#`TnywnR)qTRC%7j%DNp)<|85BXd*~|E zKzKCi>@Es^1@XlL;hw3hV;w1jd}8G3h!gFP`~Mx@)IwlCw5m`#F^lAt+nR@z?QCqm zg)D=q2-vXx|4yShQU}DqY*VhU|H3z)rDGp&%iX~zmB1?7a$1z0A}M>IDx4Y7Pq)%_ zD`858+1%t(C{6l{Fl@jCozgt3fZU%nFcf%qoe6deB}71kQPGI$#ryDwsYOy?tla!) z{XaY^N_kmX>pX7v8tC){8lgBO2V|IhLlX{ zrN+ST706?_k^kd;QIUR}@)05y6lLK^gVk+ge7l(>Y1 zj5IV-PHHt{)q0(9I1omCx}_>*K!Eli=YQgv$mfOR!~64bxmX+X>qr+++y`K%q7sS4U})35Z!5479hj+9?pmSYWG6=v z)4n{q=LznOU#vGrhi>uMZ}A=d&ij8zd+VsEzVCmS?(UW@X`}?{?(XjHZlt6^Qjid& zyFnTRq`MoWyBmIY-k;Lvzh`}&#X^ReJC}RU+2`!NUooB{q_+0BdfU07mN#L_toF3P zoe`d0l+Sq{G~`L}2%3WH(vnRGY8&>s;lXB^HHTPHAL^`YFs50PBw92$k9^+F8e z@QJlutlVa01p(E946rzD4tqJqT zFQLUqMTR)=kU(ZW%xzZ~%qQjNKf5-tg?m6Kgf#4ioN08zsQ-=5AWA5;pjhDS z4$Exl5u*S1DL}$r3d&PTTTnwK{x_2Z!O;bW>I2^sX8hwT{;zNmq$QUFhofDMj7LbA zArRnyaq|QcovEMG&uB&ZJsAoi%T`TED5d7;NdnqwlhKj}g2MDaA-Z=t1GweWP(UyX z1dF4v;3QCc$I9A8kZRZqU@6~4l*0=L01`EzOvSkrYfz9%k>RlT4@(4n>U_+&RkiudpcPak_zo?DC{z{WU>5htjFw*^+!kn&Q4M` zP+=(fLV{Z56(gsQg1z)CQ{ZO#LShN!b?+=_7V?bQWTji81BMs=kI@F)d08poeKXHx z+6~$;*$Nsj>&vJ9IVi_H63=CXJ|JxSf8s0fT2s(#)fV^8Vm&u5vz`acvVAAf7sKQ7 zln5xcJ1=LJ+8d71S18ULu5YY&rk1nKbj}?AcsprO^FJpUo!EbjAvvU4;#R_3_6+ef zo>HkfP>S8TtJye9&~w?Z4yw!FPv)IFO2s~TZ#zms0N(p)Sac5hcUi1D<-YY`Z{GHNaz|(cV0XkYXwM+3Q zg#`O9Ac&>MhbwP?0~kTNOP5uTKlNIL)d>*)Ba|A>0l^q5 zDk>?>KsEpCgPFsMmXmaw++`#PftSgCl+xGn+jv^nv+xrOQ-g2*H=|p!L>h5cy)Y$* zwv12P3%AACS-UScPig-JUTx3%Gls$%{co$S(JjC1(C zaWsEKLof_d>cEt@tn>_@{)(J=P~*;-N>857e;ydz7{am{Bd`18|KYHa{CDe+>Vf~+ zN|U3SG6w&Ikfkp9-Mc=QWF}ei(fdO2U&|jo4Un1SK!Sk-b!~J!A#{Ca;Igrbqo>1$ zq{k!Ees#&5fQ9Ab`75Nb29X1%Mu-MYjz;^F`2#d6MzJ?xg!YpB*@MGd!qrDW!Q|hE z?{XoDa0YG*^!q@Qf9=y0A7VGB`K;51_l`e1_nL~2LU`&YvvOQd;@n;1~y_9 zqeT0_5AcqXS}tH2mvARrn|m zDd<$yd8+0ro1Su};+*eMK2q&xv{vT|;2PS^8U!WAg1uPSI*OLRnO3o|33TV7G*SW^ zZ4dP3VM6Vi5F3SbHSxa(N>q8 zueZOSw%)vw3hP){>?YBvqy`t zMan&kFg|Wteg#HL5HeuzJAs6T^)dH!%X4na61cheIi0&m_J&cxuSm81RB|ZwRH9hN zXf&d#5cQkiq~Rhdz+(rRR9UsLBtX-2!j3z2C{l)?jy9GB9qZ#@hzzrMD$NT3`~v%9 z;Ppibmd)L6EGBuyZy^v4RkEfCkkNO{k6UY#sMF(ZBm{i|JS?s3UiT3|MMOQ;8$k}f}?W=0V8|Y z=lyTi0PT0y>5%Oz7#Ntn`T}E`U;_!+9x<$68{gFVRN;l3-pNCS=5)eAJ#45^T2u~cJco{uV3B}JZF+Xm&|dad%9S~#3M=g^$-w&!f&ZeI>`$) ztt$fUuK|Rm!;1YakhY>$Yx4Qr9Qm9yTL9LTx}shCQj_%7tQ$OmQU5xFGTwjApnI{X zx(>!t3G}$)MPTw!0EOw5)!6Ph>5{^BzejgG$tpnVbxh#Z7tk*U^+3D2RvPS(5g38F_Jq4~oo?XE8P|?;N z4BeX1FnB)eK|Nil4VN(nR9^oWxqz%I#%bZ=v3s&~Z|3@n$J%qo+EbX1w`{~;uR;dB z3Z!7w3hd{bYcp6)`aqKRASTtaLRZosf1V%&z5?mF{{f(Uey#9&rLf#J5dj$lcB{fd z_2+mO?89tAN)b2Yq-A_uD|)0TprfV5Q`;??JB0os{LQhcOky}eU(-u;#AuswUR<_M zOf`3sQjsbat;sS=u)N6>n70ss2Nw~%qio9N!PaNu)OVIjM2EOSWV8M#5P@D=n_m_XTy_MhrGCPzqIk$(a{f$W)(YLXKjKsamhN(=k5|Vkq()^~wO1i9*>g70xukcBo^a;Qg2c3evTBD&uro4(U z1nPwqb(!$}XNiITMF~fB_kBHSAUfBN29kiSI*ea_&xVbILkF;P^S|qP zb8!7IEFPUN^5^LP6fCIxq&f~6Rs_^fQ~;xGprT}C^aM!E_W-sOfH=c(m3i`jX{3l1 z$p7Mh0gQADo^nV5+7VzDzTRK%k_C3Y0;Z3rC8ZVV0IXe=z6}st}c@Q%3bZW z)fc@R1^rjv@+nRb<5^X457-P8RaU}QUIo1D1^_e41CZf=cZp6XGHMD(k_pYz@ zj|mb8RTCuW{Hz*A$`FeXRUFy738+#FYL?oPMw$I}d_2S;tovdUCG@d>%xM2}?jX(L z!vAO%|93{iKyBWt80AlG_1M13*%=AwH#vSQEDYy?Lw_Md_C=)$;m?ABQv&46|98QI zDA7KxDLeyq;QDOCFy|^ph>z9P)#pH*V{}n0R(<(RBM@}D5i;JNsA!7y_w0p%a?Z&} zRI2@#wr|5MpvWb_)bVsNZ)Lb|Bq>fD`lbL`PbCy|L1_Vq}GJk1~!2>p}+$giaQ-#-y1H{-m3Xg z>Ad4sA$ZhS75%Rd>M=f)%_#@aQ+2HYX!cnz3Gri zwlt)u4p>wHvw5!TRFYJ2yd_%O;V!o7m`zKVVp!ITO zMCD)7UX@yDKk-xXK6J^^ga6y$QM zz=GMqSDs8lB)W2ohd)_)t!~1 z7o{m1{zI{=n2T@gn@Udl299o@w0UNizTUL0se@SFlTJWnmT=GWzS!uRgQ+j&qbwjz z%||Vee4iQZE&smLJC(jZ6Y)jr5gC-uRgNZcPpvZ z)JN7?F+t1H19JD$ABup)_Eu}V@Z+^M1CIN#X#M3~2{Su`_3>i83xnC)2I5(x#9M)4?HG0Z_a9Kzq}$ZT6SLL)OMqS= zK!@LCPeUIYM2gaGwAZt@x4*e7R^U5_LQ;}@&gaVIIakS_wh6Vv!d2Nwqh?>EjSVH1 zVT;Y_qySoi3tNRiOAwG2ukLb&f-d}R7(h=*)NjFjG6wGC%GW)Du2qCKKcGC<*lzPBsNbj+stfF)&dR&nPx)3g=EnSBjlGel<{z ziD88&QGbJ~*3C&@JS*wW>(q2??nTJ)l{uj^C2=c1wZ5E61)4}GVL#DtI|ta_{%^v8 zQ=-8FyW*|DutL)RO>HoE%1p3_Vktl}{jX<#3V}UObLVW(Z7Fp63~nBw6i*!1ym5kF z7cdW3suEZ~B?~ZW2wXdS<81ge^m&Hh>fyN!3#=&Z8wYk+Z$Q^}zKZx7L$j$lszo4v6E>CSE-xWtD+wT}A9mwd@VbCm4)RUPlR*1C7?BK!5p zbgz&)n{`L9>Cj?)YdX(%QA9{^-CO%6=FG@<>c(zcoJOc~`}ei?Sh_|zEAIktbiYfr zlG5a!xmu84Ow$3JI=lf~lLsvpZ_xvfG8Kuoiij$oMrBe(O`kRQhlcu6+i`OhoQ)6W zv}?w1YI^uG1;uTS7&cD&FvPaR+QEcA^d$(ce_ip9y~aXBRZ1AEOHknNv5X#@+|o?O z&vNtFdg7JS&t37%t|qpxti_HQx7p%Im9P>PL8cIzpNs4b-Nxh@>Q&%IFw|I|2*t#iBDQ?p8_F@v zj>a!z@ip_TKrqquM?_2k;&=WRkqqq%jLL_=D$9#`WTvUSByWV`OBG=9cht^dN%|?V_B&Cnb5>RsX~Jg{Ttb_7XLSQa$ z3;R(Fr4aJm`qioRtgoKQGv3RAbT;o{UFR;)$3RTU$g37;W#?wQ{2H++{rqWqM`T91 zg!Y8kY*RS&rA$UZL3g%*(#~9_+`i4}mwY}$>%5Qvg(vyE_)AExcgcP~;}9HN(p$Bg zOwK`Sz3WP}z8Gon4fi^!NDCx|T!HnhqS~sHhtb6ANPC4Qqpe!k6nvG7s6%^IsS*Wm z0_nODQI{DC^;^z-&+?T8YpR=rG?J-wijdp0f-b@nCeK$qAHpL6g1bp;&*1}nTc?2! z?9JZ??riBURLEFfF2@7{e*a1U$odw(2$9XP?BEgB9TM)waz58V51TB17OmSXx-xfqpxH%`~QS6Ip)+fhk*}f7p8Kl0XcGrmK4oato^swkzTOu!tA7~lIZYh9~_~EAc_PY+g zPc4<7Tdz4ZPvXe3tIc*M*a=-tEHS)`pMt`PzmEjpYS zdE+IV(UR2(Cc?V!gluw2()};t55?2H%hvJoT--nS`X-$ic+H8$1xwZ#mQ?46>NgOH z*xn6Z&8Q5hKuy^Ym&4qPcC=`e>C@L#ei0B;*I&!itXHK*s-hNprfGfSs#QvD(nbm%DOik7qO14lYFzcpU$}Z=#JdQ^Uu%5fScbq1wxiujN; zeNYzXGoRKFMsV18+AR+Lwpq;M@CYuvMxz2Hx$g>FFCY3cA@o$z0aeN7$EQtb>uZLK zKFQk&&mY4C2MutKv*8OA(0s=%S0`1~-V%a5ah4{?J+*%8H#GI4tf2-lhb63puE#a6 zF+Wfz#brfqao7h){O>kaS66|ZoZUi=nFrw12~x>30o%J?7RQ2y|NMQ%QOji_GMqjJ zk#^KQgQl&L;WT=rp}a(QYR^D3#iOY}H;;?B;XePp8JUc%eLGykN8j!#d7gTdetc9R zVhUznb6z7(XgIG5yBYn_IeBJ|wmup8n?j34Pru(Nx6Q9rFZyXCAqza(SU%`G^9^L0 znic%h#u01*Yc`9vQx!9c$;bAppL^IZC;|N;l-#=Nl`X=i>D?s_D!w({T1EP1CK?(A zn{Tq6K1B=ilKD(+8(12pNa^5s!U7wI@QYy%?_6F1itN7hu2FEONOB)E7MBgMI;G0I zp(r6qmFCj1US8a+=e*QMbQ(RTLyPeKVBajP4@OP*nNg{9R|*b(`Q=+iB&jf$k0%f2 z1z5E7FXyjW`PDJfNmHLc_I>rS!8hvhALqY-Q^{eyiGzFB=mwLo`C%RT>bsFkmSAVo&aELt)s17@#BF0m-AeO-a4>i+->E( zB`=V7fFPd<3tI#PBEA*v%Z6izp)M{G#~~is319cYIRDzG(w!+_Cqsx%5@5Mbkgj5DzlQ#{K7#GwjDyNoTZsc)SI@QS< z%s*C?EhCe%hw|ftAEaMaY~Dy%3G`$`@;!Dqboc&XNsQcVBFULH?8C6NBQBi7kba}6 zXp+Nhv-{$6$lA;xTZB69_F$MpY|PbLmYD*V3OVNsMoqVju{u#3^*q{ei}6N&uA8_-F_K%m|r4M9HQF?ubjH* zroMzu)vqYxnLas>Dp@O_QQ{~mR0|JNKg3pD6ztICMi0}rQ!aN+9Xab<3ed6f@hOc# z>1L-y>BCcvyHvfAT)5l~R;dX`$tHe6X zOiE|eO3WaFT)$LrQ+iS;PKockn$Wb>4ihB#DpITnlMr$jk?jTZ*IH}a9kU6$I2x{F zBnE^Vr4R4LD#D6JsHzQ_rkk^c2g#@-U;U6v<*K6Ij@Atc3Ia*&14tianSps=-pQ@+ zPWOeOMfDs}5W^V#RaO`0nJu|svCMdCfvbVn8 zl?c9%lBwPjPVZN=CRdh|3e=D&-fMTDi zTOqJDsx9HRCXj`pf__Be4fi2T{`oQuq-{aYEDUOeQ`MP!fXf$PJ_QX^;{SBs@AQ7o zQ=0(&m)p{fcaqNs5*@b}R(8yYw$rj+r>N>@nYiYkCN2+}%-6*=3G8}BjTkJ4W_vpV z(-@j9k={_0pGxBFKTa7y4v>}sVq>eFb8&fb0c6;l_v>;WZkBx!y$BL@-o z4nb)R?`Nq=B_tm+4&#d7U9Mx9^>oqCY!PRk3N?MUma=Ja{cuEdOvF+;Pjfwgn2LKC z%J|)=Mb7#_YjGUsog0ykz`@|~6(-bFBqR+W72$o2QGb=2Ij>tjOf|%iUXF&2pha63 zVW}1DmREttfZyP6@u(HL{zhT#2MM1GFgIE%TTwaFdx0=VP*0&-G5eEi%FO z81E3vMe#VD{02n%@FZ(ZBgGl-79;yJ+<_kTK}y~0TF8=_AHGU4#OA*zrl6fa#F~iC zB(#I4HhY8fAom4GmU@fKRH;+1&8Ky!s|7HTtekzlq9Oe(wR}UOcWqt&BgxVu1vwM)WdLWF)5b#t>5zMNfZDt59~Q0^@C+o3~0Fd52nMWvQ}M$vQkJr|AxLE8JAlD7NtWShf7=kz_c&$b!J5`$okHOCaf@)92FCQZIXyB7I}H&ZnQs z<&W@f=8{;^a0|G@9BB7uZ3}YZ{@*ss+b4JID}pjhj$;iEB7`URO&j!6&3cnIDb!}| zkase@&=d<^(o)kUnG_vZHIktWa_<$U$5IKuJ1mtJb{$KYbC-D(N4>pi?q{79H|{LR zOPVS$+^#4qvT~ogmI-_OW|RG3`<}>`A&5-9AX)4_KemKj!tI-&s-mSPmT-+AzALFA z7($dtr%h#tiZWGQdLu`jr8X8jJwumR*mpIb=mV=d2^n#7M)ekJZ8>^wts+*P?=bgI z512~Ycdn+<@8e=SW!v21s`S&dnJdT}2-H;Bx4ngmardwsRK&3Vb^Ye>*#;L zyIv^D-&9?%z1mwhIZ(ocyK7lm(q6fbx>lRxIB;)*z?I!rCa#`Zz4DIgDt!y1;kKte zeq)|!>x92x_^^lH`^~CXbyi*{$}~&2YJAwAV{HIwFgMm*`$^UFTZeIPBv9D#>=hsi zI0Fo99_KN)8q31Slr%!~zR=&7Vc2lNQ z_Wom*^3Hq{{TLbfu!PAjNEq9~t1HNM zKSj;d2H{}aEq&9$Kb-RY;twfPcUr+{P)wRV?lDP9C-F7_{lXF(v>88ybr-ePei z8B@wZ;2M;o&m;UkLgl6k&21Cvg4Hyvgtx*+&s3k%`mRUqgGFMem#XaccOSwTj~aDO zDXnMk7G}*yzgaV3E3+sXQ>69=?R#AjiM7Bjrwe)Jwb_McJ-Ri7OJ1X!2vHtxAq46$ z6#4j%V&6Dm9}Odu1xcrDT|z=ouQDAbx{#75sc(j{vgK$nilgoL8wPGOtrR0ff86dZ ze5A0Q7k9GC3ky#3zBOdHEXqy#=+c9o*@>s{W`Ns^D=v~G1p$Q?7nP_$vrF_XEhLKS z_Q$s|Q&nrzaWbsA^eiXZF^CAmSa3)h*OnLy79=0F!fq<^x|EJg&!J1^{D^sHa^qRy zcJYYH>y^RD)`TBYVrMW0dL)SBgkBQ|`NrWBs6~c&8|!Y7<>Qr)gEaCX?ssC_+ubj% zdDyk3SkzX2A07HA^plh_>yAS)BbV%k=-(;UlcvcteVJ7y;2(PTSOO=*hY`fescXXL zM|s?L=ku|@uv^C0Gr1$+^<^V0U%Uhnv%IqskXAazlL3r%|6SIT1PgL%wgaja5Y{MS zrldil55-la^kv-8J<9o$N@ZVBNEkgE(M+&mOU!fpj1vB6#Go+;h1?hSh{FI@rhC1oWfYdGx{fa>j&UxNjZ&J`LFM8g* zRMpjC?Q~TKMCz1sBXpl*k(5BC7iyNq@jt+kF#7Vpk+8JNJOX^RYnF~3+OE|+jFi#hE`g$;Bu0TPYa13b|4|4axvGV~Y1Uh-`BvzmgkTws9vvNhWiyjT zB43B=d3=V)q}Fv`SPumE)IufG?raX>S9;KelY?H<&~@sy6a$oChO<8S0Ly$74kJOH zdV*Gex!U)lJ3%TnDzq%)a(}?V*djUG`{~Xps<*pBw63TM2Hadk*mUaXT;=fK01!#e znl|uGh+zTB=un;9)iFSYxMb?{v=3`P;WX=At7PcKxiw1N*9cvHRs@3rZDUE)#(L$SnFw}s)S{-|A(*24d;qRG?)z)1(w#jFTOA|DL- zUjUc{{D(#s2JBgh&}z%70@ZoCc$ip0w%AxUOd)hE)snd zXj3<0*#JEzDZFfNfB@cSh%%de)<{_O=>~9$PfSh4y-mi?RyRC0GKm<^okxaHg>BX2 z@jNqJzV6=sd3O*S^_zQgdTvhS(`Vq$$WjoA>|!;-=mKpL+8;54S{P#kHYTC)3Lr>x?r5OAWU|Qb zfV32FOirM%(Cjk?w0@p#JHP&_epn|NUs@tuLIz;M3VWNA>pj&_TDS z^<9{aPO+-+@Cr+{Be63&v_)?@_V1z5Bnn!lM#mEk1|I|y%6ZUj)Bq<#&zVsG!MlIYJEBa z*wl|M9fvX13#KRDetv%S_4VW0;_g@9bGDIMf}9=lHm_7R%!_^RlIHjr#4mn&-R+eThj*k{&Y5fG$qYf(1m|u4L4E zV3&DU!htG6p!%I zC?|wTx&#NkCQH22BoO`HLt|0|NkXtdV05RD;Zq7?28M~{O^_l}cD{kYi1-b1o)5SZ zl8XnE0}Go6?8~34O_na>)efFiKSd6snY4e@d1i+0Ow{um+|0>Edl)+kJ(fj%;}odip$-ze{-i2WCLf9Uad=fMfl`_JujF zBg6khp+SE$4Fvq93gqrliXYCyrTh@@nbAuq@ndr*&}@cBv_MunKpe`OD!qZ>wu+31 z2NMI^eas`Pf?xLysDo`s_XL1PQBhI%1=t6{P&Iz-9lPW7$L6)ipOE=awX<3bZohs3 z0MK5w?lWYl46ag@>DXse=m~8B517@4RuRutBgA~`*Lg#c8k3SxEdB?QAvK2{(b?&G z*O@5!dUclQeEj*r1w|%+k^5b7h^UF};sR8*2G`5d@6(rz1mMU@6h=!Q{bDq$bvrf& zkQE$!y)W^lnmZecN`C>G4#X=?x30u0)KqdaO8_!7iCt@MB^F!APqgKF+G zML>v{3eez|IV3Y!sXMIKTOw@i;W{4bF7zf*2RxR)be3t=I&!Qeu$sw50(DwU8hKMW zr|KNQcUS!bpeic`DW=rRKrz0y767bHck-3aG?NN$ZAB>~DP6m;GWzdtJD7`${qBkk zT)~q7TV#j%Dzdh{oCZG1Dx0~AW|!RyMOIZST{uA~OSocQCM}Z!NmBZt!9i(Xcj2XV zGH}llW;(hc2a*FEk$hk)GZ}-TkP6HHW+^+}{ZIwP`VD_<%p?o)qJD9aZ`DOYiNtz~ zu^IGpv4b45Ytdi#TMz@Da#CTtpkQemOHxL)M0rN<^7Ny_4n@XKIk1AiAb`IhAb6_I zAXSF{-3q7WVEEz&U|oS#T(lzMfKxvE;q>?8b5X|CJz{L~T39ktMaRn&G8fZO!0XXi zVMx?RZZPm5Nm@8u7GMWd^AC0scc-OSL-0lm0RK&IeN!J$+z0Y_e*hgoF((&e^wo$X z3#mMeojz6@h^emCv`rO8NPO&V=@e&B4KVu<^uwa)Sjd$4sjEP+fwB26gp_laMkDps zHqUtZ0dt;|vM0As(<54}OYL=lCR@-3f4@7wU1%MJ9(Gp949yjA=*7Y5+s%Bvcqv_N zJ}q6LKR9~zX}+@v*`CfzEPiEb*DRxEIF3_#ecl&P`@HtyVdkcV+kzdZoZEu!M+k7v z2mt2u^S8;bJTBHYHvMdrtoYh7qk-hgmx}pE)kUnc#2+_N;=|p6WfO#5X~JAj`waY~ zmk)Jac=JZbZ-jc`_1Qf1Q^-xsA@su7Cj-ALZsItEAKJJW;iI$huh6TlkJ&d?ud6jz zksB@MJxwkiKPcXy&*#?s4x$U2xwsFC@L5>_di`#0Znw)W3YtrSM^y$ISvU>E%A`Yq9JxsV4VPk7 zf_jo>mN61VR@o1Uf*_>OYK<9UOO>v4cq&OhBDhd5xb^O6CJ3+r>~8=pI6X>~w5kb8 z`ziYvALN=7p#?-~oQw#uY)|zRw>g`}mUx^|OYDJ+nZv3$k5&=gp&xzoZ-9Ykx!N#8 z%A%S|Nv@ETP!0tWd9<1;FtgdOUPdpEo_l<{9HYPmtrnGSH;cd=y30eg{s?6W!6LB- zP`*E&UO{}0zkiurWIwLA9ouLT5O{vfmVr}JTLNp=yTB{=f9L_yI&M7b%_^2HAvOC_^Sjp9=$=#LnDAD1h5vksn*o`4$4i zy7_Gypl|hQ(3A$;b49@G;`e;5kf$WIkUxF+=W@+zh}AGh$xl-8f(#I5W@Z4hkAzJa z;$09>nM4(MLbD5I1}@ ze`k9m3<_=&*zucaU4f&M2Zdk)+)qBhJ-fR%SCEoL9HOnQ4IoUMeGuoN7C%#Y?fR69apSWT+uY-l z{|??-tdM6DL1F6j!)=E_c%3vxn(C)a4jXkLAt8F_ZobJNu)5|w%jj9Ie zkPxSbefblbHI4D>9)MzfArb)EIsl}SCk&!08aqTJpBK>tfHC(>KJ9RI{9_niQbPYA z8kmZ(Um%ruHOnsr>iU|XB!g#o~3$&h;!Vm#ub$c~m6T(Nu zAA)q5l4ggER{0N`CdX>zjfFJK4&+7#c}JQy1{}?mm0SvZT9i4te$b=#%1Mi*vBWb% zA=({cZ&~RY5C{PUQ6E)d@kapH;1U+w4}a!|Y*AF(s{bmQ@M*Y6bIrOu{fL9E7rTEC z^W7|XZ6xX9>~D^wn=iN+4clG~$$rd3ui%7w90@aA^ommT|DdKpz$HXP#4VKw4V+|E z#U8zH`=0x~V9-&bgfV>p-pNZ9Sq4Z@8R>f%=-b0W?UVo`h>&Vpwl56)|KO%0+R)i? zpvj0qW?q(z6k7#OrdgdSE?5;Sj$E}NZ(ipDo;CWU*4=yiHUN;>HkK=1FFWdkE5vJ6+D+NvIX{w~HSh+AyARnVk z*3Gd)dG2?#_NM%nYccCbn@4$VNfll%WuIfyOgF>MAJNiYK;vj!h~!2S*;Sl(3D!4u zQ48W;{eZjqzHCS|m&$yM>Og?oOoqm*TReD%ef%XvvUy6R&}L1FWWRQ1&>~Vav1rUh zqS)YlOs!>aH;1g@HC0b8(C6`5?+j{+NesXd!=b{@32Oo4(eHhlMi6o;c;6L>|YVjS6fr0eB;a(0W9LS7;$zL-)MTm4hDJjw%@U4Cw zjBHFl>QaT+c26~H=oh*!hT(E(sU5N_emmE;cS}4m_5NL!t50i)VNln`75D7#w~ao0 zI?1alI79q8K8@pB-`%}UmG>%p|Kx`HlE=RnxCTlX+5lxNdyu4&3Bpt2O+(jPAM-q4 z#htt)gwRQ^BMRpMQQ>zo<@&ivojh$!kNk+$n#?>_)h&L<;fya{9AZpS+exWuv}#OB zrMOtTn8E{)a&j`g?e?g$tq7jS*B+6VIQ5bwmFnzyCLiol>^QS^sc3X7l-v9xq}9l6 z*Jj8V)UZX;1J@8U;$99<#` zZ0f<>bS)t;{fCarQC=-2RR&XS^s~oj7J0PxDQO#WAf$RbMHJiVJR5pgRpr&SyPYAO z35D9Jp^$mzo`G|*c6frfF<&0J!=;AoC{0*g{aA{fx1H`^IQFPtwCz7~znjD7_#C*@ zT0?7~uE4i(P|_ZeBS+alW)KPU!XGJgr0?Nn%7*blOCzkL+Eb9&DEwD)a*`acX}k6U%a{z+S`y@^sr)woiI zMWLJt`~4!snY;e1UD@IxK^wXMQu^kF-wV3DYsR3%g!V60wiyVi@xr4q?79;fn7outbZA ziAm?Psm&ym`F_o?S>zzVCp*iW)*ZKDUF8LeX|5nU7hpsu(J$+0p78%Y{;S1M{) zcgbl{h(iYoNbkGs8(XyU-d&^l=~r%CyBUIMgHX4BB;YB-xX#Xhr@o7)_gzZ%;a2{eeuUCVx~xj+sfR z9{KC)cisZ_N^0IW`OeAlNKW+h0iqip(_We<7m4Zn`Du<%=o-C0K<@t)UT_ zrak>i*ppH1}rnTO6LW&fq{;!YkaTo-Q|wn(K?Vl;`XoyV`7Y6!Fj!IL7+>X6vAp;Dn1E`Q&^ON_HDCJctE(p8)m2%25#CAOe~iW@J{nejn{4S=1Y9%^F3pPP^eq?`XuI3Xji zR?}i0uS(}d=rOq|7^E&)!>6*hMERhS`4kgyER;@W8vB5(BW7cr_AP5q6 zGpphgPH*)IK%s;n>;$Tl_<$;n*jn;GRKR7SeEarSz@z63P=)C`8Tx6E&IP@zCBcsBV8bOl5RBm)JY^!=`9Ty{01+Rr4| zrzul1Pf!Bo0;h%d|k3{L7vTYexC^_MxZ7> zj*Fmv%T5QI{X!1$G`*W0z^@`5y!{IblztLC6n{}nz}J8|Qw018>8@1RD~$87X>Vxt zxglYOcDA=;xJ_}yU1PYfIAxP=%ccmaZobSlkMXeX%x~5er5QYJ;guYZ&wM5(j9dt#xxH+|{r<7~O4zf^ z^>ef~NB+)p&2Q7^<7HplFX%kdbxo5#j?dbZX6cnJNo4Yw+HkE}*oIT|6j{H|WZ;ZQ zMno?LwN^@1OYn@1m>7A}w2iR^t*j)#`oh<>53Dq7zLcLKb1kFsEC|#_Md!;PLX01C z0O>8d&-k5s3b2;FRWA!{B=dbMK;!4Fx1*k5pVx(U^JSO4?f8HYYr{&wxEA@+$|d}( zOptQNVqUWP{8NallqB`1i?_iSZ`3E1nnGk`ceG-}oc(mprUUI_W*bB$$|^s)OV zeB;+Dmgcxp(d{hG*~)^0`5s#&qNTL}qNy0O$;MMb0kN4MV0AIjG2pN>!gUgoz5hgF zFBzx-mD4hQ?B2swSx2Ds1vp8HlI}w&e-EG19`qX?OdM_9f~AG&cf*D5U50R)8^*OZ zrN6eRphDWLLz4r~s)WJG&^{X(qwZtz>XKmz-ihP656cX1~c*tjBdRuQt2pK=J*_`hs_%X+6yj5j9cEshF1_D5B_lk|^@KwnLV zq5)KOlCi^(9n=QPaLRzWOfOZ8{pV0orOm2FR@Ft@a_wuP3xiuiZT#;^k-aty6}Z@& z63dG*@6W{dcDVCr!K{!iR(VZH=*JmZ92MN4yYuoFqf zHmGlrbwN#psZMK+cv4&Wg_D(*fZLX}aP8cPx2cQwm4jQfcRJelabjKO6!-$Y4ZQfI&ZARbXlT+n*d(5~g zY#64~_w(BH9hjpPkP+zhPpkMD$l~5i?i@{_#G}}=sAM+kw|p&MOcW!4;^Z{2~7iz{M-??#V}y8~~FChjyRv+$$118{=_S}tbPys>X>&W*5ZVn>ws zQ$~Zp_sEk8#)8Ga5ofDWD04Q!qCcdoiAp7g^K~95xZ!^f89XvcY_KjMjQ?eaVcG)RNsPoUb*uPY*%|Hs!^MrGM+^F z?p9h-LO@CBmXZdgk@P)peV)Dd_vahKKk69d73Z33&SMTC#zbq2fq7aw%ernXJ4HRi_e`LDziw1eza=WI?p;zhGQb+>e>bN zl^R;0cCEhr4u^Civd_x1CjM*fQ=!kL_k*Q)m&Wo6|GMqe7#_wW>HExaUG(D`I(xf; zO{scspT=r6$sc%g3qGh`7tx|%O?EWiIEmWB%@qv=r|w{HKUzU;Za$R*#iEMbrE6n? zq%97METL!W-I(jy8}Mwmyv!wcclgq98`?X0{97m6ynUmO&1b74ui5l8;lr8;eN7Z5 z!?l8Mt;0R!xyu&s5@U4y^q)OM!hYvrL`jYN{$lcGQ_4CF8V$K3<198At0L=Lby)-w zn&Yrg`FY9o{+aj6%(!9~b=-dO!G8|r5^0b?rRTu(q$2ahQ0KUV?>T&{kLbOj^bdRP zwsD?$jgO8(N9Z|?ts|pXL#2}gs@nU9mXCD>&xwEaeA{tgnEOD6`IZBFZE;TS;?48i zpB1@z44vbvfm5pR)ztiVoYl_M+jP&)>kwK|tsmOoKQ-mOj1(03r0F0b(rXZeLOLX8z+NZ;QY8F{ZLu zkJphUmOOe(*c%us8rxKD`lq;oe+ODxt3`7;5eCRW+vmnIkt%c95ZzNG8?%1;v^qLA zTon}tI8fj}sfYh;`kJQ6KdmN8&$(5XoyAHEo)}XW;yg48NrY{6X+BixMPPA2qMrN($43kc7!Z#=+^I(bE%R z-w8YkrC>4bzR⁡nK1C8#D&1z1zwXsimf4U=n6?EeeTNr}O1)w1@Hl$xi7f1}lS^ zq6IGqVV^uxe4_ClXB~o^c-uk-kcJiy)D;2}y(k-yn%n=~w>$zfM~}bzulQvFT)hAz zM``!09I$Nn*Q#G5f7ilK{_x&!W=mpks-jtzM zbM(9Se@Gqgl>THcm7c_el&^LCXh)qR-Eo9MR{zp}uvMtE|3cG(|1B7!XXfTW#Uh8J zrbvw#uqlWV;I~qR-)I7(d$=A;#M~KxP!M&Daw@GmY6>2mCg$emJ}Xm+O5_)4IT7*$ zV_&*4fn5)j_aP;%J=&)cFk=G(fguZlffx-+1WDg0;pg_wPJd9^yk6MXzXxP_MTTX- zSg4)-*5wCK8p!exaH6h`&g4h2^HFZGd`!}Nkm3jJmS0i6eFpr>+vkKF93D(W#L)x_ z>3A~*uj81Uw+7>0g90jvarMA6+z&UB4HYm{eB|yM9K>=c{($Rbqp|KE8j%21B8vig zfWtPSD&A8!!b|PbtLLFT`}%6fJrNYN;zCfF3$hr~U+wv%8vq$)4p>@0;{zUFENfnm~SY9L!W6cy4SZULQpF)hpMJnpkwqlmfA1R5dLi1`~B$D01>2OcfkJM2uk!aaT zv?L7HR34%qlz1aTh>)iFw2JGZx5DEItUVg;_KTcY*#SNewxXgXpAtQ`BAitEU?w0T zaQGUTSu<2{Y{_USa=Er6$1U|ao9EHi4lcO5PUa{R1NOz7QC0iBG(B$k?F9B^ur zil*_k8l|3clW+V8ns-HZc=Gc!{0v~!pr1-a*y%-tVl~G_Pk?{Z_AdpR!Mi7X6#!0w zClz2pf`54+9RnO&II|hja~$UkRjBE{wI4bVE3<#T1~>=P*AJH}^EL|@XxqW_w-B_! z^DkJFTVUYqPk8LFA3oax^`}IB8XjrWJ)8aSiDIF{tpBbGVd1L2rz%yT;S}7_n-fy4 z7G}$le4JrrX1>e+eUlH$Fz$i7210r@Poed#wy{*HVEWHI7zBr-0MR_bG~6>9A8i~2 zk4n(g+}vA2f%FVsly14z={Ha(aP_S5Qs>~n!nPMIO-ntnHE!T=PJFvgZs~$yH1Ti< zX@Vi>l$AC&3p`+(1UtVV$tUmii2WIiT(#iKX4J{p7?KNHHaLG*@;?|FpFkcFeLq&pDacNeJyBeh?I!5hi5 zjQ^l&D2_()&b?}Uin?(Q(AfcxG4ukc>n>w_D#a6%^6;NL6Ug~ zRtwt0jAfAOv&{8!vETRSHdP{3xruNle#c-MNa z<4H4lY^H8659Kq1yOfNq%Eyt%w5}J@Y*eLJxqoh`;xjX^Kf5v89*)%Q<9}d3v~bmu zS`i)|@oM{gQfIPUcEV%nJ8i?IuQtB_(kZw5_SX}8hmDm@tK%m8hpPeQ;RW);=86n?oY#7En0M4LAUKEO@11Fdv^K4xUv>y zJkCP6WGpj*VuonOZygz({!OwEZi=I{g7!TZZ<6_xoTjsxtx3!i+M0oGNoP@sS+4v2vzU((Izr# zvoYYwkxwndPd~NY5~;$j@*arBKjE`v@r0V}G^d;OrelnAXc?@Hi#wbx($~3s51S9G zHla($%3)fj#jg3}hBdH~0DPkac)Q$fC?(CcSFZWX`OMBgwTO(V7tY+G?qPl%@{QLu zaEdL{s*d<1f4A(Q7(e!!Wv|8lX=CHtC41MRB zT7Z0UE$0G5KlTa+ECK)w)?DrhHfp*xT#fD_*kxo|D;2lvOF*@wQnBItmp|8k#xKTu zX#_6RPvJ|}Mf%Fu*-7u($igZ*U2>(Mmb?wCLY%sgzig3_y;WYX?Jj0D^ONCPa8SI| zo%>KNj4;Y1P&$tpy3rXJ<=Ca9fYp$xH67g2>uT)0;Hdd@0}%#cK+Evs)O%Svv=0Zn z_}R*2)_dclsk#)L*vxtlHE@N3pW);WdDPO0jgDSRZ(8xP+C@kG*f}GrO8e#y4J`=w zCa|wrQ^+cOz_7q}p$aG2COk<{`{hZjm{+TI8|4CLjUfxBO3K&VPXq7?Dn@8`+_Il& z_hi$Q>HDxV*%m}qu2AM#ponMawPt_V+b%86yqBBmo}hV0bG>1~a@y2{GMoM7VF|uy z<~iHWf9ZjiBEh6@lE(0G`mFk6O9`zaWZQcpU(6X2v(eFp=D!%)+hj!f{;5{S(eZ~> zdRO%rr=1Nuu1PMt*Km1qJZ&5Nii6g45BXX8`rNY76|3K@1n%M21nQ8j>V*}x3-44X z%nb8=>vuMRQLVkD^<#`Q81Ap$jy*>ljh|g_>LrA&&7{0vy@}u}wsY~3uas<+tIozh z+r7WiY20mncPT(lAo;q=2bnHz#U5WU&NW}>$;_m&x?&yulh^1Uu4}X2)mMMBb7I79 zH(_L3(y|v_E5W&4Her13l**H5qm_*D>Q#q^X;a4gyh@DQY>lgcC93e!U^q;vYg?L; zE&6Z;0un;Rnb+Prr__<-`xUurzP~Qy$hBMT;uq1}!ZflU9%_PH3wd1TSFwJ~yvT44 zYpI~PUq|%q3Y;vGO|wL_l>kATI(%?_J6ns0R zBw?CC(VA{i56E)qeKL)ohDn>7_N%gZd3z^Zt-SfyZ6X8GWK_Ju8(P1T27m~Z_m>|F zguX*;Omnpfkr8lkE6{C$oUB?lv}+^6Xw%3=5?1cMq{>UoQUR^OsA*ZX(EXWWepWL4 z-#N1d=Ub|@*LL1A>i0Ol4~O)2cA30>cy$mw zJr=P?b<^5VxrWB&CGT-E6r_6{KIA+|>$@r<&~zmeFbnT+_l0X&#AcxISHn(`NeYj! z=aB{@o=aYAIY31GzWeywu+!UR5FZsaWe^S$!iJdYZH%C_MWrE2mcAADUuunKrS{=d z|AaNkj?W@2Op?D=QSs;s&4&`dh+6EocW9on>NVY46JD#E(>dr9JII9TwMER<+9i0} zS^0CN4o4Mdl48#SujgcD{o|~BXyupmUvj>52A_$~4i4=rQ~Ii3uP)~XP({sI6<$B4 z3&l2uWrcRf=PFIkR27S96-y$!`zD+O$#9gPeg{};(eB* zh0Li>bZ=8U>sI-$|CJLrV)J5P)AljJ+4+Z@3`4S&*LSam(zWw;g&92pcEY9N z!iT+krnRLivMZ%NED2}yz30@tTX`ZEBjE8F+Q^puGG^(t@s^r(c;6i*Tx!q=3oj0a zT{J!|0ZoJZ<+zCRx`bu+pe9|Qt|^xU`uq_MBV}@IN8ZG4XtvnDZd6&TvtKj43=xk( zt&v%4?w>dWByF3Y+HZDQMkSK_e|aS2#Zfd*IZaQpvffo>xUAP!Pu8Ue! z4#(L=i^_i%{B=c6_`Aw}UgZlj%RGf=G93#eh8$A{3ldVP61}seGb0nPkw?5t#$i+E z-e^7(%+Ey&ep{tzf8h(qOaoDMDTNd&8KtL!j;UBGsagjpyoQ%`@>TYMeU~9so65y5 zPj%kdaM^g9PaSEZ&;EBh{-p@cWlSm~tbqK@87{#;DjTU;ep7WxuUwste@W{6VgGlS^lA%~N+bvCWMzdtGZ{O;tG`r`d#O@NZ=Szm4JL0CXCr4W|e`*W$MUsJ$ z{8+Z1Fx=5SxFX%t$+$Fsq$1uYV9l-Q(~?1@j%?(2+)Nx7Q9fK~psxre zH_@*Yt*`IS!t)MU0`DWh#Zh$o)LMnP0u`4^Z77S^PD^pU{2b@)fb(ceMJ}8a;AAY<@GBxa#2;ZN~IJ2I=?6mJRtz@9#x^ z*4=D|^Ua!Pl$KDfb*gLew}}is>P+!Y`pVud+d6)sDLx(wDAZl`k-{UlQTZkF=x zjvhumt5g2erki~U&UhtPs*ro571wQJ4|OwPL`esyxH7p+8L46u`-#XbG(H?`$J-9jx52AeWlkt)1hm%d0JEZY^iC5hER0|71mN$ zpjI-n&s3ypH%{{MZg7;YWw}#u=hDu;TlP#?ZJ9QUPnh%smx<^9oTv#|p|6_Qe@wsI z%*Yj0JAbgS6M6(mf06Eu-I1X}Q&Ur^fnbF6&9BtnN?NQ;Dy%uwStU=4IIHq$&P&v= z2W}oUnUTQ5Z!i;0Ltsr@t~jx04hojWna33YZ~U5~HZpc!5eCM4JOAs=8H^m0QJGHcx&0{Q$x*4?p`47W7r2QU8lP)PMsQQlJ0t z+3M$SX*~5tVoa9U1`$@bE|N^^lY2WZ!#*n(C>3CeHxui`NqO4TogaAP+ zb~pWhYf_E<`UJkrt!jZ|lsD%O({;lQG8;U(KVSP88 zbV5Q-G^!`($Y#a?UZECJ*f9YVsAZ>q7=2d2NjnFgV&e*d!J?|_YV%+7*WK4$pWC-y zBm633dE8zA5Nb34XOx=g@k}jQLiv^E2U=}{8eiwg- zkj0ixZlFEmnK2P3xMIE$XQj=~h#{=LXw1F~+8SQu(YF6lv~I4u{u5 z{*kW22nJRMz4ZdX*@%@%nT07b5T)c_C>*1p_ewgOG0c4M4=plB*ypf;D2C?+9UaR* zuR|v!^JQahj~XWeZ>RGIt$}ga6fzrgPJLAqB^ru4KqPZ4HoYC1%PD3A0Xv=D1;djnh;NNw9VRw%L&M$P*M!v7LR_ec&Q!st{mdig?~XKxe^H z_3`6x2(k9#{m94fI}sCa)w*;6QmzEChw@*dZijEvF811cpK@kC?2q%UOD9Z|&IjL#@Y9uOa^JKUl1P4}_1NeSqZznBp| zfTki63O9g59>tz{B`IlY9vCPl%0=}@&+2)o0eaOP>8s{)9U2Q0!P8nK2||?CW%MukQLgMx291B8~e7O__2|(3bM1adlG<5k|&MH2`Tuk zmh!;k=bx_Y|9zVFsKbC)yZEp5P;iqc=i_Nq^H86xhhnN_^Ra4~pCFlQ+o_E|sq1(6 z7I@}G7&)#sc<;9rw|3=umzfW<%I5SF%ZEy{KT@#xyY$f;jbBI~4>P9K$w=Gb#~*f@ zFq>`>>8ixnuQ4@|<9*cib5=h=YB-7xRZ`5KF>OubT)Te z5d&F?ll^-}z(!&fe9L4;W(U8u=_1-ItEV`*w>(ZNCK<_SCEwFW#AcAr5 z&2*h!Oo$|Ko=s=Gq|k6Q{#b6+CiOa+t)jz4vJF|Sq@|}mYZISfYO8ZWPnVG(GGK10 zQl=$ZN>&3eVCktvrq;4|uqvCGzS!E#aeXas3+@kJAARoc{(9vL8yNk|-L)%wB{Leb zmgTl+>Z0E*gNL*VE9_#lOd%fDnD9r^M*TE94`Hd_KWJ7r1^Cn~p~jRrD`YgwS^~>m zHvEs-=HCknK@_KA{NA5dE#&zY*+stZvOO%{bi56;CB=^}r+o`G`U&jUe7rSXSKxZ2 z13)$2SM@j&%DgvlgA(f*m4OW{{y1>*9)jghMkpidB^>Riy;w}Fij9ebo35PW{DRXi zp19HJ7&g`QtNj{yEwQHeq6+B;eZzsQmo6Jo>O(^%y{pQS<;i%`M2Z~Zk z)xJucpUY{LMT+>`&!r2A##@it%V6JmGp8bnF12G@8e!;%a+YABMmdEK<3jk{rTzF^ zUsFxpMz{7+0^(=Cd!hSUv}_A5NyAN!oPFywsc%>Esqb?58gTBr_|R;U?c(GYlyHz0 zw+$a==aqW;y+Gm`RaS7sA%%;NwM#+n6%BXvfz3E(cuksq+&R$!Pd8Y_04e`klcBXr5k%ruu_)YYO2ge#A^q?vz)p-*Ja%TBxE z^vVjH)1vfP5)*}E;xNi3RVkjPB+2thJ#U!z$soqiphP2mb%Kg;1NXVH_N4$JLmMBr_Z0K1deoY= zg=89Cj}TBJ-kJQRL0d>AQq*s$QQ(w=srAEUC$l9ZD9m0UL3eHt?0!OblL ztL}~~spgHS7k2>-wuN6V+fi1y7L3^Oo)~Ih^&<%0Q#d;?X%ed|r=Y?HFUIZA9WzB$ zuB@6Ee>G~Un6R9Ws(4mVJkx2}(}|U$+4Rny;N9B*T9eOi@LZ*y4wA2-OT zmdlXt_Q#?VJ)XiOxU5+pR^?lRv?)YD5RK1(MF^XMSL%%~dipXJ*010KfU@OC;mATL z3#vVa$&Gh24+?}8qQ6T;IRB`6C4yW@cM#V+Ff?pscdlAjMw#VyInY2b%b9H+@1)>@ z@oIpM}csY=T?QS@!8=Azy(%zJ;pN~@*9476rRql0BjBwY-W9XJG zNvdC$X@4h=uk)I(Vq?yiO8v+-q2KPuyrIE2jKCTO(SQ`0w_^p>+DgFK@$pE2_`X?^ zCh2*k7P-eIx`sF}3%+8jd(!R)v?;_I*xk4(E8T<|Bl|KLpQSI)sFuLeSMWJ(_^NKKsuZlSdKBy~7K3oxSQ;~C+0Y#yp_S+_ z?32TWXh?iNQE%R>j43&Z5atC`8Azp*5j(QIV4I=#!MD3c;SbIf$h4tBZhirVY#Vls zi}4!y4mwuZm6_^rRA4S`YBU%hZ=T-|JIx84D~!_G#%WecQ}?9IYtS24Ku3l7e&^M? zIz>OnN@ahy9@nPOA_D>yVcl|*M$*%AZ3QE$7?npJ`noD#lKbB1Nzb|moB76V-A^+0 zZTfzK5>1;Lh!&A-zCq93eNWbuoF0K!2m{qr%Ut&D4spqZ!8Du%vm@8(>$?GxW6`gQ z%RiD75j*%Qr}kRxSd}l-KDVyve5{eIH&(~^Le~C;nS`Vj zil;oT{c52i^T!d;2oKQn-O*2Pa2|Y`&3Spxf)?+`BKT)+GwJt5uD+Ta>?#UXPfRyx z@A+DFyDQhP9@n$mXpYv^Un*7GlMnT)2-0d1K@nTIaQxHoQiA-CV=j`8a~ck{>We81 zpo?S)dpY7gjL#mLBpjq6z@eHMSv;G*vW*hgXioDHBo_*G1)*uJi;jTOsjGH^qOh~N zGW62|k@1Aa<%2UX;oie$ipJ&mro{N?zjhj(*lyG$+30^zPEj#)wrur>b!=>l7ZumQS6Lj03_FT5KXS3hcrpFCZ z-#F)^V!R_uI&NA@lee$BBUZH=iPcJWkxYTk+9X05=q$`%#F;{*aEaOf6&HcFVYjNS zn_(I#1Fu$IZ&{JFZk}!nYj|MCFGPCXj5k7KH0!7w&ZF+4=df5lcI_9HG+3OC98joN zKfXy$ygKsxG!uIy3^_q!7)e`KH&4KY8se=`2%-u8_RT~ulC)c}Y*(=X_$^mgS6@!# zZ7bGm#$C{HfDLU(NQm>p17Gb5WphS$3oq7N#>0u;3;OW-Pjgsfh2d_%)BwV)|U3C|k`QUiI>#WYy~9y+a<>FdG9Y$#)}9SzOs7k#%1T@Z~>X+qTcf z`ntY9YN85t$XqFXoB6!$xz15Sb_-%;P(vmXicFnD$!~DQYmMtxG0q!3WYBR4hxzektP}Upo_h7i7DH9MTe|?n^F8A=2kz9N3473 z(5;^H@#{jMCS@>mFG*-}9UmFx>xrLEPjRJ3-$@3iKR(LdE^*uD`M{~=3e8T#zLRp6 zhPkKyH%q>gZa`y`3_L!xswZBwfKEg1>^r>bfpIQHMWvnjHZ{BS#%dK|evazr4eS%6 zALMUa=i6*NyWP`gTqCkJxog`WGOAoE^U$;g?8k3!TmzaMRdln+{l+?}A8Z7uHQ5r7 zL&>X1to0`u5a?5%qoPkO4h-0RqBlr(yIeY^_OU}3R(PhdX%i{UmW-_>&5WBhjMgvr zMb&`C1048d;o0<1En!Yh!rGRsP7w>G9YA+j z7-JK4GRbj!6n5L^DmP~GMnxO58hyqRyYrRRB#V;dQl~=|efGiYIZx7u&#D>~6+-JS zB7A#j$`q}BSssNO=+tB6Uil+6xlEINaIbHJgYOBOpPi@Ljgoa23%!w)b9799c00j8 zWGCoN{&!h^k`0VVGoU^Ckeg~e=^L9 zg$cEcXnA}ebM@tZNEd(1EoJ`3L#xZFcI>8IP44<6_!+~@5=Je~_18jqSd+IC+j!a( zd@?@=OOSJ2n=XHqu(y!B44&9N=fK`$Z&`f%Aq3ix0p$$*fg7-`Y&(!m{~daJQ_5<9 z)aNT<$M%%pnDFdi>6^VSD?KdcF9eI22&qCfokOJLaEy^jOgoKC+nuQMoy?LBk=*5( zsyK`ZvC;s=z`R%%79X{q)o%yRXn{+jVGKtK3w~}`E5P_JdYMMNxW4il30^~+A{MDH zPUYkD6s>8et zJ9QJI4E{S)ja!nno=>=;D*Das-`Y6h*isNn9!*XHYGU%G3`i#s_j6(ohL zhDE-n5LU{!bZ|Va-yNSme~5JK4n^OoTc`Ig4Hf7U8`UGAckMCs@O{*U710Z1M-`9xs9;7?t!#7!6}9`37Hb&bZY!5glG zmOU%Q-K+-f_;)H#sE3G#-Jnqjl>LnBCFs4^#&#CU1u}z^rQ?Y`y4`Ni^_%D(U#j|P zXFT}D$?D5b3j)!gKtiM9bm{=O^J;5rvB)FaL9!uI{yXU#Qj35>_$xH0%ukRxJl4QxhQ%7IH%8e!}XH^); zD(z4+Y1-g`nye6hN?@1a^?&<{6%_p19PyCK21q*~V}lBu0;8=`{F+h!y|0Bt+}0{N z0@&n^pr)Acb0X6Nr~(Qrb(dd`-zXibACS;+2?`;R0lA|))ijHE;AsO*5p0Vtipdg? zA|03`OU?tvf!QHCVIkFVU~d`l9{UT;QgkgMAto+(`@OdH8*%M@i7l^z)!v1Oc2vFr z6=OU?L_wd#!#4ZtOfD-F_Zqbf4(O$)84_Kf-sNZDbw^?Wh#VC|JZ}V<+i!%3zWk8| zpZYCT{58DwZ9Q8V9Q@;hTeQ%0A<@e4x(1f6Hv=zTvA%2D$*LbAEr$C+kP2%ouVM`x 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,S?Y(TJry*3E3dmfScu!)BZ>fH2z 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�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�-#VeJzQ#Qoxn;Z| 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%0Dyt(BK$Bg$>RMhZ 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�mFwsO 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 Date: Sun, 26 Oct 2025 21:00:34 +0800 Subject: [PATCH 13/13] =?UTF-8?q?hyt=5F=E7=AC=AC=E5=85=AD=E5=91=A8?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__init__.py | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 src/__init__.py diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index 66d588a..0000000 --- a/src/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# 当该包(通常是Django应用)被导入时,打印初始化信息 -# 主要用于开发调试,确认包的加载时机和状态 -print("__init__.py is running") - -# 定义Django应用的默认配置类 -# Django在启动时会根据此配置加载应用,包括应用名称、信号注册、初始化逻辑等 -# 'djangoblog.apps.DjangoblogAppConfig'表示配置类的完整路径: -# - djangoblog:应用所在的包名 -# - apps:存放配置类的模块名 -# - DjangoblogAppConfig:具体的配置类(继承自django.apps.AppConfig) -default_app_config = 'djangoblog.apps.DjangoblogAppConfig' - -# 导入pymysql库(Python连接MySQL的第三方库) -import pymysql - -# 将pymysql伪装成MySQLdb库 -# 背景:早期Django默认使用MySQLdb库连接MySQL,但MySQLdb不支持Python3 -# 作用:让Django在使用`import MySQLdb`时实际导入pymysql,实现Python3环境下的MySQL连接兼容 -pymysql.install_as_MySQLdb() \ No newline at end of file -- 2.34.1

    sf33$Q#1Y<1wmF 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