-
{lang="review_response_title"}
+
{lang="review_response_title"}
{{if $review->canEditResponse() OR $review->canDeleteResponse()}}
{{endif}}
@@ -1715,10 +1715,18 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
{template="filterMessage" group="listing" location="database" app="cms" params="$activeFilters, $category"}
{{endif}}]]>
baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}'>
-
- {{if $table->title}}
-
+
+ {{if isset( $table->extra['db'] )}}
+
{{endif}}
+
]]>
-
url()}'>{$item->mapped( 'title' )}
-{{endforeach}}]]>
+
+ {{foreach $items as $item}}
+ {$item->mapped( 'title' )}
+ {{endforeach}}
+
+{{endif}}]]>
{$content|raw}
diff --git a/applications/cms/data/themesettings.json b/applications/cms/data/themesettings.json
deleted file mode 100644
index 9e26dfee..00000000
--- a/applications/cms/data/themesettings.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/applications/cms/data/versions.json b/applications/cms/data/versions.json
index 40fae031..01eb43e2 100644
--- a/applications/cms/data/versions.json
+++ b/applications/cms/data/versions.json
@@ -628,5 +628,11 @@
"5000040": "5.0.0 Beta 9.1",
"5000041": "5.0.0 Beta 10",
"5000042": "5.0.0 Beta 11",
- "5000043": "5.0.0 Beta 11.1"
+ "5000043": "5.0.0 Beta 11.1",
+ "5000044": "5.0.0 Beta 12",
+ "5000045": "5.0.0 Beta 13",
+ "5000046": "5.0.0 Beta 14",
+ "5000047": "5.0.0 Beta 14.1",
+ "5000048": "5.0.0 Beta 14.2",
+ "5000049": "5.0.0"
}
\ No newline at end of file
diff --git a/applications/cms/hooks/index.html b/applications/cms/hooks/index.html
deleted file mode 100644
index e69de29b..00000000
diff --git a/applications/cms/modules/admin/pages/templates.php b/applications/cms/modules/admin/pages/templates.php
index 87c001c7..670845a3 100644
--- a/applications/cms/modules/admin/pages/templates.php
+++ b/applications/cms/modules/admin/pages/templates.php
@@ -888,6 +888,19 @@ class templates extends Controller
{
$save['content'] = $values['template_content'];
}
+ elseif( $type == 'page' )
+ {
+ $templateBits = \IPS\cms\Theme::i()->getAllTemplates( 'cms', 'page', 'custom_wrappers', Theme::RETURN_ALL );
+ foreach( $templateBits['cms']['page']['custom_wrappers'] as $_template )
+ {
+ /* Use the first master wrapper that we find */
+ if( !$_template['template_user_created'] )
+ {
+ $save['content'] = $_template['template_content'];
+ break;
+ }
+ }
+ }
$save['location'] = $type;
diff --git a/applications/cms/modules/front/database/category.php b/applications/cms/modules/front/database/category.php
index 18aeff30..9b445d4f 100644
--- a/applications/cms/modules/front/database/category.php
+++ b/applications/cms/modules/front/database/category.php
@@ -258,20 +258,15 @@ class category extends Controller
/* Does the category have a custom layout? */
if( $category->template_listing == 0 )
{
- $table->extra = [ 'layout' => $database->display_settings['listing']['layout'] ];
+ $layout = $database->display_settings['listing']['layout'];
}
- else
+ elseif( $displaySettings = $category->display_settings )
{
- if( $displaySettings = $category->display_settings )
- {
- $table->extra = [ 'layout' => $displaySettings['layout'] ];
- }
- else
- {
- $table->extra = [ 'layout' => 'table' ];
- }
+ $layout = $displaySettings['layout'];
}
+ $table->extra = [ 'layout' => $layout ?? 'table', 'db' => $database ];
+
$table->hover = TRUE;
$table->sortBy = ( isset( Request::i()->sortby ) ) ? Request::i()->sortby : ( $database->field_sort ? $recordsClass::$databaseTable . '.' . $recordsClass::$databasePrefix . $database->field_sort : 'record_last_comment' );
$table->sortDirection = ( isset( Request::i()->sortdirection ) ) ? Request::i()->sortdirection : ( $database->field_direction ? $database->field_direction : 'desc' );
@@ -281,7 +276,6 @@ class category extends Controller
$table->defaultSortDirection = $database->field_direction;
}
$table->limit = $database->field_perpage ? $database->field_perpage : 25;
- $table->title = Member::loggedIn()->language()->addToStack( $database->use_categories ? 'x_records_in_this_category' : 'x_records' , FALSE, array( 'sprintf' => array( $category->_items, $database->recordWord( $category->_items ) ) ) );
/* Set up sort fields to allow sorting numerically or by date */
$sortFields = $customFields;
diff --git a/applications/cms/setup/upg_5000044/data.json b/applications/cms/setup/upg_5000044/data.json
new file mode 100644
index 00000000..1289748d
--- /dev/null
+++ b/applications/cms/setup/upg_5000044/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000044,
+ "name": "5.0.0 Beta 12",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": true,
+ "themeeditor": false,
+ "javascript": true,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/cms/setup/upg_5000044/javascript.json b/applications/cms/setup/upg_5000044/javascript.json
new file mode 100644
index 00000000..46d1f95c
--- /dev/null
+++ b/applications/cms/setup/upg_5000044/javascript.json
@@ -0,0 +1,14 @@
+{
+ "files": {
+ "added": [],
+ "edited": [
+ "cms\/front\/controllers\/blocks\/ips.blocks.navigation.js"
+ ],
+ "removed": []
+ },
+ "orders": {
+ "added": [],
+ "edited": [],
+ "removed": []
+ }
+}
\ No newline at end of file
diff --git a/applications/cms/setup/upg_5000044/theme.json b/applications/cms/setup/upg_5000044/theme.json
new file mode 100644
index 00000000..ab3ffebd
--- /dev/null
+++ b/applications/cms/setup/upg_5000044/theme.json
@@ -0,0 +1,19 @@
+{
+ "html": {
+ "added": [],
+ "edited": [
+ "front\/widgets\/databaseNavigationItems"
+ ],
+ "removed": []
+ },
+ "css": {
+ "added": [],
+ "edited": [],
+ "removed": []
+ },
+ "resources": {
+ "added": [],
+ "edited": [],
+ "removed": []
+ }
+}
\ No newline at end of file
diff --git a/applications/cms/setup/upg_5000045/data.json b/applications/cms/setup/upg_5000045/data.json
new file mode 100644
index 00000000..43dd5fbc
--- /dev/null
+++ b/applications/cms/setup/upg_5000045/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000045,
+ "name": "5.0.0 Beta 13",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/cms/setup/upg_5000046/data.json b/applications/cms/setup/upg_5000046/data.json
new file mode 100644
index 00000000..f6bc8028
--- /dev/null
+++ b/applications/cms/setup/upg_5000046/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000046,
+ "name": "5.0.0 Beta 14",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/cms/setup/upg_5000047/data.json b/applications/cms/setup/upg_5000047/data.json
new file mode 100644
index 00000000..84c44ea3
--- /dev/null
+++ b/applications/cms/setup/upg_5000047/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000047,
+ "name": "5.0.0 Beta 14.1",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/cms/setup/upg_5000048/data.json b/applications/cms/setup/upg_5000048/data.json
new file mode 100644
index 00000000..9b5589de
--- /dev/null
+++ b/applications/cms/setup/upg_5000048/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000048,
+ "name": "5.0.0 Beta 14.2",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/cms/setup/upg_5000049/data.json b/applications/cms/setup/upg_5000049/data.json
new file mode 100644
index 00000000..b049059d
--- /dev/null
+++ b/applications/cms/setup/upg_5000049/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000049,
+ "name": "5.0.0",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/cms/sources/Databases/Dispatcher.php b/applications/cms/sources/Databases/Dispatcher.php
index a6d6c941..89eb273c 100644
--- a/applications/cms/sources/Databases/Dispatcher.php
+++ b/applications/cms/sources/Databases/Dispatcher.php
@@ -446,6 +446,13 @@ class Dispatcher extends SystemDispatcher
public function finish() : void
{
Output::i()->output = $this->output ?: Output::i()->output;
+
+ /* Loader Extension */
+ foreach( Application::allExtensions( 'core', 'Loader' ) as $loader )
+ {
+ $loader->onFinish();
+ }
+
parent::finish();
}
}
\ No newline at end of file
diff --git a/applications/cms/widgets/DatabaseNavigation.php b/applications/cms/widgets/DatabaseNavigation.php
index 8955d25a..617640cc 100644
--- a/applications/cms/widgets/DatabaseNavigation.php
+++ b/applications/cms/widgets/DatabaseNavigation.php
@@ -56,6 +56,7 @@ class DatabaseNavigation extends PermissionCache
public function init(): void
{
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'front_blocks.js', 'cms', 'front' ) );
+ Output::i()->jsVars['currentRecordId'] = Dispatcher::i()->recordId;
parent::init();
}
diff --git a/applications/convert/data/javascript.xml b/applications/convert/data/javascript.xml
index ed5d651d..87c9ba09 100644
--- a/applications/convert/data/javascript.xml
+++ b/applications/convert/data/javascript.xml
@@ -1,6 +1,6 @@
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -45,7 +45,7 @@
}
} );
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
diff --git a/applications/convert/data/lang.xml b/applications/convert/data/lang.xml
index 182300d5..9e6f5d9f 100644
--- a/applications/convert/data/lang.xml
+++ b/applications/convert/data/lang.xml
@@ -1,6 +1,6 @@
-
+
Converter
Conversions
Start New Conversion
diff --git a/applications/convert/data/versions.json b/applications/convert/data/versions.json
index c3cc4ef1..690ddcd5 100644
--- a/applications/convert/data/versions.json
+++ b/applications/convert/data/versions.json
@@ -310,5 +310,11 @@
"5000040": "5.0.0 Beta 9.1",
"5000041": "5.0.0 Beta 10",
"5000042": "5.0.0 Beta 11",
- "5000043": "5.0.0 Beta 11.1"
+ "5000043": "5.0.0 Beta 11.1",
+ "5000044": "5.0.0 Beta 12",
+ "5000045": "5.0.0 Beta 13",
+ "5000046": "5.0.0 Beta 14",
+ "5000047": "5.0.0 Beta 14.1",
+ "5000048": "5.0.0 Beta 14.2",
+ "5000049": "5.0.0"
}
\ No newline at end of file
diff --git a/applications/convert/setup/upg_5000044/data.json b/applications/convert/setup/upg_5000044/data.json
new file mode 100644
index 00000000..9e06f588
--- /dev/null
+++ b/applications/convert/setup/upg_5000044/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000044,
+ "name": "5.0.0 Beta 12",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/convert/setup/upg_5000045/data.json b/applications/convert/setup/upg_5000045/data.json
new file mode 100644
index 00000000..43dd5fbc
--- /dev/null
+++ b/applications/convert/setup/upg_5000045/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000045,
+ "name": "5.0.0 Beta 13",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/convert/setup/upg_5000046/data.json b/applications/convert/setup/upg_5000046/data.json
new file mode 100644
index 00000000..f6bc8028
--- /dev/null
+++ b/applications/convert/setup/upg_5000046/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000046,
+ "name": "5.0.0 Beta 14",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/convert/setup/upg_5000047/data.json b/applications/convert/setup/upg_5000047/data.json
new file mode 100644
index 00000000..84c44ea3
--- /dev/null
+++ b/applications/convert/setup/upg_5000047/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000047,
+ "name": "5.0.0 Beta 14.1",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/convert/setup/upg_5000048/data.json b/applications/convert/setup/upg_5000048/data.json
new file mode 100644
index 00000000..9b5589de
--- /dev/null
+++ b/applications/convert/setup/upg_5000048/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000048,
+ "name": "5.0.0 Beta 14.2",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/convert/setup/upg_5000049/data.json b/applications/convert/setup/upg_5000049/data.json
new file mode 100644
index 00000000..b049059d
--- /dev/null
+++ b/applications/convert/setup/upg_5000049/data.json
@@ -0,0 +1,22 @@
+{
+ "id": 5000049,
+ "name": "5.0.0",
+ "steps": {
+ "queries": false,
+ "lang": false,
+ "theme": false,
+ "themeeditor": false,
+ "javascript": false,
+ "emailTemplates": false,
+ "acpSearchKeywords": false,
+ "settings": false,
+ "tasks": false,
+ "modules": false,
+ "widgets": false,
+ "customOptions": false,
+ "customRoutines": false
+ },
+ "forceMainUpgrader": false,
+ "forceManualDownloadNoCiC": false,
+ "forceManualDownloadCiC": false
+}
\ No newline at end of file
diff --git a/applications/core/Application.php b/applications/core/Application.php
index 846ac84e..9c39c351 100644
--- a/applications/core/Application.php
+++ b/applications/core/Application.php
@@ -24,6 +24,7 @@ use IPS\core\Achievements\Badge;
use IPS\core\Achievements\Rank;
use IPS\core\Achievements\Rule;
use IPS\core\extensions\core\CommunityEnhancements\FacebookPixel;
+use IPS\core\extensions\core\CommunityEnhancements\Postmark;
use IPS\core\extensions\core\CommunityEnhancements\Sendgrid;
use IPS\core\extensions\core\CommunityEnhancements\Zapier;
use IPS\core\Warnings\Warning;
@@ -473,16 +474,27 @@ class Application extends SystemApplication
'privacyUrl' => 'https://invisioncommunity.com/legal/privacy'
);
}
-
- /* Send Grid */
- $sendgrid = new Sendgrid();
- if ( $sendgrid->enabled )
+
+ /* Postmark */
+ $postmark = new Postmark();
+ if ( $postmark->enabled )
{
$subprocessors[] = array(
+ 'title' => Member::loggedIn()->language()->addToStack('enhancements__core_Postmark'),
+ 'description' => Member::loggedIn()->language()->addToStack('pp_desc_Postmark'),
+ 'privacyUrl' => 'https://postmarkapp.com/privacy-policy'
+ );
+ }
+
+ /* Send Grid */
+ $sendgrid = new SendGrid();
+ if ( $sendgrid->enabled )
+ {
+ $subprocessors[] = [
'title' => Member::loggedIn()->language()->addToStack('enhancements__core_Sendgrid'),
'description' => Member::loggedIn()->language()->addToStack('pp_desc_SendGrid'),
'privacyUrl' => 'https://sendgrid.com/policies/privacy/'
- );
+ ];
}
/* Captcha */
diff --git a/applications/core/api/search.php b/applications/core/api/search.php
index 9f167ee4..c24b3718 100644
--- a/applications/core/api/search.php
+++ b/applications/core/api/search.php
@@ -234,7 +234,7 @@ class search extends Controller
200,
array( $query, $flags, isset( Request::i()->q ) ? ( Request::i()->q ) : NULL, isset( Request::i()->tags ) ? explode( ',', Request::i()->tags ) : NULL, $operator ),
isset( Request::i()->page ) ? Request::i()->page : 1,
- NULL,
+ '',
0,
$this->member,
isset( Request::i()->perPage ) ? Request::i()->perPage : NULL
diff --git a/applications/core/data/acpsearch.json b/applications/core/data/acpsearch.json
index 4fa51025..bd4c475a 100644
--- a/applications/core/data/acpsearch.json
+++ b/applications/core/data/acpsearch.json
@@ -246,6 +246,13 @@
"stock photo"
]
},
+ "app=core&module=applications&controller=enhancements&do=edit&id=core_Postmark": {
+ "lang_key": "menu__core_applications_enhancements",
+ "restriction": "enhancements_manage",
+ "keywords": [
+ "postmark"
+ ]
+ },
"app=core&module=applications&controller=enhancements&do=edit&searchResult=form_ga_enabled": {
"lang_key": "ga_enabled",
"restriction": "enhancements_manage",
@@ -1487,12 +1494,12 @@
"lang_key": "menu__core_moderation_spam",
"restriction": "spam_manage",
"keywords": [
- "spam",
- "spammers",
"delete guest content",
"delete guest posts",
"guest content",
- "guest posts"
+ "guest posts",
+ "spam",
+ "spammers"
]
},
"app=core&module=moderation&controller=spam&do=serviceLogs": {
@@ -1751,8 +1758,8 @@
"reddit",
"share links",
"stumbleupon",
- "twitter",
- "tiktok"
+ "tiktok",
+ "twitter"
]
},
"app=core&module=settings&controller=advanced": {
@@ -2068,13 +2075,13 @@
"lang_key": "site_social_profiles",
"restriction": "general_manage",
"keywords": [
+ "bluesky",
"facebook",
"social profile",
+ "tiktok",
"twitter",
"x",
- "bluesky",
- "youtube",
- "tiktok"
+ "youtube"
]
},
"app=core&module=settings&controller=general&searchResult=form_site_twitter_id": {
diff --git a/applications/core/data/allKnownCodeLanguages.json b/applications/core/data/allKnownCodeLanguages.json
index 9e8b9f3c..ab8e91f4 100644
--- a/applications/core/data/allKnownCodeLanguages.json
+++ b/applications/core/data/allKnownCodeLanguages.json
@@ -1 +1 @@
-{"languages":["1c","abnf","accesslog","actionscript","ada","angelscript","apache","applescript","arcade","arduino","armasm","asciidoc","aspectj","autohotkey","autoit","avrasm","awk","axapta","bash","basic","bnf","brainfuck","c","cal","capnproto","ceylon","clean","clojure-repl","clojure","cmake","coffeescript","coq","cos","cpp","crmsh","crystal","csharp","csp","css","d","dart","delphi","diff","django","dns","dockerfile","dos","dsconfig","dts","dust","ebnf","elixir","elm","erb","erlang-repl","erlang","excel","fix","flix","fortran","fsharp","gams","gauss","gcode","gherkin","glsl","gml","go","golo","gradle","graphql","groovy","haml","handlebars","haskell","haxe","hsp","http","hy","inform7","ini","irpf90","isbl","java","javascript","jboss-cli","json","julia-repl","julia","kotlin","lasso","latex","ldif","leaf","less","lisp","livecodeserver","livescript","llvm","lsl","lua","makefile","markdown","mathematica","matlab","maxima","mel","mercury","mipsasm","mizar","mojolicious","monkey","moonscript","n1ql","nestedtext","nginx","nim","nix","node-repl","nsis","objectivec","ocaml","openscad","oxygene","parser3","perl","pf","pgsql","php-template","php","plaintext","pony","powershell","processing","profile","prolog","properties","protobuf","puppet","purebasic","python-repl","python","q","qml","r","reasonml","rib","roboconf","routeros","rsl","ruby","ruleslanguage","rust","sas","scala","scheme","scilab","scss","shell","smali","smalltalk","sml","sqf","sql","stan","stata","step21","stylus","subunit","swift","taggerscript","tap","tcl","thrift","tp","twig","typescript","vala","vbnet","vbscript-html","vbscript","verilog","vhdl","vim","wasm","wren","x86asm","xl","xml","xquery","yaml","zephir"]}
\ No newline at end of file
+{"languages":["1c","abnf","accesslog","actionscript","ada","angelscript","apache","applescript","arcade","arduino","armasm","asciidoc","aspectj","autohotkey","autoit","avrasm","awk","axapta","bash","basic","bnf","brainfuck","c","cal","capnproto","ceylon","clean","clojure-repl","clojure","cmake","coffeescript","coq","cos","cpp","crmsh","crystal","csharp","csp","css","d","dart","delphi","diff","django","dns","dockerfile","dos","dsconfig","dts","dust","ebnf","elixir","elm","erb","erlang-repl","erlang","excel","fix","flix","fortran","fsharp","gams","gauss","gcode","gherkin","glsl","gml","go","golo","gradle","graphql","groovy","haml","handlebars","haskell","haxe","hsp","http","hy","inform7","ini","irpf90","isbl","java","javascript","jboss-cli","json","julia-repl","julia","kotlin","lasso","latex","ldif","leaf","less","lisp","livecodeserver","livescript","llvm","lsl","lua","makefile","markdown","mathematica","matlab","maxima","mel","mercury","mipsasm","mizar","mojolicious","monkey","moonscript","n1ql","nestedtext","nginx","nim","nix","node-repl","nsis","objectivec","ocaml","openscad","oxygene","parser3","perl","pf","pgsql","php-template","php","plaintext","pony","powershell","processing","profile","prolog","properties","protobuf","puppet","purebasic","python-repl","python","q","qml","r","reasonml","rib","roboconf","routeros","rsl","ruby","ruleslanguage","rust","sas","scala","scheme","scilab","scss","shell","smali","smalltalk","sml","sqf","sql","stan","stata","step21","stylus","subunit","swift","taggerscript","tap","tcl","thrift","tp","twig","typescript","vala","vbnet","vbscript-html","vbscript","verilog","vhdl","vim","wasm","wren","x86asm","xl","xml","xquery","yaml","zephir","ipsphtml","ipscss"]}
\ No newline at end of file
diff --git a/applications/core/data/build.xml b/applications/core/data/build.xml
index b0d40bf8..dac70a4c 100644
--- a/applications/core/data/build.xml
+++ b/applications/core/data/build.xml
@@ -323,6 +323,9 @@
+
+
+
@@ -407,6 +410,7 @@
+
@@ -546,6 +550,7 @@
+
@@ -683,7 +688,7 @@
-
+
@@ -711,7 +716,7 @@
-
+
@@ -747,7 +752,7 @@
-
+
@@ -872,7 +877,7 @@
- logo['front']['url'] ) AND \\IPS\\Theme::i()->logo['front']['url'] !== null }}{{$logo = \\IPS\\File::get( 'core_Theme', \\IPS\\Theme::i()->logo['front']['url'] )->url;}}{$logo}{{endif}}","cat":"imageLogoDesktop"}]]>
+ logo['front']['url'] ) AND \\IPS\\Theme::i()->logo['front']['url'] !== null }}\r\n {{$logo = \\IPS\\File::get( 'core_Theme', \\IPS\\Theme::i()->logo['front']['url'] )->url;}}\r\n {$logo}\r\n{{endif}}","cat":"imageLogoDesktop"}]]>
logo['mobile']['url'] ) AND \\IPS\\Theme::i()->logo['mobile']['url'] !== null }}{{$logo = \\IPS\\File::get( 'core_Theme', \\IPS\\Theme::i()->logo['mobile']['url'] )->url;}}{$logo}{{endif}}","cat":"imageLogoMobile"}]]>
Classic<\/strong> is the traditional layout, with a horizontal header. Side Panel<\/strong> moves the logo and navigation into a vertical panel on the side of your page.","refresh":true,"options":[["default","Classic"],["side","Side panel"]],"default":"default","cat":"pageLayouts"}]]>
diff --git a/applications/core/data/defaults/extensions/EmailHandler.txt b/applications/core/data/defaults/extensions/EmailHandler.txt
new file mode 100644
index 00000000..ad9b6186
--- /dev/null
+++ b/applications/core/data/defaults/extensions/EmailHandler.txt
@@ -0,0 +1,56 @@
+Invision Power Services, Inc.
+ * @copyright (c) Invision Power Services, Inc.
+ * @license https://www.invisioncommunity.com/legal/standards/
+ * @package Invision Community
+{subpackage}
+ * @since {date}
+ */
+
+namespace IPS\{app}\extensions\core\EmailHandler;
+
+use Exception;
+use IPS\Email;
+
+/* To prevent PHP errors (extending class does not exist) revealing path */
+if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
+{
+ header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
+ exit;
+}
+
+/**
+ * {class}
+ */
+class {class} extends Email
+{
+ /**
+ * Send the email
+ *
+ * @param mixed $to The member or email address, or array of members or email addresses, to send to
+ * @param mixed $cc Addresses to CC (can also be email, member or array of either)
+ * @param mixed $bcc Addresses to BCC (can also be email, member or array of either)
+ * @param mixed $fromEmail The email address to send from. If NULL, default setting is used
+ * @param mixed $fromName The name the email should appear from. If NULL, default setting is used
+ * @param array $additionalHeaders The name the email should appear from. If NULL, default setting is used
+ * @return void
+ * @throws Exception
+ */
+ public function _send( mixed $to, mixed $cc=array(), mixed $bcc=array(), mixed $fromEmail = NULL, mixed $fromName = NULL, array $additionalHeaders = array() ) : void
+ {
+
+ }
+
+ /**
+ * Is Outgoing Handler usable?
+ *
+ * @param string $type Email type
+ * @return bool
+ */
+ public static function isUsable( string $type ): bool
+ {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/applications/core/data/defaults/extensions/Loader.txt b/applications/core/data/defaults/extensions/Loader.txt
index 5b93271d..466dae37 100644
--- a/applications/core/data/defaults/extensions/Loader.txt
+++ b/applications/core/data/defaults/extensions/Loader.txt
@@ -15,6 +15,10 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
/**
* @brief Loader extension: {class}
+ * IMPORTANT: Most methods in this extension are NOT called
+ * on Database Pages (@see \IPS\cms\Databases\Dispatcher)
+ * The above dispatcher class bypasses CSS and JS intentionally.
+ * Redirects can be handled in a Raw HTML block for now.
*/
class {class} extends LoaderAbstract
{
diff --git a/applications/core/data/editorManifest.json b/applications/core/data/editorManifest.json
index 4e882142..c7774275 100644
--- a/applications/core/data/editorManifest.json
+++ b/applications/core/data/editorManifest.json
@@ -69,7 +69,7 @@
"isDynamicEntry": true
},
"src/main.jsx": {
- "file": "assets/main-DuMoUIOM.js",
+ "file": "assets/main-CbPFTxeK.js",
"name": "main",
"src": "src/main.jsx",
"isEntry": true,
diff --git a/applications/core/data/extensions.json b/applications/core/data/extensions.json
index 958cef20..9f213cfa 100644
--- a/applications/core/data/extensions.json
+++ b/applications/core/data/extensions.json
@@ -47,7 +47,8 @@
"Mapbox": "IPS\\core\\extensions\\core\\CommunityEnhancements\\Mapbox",
"Matomo": "IPS\\core\\extensions\\core\\CommunityEnhancements\\Matomo",
"Pixabay": "IPS\\core\\extensions\\core\\CommunityEnhancements\\Pixabay",
- "Sendgrid": "IPS\\core\\extensions\\core\\CommunityEnhancements\\Sendgrid",
+ "Postmark": "IPS\\core\\extensions\\core\\CommunityEnhancements\\Postmark",
+ "SendGrid": "IPS\\core\\extensions\\core\\CommunityEnhancements\\SendGrid",
"SpamMonitoring": "IPS\\core\\extensions\\core\\CommunityEnhancements\\SpamMonitoring",
"Zapier": "IPS\\core\\extensions\\core\\CommunityEnhancements\\Zapier"
},
diff --git a/applications/core/data/hooks.json b/applications/core/data/hooks.json
deleted file mode 100644
index 0637a088..00000000
--- a/applications/core/data/hooks.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
\ No newline at end of file
diff --git a/applications/core/data/javascript.xml b/applications/core/data/javascript.xml
index 08dfe702..5ac6f3e9 100644
--- a/applications/core/data/javascript.xml
+++ b/applications/core/data/javascript.xml
@@ -1,6 +1,6 @@
- {
+ const form = e.target;
+ if (e instanceof SubmitEvent && form instanceof HTMLFormElement && form.method.toUpperCase() === 'POST' && !getSetting('memberID') && getCsrfKeyExpiry() < Date.now() / 1000) {
+ Debug.log(`Intercepted form submission... fetching fresh CSRF key`);
+ e.preventDefault();
+ e.stopPropagation();
+ e.stopImmediatePropagation();
+ getFreshCsrfKey()
+ // .then(() => new Promise(resolve => setTimeout(resolve, 2000))) // DEBUG - wait a couple seconds so I can read the logs
+ .then(() => {
+ Debug.log(`Got a new CSRF key, resuming the form submission`);
+ let submitButton = (e instanceof SubmitEvent || e.submitter instanceof Element) ? e.submitter : form.querySelector('button[type="submit"], button:not([type]), input[type="submit"]');
+ if (submitButton) {
+ submitButton.click();
+ } else {
+ // the click() causes the native submit event to fire. However, if there was no submitter (e.g. the user pressed 'Enter'), we need to dispatch our own submit event and see if they call prevent default.
+ const ev = new CustomSubmitEvent(e);
+ form.dispatchEvent(ev);
+ if (ev.defaultPrevented) {
+ return;
+ }
+ form.submit();
+ }
+ });
+ }
+ }, {capture: true});
+
+
+ // Add a little jQuery plugin that allows us to add callbacks
// to CSS animations
$.fn.animationComplete = function (callback) {
return $( this ).one('webkitAnimationEnd animationend', function (e) {
@@ -99,18 +145,252 @@ jQuery.migrateMute = true;
});
},
- /**
- * Allows us to use mock ajax objects if necessary
- *
- * @returns {(function(url:string|ajaxOptions, options?:ajaxOptions|undefined): Object)} Ajax object (jQuery's $.ajax by default)
- */
- getAjax = function () {
- if( getSetting('mock_ajax') ){
- return getSetting('mock_ajax');
- }
+ /**
+ * Allows us to use mock ajax objects if necessary, and fetches a fresh CSRF token if we're on a guest page before sending the request
+ *
+ * @returns {object} Ajax object (jQuery's $.ajax by default)
+ */
+ getAjax = function () {
+ const wrap = method => (...args) => {
+ let options = {}, url;
+ if (typeof args[0] === 'string') {
+ url = args[0];
+ options = args[1] || {};
+ } else if (typeof args[0] === 'object' && args[0]) {
+ options = args[0];
+ }
- return $.ajax;
- },
+ if ((options.method || options.type)?.toLowerCase() !== 'post' || getSetting('memberID') || getCsrfKeyExpiry() >= Date.now() / 1000) {
+ return method(...args);
+ }
+
+ // Guest with an expired CSRF key? Oh boy, we need to return a proxy object for an api encompassing its own polyfill (our polyfill > $.ajax > XMLHttpRequest)
+ let requestInstance;
+ const decoratorQueues = {};
+ const properties = {};
+ let thenResolve,
+ thenReject,
+ mimeTypeOverride;
+ const uploadEventListeners = new Map();
+ const uploadDispatchedEvents = [];
+ const proxyXHRObject = {
+ _promise: new Promise((resolve, reject) => {
+ thenResolve = resolve;
+ thenReject = reject
+ }),
+ then(cb) {
+ this._promise.then(cb);
+ },
+ catch(...args) {
+ this._promise.catch(...args)
+ },
+ finally(...args) {
+ this._promise.finally(...args);
+ },
+ _aborted: false,
+ get aborted() {
+ return this._aborted;
+ },
+ _abortedStatusText: undefined,
+ get abortedStatusText() {
+ return this._abortedStatusText;
+ },
+ abort(statusText) {
+ this._aborted = true;
+ this._abortedStatusText = statusText;
+ requestInstance?.abort(statusText);
+ },
+ getAllResponseHeaders() {
+ return requestInstance?.getAllResponseHeaders() || null;
+ },
+ getResponseHeader(header) {
+ return requestInstance?.getResponseHeader(header) || null;
+ },
+ overrideMimeType(mimeType) {
+ if (requestInstance) {
+ requestInstance.overrideMimeType(mimeType);
+ return;
+ }
+ mimeTypeOverride = mimeType;
+ },
+ get readyState() {
+ return requestInstance ? requestInstance.readyState : 0;
+ },
+ get response() {
+ return requestInstance ? ('response' in requestInstance ? requestInstance.response : null) : null;
+ },
+ get responseText() {
+ if (typeof requestInstance?.responseText === 'string') {
+ return requestInstance.responseText;
+ }
+ return "";
+ },
+ get responseType() {
+ if (typeof requestInstance?.responseType === 'string') {
+ return requestInstance.responseType;
+ }
+ return "";
+ },
+ get responseURL() {
+ return requestInstance ? requestInstance.responseURL : (url || options.url || window.location.href);
+ },
+ get responseXML() {
+ return requestInstance ? requestInstance.responseXML : null;
+ },
+ get status() {
+ return requestInstance ? requestInstance.status : 0;
+ },
+ get statusText() {
+ return requestInstance ? requestInstance.statusText : "";
+ },
+ get timeout() {
+ return properties.timeout || 0;
+ },
+ set timeout(val) {
+ properties.timeout = val;
+ if (requestInstance) {
+ requestInstance.timeout = val;
+ }
+ },
+ get withCredentials() {
+ return !!(requestInstance ? requestInstance.withCredentials : properties.withCredentials);
+ },
+ set withCredentials(val) {
+ val = !!val;
+ properties.withCredentials = val; // track this in case it was set before the request instance was defined
+ if (requestInstance) {
+ requestInstance.withCredentials = val;
+ }
+ },
+ _upload: {
+ _getEventCollection(event, options) {
+ const path = [
+ event,
+ (options && options.capture) ? "true" : "false"
+ ];
+
+ let collection = uploadEventListeners;
+ for (let i = 0; i < path.length; i++) {
+ const cmp = path[i];
+ collection.set(cmp, collection.get(cmp) || new Map());
+ collection = collection.get(cmp);
+ }
+
+ return collection;
+ },
+ addEventListener(event, cb, options={}) {
+ requestInstance?.upload?.addEventListener?.(event, cb, options);
+ this._getEventCollection(event, options).set(cb, {options, event});
+ },
+ removeEventListener(event, cb, options={}) {
+ requestInstance?.upload?.removeEventListener?.(event, cb, options);
+ this._getEventCollection(event, options).delete(cb);
+ },
+ dispatchEvent(...args) {
+ if (requestInstance?.upload?.dispatchEvent instanceof Function) {
+ requestInstance.upload.dispatchEvent(...args);
+ return;
+ }
+ uploadDispatchedEvents.push(args);
+ },
+ set onabort(cb) {
+ this.addEventListener('abort', cb);
+ },
+ set onerror(cb) {
+ this.addEventListener('error', cb);
+ },
+ set onload(cb) {
+ this.addEventListener('load', cb);
+ },
+ set onloadend(cb) {
+ this.addEventListener('loadend', cb);
+ },
+ set onloadstart(cb) {
+ this.addEventListener('loadstart', cb);
+ },
+ set onprogress(cb) {
+ this.addEventListener('progress', cb);
+ },
+ set ontimeout(cb) {
+ this.addEventListener('timeout', cb);
+ }
+ },
+ get upload() {
+ return requestInstance ? requestInstance.upload : this._upload;
+ }
+ }
+
+ for (const chainableMethod of ['done','always', 'fail', 'success', 'error', 'complete']) {
+ proxyXHRObject[chainableMethod] = (function(...args) {
+ decoratorQueues[chainableMethod] = decoratorQueues[chainableMethod] || [];
+ decoratorQueues[chainableMethod].push(args);
+ requestInstance?.[chainableMethod]?.(...args);
+ return this;
+ }).bind(proxyXHRObject);
+ }
+
+ for (const simpleMethod of ['getAllResponseHeaders', 'getResponseHeader']) {
+ proxyXHRObject[simpleMethod] = (function(...args) {
+ return requestInstance?.[simpleMethod]?.(...args);
+ }).bind(proxyXHRObject);
+ }
+
+
+ getFreshCsrfKey()
+ .then(() => {
+ Debug.log(`Intercepted Fetch request and get fresh CSRF Key`);
+ requestInstance = method(url, options);
+ if (requestInstance.upload) {
+ if (Object.keys(uploadEventListeners).length) {
+ function evalCollection(collection) {
+ for (const [key, childCollection] of collection.entries()) {
+ if (key instanceof Function) {
+ requestInstance.upload.addEventListener(childCollection.event, key, childCollection.options);
+ } else {
+ evalCollection(childCollection);
+ }
+ }
+ }
+ evalCollection(uploadEventListeners);
+ }
+
+ for (const args of uploadDispatchedEvents) {
+ requestInstance.upload.dispatchEvent(...args);
+ }
+ }
+ if (mimeTypeOverride) {
+ requestInstance.overrideMimeType(mimeTypeOverride);
+ }
+
+ for (const queue in decoratorQueues) {
+ requestInstance[queue](...decoratorQueues[queue]);
+ }
+
+ for (const property in properties) {
+ requestInstance[property] = properties[property];
+ }
+
+ requestInstance
+ .then((...result) => {
+ thenResolve(...result);
+ }).catch(err => {
+ thenReject(err);
+ });
+
+ if (proxyXHRObject.aborted) {
+ proxyXHRObject.abortedStatusText ? requestInstance.abort(proxyXHRObject.abortedStatusText) : requestInstance.abort();
+ }
+ });
+
+ return proxyXHRObject;
+ }
+
+ if( getSetting('mock_ajax') ){
+ return wrap(getSetting('mock_ajax'));
+ }
+
+ return wrap($.ajax);
+ },
/**
* Async wrapper for our getAjax method to act like fetch. Resolves the response data or throws an error on reject
*
@@ -193,6 +473,93 @@ jQuery.migrateMute = true;
return ( tryThis.length ) ? tryThis : $('body');
},
+ /**
+ * Refresh teh csrf key if needed
+ * @return {Promise}
+ * @private
+ */
+ _refreshCsrfKey = async function() {
+
+ // we do this before refreshing to prevent any infinite loops.
+ setSetting('csrfKeyExpiry', Math.floor(Date.now() / 1000 + 20));
+ try {
+ // we use fetch() directly to not use the existing csrf key that getAjax uses
+ const response = await window.fetch(getSetting('baseURL').toString().replace(/\/+$/, '') + '/?app=core&module=system&controller=ajax&do=getCsrfKey&path=' + window.location.pathname );
+ const data = await response.json();
+
+ Debug.log(`Got new CSRF Key: ${data.key}`);
+ setSetting('csrfKey', data.key);
+ setSetting('csrfKeyExpiry', typeof data.expiry === "number" ? data.expiry : Math.floor(Date.now() / 1000 + 500));
+ _setAjaxConfig();
+
+ // All csrfKey inputs
+ document
+ .querySelectorAll(`form input[name="csrfKey"]`)
+ .forEach(input => {
+ input.value = data.key;
+ });
+
+
+ // Make sure the form's action is updated
+ document.querySelectorAll(`form:is([action*="?csrfKey="],[action*="&csrfKey="])`)
+ .forEach(form => {
+ const url = new URL(form.action);
+ if ((url.toString().startsWith('https:' + ips.getSetting('baseURL')) || url.toString().startsWith('http:' + ips.getSetting('baseURL'))) && (url.searchParams.has('csrfKey') || form.method.toLowerCase() !== 'get')) {
+ url.searchParams.set('csrfKey', data.key);
+ form.action = url.toString();
+ }
+ });
+
+ // Any links need updating too
+ document.querySelectorAll(`[href*="?csrfKey="], [href*="&csrfKey="]`)
+ .forEach(linkLikeEl => {
+ const url = new URL(linkLikeEl.href || linkLikeEl.getAttribute('href'));
+ if ((url.toString().startsWith('https:' + ips.getSetting('baseURL')) || url.toString().startsWith('http:' + ips.getSetting('baseURL'))) && url.searchParams.has('csrfKey')) {
+ url.searchParams.set('csrfKey', data.key);
+ linkLikeEl.setAttribute('href', url.toString());
+ }
+ });
+
+ // Dispatch an event so third party code can listen
+ document.dispatchEvent(new CustomEvent('ips:csrfKeyUpdated'));
+ } catch (e) {
+ Debug.warn(e);
+ }
+ },
+
+
+ /**
+ * Get the time the csrf key should expire. If there is no current csrf key, we return null
+ *
+ * @return {number}
+ */
+ getCsrfKeyExpiry = function() {
+ const setting = getSetting('csrfKeyExpiry');
+ if (typeof setting === "number" && !Number.isNaN(setting) && getSetting('csrfKey')) {
+ return setting;
+ }
+
+ return 0; // in this case, we assume it's expired
+ },
+
+ /**
+ * Refresh the csrf key on the page to make sure it's valid
+ *
+ * @returns {Promise}
+ */
+ getFreshCsrfKey = async function() {
+ // Logged In and we know the key? Return it now
+ if (getSetting('memberID') && getSetting('csrfKey')) {
+ return getSetting('csrfKey');
+ }
+
+ if (Date.now() / 1000 >= getCsrfKeyExpiry()) {
+ await _refreshCsrfKey();
+ }
+
+ return getSetting('csrfKey');
+ },
+
/**
* Sets up our global ajax handlers
*
@@ -200,13 +567,20 @@ jQuery.migrateMute = true;
*/
_setAjaxConfig = function () {
var data = {
- csrfKey: ips.getSetting('csrfKey')
+ csrfKey: getSetting('csrfKey')
};
$.ajaxSetup({
data: data,
cache: true
});
+ },
+
+ /**
+ * Set up the event listeners for ajax requests
+ * @private
+ */
+ _setAjaxEventListeners = function() {
// Add global loading indicator ability
var count = 0;
@@ -277,7 +651,7 @@ jQuery.migrateMute = true;
* Config getter
*
* @param {string} key Setting key to return
- * @returns {mixed} Config setting, or undefined if it doesn't exist
+ * @returns {*} Config setting, or undefined if it doesn't exist
*/
getSetting = function (key) {
return _settings[ key ];
@@ -701,26 +1075,37 @@ ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCg==")
const stack = (new Error()).stack;
const lastLine = stack.split('\n').slice(0,3).pop().trim().replace(/^at\s*/, '');
logTimeIndent++;
- let start = Date.now();
+ const now = window.performance.now instanceof Function ? () => window.performance.now() : Date.now;
+ const start = now();
+ const doneExecuting = () => {
+ const end = now();
+ if (message instanceof Function) {
+ try {
+ message = message(end - start);
+ } catch (e) {
+ e.message = "\t".repeat(Math.max(0, logTimeIndent - 1)) + e.message;
+ Debug.warn(e);
+ message = "Done timing code, but a message generator failed";
+ }
+ }
+ if ((end - start >= threshold) && Debug.isEnabled()) {
+ if (typeof message === "string") {
+ console.log(`${"\t".repeat(Math.max(0, logTimeIndent - 1))}${end - start}ms: ${message}\n${"\t".repeat(Math.max(1, logTimeIndent))}${lastLine}`);
+ } else {
+ console.log(`${"\t".repeat(Math.max(0, logTimeIndent - 1))}${end - start}ms: `, message, `\n${"\t".repeat(Math.max(1, logTimeIndent))}${lastLine}`);
+ }
+ }
+ logTimeIndent--;
+ }
const res = cb();
- const end = Date.now();
- if (message instanceof Function) {
- try {
- message = message(end - start);
- } catch (e) {
- e.message = "\t".repeat(Math.max(0, logTimeIndent - 1)) + e.message;
- Debug.warn(e);
- message = "Done timing code, but a message generator failed";
- }
+ if (res instanceof Promise) {
+ return res.then((result) => {
+ doneExecuting();
+ return result;
+ })
}
- if ((end - start >= threshold) && Debug.isEnabled()) {
- if (typeof message === "string") {
- console.log(`${"\t".repeat(Math.max(0, logTimeIndent - 1))}${end - start}ms: ${message}\n${"\t".repeat(Math.max(1, logTimeIndent))}${lastLine}`);
- } else {
- console.log(`${"\t".repeat(Math.max(0, logTimeIndent - 1))}${end - start}ms: `, message, `\n${"\t".repeat(Math.max(1, logTimeIndent))}${lastLine}`);
- }
- }
- logTimeIndent--;
+
+ doneExecuting();
return res;
}
};
@@ -752,8 +1137,26 @@ ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCg==")
}
e.submitter = e.target.querySelector('button, input[type=button], input[type=image]');
}, true);
-}();]]>
-
+
- {
const raw = String.raw({raw:str}, ...values)
return ips.getString(raw) || raw
}]]>
- {
}( jQuery, _ ));
]]>
- {
}
});
}( jQuery, _ )); ]]>
- {
});
}( jQuery, _ ));]]>
- {
+ {
"use strict";
/**
@@ -2484,7 +2887,7 @@ const ilang = (str, ...values) => {
}
}
})(jQuery, _));]]>
- {
};
});
}(jQuery, _));]]>
- /* global ips, _, Debug */
+ /* global ips, _, Debug */
/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
@@ -3045,7 +3448,7 @@ const ilang = (str, ...values) => {
};
}(jQuery, _));
- {
return AlertMessage.buildModuleAndRegisterWidget('alertMessage');
})
}(jQuery, _));]]>
- {
};
}(jQuery, _));]]>
- {
}(jQuery, _));
]]>
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -5654,7 +6057,7 @@ function recaptcha2Callback(){
};
});
}(jQuery, _));
-
- {
+ {
"use strict";
ips.createModule('ips.ui._codehighlighting', function() {
+
+ const LOADER_RESOLVERS = new Set();
+ const LOADER_REJECTS = new Set();
+ /**
+ *
+ * @type {'loaded'|'error'|"loading"}
+ */
+ let STATE = 'loading';
+
+ document.addEventListener('ipsCodehighlightingLoaded', () => {
+ STATE = 'loaded';
+ LOADER_RESOLVERS.forEach(resolve => resolve());
+ LOADER_RESOLVERS.clear();
+ LOADER_REJECTS.clear();
+ });
+
// The actual ips.ui.codehighlighting module is bundled and lazily loads the language support.
// We are NOT using ips.loader here because that ruins the browsers ability to track the URL of the script
let timeout;
@@ -5826,6 +6246,10 @@ function recaptcha2Callback(){
clearTimeout(timeout);
window.removeEventListener('load', inject);
if (typeof ips.ui?.codehighlighting === 'object') {
+ STATE = 'loaded';
+ LOADER_REJECTS.clear();
+ LOADER_RESOLVERS.forEach(resolve => resolve());;
+ LOADER_RESOLVERS.clear();
return;
}
@@ -5834,6 +6258,10 @@ function recaptcha2Callback(){
timeout = setTimeout(inject, 100);
Debug.log(`Attempting to load the codehighlighting module. Attempt: ${attempts}`);
} else {
+ STATE = 'error';
+ LOADER_RESOLVERS.clear();
+ LOADER_REJECTS.forEach(reject => reject(new Error(`The codehighlighting module could not be loaded`)));
+ LOADER_RESOLVERS.clear();
Debug.warn(`Couldn't load the codehighlighting module after 5 attempts because document.body isn't present!`);
}
return;
@@ -5853,6 +6281,10 @@ function recaptcha2Callback(){
window.addEventListener('load', inject, {once: true});
timeout = setTimeout(() => {
if (typeof ips.ui?.codehighlighting === "object") {
+ STATE = 'loaded';
+ LOADER_REJECTS.clear();
+ LOADER_RESOLVERS.forEach(resolve => resolve());
+ LOADER_RESOLVERS.clear();
return;
}
Debug.warn(`The codehighlighting module was not appended to document.body because the window's \`load\` event didn't fire within 2 seconds after ips.ui._codehighlighting was initialized.`);
@@ -5860,10 +6292,23 @@ function recaptcha2Callback(){
}, 2000);
}
- return {}
+ return {
+ whenLoaded() {
+ return new Promise((resolve, reject) => {
+ if (STATE === 'loaded') {
+ return resolve();
+ } else if (STATE === 'error') {
+ return reject();
+ }
+
+ LOADER_REJECTS.add(reject);
+ LOADER_RESOLVERS.add(resolve);
+ })
+ }
+ }
})
})(jQuery, _))]]>
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -7286,7 +7731,7 @@ function recaptcha2Callback(){
};
});
}(jQuery, _));
-
-
-
- ')
+ .setContent(originalContent || '
', {emitUpdate: true})
.clearAutosave()
.run();
@@ -9500,7 +9945,7 @@ function recaptcha2Callback(){
}
}(jQuery, _));]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ;( function(){
+ ;( function(){
"use strict";
ips.createModule('ips.ui.readmore', function(){
@@ -15626,7 +16071,7 @@ function recaptcha2Callback(){
});
}());
-
-
-
-
-
-
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -20106,7 +20551,7 @@ function recaptcha2Callback(){
});
}(jQuery, _));
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -24224,7 +24669,7 @@ function recaptcha2Callback(){
};
});
}(jQuery, _));
-
- {
+ {
"use strict";
ips.createModule('ips.utils.pagebuildericons', function() {
@@ -24472,7 +24917,7 @@ function recaptcha2Callback(){
return {}
})
})(jQuery, _))]]>
-
-
-
-
- {
+ const registerServiceWorker = (type) => {
return navigator.serviceWorker
- .register(`${SERVICE_WORKER_URL}&type=${type}&loggedIn=${JSON.stringify(loggedIn)}`)
+ .register(`${SERVICE_WORKER_URL}&type=${type}`)
.then((registration) => {
// Registration was successful
Debug.log("ServiceWorker registration successful with scope: ", registration.scope);
@@ -25714,7 +26159,7 @@ function recaptcha2Callback(){
});
})(jQuery, _);
]]>
-
-
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -27957,7 +28402,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
-
-
-
-
-
-
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -30173,7 +30618,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
-
-
-
-
- } */
const OLD_TIME_ELEMENTS = new WeakSet();
}(jQuery, _));]]>
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -33947,7 +34392,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* IPS Social Suite 4
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -33989,7 +34434,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -34604,7 +35049,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -35659,7 +36104,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://invisioncommunity.com
*
@@ -36187,7 +36632,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -36225,7 +36670,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -36774,7 +37219,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -37356,7 +37801,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -37931,7 +38376,7 @@ var escapeRegExp;
});
}(jQuery, _));
- /**
+ /**
* IPS Social Suite 4
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -37990,7 +38435,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -38015,7 +38460,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -38403,7 +38848,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* IPS Social Suite 4
* (c) 2018 Invision Power Services - http://www.invisionpower.com
*
@@ -38478,7 +38923,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* IPS Social Suite 4
* (c) 2013 Invision Power Services - http://www.invisionpower.com
*
@@ -38499,7 +38944,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -39213,7 +39658,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -39334,7 +39779,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -40211,7 +40656,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -41104,7 +41549,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -41436,7 +41881,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -41822,7 +42267,7 @@ var escapeRegExp;
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -41885,7 +42330,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -43033,7 +43478,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -43389,7 +43834,7 @@ var escapeRegExp;
});
}(jQuery, _));
- 0 ) {
- translatable.each(function() {this.ipsShow();});
+ check.checked = true;
+ check.dispatchEvent(new Event('change', {bubbles: true}));
+ toggleWrap.ipsHide();
+ if (conditionButtons?.querySelector('[data-role="toggleFilter"] input[data-filter]:not(:checked)')) {
+ conditionButtons?.ipsShow();
} else {
- translatable.each(function() {this.ipsHide();});
+ conditionButtons?.ipsHide();
}
+
+ const filterName = check.dataset.filter;
+ if (filterName) {
+ ruleWrap.querySelectorAll(`#${filterName}`).ipsShow();
+ }
+ ruleWrap.querySelectorAll('input[type="number"]').forEach(el => this._pluralizeNumber(el));
},
- changeRule: function (e) {
- if(e) {
- e.preventDefault();
- }
-
- const ruleToShow = this.scope.find(`#rule_${this._select.val()}`);
- this.scope.find('[data-role="ruleWrap"]').each(function() {this.ipsHide()}); // Hide all rule wraps
-
- ruleToShow.attr('data-ipsForm', true); // Apply the form widget to each individual rule wrapper
- ruleToShow.get(0).ipsShow();
-
- this._changeBadge( $('select[name="' + this._select.val() + '_award_subject[badge]"]' ) );
- const otherBadge = $('select[name="' + this._select.val() + '_award_other[badge]"]' );
- if ( otherBadge.length ) {
- this._changeBadge( otherBadge );
- }
- $( document ).trigger('contentChange', [ ruleToShow ] ); // Trigger form init
- },
-
- showFilter: function (e) {
- const ruleWrap = $( e.currentTarget ).closest('[data-role="ruleWrap"]');
- const toggleWrap = $( e.currentTarget ).closest('[data-role="toggleFilter"]');
- const check = toggleWrap.find('input[type="checkbox"]');
- const toggleRow = toggleWrap.closest('[data-role="conditionButtons"]');
-
- check.prop('checked', true).trigger('change');
- toggleWrap.each(function() {this.ipsHide();});
- toggleRow.toggle( toggleRow.find('[data-role="toggleFilter"] input[type="checkbox"]:visible').length > 0 );
- ruleWrap.find(`#${check.attr('data-filter')}`).each(function() {this.ipsShow();});
-
- if( ruleWrap.find('input[type="number"]') ){
- const self = this;
- ruleWrap.find('input[type="number"]').each( function () {
- self._pluralizeNumber( $( this ) );
- });
- }
- },
-
- hideFilter: function (e) {
+ /**
+ * Hide a filter
+ * @param {MouseEvent} e
+ */
+ hideFilter(e) {
e.preventDefault();
- const filter = $( e.currentTarget ).closest('[data-role="filterField"]');
- const filterName = filter.attr('id');
- const ruleWrap = filter.closest('[data-role="ruleWrap"]');
- const check = ruleWrap.find(`#${filterName}Checkbox`);
+ const filter = e.currentTarget.closest('[data-role="filterField"]');
+ const filterName = filter.id;
+ const check = filter
+ .closest('[data-role="ruleWrap"]') // in theory, we can just do document.querySelector, however other tabs may have an element sharing this ID. THerefore, we only find the element with this ID inside this tab
+ .querySelector(`#${filterName}Checkbox`);
+
const toggleWrap = check.closest('[data-role="toggleFilter"]');
-
- check.prop('checked', false).trigger('change');
- toggleWrap.each(function() {this.ipsShow();})
- toggleWrap.closest('[data-role="conditionButtons"]').each(function() {this.ipsShow();});
- filter.each(function() { this.ipsHide() });
+
+ check.checked = false;
+ check.dispatchEvent(new Event('change', {bubbles: true})); // todo this may be redundant
+ toggleWrap.ipsShow()
+ toggleWrap.closest('[data-role="conditionButtons"]')?.ipsShow();
+ filter.ipsHide();
},
- changeNumber: function (e) {
- this._pluralizeNumber( $( e.currentTarget ) );
+ /**
+ * Change the number of a numeric input so that the lang string is pluralized properly
+ * @param {Event} e
+ */
+ changeNumber(e) {
+ this._pluralizeNumber(e.currentTarget);
},
- _pluralizeNumber: function (input) {
- const span = input.next('[data-role="th"]');
+ /**
+ *
+ * @param {HTMLInputElement} input
+ * @private
+ */
+ _pluralizeNumber(input) {
+ const span = input.nextElementSibling;
- if( span.length ){
- span.text( ips.pluralize( ips.getString('numberSuffix'), input.val() ) );
+ if (span?.matches('[data-role="th"]')) {
+ span.innerText = ips.pluralize(ips.getString('numberSuffix'), input.value);
}
}
});
}(jQuery, _));]]>
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -43543,7 +43969,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -43667,7 +44093,7 @@ var escapeRegExp;
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -43693,7 +44119,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -44141,7 +44567,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -44187,7 +44613,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -46386,7 +46812,7 @@ var escapeRegExp;
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -46449,7 +46875,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -47072,7 +47498,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -48165,7 +48591,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -48231,7 +48657,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
-
-
-
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -51341,7 +51767,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -51719,7 +52145,7 @@ var escapeRegExp;
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -51849,7 +52275,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -51966,7 +52392,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -52016,7 +52442,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -52068,7 +52494,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -52648,7 +53074,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -53028,7 +53454,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
-
-
-
- \x20\t\r\n\f]*)[^>]*)\/>/gi;s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.migrateEnablePatches("self-closed-tags")},i(s,"htmlPrefilter",function(e){var t,r;return(r=(t=e).replace(F,"<$1>$2>"))!==t&&T(t)!==T(r)&&u("self-closed-tags","HTML tags must be properly nested and closed: "+t),e.replace(F,"<$1>$2>")},"self-closed-tags"),s.migrateDisablePatches("self-closed-tags");var D,W,_,I=s.fn.offset;return i(s.fn,"offset",function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?I.apply(this,arguments):(u("offset-valid-elem","jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},"offset-valid-elem"),s.ajax&&(D=s.param,i(s,"param",function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(u("param-ajax-traditional","jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),D.call(this,e,t)},"param-ajax-traditional")),c(s.fn,"andSelf",s.fn.addBack,"andSelf","jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),s.Deferred&&(W=s.Deferred,_=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],i(s,"Deferred",function(e){var a=W(),i=a.promise();function t(){var o=arguments;return s.Deferred(function(n){s.each(_,function(e,t){var r="function"==typeof o[e]&&o[e];a[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===i?n.promise():this,r?[e]:arguments)})}),o=null}).promise()}return c(a,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),c(i,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),e&&e.call(a,a),a},"deferred-pipe"),s.Deferred.exceptionHook=W.exceptionHook),s});]]>
-
- +~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=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))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(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&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(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&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(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 U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);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&&C){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=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML=" ",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(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(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===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]||I.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]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(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(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(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=I.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 T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.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 ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML=" ",le.option=!!xe.lastChild;var ke={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|?\w+;/;function Ae(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 Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.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)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.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),v(t)&&(t=t.call(e,n,ce.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)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.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"===ce.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"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(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)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(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?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.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.on("mouseenter",e).on("mouseleave",t||e)}}),ce.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){ce.fn[n]=function(e,t){return 0
- 1?a[1]:a[0];break;case S+"X":l[2]=r.tan(M(a));break;case S+"Y":l[1]=r.tan(M(a));break;case x:a=a.split(",");l[0]=a[0];l[1]=a[1];l[2]=a[2];l[3]=a[3];l[4]=parseInt(a[4],10);l[5]=parseInt(a[5],10);break}c[0]=f[0]*l[0]+f[2]*l[1];c[1]=f[1]*l[0]+f[3]*l[1];c[2]=f[0]*l[2]+f[2]*l[3];c[3]=f[1]*l[2]+f[3]*l[3];c[4]=f[0]*l[4]+f[2]*l[5]+f[4];c[5]=f[1]*l[4]+f[3]*l[5]+f[5];f=[c[0],c[1],c[2],c[3],c[4],c[5]]}return c}function N(e){var t,n,i,s=e[0],o=e[1],u=e[2],a=e[3];if(s*a-o*u){t=r.sqrt(s*s+o*o);s/=t;o/=t;i=s*u+o*a;u-=s*i;a-=o*i;n=r.sqrt(u*u+a*a);u/=n;a/=n;i/=n;if(s*a1?t[1]:e==E?r||t[0]:n+"")]:[n,n];break;case S+"X":case S+"Y":case w:t=t?M(t):0;break;case x:return N(t?_(t):[1,0,0,1,0,0]);break}return[[i,t]]}function L(e){return m.test(e)}function A(e){return e.replace(/(?:\([^)]*\))|\s/g,"")}function O(e,t,n){while(n=t.shift()){e.push(n)}}function M(e){return~e.indexOf("deg")?parseInt(e,10)*(r.PI*2/360):~e.indexOf("grad")?parseInt(e,10)*(r.PI/200):parseFloat(e)}function _(e){e=/([^,]*),([^,]*),([^,]*),([^,]*),([^,p]*)(?:px)?,([^)p]*)(?:px)?/.exec(e);return[e[1],e[2],e[3],e[4],e[5],e[6]]}var s=n.createElement("div"),o=s.style,u="Transform",a=["O"+u,"ms"+u,"Webkit"+u,"Moz"+u],f=a.length,l,c,h="Float32Array"in t,p,d,v=/Matrix([^)]*)/,m=/^\s*matrix\(\s*1\s*,\s*0\s*,\s*0\s*,\s*1\s*(?:,\s*0(?:px)?\s*){2}\)\s*$/,g="transform",y="transformOrigin",b="translate",w="rotate",E="scale",S="skew",x="matrix";while(f--){if(a[f]in o){e.support[g]=l=a[f];e.support[y]=l+"Origin";continue}}if(!l){e.support.matrixFilter=c=o.filter===""}e.cssNumber[g]=e.cssNumber[y]=true;if(l&&l!=g){e.cssProps[g]=l;e.cssProps[y]=l+"Origin";if(l=="Moz"+u){p={get:function(t,n){return n?e.css(t,l).split("px").join(""):t.style[l]},set:function(e,t){e.style[l]=/matrix\([^)p]*\)/.test(t)?t.replace(/matrix((?:[^,]*,){4})([^,]*),([^)]*)/,x+"$1$2px,$3px"):t}}}else if(/^1\.[0-5](?:\.|$)/.test(e.fn.jquery)){p={get:function(t,n){return n?e.css(t,l.replace(/^ms/,"Ms")):t.style[l]}}}}else if(c){p={get:function(t,n,r){var s=n&&t.currentStyle?t.currentStyle:t.style,o,u;if(s&&v.test(s.filter)){o=RegExp.$1.split(",");o=[o[0].split("=")[1],o[2].split("=")[1],o[1].split("=")[1],o[3].split("=")[1]]}else{o=[1,0,0,1]}if(!e.cssHooks[y]){o[4]=s?parseInt(s.left,10)||0:0;o[5]=s?parseInt(s.top,10)||0:0}else{u=e._data(t,"transformTranslate",i);o[4]=u?u[0]:0;o[5]=u?u[1]:0}return r?o:x+"("+o+")"},set:function(t,n,r){var i=t.style,s,o,u,a;if(!r){i.zoom=1}n=T(n);o=["Matrix("+"M11="+n[0],"M12="+n[2],"M21="+n[1],"M22="+n[3],"SizingMethod='auto expand'"].join();u=(s=t.currentStyle)&&s.filter||i.filter||"";i.filter=v.test(u)?u.replace(v,o):u+" progid:DXImageTransform.Microsoft."+o+")";if(!e.cssHooks[y]){if(a=e.transform.centerOrigin){i[a=="margin"?"marginLeft":"left"]=-(t.offsetWidth/2)+t.clientWidth/2+"px";i[a=="margin"?"marginTop":"top"]=-(t.offsetHeight/2)+t.clientHeight/2+"px"}i.left=n[4]+"px";i.top=n[5]+"px"}else{e.cssHooks[y].set(t,n)}}}}if(p){e.cssHooks[g]=p}d=p&&p.get||e.css;e.fx.step.transform=function(t){var n=t.elem,i=t.start,s=t.end,o=t.pos,u="",a=1e5,f,h,v,m;if(!i||typeof i==="string"){if(!i){i=d(n,l)}if(c){n.style.zoom=1}s=s.split("+=").join(i);e.extend(t,C(i,s));i=t.start;s=t.end}f=i.length;while(f--){h=i[f];v=s[f];m=+false;switch(h[0]){case b:m="px";case E:m||(m="");u=h[0]+"("+r.round((h[1][0]+(v[1][0]-h[1][0])*o)*a)/a+m+","+r.round((h[1][1]+(v[1][1]-h[1][1])*o)*a)/a+m+")"+u;break;case S+"X":case S+"Y":case w:u=h[0]+"("+r.round((h[1]+(v[1]-h[1])*o)*a)/a+"rad)"+u;break}}t.origin&&(u=t.origin+u);p&&p.set?p.set(n,u,+true):n.style[l]=u};e.transform={centerOrigin:"margin"}})(jQuery,window,document,Math)]]>
- =0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}t="default"in t?t["default"]:t;var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);]]>
- 2&&void 0!==arguments[2]?arguments[2]:{},o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||h.defaultProtocol,this.events=t.events||h.events,this.format=t.format||h.format,this.formatHref=t.formatHref||h.formatHref,this.nl2br=t.nl2br||h.nl2br,this.tagName=t.tagName||h.tagName,this.target=t.target||h.target,this.validate=t.validate||h.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||h.attributes,this.className=t.className||t.linkClass||h.className;for(var e=t.ignoreTags||h.ignoreTags,n=0;n=r)return[];for(;a1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),A=u("mailto:"),L=u("?"),E=u("/"),C=u("_"),P=u(),R=u(),q=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,MAILTO:A,SLASH:E,UNDERSCORE:C,SYM:P,TLD:R,WS:q,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),W="0123456789".split(""),X="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Z=[" ","\f","\r","\t","\x0B"," "," ",""],F=[],J=function(t){return new m(t)},V=J(),$=J(O),tt=J(v),et=J(),nt=J(q);V.on("@",J(y)).on(".",J(w)).on("+",J(S)).on("#",J(N)).on("?",J(L)).on("/",J(E)).on("_",J(C)).on(":",J(k)).on("{",J(H)).on("[",J(B)).on("<",J(U)).on("(",J(M)).on("}",J(D)).on("]",J(I)).on(">",J(K)).on(")",J(_)).on("&",J(G)).on([",",";","!",'"',"'"],J(j)),V.on("\n",J(z)).on(Z,nt),nt.on(Z,nt);for(var ot=0;ot=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var p=l.emit();o.push(new p(t.substr(a-c,c)))}}return o},yt=V,kt=Object.freeze({State:m,TOKENS:Y,run:vt,start:yt}),wt=l();wt.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var jt=n(wt,l(),{type:"email",isLink:!0}),xt=n(wt,l(),{type:"email",isLink:!0,toHref:function(){this.v;return"mailto:"+this.toString()}}),zt=n(wt,l(),{type:"text"}),Ot=n(wt,l(),{type:"nl"}),St=n(wt,l(),{type:"url",isLink:!0,toHref:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof T;)e=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof E;)n=!0,a.push(o[r].toString()),r++;for(;p(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r=0&&u++,n++,c++;if(u<0)for(var p=n-c;p0&&(o.push(new zt(a)),a=[]),n-=u,c-=u;var h=l.emit();o.push(new h(t.slice(n-c,n)))}}return a.length>0&&o.push(new zt(a)),o},fe=Object.freeze({State:d,TOKENS:Nt,run:ge,start:At});Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var me=function(t){return ge(vt(t))},de=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=me(t),o=[],a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=me(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=de,e.inherits=n,e.options=g,e.parser=fe,e.scanner=kt,e.test=be,e.tokenize=me}(self.linkify=self.linkify||{})}();]]>
- =0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}t="default"in t?t["default"]:t;var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);]]>
+ 2&&void 0!==arguments[2]?arguments[2]:{},o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||h.defaultProtocol,this.events=t.events||h.events,this.format=t.format||h.format,this.formatHref=t.formatHref||h.formatHref,this.nl2br=t.nl2br||h.nl2br,this.tagName=t.tagName||h.tagName,this.target=t.target||h.target,this.validate=t.validate||h.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||h.attributes,this.className=t.className||t.linkClass||h.className;for(var e=t.ignoreTags||h.ignoreTags,n=0;n=r)return[];for(;a1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),A=u("mailto:"),L=u("?"),E=u("/"),C=u("_"),P=u(),R=u(),q=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,MAILTO:A,SLASH:E,UNDERSCORE:C,SYM:P,TLD:R,WS:q,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),W="0123456789".split(""),X="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Z=[" ","\f","\r","\t","\x0B"," "," ",""],F=[],J=function(t){return new m(t)},V=J(),$=J(O),tt=J(v),et=J(),nt=J(q);V.on("@",J(y)).on(".",J(w)).on("+",J(S)).on("#",J(N)).on("?",J(L)).on("/",J(E)).on("_",J(C)).on(":",J(k)).on("{",J(H)).on("[",J(B)).on("<",J(U)).on("(",J(M)).on("}",J(D)).on("]",J(I)).on(">",J(K)).on(")",J(_)).on("&",J(G)).on([",",";","!",'"',"'"],J(j)),V.on("\n",J(z)).on(Z,nt),nt.on(Z,nt);for(var ot=0;ot=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var p=l.emit();o.push(new p(t.substr(a-c,c)))}}return o},yt=V,kt=Object.freeze({State:m,TOKENS:Y,run:vt,start:yt}),wt=l();wt.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var jt=n(wt,l(),{type:"email",isLink:!0}),xt=n(wt,l(),{type:"email",isLink:!0,toHref:function(){this.v;return"mailto:"+this.toString()}}),zt=n(wt,l(),{type:"text"}),Ot=n(wt,l(),{type:"nl"}),St=n(wt,l(),{type:"url",isLink:!0,toHref:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof T;)e=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof E;)n=!0,a.push(o[r].toString()),r++;for(;p(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r=0&&u++,n++,c++;if(u<0)for(var p=n-c;p0&&(o.push(new zt(a)),a=[]),n-=u,c-=u;var h=l.emit();o.push(new h(t.slice(n-c,n)))}}return a.length>0&&o.push(new zt(a)),o},fe=Object.freeze({State:d,TOKENS:Nt,run:ge,start:At});Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var me=function(t){return ge(vt(t))},de=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=me(t),o=[],a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=me(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=de,e.inherits=n,e.options=g,e.parser=fe,e.scanner=kt,e.test=be,e.tokenize=me}(self.linkify=self.linkify||{})}();]]>
+
-
-
-
- /**
+ /**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -54977,7 +55403,7 @@ var escapeRegExp;
}
});
}(jQuery, _));
-
-
- ":">",'"':""","'":"'","/":"/","`":"`","=":"="};function escapeHtml(string){return String(string).replace(/[&<>"'`=\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var lineHasNonSpace=false;var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;var indentation="";var tagIndex=0;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i"){token=[type,value,start,scanner.pos,indentation,tagIndex,lineHasNonSpace]}else{token=[type,value,start,scanner.pos]}tagIndex++;tokens.push(token);if(type==="#"||type==="^"){sections.push(token)}else if(type==="/"){openSection=sections.pop();if(!openSection)throw new Error('Unopened section "'+value+'" at '+start);if(openSection[1]!==value)throw new Error('Unclosed section "'+openSection[1]+'" at '+start)}else if(type==="name"||type==="{"||type==="&"){nonSpace=true}else if(type==="="){compileTags(value)}}stripSpace();openSection=sections.pop();if(openSection)throw new Error('Unclosed section "'+openSection[1]+'" at '+scanner.pos);return nestTokens(squashTokens(tokens))}function squashTokens(tokens){var squashedTokens=[];var token,lastToken;for(var i=0,numTokens=tokens.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,intermediateValue,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){intermediateValue=context.view;names=name.split(".");index=0;while(intermediateValue!=null&&index")value=this.renderPartial(token,context,partials,config);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context,config);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate,config){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials,config)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j0||!lineHasNonSpace)){partialByNl[i]=filteredIndentation+partialByNl[i]}}return partialByNl.join("\n")};Writer.prototype.renderPartial=function renderPartial(token,context,partials,config){if(!partials)return;var tags=this.getConfigTags(config);var value=isFunction(partials)?partials(token[1]):partials[token[1]];if(value!=null){var lineHasNonSpace=token[6];var tagIndex=token[5];var indentation=token[4];var indentedValue=value;if(tagIndex==0&&indentation){indentedValue=this.indentPartial(value,indentation,lineHasNonSpace)}var tokens=this.parse(indentedValue,tags);return this.renderTokens(tokens,context,partials,indentedValue,config)}};Writer.prototype.unescapedValue=function unescapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return value};Writer.prototype.escapedValue=function escapedValue(token,context,config){var escape=this.getConfigEscape(config)||mustache.escape;var value=context.lookup(token[1]);if(value!=null)return typeof value==="number"&&escape===mustache.escape?String(value):escape(value)};Writer.prototype.rawValue=function rawValue(token){return token[1]};Writer.prototype.getConfigTags=function getConfigTags(config){if(isArray(config)){return config}else if(config&&typeof config==="object"){return config.tags}else{return undefined}};Writer.prototype.getConfigEscape=function getConfigEscape(config){if(config&&typeof config==="object"&&!isArray(config)){return config.escape}else{return undefined}};var mustache={name:"mustache.js",version:"4.2.0",tags:["{{","}}"],clearCache:undefined,escape:undefined,parse:undefined,render:undefined,Scanner:undefined,Context:undefined,Writer:undefined,set templateCache(cache){defaultWriter.templateCache=cache},get templateCache(){return defaultWriter.templateCache}};var defaultWriter=new Writer;mustache.clearCache=function clearCache(){return defaultWriter.clearCache()};mustache.parse=function parse(template,tags){return defaultWriter.parse(template,tags)};mustache.render=function render(template,view,partials,config){if(typeof template!=="string"){throw new TypeError('Invalid template! Template should be a "string" '+'but "'+typeStr(template)+'" was given as the first '+"argument for mustache#render(template, view, partials)")}return defaultWriter.render(template,view,partials,config)};mustache.escape=escapeHtml;mustache.Scanner=Scanner;mustache.Context=Context;mustache.Writer=Writer;return mustache});]]>
- \
");
@@ -55296,7 +55722,7 @@ ips.templates.set('support.ticket.supportSummary', " \
{{#lang}}health_ticket_beforeproceeding{{/lang}}\
\
");]]>